|
@@ -65,6 +65,7 @@
|
|
#include <linux/nsproxy.h>
|
|
#include <linux/nsproxy.h>
|
|
#include <linux/virtio_net.h>
|
|
#include <linux/virtio_net.h>
|
|
#include <linux/rcupdate.h>
|
|
#include <linux/rcupdate.h>
|
|
|
|
+#include <net/ipv6.h>
|
|
#include <net/net_namespace.h>
|
|
#include <net/net_namespace.h>
|
|
#include <net/netns/generic.h>
|
|
#include <net/netns/generic.h>
|
|
#include <net/rtnetlink.h>
|
|
#include <net/rtnetlink.h>
|
|
@@ -1139,6 +1140,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ skb_reset_network_header(skb);
|
|
|
|
+
|
|
if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) {
|
|
if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) {
|
|
pr_debug("GSO!\n");
|
|
pr_debug("GSO!\n");
|
|
switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
|
|
switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
|
|
@@ -1159,6 +1162,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
|
current->comm);
|
|
current->comm);
|
|
}
|
|
}
|
|
skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
|
|
skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
|
|
|
|
+ if (skb->protocol == htons(ETH_P_IPV6))
|
|
|
|
+ ipv6_proxy_select_ident(skb);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
default:
|
|
default:
|
|
@@ -1189,7 +1194,6 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
|
skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
|
|
skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
|
|
}
|
|
}
|
|
|
|
|
|
- skb_reset_network_header(skb);
|
|
|
|
skb_probe_transport_header(skb, 0);
|
|
skb_probe_transport_header(skb, 0);
|
|
|
|
|
|
rxhash = skb_get_hash(skb);
|
|
rxhash = skb_get_hash(skb);
|