lwtunnel: Pass encap and encap type attributes to lwtunnel_fill_encap
authorDavid Ahern <dsahern@gmail.com>
Tue, 23 Apr 2019 15:23:41 +0000 (08:23 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Apr 2019 02:42:29 +0000 (19:42 -0700)
Currently, lwtunnel_fill_encap hardcodes the encap and encap type
attributes as RTA_ENCAP and RTA_ENCAP_TYPE, respectively. The nexthop
objects want to re-use this code but the encap attributes passed to
userspace as NHA_ENCAP and NHA_ENCAP_TYPE. Since that is the only
difference, change lwtunnel_fill_encap to take the attribute type as
an input.

Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/lwtunnel.h
net/core/lwtunnel.c
net/ipv4/fib_semantics.c

index 671113bcb2cc20e2b4ff56f4160a9241cebce477..5d6c5b1fc6955fddb69357fc7c4c4a81f9cd694d 100644 (file)
@@ -118,8 +118,8 @@ int lwtunnel_build_state(u16 encap_type,
                         unsigned int family, const void *cfg,
                         struct lwtunnel_state **lws,
                         struct netlink_ext_ack *extack);
-int lwtunnel_fill_encap(struct sk_buff *skb,
-                       struct lwtunnel_state *lwtstate);
+int lwtunnel_fill_encap(struct sk_buff *skb, struct lwtunnel_state *lwtstate,
+                       int encap_attr, int encap_type_attr);
 int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate);
 struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len);
 int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b);
@@ -219,7 +219,8 @@ static inline int lwtunnel_build_state(u16 encap_type,
 }
 
 static inline int lwtunnel_fill_encap(struct sk_buff *skb,
-                                     struct lwtunnel_state *lwtstate)
+                                     struct lwtunnel_state *lwtstate,
+                                     int encap_attr, int encap_type_attr)
 {
        return 0;
 }
index a8018aa5b7987d95c3924eefd86c3e764c80d363..94749e0e2cfd28e8d80692a039757d8ad77437d5 100644 (file)
@@ -223,7 +223,8 @@ void lwtstate_free(struct lwtunnel_state *lws)
 }
 EXPORT_SYMBOL_GPL(lwtstate_free);
 
-int lwtunnel_fill_encap(struct sk_buff *skb, struct lwtunnel_state *lwtstate)
+int lwtunnel_fill_encap(struct sk_buff *skb, struct lwtunnel_state *lwtstate,
+                       int encap_attr, int encap_type_attr)
 {
        const struct lwtunnel_encap_ops *ops;
        struct nlattr *nest;
@@ -236,7 +237,7 @@ int lwtunnel_fill_encap(struct sk_buff *skb, struct lwtunnel_state *lwtstate)
            lwtstate->type > LWTUNNEL_ENCAP_MAX)
                return 0;
 
-       nest = nla_nest_start(skb, RTA_ENCAP);
+       nest = nla_nest_start(skb, encap_attr);
        if (!nest)
                return -EMSGSIZE;
 
@@ -250,7 +251,7 @@ int lwtunnel_fill_encap(struct sk_buff *skb, struct lwtunnel_state *lwtstate)
        if (ret)
                goto nla_put_failure;
        nla_nest_end(skb, nest);
-       ret = nla_put_u16(skb, RTA_ENCAP_TYPE, lwtstate->type);
+       ret = nla_put_u16(skb, encap_type_attr, lwtstate->type);
        if (ret)
                goto nla_put_failure;
 
index b5230c4a1c16e2903472ef017456ea7f2a234227..c695e629fac2a75e95cdc881ca641f2d0c4e449e 100644 (file)
@@ -1503,7 +1503,8 @@ int fib_nexthop_info(struct sk_buff *skb, const struct fib_nh_common *nhc,
                goto nla_put_failure;
 
        if (nhc->nhc_lwtstate &&
-           lwtunnel_fill_encap(skb, nhc->nhc_lwtstate) < 0)
+           lwtunnel_fill_encap(skb, nhc->nhc_lwtstate,
+                               RTA_ENCAP, RTA_ENCAP_TYPE) < 0)
                goto nla_put_failure;
 
        return 0;