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 http://ramirose.wix.com/ramirosen On Mon, Jun 17, 2013 at 6:18 AM, Adel Qodmani <mpcadel@gmail.com> 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 = skb_put(newPacket, 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@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies