-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ipv6: Kill ipv6 dependency of icmpv6_send().
Following patch adds icmp-registration module for ipv6. It allows ipv6 protocol to register icmp_sender which is used for sending ipv6 icmp msgs. This extra layer allows us to kill ipv6 dependency for sending icmp packets. This patch also fixes ip_tunnel compilation problem when ip_tunnel is statically compiled in kernel but ipv6 is module Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Pravin B Shelar
authored and
David S. Miller
committed
Apr 29, 2013
1 parent
a4c4009
commit 5f5624c
Showing
4 changed files
with
83 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
#include <linux/export.h> | ||
#include <linux/icmpv6.h> | ||
#include <linux/mutex.h> | ||
#include <linux/netdevice.h> | ||
#include <linux/spinlock.h> | ||
|
||
#include <net/ipv6.h> | ||
|
||
#if IS_ENABLED(CONFIG_IPV6) | ||
|
||
static ip6_icmp_send_t __rcu *ip6_icmp_send; | ||
|
||
int inet6_register_icmp_sender(ip6_icmp_send_t *fn) | ||
{ | ||
return (cmpxchg((ip6_icmp_send_t **)&ip6_icmp_send, NULL, fn) == NULL) ? | ||
0 : -EBUSY; | ||
} | ||
EXPORT_SYMBOL(inet6_register_icmp_sender); | ||
|
||
int inet6_unregister_icmp_sender(ip6_icmp_send_t *fn) | ||
{ | ||
int ret; | ||
|
||
ret = (cmpxchg((ip6_icmp_send_t **)&ip6_icmp_send, fn, NULL) == fn) ? | ||
0 : -EINVAL; | ||
|
||
synchronize_net(); | ||
|
||
return ret; | ||
} | ||
EXPORT_SYMBOL(inet6_unregister_icmp_sender); | ||
|
||
void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info) | ||
{ | ||
ip6_icmp_send_t *send; | ||
|
||
rcu_read_lock(); | ||
send = rcu_dereference(ip6_icmp_send); | ||
|
||
if (!send) | ||
goto out; | ||
send(skb, type, code, info); | ||
out: | ||
rcu_read_unlock(); | ||
} | ||
EXPORT_SYMBOL(icmpv6_send); | ||
#endif |