Subject: Re: [PATCH] NET: Proper handling of IPv6 header in tun driver when TUN_NO_PI is set

From: Ang Way Chuang <[email-masked]>
Date: Wed, 18 Jun 2008 10:13:31 +0800

David Miller wrote:
> From: Max Krasnyanskiy <[email-masked]>
> Date: Fri, 06 Jun 2008 13:21:06 -0700
> 
>> Acked-by: Max Krasnyansky <[email-masked]>
>>
>> Dave, can you please add this patch to your tree.
> 
> I can't, the patch is severely whitespace damaged.
> 
Resend. Hopefully Thunderbird won't screw this time.

By default, tun.c running in TUN_TUN_DEV mode will set the protocol of packet
to IPv4 if TUN_NO_PI is set. My program failed to work when I assumed that
the driver will check the first nibble of packet, determine IP version and set
the appropriate protocol.

Signed-off-by: Ang Way Chuang <[email-masked]>
---

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 0ce07a3..f97bb9b 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -313,6 +313,21 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv,

        switch (tun->flags & TUN_TYPE_MASK) {
        case TUN_TUN_DEV:
+                if (tun->flags & TUN_NO_PI) {
+                        switch (skb->data[0] & 0xf0) {
+                        case 0x40:
+                                pi.proto = htons(ETH_P_IP);
+                                break;
+                        case 0x60:
+                                pi.proto = htons(ETH_P_IPV6);
+                                break;
+                        default:
+                                tun->dev->stats.rx_dropped++;
+                                kfree_skb(skb);
+                                return -EINVAL;
+                        }
+                }
+
                skb_reset_mac_header(skb);
                skb->protocol = pi.proto;
                skb->dev = tun->dev;

--