22 #define pr_fmt(fmt) "IPv6: " fmt
24 #include <linux/icmpv6.h>
26 #include <linux/module.h>
28 #include <linux/netdevice.h>
30 #include <linux/slab.h>
48 for (pprev = (family ==
AF_INET6) ? &tunnel6_handlers : &tunnel46_handlers;
50 lockdep_is_held(&tunnel6_mutex))) !=
NULL;
58 handler->
next = *pprev;
79 for (pprev = (family ==
AF_INET6) ? &tunnel6_handlers : &tunnel46_handlers;
81 lockdep_is_held(&tunnel6_mutex))) !=
NULL;
84 *pprev = handler->
next;
99 #define for_each_tunnel_rcu(head, handler) \
100 for (handler = rcu_dereference(head); \
102 handler = rcu_dereference(handler->next)) \
108 if (!pskb_may_pull(skb,
sizeof(
struct ipv6hdr)))
126 if (!pskb_may_pull(skb,
sizeof(
struct iphdr)))
130 if (!handler->handler(skb))
146 if (!handler->
err_handler(skb, opt, type, code, offset, info))
150 static
const struct inet6_protocol tunnel6_protocol = {
151 .handler = tunnel6_rcv,
152 .err_handler = tunnel6_err,
153 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
156 static const struct inet6_protocol tunnel46_protocol = {
157 .handler = tunnel46_rcv,
158 .err_handler = tunnel6_err,
159 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
162 static int __init tunnel6_init(
void)
165 pr_err(
"%s: can't add protocol\n", __func__);
169 pr_err(
"%s: can't add protocol\n", __func__);
176 static void __exit tunnel6_fini(
void)
179 pr_err(
"%s: can't remove protocol\n", __func__);
181 pr_err(
"%s: can't remove protocol\n", __func__);