| #include <linux/export.h> |
| #include <linux/icmpv6.h> |
| #include <linux/netdevice.h> |
| #include <linux/spinlock.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) ? |
| EXPORT_SYMBOL(inet6_register_icmp_sender); |
| int inet6_unregister_icmp_sender(ip6_icmp_send_t *fn) |
| ret = (cmpxchg((ip6_icmp_send_t **)&ip6_icmp_send, fn, NULL) == fn) ? |
| EXPORT_SYMBOL(inet6_unregister_icmp_sender); |
| void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info) |
| send = rcu_dereference(ip6_icmp_send); |
| send(skb, type, code, info); |
| EXPORT_SYMBOL(icmpv6_send); |