gre: change gre_parse_header to return the header length
authorJiri Benc <jbenc@redhat.com>
Tue, 3 May 2016 13:00:21 +0000 (15:00 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 4 May 2016 16:44:45 +0000 (12:44 -0400)
It's easier for gre_parse_header to return the header length instead of
filing it into a parameter. That way, the callers that don't care about the
header length can just check whether the returned value is lower than zero.

In gre_err, the tunnel header must not be pulled. See commit b7f8fe251e46
("gre: do not pull header in ICMP error processing") for details.

This patch reduces the conflict between the mentioned commit and commit
95f5c64c3c13 ("gre: Move utility functions to common headers").

Signed-off-by: Jiri Benc <jbenc@redhat.com>
Acked-by: Tom Herbert <tom@herbertland.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/gre.h
net/ipv4/gre_demux.c
net/ipv4/ip_gre.c
net/ipv6/ip6_gre.c

index 29e37322c06ed06ed8d5078b4bc37399c6fd604e..a14093c70eabbb13d925b06ef4d72d4bd696f21c 100644 (file)
@@ -26,7 +26,7 @@ int gre_del_protocol(const struct gre_protocol *proto, u8 version);
 struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
                                       u8 name_assign_type);
 int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
-                    bool *csum_err, int *hdr_len);
+                    bool *csum_err);
 
 static inline int gre_calc_hlen(__be16 o_flags)
 {
index 371674801e84e5015bcac9c16c1496c7275c2507..a41e73ab1369662a61f3ec53f2817b625741af31 100644 (file)
@@ -60,8 +60,9 @@ int gre_del_protocol(const struct gre_protocol *proto, u8 version)
 }
 EXPORT_SYMBOL_GPL(gre_del_protocol);
 
+/* Fills in tpi and returns header length to be pulled. */
 int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
-                    bool *csum_err, int *ret_hdr_len)
+                    bool *csum_err)
 {
        const struct gre_base_hdr *greh;
        __be32 *options;
@@ -119,8 +120,7 @@ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
                                return -EINVAL;
                }
        }
-       *ret_hdr_len = hdr_len;
-       return 0;
+       return hdr_len;
 }
 EXPORT_SYMBOL(gre_parse_header);
 
index b99213c46aacb421df43982f861c6a372b305f1b..8260a707b9b8beac7001e9da2cf501440904a258 100644 (file)
@@ -221,16 +221,12 @@ static void gre_err(struct sk_buff *skb, u32 info)
        const int code = icmp_hdr(skb)->code;
        struct tnl_ptk_info tpi;
        bool csum_err = false;
-       int hdr_len;
 
-       if (gre_parse_header(skb, &tpi, &csum_err, &hdr_len)) {
+       if (gre_parse_header(skb, &tpi, &csum_err) < 0) {
                if (!csum_err)          /* ignore csum errors. */
                        return;
        }
 
-       if (iptunnel_pull_header(skb, hdr_len, tpi.proto, false))
-               return;
-
        if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) {
                ipv4_update_pmtu(skb, dev_net(skb->dev), info,
                                 skb->dev->ifindex, 0, IPPROTO_GRE, 0);
@@ -314,7 +310,8 @@ static int gre_rcv(struct sk_buff *skb)
        }
 #endif
 
-       if (gre_parse_header(skb, &tpi, &csum_err, &hdr_len) < 0)
+       hdr_len = gre_parse_header(skb, &tpi, &csum_err);
+       if (hdr_len < 0)
                goto drop;
 
        if (iptunnel_pull_header(skb, hdr_len, tpi.proto, false))
index 10127741a60db425daaf42ce60b2101a0f67eabb..47b671a46dc488e4a016b739314fb637eeb3b4c7 100644 (file)
@@ -468,7 +468,8 @@ static int gre_rcv(struct sk_buff *skb)
        bool csum_err = false;
        int hdr_len;
 
-       if (gre_parse_header(skb, &tpi, &csum_err, &hdr_len) < 0)
+       hdr_len = gre_parse_header(skb, &tpi, &csum_err);
+       if (hdr_len < 0)
                goto drop;
 
        if (iptunnel_pull_header(skb, hdr_len, tpi.proto, false))