|
@@ -123,18 +123,18 @@ static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb)
|
|
|
}
|
|
|
|
|
|
#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
|
|
|
-static int (*mh_filter)(struct sock *sock, struct sk_buff *skb);
|
|
|
+typedef int mh_filter_t(struct sock *sock, struct sk_buff *skb);
|
|
|
|
|
|
-int rawv6_mh_filter_register(int (*filter)(struct sock *sock,
|
|
|
- struct sk_buff *skb))
|
|
|
+static mh_filter_t __rcu *mh_filter __read_mostly;
|
|
|
+
|
|
|
+int rawv6_mh_filter_register(mh_filter_t filter)
|
|
|
{
|
|
|
rcu_assign_pointer(mh_filter, filter);
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL(rawv6_mh_filter_register);
|
|
|
|
|
|
-int rawv6_mh_filter_unregister(int (*filter)(struct sock *sock,
|
|
|
- struct sk_buff *skb))
|
|
|
+int rawv6_mh_filter_unregister(mh_filter_t filter)
|
|
|
{
|
|
|
rcu_assign_pointer(mh_filter, NULL);
|
|
|
synchronize_rcu();
|
|
@@ -192,10 +192,10 @@ static int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)
|
|
|
* policy is placed in rawv6_rcv() because it is
|
|
|
* required for each socket.
|
|
|
*/
|
|
|
- int (*filter)(struct sock *sock, struct sk_buff *skb);
|
|
|
+ mh_filter_t *filter;
|
|
|
|
|
|
filter = rcu_dereference(mh_filter);
|
|
|
- filtered = filter ? filter(sk, skb) : 0;
|
|
|
+ filtered = filter ? (*filter)(sk, skb) : 0;
|
|
|
break;
|
|
|
}
|
|
|
#endif
|