|
18 | 18 | #include <net/ipv6.h>
|
19 | 19 | #include <net/xfrm.h>
|
20 | 20 |
|
21 |
| -/* Informational hook. The decap is still done here. */ |
22 |
| -static struct xfrm_tunnel_notifier __rcu *rcv_notify_handlers __read_mostly; |
23 |
| -static DEFINE_MUTEX(xfrm6_mode_tunnel_input_mutex); |
24 |
| - |
25 |
| -int xfrm6_mode_tunnel_input_register(struct xfrm_tunnel_notifier *handler) |
26 |
| -{ |
27 |
| - struct xfrm_tunnel_notifier __rcu **pprev; |
28 |
| - struct xfrm_tunnel_notifier *t; |
29 |
| - int ret = -EEXIST; |
30 |
| - int priority = handler->priority; |
31 |
| - |
32 |
| - mutex_lock(&xfrm6_mode_tunnel_input_mutex); |
33 |
| - |
34 |
| - for (pprev = &rcv_notify_handlers; |
35 |
| - (t = rcu_dereference_protected(*pprev, |
36 |
| - lockdep_is_held(&xfrm6_mode_tunnel_input_mutex))) != NULL; |
37 |
| - pprev = &t->next) { |
38 |
| - if (t->priority > priority) |
39 |
| - break; |
40 |
| - if (t->priority == priority) |
41 |
| - goto err; |
42 |
| - |
43 |
| - } |
44 |
| - |
45 |
| - handler->next = *pprev; |
46 |
| - rcu_assign_pointer(*pprev, handler); |
47 |
| - |
48 |
| - ret = 0; |
49 |
| - |
50 |
| -err: |
51 |
| - mutex_unlock(&xfrm6_mode_tunnel_input_mutex); |
52 |
| - return ret; |
53 |
| -} |
54 |
| -EXPORT_SYMBOL_GPL(xfrm6_mode_tunnel_input_register); |
55 |
| - |
56 |
| -int xfrm6_mode_tunnel_input_deregister(struct xfrm_tunnel_notifier *handler) |
57 |
| -{ |
58 |
| - struct xfrm_tunnel_notifier __rcu **pprev; |
59 |
| - struct xfrm_tunnel_notifier *t; |
60 |
| - int ret = -ENOENT; |
61 |
| - |
62 |
| - mutex_lock(&xfrm6_mode_tunnel_input_mutex); |
63 |
| - for (pprev = &rcv_notify_handlers; |
64 |
| - (t = rcu_dereference_protected(*pprev, |
65 |
| - lockdep_is_held(&xfrm6_mode_tunnel_input_mutex))) != NULL; |
66 |
| - pprev = &t->next) { |
67 |
| - if (t == handler) { |
68 |
| - *pprev = handler->next; |
69 |
| - ret = 0; |
70 |
| - break; |
71 |
| - } |
72 |
| - } |
73 |
| - mutex_unlock(&xfrm6_mode_tunnel_input_mutex); |
74 |
| - synchronize_net(); |
75 |
| - |
76 |
| - return ret; |
77 |
| -} |
78 |
| -EXPORT_SYMBOL_GPL(xfrm6_mode_tunnel_input_deregister); |
79 |
| - |
80 | 21 | static inline void ipip6_ecn_decapsulate(struct sk_buff *skb)
|
81 | 22 | {
|
82 | 23 | const struct ipv6hdr *outer_iph = ipv6_hdr(skb);
|
@@ -130,17 +71,13 @@ static int xfrm6_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
|
130 | 71 |
|
131 | 72 | static int xfrm6_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb)
|
132 | 73 | {
|
133 |
| - struct xfrm_tunnel_notifier *handler; |
134 | 74 | int err = -EINVAL;
|
135 | 75 |
|
136 | 76 | if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPV6)
|
137 | 77 | goto out;
|
138 | 78 | if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
|
139 | 79 | goto out;
|
140 | 80 |
|
141 |
| - for_each_input_rcu(rcv_notify_handlers, handler) |
142 |
| - handler->handler(skb); |
143 |
| - |
144 | 81 | err = skb_unclone(skb, GFP_ATOMIC);
|
145 | 82 | if (err)
|
146 | 83 | goto out;
|
|
0 commit comments