Adel,
You say you have a NULL pointer but you do not specify where.
can you please send the log of the panic ?
Can you send the kernel module full code ?
Regards,
Rami Rosen
On Mon, Jun 17, 2013 at 6:18 AM, Adel Qodmani <mpcadel@xxxxxxxxx> wrote:
Hello everyone,
I am trying to send an ICMP message in a kernel module; typically I'd build the skb, set up the net_device, the ethernet header and then use dev_queue_xmit.But right now I want my packet to follow the IP routing rules set in the system, so I thought I'll use ip_local_out function and let it handle the routing and setting the rest of the parameters in the skb.Yet, my code causes the kernel to panic due to a NULL pointer.
The code is as follows:/* This function assumes source and dest are in NETWORK byte order */int sendICMPEcho(char *msg, unsigned int length, __be32 source, __be32 dest){struct iphdr *iph;struct icmphdr *icmph;struct sk_buff *newPacket;unsigned char *data;unsigned int skbSize = length + sizeof(struct icmphdr) * 2+ sizeof(struct iphdr) * 2+ sizeof(struct ethhdr) * 2;/* Allocate the skb */newPacket = alloc_skb(skbSize, GFP_ATOMIC);if(newPacket == NULL)return SEND_FAIL_MEMORY;/* Reserve the headers area */skb_reserve(newPacket, sizeof(struct icmphdr)+ sizeof(struct iphdr)+ sizeof(struct ethhdr));/* Extend the data area from 0 to the message length */data = "" length);/* Copy the data from the message buffer to the newPacket */memcpy(data, msg, length);/************** ICMP HEADER***************//* skb_push - pushing the icmp header in the packet data */icmph = (struct icmphdr *) skb_push(newPacket,sizeof(struct icmphdr));/*set ICMP header here */icmph->type = ICMP_ECHO;icmph->code = 0;icmph->un.echo.id = 0;icmph->un.echo.sequence = htons(sendCounter);icmph->checksum= 0;icmph->checksum = in_cksum((unsigned short *)icmph,sizeof(struct icmphdr) + length);/************** END ICMP HEADER**************//************** IP HEADER ***************/iph = (struct iphdr *) skb_push(newPacket,sizeof(struct iphdr));/* set IP header here */iph->ihl = 5;/* 5 * 32(bits) */iph->version = 4;iph->tos = 0; /* The recommended value by IANA for ICMP request */iph->tot_len = htons( sizeof(struct iphdr)+ sizeof(struct icmphdr)+ length);iph->id = 0;iph->frag_off = 0; /* No fragementation */iph->ttl = 65;iph->protocol = IPPROTO_ICMP;iph->saddr = source;iph->daddr = dest;iph->check = 0;iph->check = in_cksum((unsigned short *)iph, sizeof(struct iphdr));/************** END IP HEADER ***************/// if(ip_local_out(newPacket) < 0) THIS CRASHES WITH A NULL POINTER// return SEND_FAIL_SEND;++sendCounter;return SEND_SUCCESS;}/* end sendICMPEcho */In my attempts when trying to solve this, I've tried to manually set the net_device in the skb and that didn't work either; I still had the same kernel panic.So I am sorry for the trouble, any hint where the error can be?
Regards,
Adel
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies