Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

lwt: Add cfg argument to build_state

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 parameter 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 <tom@herbertland.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Tom Herbert and committed by
David S. Miller
127eb7cd 54cf7be9

+22 -10
+3
include/net/lwtunnel.h
··· 26 26 27 27 struct lwtunnel_encap_ops { 28 28 int (*build_state)(struct net_device *dev, struct nlattr *encap, 29 + unsigned int family, const void *cfg, 29 30 struct lwtunnel_state **ts); 30 31 int (*output)(struct sock *sk, struct sk_buff *skb); 31 32 int (*input)(struct sk_buff *skb); ··· 81 80 unsigned int num); 82 81 int lwtunnel_build_state(struct net_device *dev, u16 encap_type, 83 82 struct nlattr *encap, 83 + unsigned int family, const void *cfg, 84 84 struct lwtunnel_state **lws); 85 85 int lwtunnel_fill_encap(struct sk_buff *skb, 86 86 struct lwtunnel_state *lwtstate); ··· 132 130 133 131 static inline int lwtunnel_build_state(struct net_device *dev, u16 encap_type, 134 132 struct nlattr *encap, 133 + unsigned int family, const void *cfg, 135 134 struct lwtunnel_state **lws) 136 135 { 137 136 return -EOPNOTSUPP;
+3 -2
net/core/lwtunnel.c
··· 72 72 EXPORT_SYMBOL(lwtunnel_encap_del_ops); 73 73 74 74 int lwtunnel_build_state(struct net_device *dev, u16 encap_type, 75 - struct nlattr *encap, struct lwtunnel_state **lws) 75 + struct nlattr *encap, unsigned int family, 76 + const void *cfg, struct lwtunnel_state **lws) 76 77 { 77 78 const struct lwtunnel_encap_ops *ops; 78 79 int ret = -EINVAL; ··· 86 85 rcu_read_lock(); 87 86 ops = rcu_dereference(lwtun_encaps[encap_type]); 88 87 if (likely(ops && ops->build_state)) 89 - ret = ops->build_state(dev, encap, lws); 88 + ret = ops->build_state(dev, encap, family, cfg, lws); 90 89 rcu_read_unlock(); 91 90 92 91 return ret;
+10 -7
net/ipv4/fib_semantics.c
··· 511 511 dev = __dev_get_by_index(net, cfg->fc_oif); 512 512 ret = lwtunnel_build_state(dev, nla_get_u16( 513 513 nla_entype), 514 - nla, &lwtstate); 514 + nla, AF_INET, cfg, 515 + &lwtstate); 515 516 if (ret) 516 517 goto errout; 517 518 nexthop_nh->nh_lwtstate = ··· 536 535 537 536 static int fib_encap_match(struct net *net, u16 encap_type, 538 537 struct nlattr *encap, 539 - int oif, const struct fib_nh *nh) 538 + int oif, const struct fib_nh *nh, 539 + const struct fib_config *cfg) 540 540 { 541 541 struct lwtunnel_state *lwtstate; 542 542 struct net_device *dev = NULL; ··· 548 546 549 547 if (oif) 550 548 dev = __dev_get_by_index(net, oif); 551 - ret = lwtunnel_build_state(dev, encap_type, 552 - encap, &lwtstate); 549 + ret = lwtunnel_build_state(dev, encap_type, encap, 550 + AF_INET, cfg, &lwtstate); 553 551 if (!ret) { 554 552 result = lwtunnel_cmp_encap(lwtstate, nh->nh_lwtstate); 555 553 lwtstate_free(lwtstate); ··· 573 571 if (cfg->fc_encap) { 574 572 if (fib_encap_match(net, cfg->fc_encap_type, 575 573 cfg->fc_encap, cfg->fc_oif, 576 - fi->fib_nh)) 574 + fi->fib_nh, cfg)) 577 575 return 1; 578 576 } 579 577 if ((!cfg->fc_oif || cfg->fc_oif == fi->fib_nh->nh_oif) && ··· 665 663 static int fib_check_nh(struct fib_config *cfg, struct fib_info *fi, 666 664 struct fib_nh *nh) 667 665 { 668 - int err; 666 + int err = 0; 669 667 struct net *net; 670 668 struct net_device *dev; 671 669 ··· 1007 1005 if (cfg->fc_oif) 1008 1006 dev = __dev_get_by_index(net, cfg->fc_oif); 1009 1007 err = lwtunnel_build_state(dev, cfg->fc_encap_type, 1010 - cfg->fc_encap, &lwtstate); 1008 + cfg->fc_encap, AF_INET, cfg, 1009 + &lwtstate); 1011 1010 if (err) 1012 1011 goto failure; 1013 1012
+2
net/ipv4/ip_tunnel_core.c
··· 204 204 }; 205 205 206 206 static int ip_tun_build_state(struct net_device *dev, struct nlattr *attr, 207 + unsigned int family, const void *cfg, 207 208 struct lwtunnel_state **ts) 208 209 { 209 210 struct ip_tunnel_info *tun_info; ··· 312 311 }; 313 312 314 313 static int ip6_tun_build_state(struct net_device *dev, struct nlattr *attr, 314 + unsigned int family, const void *cfg, 315 315 struct lwtunnel_state **ts) 316 316 { 317 317 struct ip_tunnel_info *tun_info;
+1
net/ipv6/ila.c
··· 123 123 }; 124 124 125 125 static int ila_build_state(struct net_device *dev, struct nlattr *nla, 126 + unsigned int family, const void *cfg, 126 127 struct lwtunnel_state **ts) 127 128 { 128 129 struct ila_params *p;
+2 -1
net/ipv6/route.c
··· 1819 1819 struct lwtunnel_state *lwtstate; 1820 1820 1821 1821 err = lwtunnel_build_state(dev, cfg->fc_encap_type, 1822 - cfg->fc_encap, &lwtstate); 1822 + cfg->fc_encap, AF_INET6, cfg, 1823 + &lwtstate); 1823 1824 if (err) 1824 1825 goto out; 1825 1826 rt->dst.lwtstate = lwtstate_get(lwtstate);
+1
net/mpls/mpls_iptunnel.c
··· 123 123 } 124 124 125 125 static int mpls_build_state(struct net_device *dev, struct nlattr *nla, 126 + unsigned int family, const void *cfg, 126 127 struct lwtunnel_state **ts) 127 128 { 128 129 struct mpls_iptunnel_encap *tun_encap_info;