|
@@ -70,6 +70,7 @@
|
|
|
#include <net/sock.h>
|
|
|
|
|
|
#include <asm/uaccess.h>
|
|
|
+#include <net/flow_keys.h>
|
|
|
|
|
|
/* Uncomment to enable debugging */
|
|
|
/* #define TUN_DEBUG 1 */
|
|
@@ -1049,6 +1050,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
|
|
bool zerocopy = false;
|
|
|
int err;
|
|
|
u32 rxhash;
|
|
|
+ struct flow_keys keys;
|
|
|
|
|
|
if (!(tun->flags & TUN_NO_PI)) {
|
|
|
if ((len -= sizeof(pi)) > total_len)
|
|
@@ -1203,6 +1205,14 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
|
|
}
|
|
|
|
|
|
skb_reset_network_header(skb);
|
|
|
+
|
|
|
+ if (skb->ip_summed == CHECKSUM_PARTIAL)
|
|
|
+ skb_set_transport_header(skb, skb_checksum_start_offset(skb));
|
|
|
+ else if (skb_flow_dissect(skb, &keys))
|
|
|
+ skb_set_transport_header(skb, keys.thoff);
|
|
|
+ else
|
|
|
+ skb_reset_transport_header(skb);
|
|
|
+
|
|
|
rxhash = skb_get_rxhash(skb);
|
|
|
netif_rx_ni(skb);
|
|
|
|