diff options
| author | Cong Wang <amwang@redhat.com> | 2013-08-31 01:44:30 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-08-31 22:30:00 -0400 |
| commit | 5f81bd2e5d804ca93f3ec8873451b22d2f454721 (patch) | |
| tree | 1c04d4577a3cd91af28753d97c7d6919dc0fcdef | |
| parent | 788787b55913d456b9851d926d9a80ff00892c34 (diff) | |
ipv6: export a stub for IPv6 symbols used by vxlan
In case IPv6 is compiled as a module, introduce a stub
for ipv6_sock_mc_join and ipv6_sock_mc_drop etc.. It will be used
by vxlan module. Suggested by Ben.
This is an ugly but easy solution for now.
Cc: Ben Hutchings <bhutchings@solarflare.com>
Cc: Stephen Hemminger <stephen@networkplumber.org>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <amwang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | include/net/addrconf.h | 15 | ||||
| -rw-r--r-- | net/ipv6/addrconf_core.c | 3 | ||||
| -rw-r--r-- | net/ipv6/af_inet6.c | 11 |
3 files changed, 29 insertions, 0 deletions
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 43fa31a610b8..5339cab356bb 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
| @@ -141,6 +141,21 @@ bool ipv6_chk_mcast_addr(struct net_device *dev, const struct in6_addr *group, | |||
| 141 | const struct in6_addr *src_addr); | 141 | const struct in6_addr *src_addr); |
| 142 | 142 | ||
| 143 | void ipv6_mc_dad_complete(struct inet6_dev *idev); | 143 | void ipv6_mc_dad_complete(struct inet6_dev *idev); |
| 144 | |||
| 145 | /* A stub used by vxlan module. This is ugly, ideally these | ||
| 146 | * symbols should be built into the core kernel. | ||
| 147 | */ | ||
| 148 | struct ipv6_stub { | ||
| 149 | int (*ipv6_sock_mc_join)(struct sock *sk, int ifindex, | ||
| 150 | const struct in6_addr *addr); | ||
| 151 | int (*ipv6_sock_mc_drop)(struct sock *sk, int ifindex, | ||
| 152 | const struct in6_addr *addr); | ||
| 153 | int (*ipv6_dst_lookup)(struct sock *sk, struct dst_entry **dst, | ||
| 154 | struct flowi6 *fl6); | ||
| 155 | void (*udpv6_encap_enable)(void); | ||
| 156 | }; | ||
| 157 | extern const struct ipv6_stub *ipv6_stub __read_mostly; | ||
| 158 | |||
| 144 | /* | 159 | /* |
| 145 | * identify MLD packets for MLD filter exceptions | 160 | * identify MLD packets for MLD filter exceptions |
| 146 | */ | 161 | */ |
diff --git a/net/ipv6/addrconf_core.c b/net/ipv6/addrconf_core.c index d2f87427244b..93b24c6bcae7 100644 --- a/net/ipv6/addrconf_core.c +++ b/net/ipv6/addrconf_core.c | |||
| @@ -98,3 +98,6 @@ int inet6addr_notifier_call_chain(unsigned long val, void *v) | |||
| 98 | return atomic_notifier_call_chain(&inet6addr_chain, val, v); | 98 | return atomic_notifier_call_chain(&inet6addr_chain, val, v); |
| 99 | } | 99 | } |
| 100 | EXPORT_SYMBOL(inet6addr_notifier_call_chain); | 100 | EXPORT_SYMBOL(inet6addr_notifier_call_chain); |
| 101 | |||
| 102 | const struct ipv6_stub *ipv6_stub __read_mostly; | ||
| 103 | EXPORT_SYMBOL_GPL(ipv6_stub); | ||
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 0d1a9b153fbb..0c9c22f7487a 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
| @@ -810,6 +810,13 @@ static struct pernet_operations inet6_net_ops = { | |||
| 810 | .exit = inet6_net_exit, | 810 | .exit = inet6_net_exit, |
| 811 | }; | 811 | }; |
| 812 | 812 | ||
| 813 | static const struct ipv6_stub ipv6_stub_impl = { | ||
| 814 | .ipv6_sock_mc_join = ipv6_sock_mc_join, | ||
| 815 | .ipv6_sock_mc_drop = ipv6_sock_mc_drop, | ||
| 816 | .ipv6_dst_lookup = ip6_dst_lookup, | ||
| 817 | .udpv6_encap_enable = udpv6_encap_enable, | ||
| 818 | }; | ||
| 819 | |||
| 813 | static int __init inet6_init(void) | 820 | static int __init inet6_init(void) |
| 814 | { | 821 | { |
| 815 | struct list_head *r; | 822 | struct list_head *r; |
| @@ -884,6 +891,9 @@ static int __init inet6_init(void) | |||
| 884 | err = igmp6_init(); | 891 | err = igmp6_init(); |
| 885 | if (err) | 892 | if (err) |
| 886 | goto igmp_fail; | 893 | goto igmp_fail; |
| 894 | |||
| 895 | ipv6_stub = &ipv6_stub_impl; | ||
| 896 | |||
| 887 | err = ipv6_netfilter_init(); | 897 | err = ipv6_netfilter_init(); |
| 888 | if (err) | 898 | if (err) |
| 889 | goto netfilter_fail; | 899 | goto netfilter_fail; |
| @@ -1040,6 +1050,7 @@ static void __exit inet6_exit(void) | |||
| 1040 | raw6_proc_exit(); | 1050 | raw6_proc_exit(); |
| 1041 | #endif | 1051 | #endif |
| 1042 | ipv6_netfilter_fini(); | 1052 | ipv6_netfilter_fini(); |
| 1053 | ipv6_stub = NULL; | ||
| 1043 | igmp6_cleanup(); | 1054 | igmp6_cleanup(); |
| 1044 | ndisc_cleanup(); | 1055 | ndisc_cleanup(); |
| 1045 | ip6_mr_cleanup(); | 1056 | ip6_mr_cleanup(); |
