Add cfg and family arguments to lwt build state functions. cfg is a void
pointer and will either be a pointer to a fib_config or fib6_config
structure. The family parametter indicates which one (either AF_INET
or AF_INET6).

LWT encpasulation implementation may use the fib configuration to build
the LWT state.

Signed-off-by: Tom Herbert <t...@herbertland.com>
---
 include/net/lwtunnel.h    |  9 ++++++---
 net/core/lwtunnel.c       |  5 +++--
 net/ipv4/fib_semantics.c  | 14 +++++++++-----
 net/ipv4/ip_tunnel_core.c |  3 ++-
 net/ipv6/ila.c            |  3 ++-
 net/ipv6/route.c          |  3 ++-
 net/mpls/mpls_iptunnel.c  |  3 ++-
 7 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/include/net/lwtunnel.h b/include/net/lwtunnel.h
index e25b60e..9bf7e6a 100644
--- a/include/net/lwtunnel.h
+++ b/include/net/lwtunnel.h
@@ -26,7 +26,8 @@ struct lwtunnel_state {
 
 struct lwtunnel_encap_ops {
        int (*build_state)(struct net_device *dev, struct nlattr *encap,
-                          struct lwtunnel_state **ts);
+                          struct lwtunnel_state **ts,
+                          unsigned int family, const void *cfg);
        int (*output)(struct sock *sk, struct sk_buff *skb);
        int (*input)(struct sk_buff *skb);
        int (*fill_encap)(struct sk_buff *skb,
@@ -75,7 +76,8 @@ int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops 
*op,
                           unsigned int num);
 int lwtunnel_build_state(struct net_device *dev, u16 encap_type,
                         struct nlattr *encap,
-                        struct lwtunnel_state **lws);
+                        struct lwtunnel_state **lws,
+                        unsigned int family, const void *cfg);
 int lwtunnel_fill_encap(struct sk_buff *skb,
                        struct lwtunnel_state *lwtstate);
 int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate);
@@ -123,7 +125,8 @@ static inline int lwtunnel_encap_del_ops(const struct 
lwtunnel_encap_ops *op,
 
 static inline int lwtunnel_build_state(struct net_device *dev, u16 encap_type,
                                       struct nlattr *encap,
-                                      struct lwtunnel_state **lws)
+                                      struct lwtunnel_state **lws,
+                                      unsigned int family, const void *cfg)
 {
        return -EOPNOTSUPP;
 }
diff --git a/net/core/lwtunnel.c b/net/core/lwtunnel.c
index 3331585..5ee3889 100644
--- a/net/core/lwtunnel.c
+++ b/net/core/lwtunnel.c
@@ -72,7 +72,8 @@ int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops 
*ops,
 EXPORT_SYMBOL(lwtunnel_encap_del_ops);
 
 int lwtunnel_build_state(struct net_device *dev, u16 encap_type,
-                        struct nlattr *encap, struct lwtunnel_state **lws)
+                        struct nlattr *encap, struct lwtunnel_state **lws,
+                        unsigned int family, const void *cfg)
 {
        const struct lwtunnel_encap_ops *ops;
        int ret = -EINVAL;
@@ -85,7 +86,7 @@ int lwtunnel_build_state(struct net_device *dev, u16 
encap_type,
        rcu_read_lock();
        ops = rcu_dereference(lwtun_encaps[encap_type]);
        if (likely(ops && ops->build_state))
-               ret = ops->build_state(dev, encap, lws);
+               ret = ops->build_state(dev, encap, lws, family, cfg);
        rcu_read_unlock();
 
        return ret;
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
index c802585..408e037 100644
--- a/net/ipv4/fib_semantics.c
+++ b/net/ipv4/fib_semantics.c
@@ -511,7 +511,8 @@ static int fib_get_nhs(struct fib_info *fi, struct 
rtnexthop *rtnh,
                                        dev = __dev_get_by_index(net, 
cfg->fc_oif);
                                ret = lwtunnel_build_state(dev, nla_get_u16(
                                                           nla_entype),
-                                                          nla, &lwtstate);
+                                                          nla, &lwtstate,
+                                                          AF_INET, cfg);
                                if (ret)
                                        goto errout;
                                nexthop_nh->nh_lwtstate =
@@ -535,7 +536,8 @@ errout:
 
 int fib_encap_match(struct net *net, u16 encap_type,
                    struct nlattr *encap,
-                   int oif, const struct fib_nh *nh)
+                   int oif, const struct fib_nh *nh,
+                   const struct fib_config *cfg)
 {
        struct lwtunnel_state *lwtstate;
        struct net_device *dev = NULL;
@@ -547,7 +549,8 @@ int fib_encap_match(struct net *net, u16 encap_type,
        if (oif)
                dev = __dev_get_by_index(net, oif);
        ret = lwtunnel_build_state(dev, encap_type,
-                                  encap, &lwtstate);
+                                  encap, &lwtstate,
+                                  AF_INET, cfg);
        if (!ret)
                return lwtunnel_cmp_encap(lwtstate, nh->nh_lwtstate);
 
@@ -569,7 +572,7 @@ int fib_nh_match(struct fib_config *cfg, struct fib_info 
*fi)
                if (cfg->fc_encap) {
                        if (fib_encap_match(net, cfg->fc_encap_type,
                                            cfg->fc_encap, cfg->fc_oif,
-                                           fi->fib_nh))
+                                           fi->fib_nh, cfg))
                            return 1;
                }
                if ((!cfg->fc_oif || cfg->fc_oif == fi->fib_nh->nh_oif) &&
@@ -996,7 +999,8 @@ struct fib_info *fib_create_info(struct fib_config *cfg)
                        if (cfg->fc_oif)
                                dev = __dev_get_by_index(net, cfg->fc_oif);
                        err = lwtunnel_build_state(dev, cfg->fc_encap_type,
-                                                  cfg->fc_encap, &lwtstate);
+                                                  cfg->fc_encap, &lwtstate,
+                                                  AF_INET, cfg);
                        if (err)
                                goto failure;
 
diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c
index fd63196..0c95caa 100644
--- a/net/ipv4/ip_tunnel_core.c
+++ b/net/ipv4/ip_tunnel_core.c
@@ -204,7 +204,8 @@ static const struct nla_policy 
ip_tun_policy[LWTUNNEL_IP_MAX + 1] = {
 };
 
 static int ip_tun_build_state(struct net_device *dev, struct nlattr *attr,
-                             struct lwtunnel_state **ts)
+                             struct lwtunnel_state **ts, unsigned int family,
+                             const void *cfg)
 {
        struct ip_tunnel_info *tun_info;
        struct lwtunnel_state *new_state;
diff --git a/net/ipv6/ila.c b/net/ipv6/ila.c
index 2540ab4..0b955e2 100644
--- a/net/ipv6/ila.c
+++ b/net/ipv6/ila.c
@@ -129,7 +129,8 @@ static struct nla_policy ila_nl_policy[ILA_ATTR_MAX + 1] = {
 };
 
 static int ila_build_state(struct net_device *dev, struct nlattr *nla,
-                          struct lwtunnel_state **ts)
+                          struct lwtunnel_state **ts, unsigned int family,
+                          const void *cfg)
 {
        struct ila_params *p;
        struct nlattr *tb[ILA_ATTR_MAX + 1];
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index c373304..ff3a0f9 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -1781,7 +1781,8 @@ int ip6_route_add(struct fib6_config *cfg)
                struct lwtunnel_state *lwtstate;
 
                err = lwtunnel_build_state(dev, cfg->fc_encap_type,
-                                          cfg->fc_encap, &lwtstate);
+                                          cfg->fc_encap, &lwtstate,
+                                          AF_INET6, cfg);
                if (err)
                        goto out;
                rt->rt6i_lwtstate = lwtstate_get(lwtstate);
diff --git a/net/mpls/mpls_iptunnel.c b/net/mpls/mpls_iptunnel.c
index 276f8c9..4513d22 100644
--- a/net/mpls/mpls_iptunnel.c
+++ b/net/mpls/mpls_iptunnel.c
@@ -126,7 +126,8 @@ drop:
 }
 
 static int mpls_build_state(struct net_device *dev, struct nlattr *nla,
-                           struct lwtunnel_state **ts)
+                           struct lwtunnel_state **ts, unsigned int family,
+                           const void *cfg)
 {
        struct mpls_iptunnel_encap *tun_encap_info;
        struct nlattr *tb[MPLS_IPTUNNEL_MAX + 1];
-- 
1.8.1

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to