467 gso.csum_offset)) {
468 tun->dev->stats.rx_frame_errors++;
469 kfree_skb(skb);
470 return -EINVAL;
471 }
472 } else if (tun->flags & TUN_NOCHECKSUM)
473 skb->ip_summed = CHECKSUM_UNNECESSARY;
474
475 switch (tun->flags & TUN_TYPE_MASK) {
476 case TUN_TUN_DEV:
477 if (tun->flags & TUN_NO_PI) {
478 switch (skb->data[0] & 0xf0) {
479 case 0x40:
480 pi.proto = htons(ETH_P_IP);
481 break;
482 case 0x60:
483 pi.proto = htons(ETH_P_IPV6);
484 break;
485 default:
486 tun->dev->stats.rx_dropped++;
487 kfree_skb(skb);
488 return -EINVAL;
489 }
490 }
491
492 skb_reset_mac_header(skb);
493 skb->protocol = pi.proto;
494 skb->dev = tun->dev;
495 break;
496 case TUN_TAP_DEV:
497 skb->protocol = eth_type_trans(skb, tun->dev);
498 break;
499 };
500
501 if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) {
502 pr_debug("GSO!\n");
503 switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
504 case VIRTIO_NET_HDR_GSO_TCPV4:
505 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
506 break;
507 case VIRTIO_NET_HDR_GSO_TCPV6: