tun: Proper handling of IPv6 header in tun driver when TUN_NO_PI is set
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 <wcang@nav6.org> Acked-by: Max Krasnyansky <maxk@qualcomm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									fe833fca2e
								
							
						
					
					
						commit
						f09f7ee20c
					
				| @ -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; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user