|
@@ -48,7 +48,7 @@ static inline struct fou *fou_from_sock(struct sock *sk)
|
|
|
return sk->sk_user_data;
|
|
|
}
|
|
|
|
|
|
-static void fou_recv_pull(struct sk_buff *skb, size_t len)
|
|
|
+static int fou_recv_pull(struct sk_buff *skb, size_t len)
|
|
|
{
|
|
|
struct iphdr *iph = ip_hdr(skb);
|
|
|
|
|
@@ -59,6 +59,7 @@ static void fou_recv_pull(struct sk_buff *skb, size_t len)
|
|
|
__skb_pull(skb, len);
|
|
|
skb_postpull_rcsum(skb, udp_hdr(skb), len);
|
|
|
skb_reset_transport_header(skb);
|
|
|
+ return iptunnel_pull_offloads(skb);
|
|
|
}
|
|
|
|
|
|
static int fou_udp_recv(struct sock *sk, struct sk_buff *skb)
|
|
@@ -68,9 +69,14 @@ static int fou_udp_recv(struct sock *sk, struct sk_buff *skb)
|
|
|
if (!fou)
|
|
|
return 1;
|
|
|
|
|
|
- fou_recv_pull(skb, sizeof(struct udphdr));
|
|
|
+ if (fou_recv_pull(skb, sizeof(struct udphdr)))
|
|
|
+ goto drop;
|
|
|
|
|
|
return -fou->protocol;
|
|
|
+
|
|
|
+drop:
|
|
|
+ kfree_skb(skb);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static struct guehdr *gue_remcsum(struct sk_buff *skb, struct guehdr *guehdr,
|
|
@@ -170,6 +176,9 @@ static int gue_udp_recv(struct sock *sk, struct sk_buff *skb)
|
|
|
__skb_pull(skb, sizeof(struct udphdr) + hdrlen);
|
|
|
skb_reset_transport_header(skb);
|
|
|
|
|
|
+ if (iptunnel_pull_offloads(skb))
|
|
|
+ goto drop;
|
|
|
+
|
|
|
return -guehdr->proto_ctype;
|
|
|
|
|
|
drop:
|