iptunnel: scrub packet in iptunnel_pull_header
authorJiri Benc <jbenc@redhat.com>
Thu, 18 Feb 2016 10:22:52 +0000 (11:22 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Feb 2016 19:34:54 +0000 (14:34 -0500)
Part of skb_scrub_packet was open coded in iptunnel_pull_header. Let it call
skb_scrub_packet directly instead.

Signed-off-by: Jiri Benc <jbenc@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/geneve.c
drivers/net/vxlan.c
include/net/ip_tunnels.h
net/ipv4/ip_gre.c
net/ipv4/ip_tunnel_core.c
net/ipv4/ipip.c
net/ipv6/sit.c

index 4ceccf871b3fe99fb70a6b051c195096742ad99d..dfbe3ca687f731683ce57651defdbb5c787fec28 100644 (file)
@@ -237,7 +237,6 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
        }
 
        skb_reset_mac_header(skb);
-       skb_scrub_packet(skb, !net_eq(geneve->net, dev_net(geneve->dev)));
        skb->protocol = eth_type_trans(skb, geneve->dev);
        skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
 
@@ -356,7 +355,8 @@ static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
 
        opts_len = geneveh->opt_len * 4;
        if (iptunnel_pull_header(skb, GENEVE_BASE_HLEN + opts_len,
-                                htons(ETH_P_TEB)))
+                                htons(ETH_P_TEB),
+                                !net_eq(geneve->net, dev_net(geneve->dev))))
                goto drop;
 
        geneve_rx(geneve, gs, skb);
index 16a176cd0dadbf603ca169c9dc7a403a1b2c1f50..c963897e713d1458480501675cab8e292c8d2997 100644 (file)
@@ -1198,7 +1198,6 @@ static void vxlan_rcv(struct vxlan_dev *vxlan, struct vxlan_sock *vs,
        int err = 0;
 
        skb_reset_mac_header(skb);
-       skb_scrub_packet(skb, !net_eq(vxlan->net, dev_net(vxlan->dev)));
        skb->protocol = eth_type_trans(skb, vxlan->dev);
        skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
 
@@ -1305,7 +1304,8 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
        if (!vxlan)
                goto drop;
 
-       if (iptunnel_pull_header(skb, VXLAN_HLEN, htons(ETH_P_TEB)))
+       if (iptunnel_pull_header(skb, VXLAN_HLEN, htons(ETH_P_TEB),
+                                !net_eq(vxlan->net, dev_net(vxlan->dev))))
                goto drop;
 
        if (vxlan_collect_metadata(vs)) {
index 87408ab808567f8457564be4d2be33597a2af91b..4dd616376fec2fff8cb4317605fe7fff45441050 100644 (file)
@@ -270,7 +270,8 @@ static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph,
        return INET_ECN_encapsulate(tos, inner);
 }
 
-int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto);
+int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto,
+                        bool xnet);
 void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
                   __be32 src, __be32 dst, u8 proto,
                   u8 tos, u8 ttl, __be16 df, bool xnet);
index 917c2c1bfadd2f1fc2c6a5f4dc86857bec957f18..12071e28d958e80c45c35223ac4480e5a958b11e 100644 (file)
@@ -238,7 +238,7 @@ static int parse_gre_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
                                return -EINVAL;
                }
        }
-       return iptunnel_pull_header(skb, hdr_len, tpi->proto);
+       return iptunnel_pull_header(skb, hdr_len, tpi->proto, false);
 }
 
 static void ipgre_err(struct sk_buff *skb, u32 info,
index a6e58b6141cdc525435f7292dc97c1e244adb8ad..eaca2449a09acae2374e4cb4a629702f95c5b510 100644 (file)
@@ -86,7 +86,8 @@ void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
 }
 EXPORT_SYMBOL_GPL(iptunnel_xmit);
 
-int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto)
+int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto,
+                        bool xnet)
 {
        if (unlikely(!pskb_may_pull(skb, hdr_len)))
                return -ENOMEM;
@@ -109,13 +110,10 @@ int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto)
                skb->protocol = inner_proto;
        }
 
-       nf_reset(skb);
-       secpath_reset(skb);
        skb_clear_hash_if_not_l4(skb);
-       skb_dst_drop(skb);
        skb->vlan_tci = 0;
        skb_set_queue_mapping(skb, 0);
-       skb->pkt_type = PACKET_HOST;
+       skb_scrub_packet(skb, xnet);
        return 0;
 }
 EXPORT_SYMBOL_GPL(iptunnel_pull_header);
index 6ec5b42fd1722eefa5968ac0b7a4265eea167289..ec51d02166de66744f27092f1490bb635c9a70bc 100644 (file)
@@ -195,7 +195,7 @@ static int ipip_rcv(struct sk_buff *skb)
        if (tunnel) {
                if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
                        goto drop;
-               if (iptunnel_pull_header(skb, 0, tpi.proto))
+               if (iptunnel_pull_header(skb, 0, tpi.proto, false))
                        goto drop;
                return ip_tunnel_rcv(tunnel, skb, &tpi, NULL, log_ecn_error);
        }
index 0625ac6356b59886b4d2e8d74863c3a2d422874b..f45b8ffc2840bbca9070b96ad85811ea8157f829 100644 (file)
@@ -740,7 +740,7 @@ static int ipip_rcv(struct sk_buff *skb)
 
                if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
                        goto drop;
-               if (iptunnel_pull_header(skb, 0, tpi.proto))
+               if (iptunnel_pull_header(skb, 0, tpi.proto, false))
                        goto drop;
                return ip_tunnel_rcv(tunnel, skb, &tpi, NULL, log_ecn_error);
        }