How to remove ip options from existing skbuff?
Guibin(Bill) Tian
gbtian at gmail.com
Tue Jan 28 23:12:45 EST 2014
I used the following code with the output, I don't understand why this
doesn't work.
struct iphdr *iph = ip_hdr(skb);
char *tmp = NULL;
int optlen = iph->ihl*4 - sizeof(struct iphdr);
if (optlen > 0)
{
printk("ihl=%d\n", iph->ihl);
printk("optlen=%d\n", optlen);
tmp = kzalloc(sizeof(struct iphdr), GFP_ATOMIC);
memcpy(tmp, iph, sizeof(struct iphdr));
memcpy(iph + optlen, tmp, sizeof(struct iphdr));
kfree(tmp);
skb_pull(skb, optlen);
skb_reset_network_header(skb);
iph = ip_hdr(skb);
printk("new ihl=%d\n", iph->ihl);
iph->ihl -= optlen>>2;
printk("newest ihl=%d\n", iph->ihl);
}
The output is:
[ 401.754279] ihl=8
[ 401.754288] optlen=12
[ 401.754293] new ihl=15
[ 401.754296] newest ihl=12
On Tue, Jan 28, 2014 at 8:54 PM, Guibin(Bill) Tian <gbtian at gmail.com> wrote:
> Hi,
> In the kernel, I added some customized options to the ip_options struct,
> and I send the ip packet with these option fields set.
>
> After I receive the packet, I extract these options and try to remove them
> from the ip packet because I don't want these options be delivered to upper
> layer.
>
> In the method ip_rcv_finish of the file ip_input.c, I added following
> code:
>
> /*********My code to process the options****/
> process_my_options(skb);
> /*********My code to remove the options ****/
> //skb_pull(skb, sizeof(struct iphdr) + 12);
> //skb_push(skb, sizeof(struct iphdr));
> //skb_reset_network_header(skb);
> //iph->ihl -= 3;
>
> /*********Normal process of the ip packet.****/
> if (iph->ihl > 5 && ip_rcv_options(skb))
> goto drop;
>
>
> The question is at how to remove the options. I tried some code but none
> of them works correctly. Can anybody give me some suggestion? Thanks.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20140128/ba71829d/attachment.html
More information about the Kernelnewbies
mailing list