diff options
author | Steve French <sfrench@us.ibm.com> | 2007-07-18 20:38:57 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2007-07-18 20:38:57 -0400 |
commit | 1ff8392c32a2645d2665ca779ecb91bb29361c13 (patch) | |
tree | 860b95e9a499ade4060848740fc6ce1fbb4e4e8d /net/ipv6 | |
parent | 70b315b0dd3879cb3ab8aadffb14f10b2d19b9c3 (diff) | |
parent | 5bae7ac9feba925fd0099057f6b23d7be80b7b41 (diff) |
Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts:
fs/cifs/export.c
Diffstat (limited to 'net/ipv6')
42 files changed, 647 insertions, 700 deletions
diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig index 8e5d54f23b..eb0b808594 100644 --- a/net/ipv6/Kconfig +++ b/net/ipv6/Kconfig | |||
@@ -109,7 +109,7 @@ config INET6_IPCOMP | |||
109 | If unsure, say Y. | 109 | If unsure, say Y. |
110 | 110 | ||
111 | config IPV6_MIP6 | 111 | config IPV6_MIP6 |
112 | bool "IPv6: Mobility (EXPERIMENTAL)" | 112 | tristate "IPv6: Mobility (EXPERIMENTAL)" |
113 | depends on IPV6 && EXPERIMENTAL | 113 | depends on IPV6 && EXPERIMENTAL |
114 | select XFRM | 114 | select XFRM |
115 | ---help--- | 115 | ---help--- |
diff --git a/net/ipv6/Makefile b/net/ipv6/Makefile index bb33309044..87c23a73d2 100644 --- a/net/ipv6/Makefile +++ b/net/ipv6/Makefile | |||
@@ -14,7 +14,6 @@ ipv6-$(CONFIG_XFRM) += xfrm6_policy.o xfrm6_state.o xfrm6_input.o \ | |||
14 | xfrm6_output.o | 14 | xfrm6_output.o |
15 | ipv6-$(CONFIG_NETFILTER) += netfilter.o | 15 | ipv6-$(CONFIG_NETFILTER) += netfilter.o |
16 | ipv6-$(CONFIG_IPV6_MULTIPLE_TABLES) += fib6_rules.o | 16 | ipv6-$(CONFIG_IPV6_MULTIPLE_TABLES) += fib6_rules.o |
17 | ipv6-$(CONFIG_IPV6_MIP6) += mip6.o | ||
18 | ipv6-$(CONFIG_PROC_FS) += proc.o | 17 | ipv6-$(CONFIG_PROC_FS) += proc.o |
19 | 18 | ||
20 | ipv6-objs += $(ipv6-y) | 19 | ipv6-objs += $(ipv6-y) |
@@ -28,6 +27,7 @@ obj-$(CONFIG_INET6_XFRM_MODE_TRANSPORT) += xfrm6_mode_transport.o | |||
28 | obj-$(CONFIG_INET6_XFRM_MODE_TUNNEL) += xfrm6_mode_tunnel.o | 27 | obj-$(CONFIG_INET6_XFRM_MODE_TUNNEL) += xfrm6_mode_tunnel.o |
29 | obj-$(CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION) += xfrm6_mode_ro.o | 28 | obj-$(CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION) += xfrm6_mode_ro.o |
30 | obj-$(CONFIG_INET6_XFRM_MODE_BEET) += xfrm6_mode_beet.o | 29 | obj-$(CONFIG_INET6_XFRM_MODE_BEET) += xfrm6_mode_beet.o |
30 | obj-$(CONFIG_IPV6_MIP6) += mip6.o | ||
31 | obj-$(CONFIG_NETFILTER) += netfilter/ | 31 | obj-$(CONFIG_NETFILTER) += netfilter/ |
32 | 32 | ||
33 | obj-$(CONFIG_IPV6_SIT) += sit.o | 33 | obj-$(CONFIG_IPV6_SIT) += sit.o |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index f96ed76d8f..0601292091 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -1034,7 +1034,7 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev, | |||
1034 | } | 1034 | } |
1035 | 1035 | ||
1036 | /* Rule 4: Prefer home address */ | 1036 | /* Rule 4: Prefer home address */ |
1037 | #ifdef CONFIG_IPV6_MIP6 | 1037 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
1038 | if (hiscore.rule < 4) { | 1038 | if (hiscore.rule < 4) { |
1039 | if (ifa_result->flags & IFA_F_HOMEADDRESS) | 1039 | if (ifa_result->flags & IFA_F_HOMEADDRESS) |
1040 | hiscore.attrs |= IPV6_SADDR_SCORE_HOA; | 1040 | hiscore.attrs |= IPV6_SADDR_SCORE_HOA; |
@@ -2268,6 +2268,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | |||
2268 | break; | 2268 | break; |
2269 | case NETDEV_UP: | 2269 | case NETDEV_UP: |
2270 | case NETDEV_CHANGE: | 2270 | case NETDEV_CHANGE: |
2271 | if (dev->flags & IFF_SLAVE) | ||
2272 | break; | ||
2273 | |||
2271 | if (event == NETDEV_UP) { | 2274 | if (event == NETDEV_UP) { |
2272 | if (!netif_carrier_ok(dev)) { | 2275 | if (!netif_carrier_ok(dev)) { |
2273 | /* device is not ready yet. */ | 2276 | /* device is not ready yet. */ |
@@ -2472,6 +2475,7 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
2472 | write_unlock_bh(&idev->lock); | 2475 | write_unlock_bh(&idev->lock); |
2473 | 2476 | ||
2474 | __ipv6_ifa_notify(RTM_DELADDR, ifa); | 2477 | __ipv6_ifa_notify(RTM_DELADDR, ifa); |
2478 | atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifa); | ||
2475 | in6_ifa_put(ifa); | 2479 | in6_ifa_put(ifa); |
2476 | 2480 | ||
2477 | write_lock_bh(&idev->lock); | 2481 | write_lock_bh(&idev->lock); |
@@ -2782,7 +2786,7 @@ static int if6_seq_show(struct seq_file *seq, void *v) | |||
2782 | return 0; | 2786 | return 0; |
2783 | } | 2787 | } |
2784 | 2788 | ||
2785 | static struct seq_operations if6_seq_ops = { | 2789 | static const struct seq_operations if6_seq_ops = { |
2786 | .start = if6_seq_start, | 2790 | .start = if6_seq_start, |
2787 | .next = if6_seq_next, | 2791 | .next = if6_seq_next, |
2788 | .show = if6_seq_show, | 2792 | .show = if6_seq_show, |
@@ -2832,7 +2836,7 @@ void if6_proc_exit(void) | |||
2832 | } | 2836 | } |
2833 | #endif /* CONFIG_PROC_FS */ | 2837 | #endif /* CONFIG_PROC_FS */ |
2834 | 2838 | ||
2835 | #ifdef CONFIG_IPV6_MIP6 | 2839 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
2836 | /* Check if address is a home address configured on any interface. */ | 2840 | /* Check if address is a home address configured on any interface. */ |
2837 | int ipv6_chk_home_addr(struct in6_addr *addr) | 2841 | int ipv6_chk_home_addr(struct in6_addr *addr) |
2838 | { | 2842 | { |
@@ -4240,7 +4244,6 @@ errout: | |||
4240 | void __exit addrconf_cleanup(void) | 4244 | void __exit addrconf_cleanup(void) |
4241 | { | 4245 | { |
4242 | struct net_device *dev; | 4246 | struct net_device *dev; |
4243 | struct inet6_dev *idev; | ||
4244 | struct inet6_ifaddr *ifa; | 4247 | struct inet6_ifaddr *ifa; |
4245 | int i; | 4248 | int i; |
4246 | 4249 | ||
@@ -4258,7 +4261,7 @@ void __exit addrconf_cleanup(void) | |||
4258 | */ | 4261 | */ |
4259 | 4262 | ||
4260 | for_each_netdev(dev) { | 4263 | for_each_netdev(dev) { |
4261 | if ((idev = __in6_dev_get(dev)) == NULL) | 4264 | if (__in6_dev_get(dev) == NULL) |
4262 | continue; | 4265 | continue; |
4263 | addrconf_ifdown(dev, 1); | 4266 | addrconf_ifdown(dev, 1); |
4264 | } | 4267 | } |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 6dd377253c..eed09373a4 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -58,9 +58,6 @@ | |||
58 | #ifdef CONFIG_IPV6_TUNNEL | 58 | #ifdef CONFIG_IPV6_TUNNEL |
59 | #include <net/ip6_tunnel.h> | 59 | #include <net/ip6_tunnel.h> |
60 | #endif | 60 | #endif |
61 | #ifdef CONFIG_IPV6_MIP6 | ||
62 | #include <net/mip6.h> | ||
63 | #endif | ||
64 | 61 | ||
65 | #include <asm/uaccess.h> | 62 | #include <asm/uaccess.h> |
66 | #include <asm/system.h> | 63 | #include <asm/system.h> |
@@ -853,9 +850,6 @@ static int __init inet6_init(void) | |||
853 | ipv6_frag_init(); | 850 | ipv6_frag_init(); |
854 | ipv6_nodata_init(); | 851 | ipv6_nodata_init(); |
855 | ipv6_destopt_init(); | 852 | ipv6_destopt_init(); |
856 | #ifdef CONFIG_IPV6_MIP6 | ||
857 | mip6_init(); | ||
858 | #endif | ||
859 | 853 | ||
860 | /* Init v6 transport protocols. */ | 854 | /* Init v6 transport protocols. */ |
861 | udpv6_init(); | 855 | udpv6_init(); |
@@ -921,9 +915,7 @@ static void __exit inet6_exit(void) | |||
921 | 915 | ||
922 | /* Cleanup code parts. */ | 916 | /* Cleanup code parts. */ |
923 | ipv6_packet_cleanup(); | 917 | ipv6_packet_cleanup(); |
924 | #ifdef CONFIG_IPV6_MIP6 | 918 | |
925 | mip6_fini(); | ||
926 | #endif | ||
927 | addrconf_cleanup(); | 919 | addrconf_cleanup(); |
928 | ip6_flowlabel_cleanup(); | 920 | ip6_flowlabel_cleanup(); |
929 | ip6_route_cleanup(); | 921 | ip6_route_cleanup(); |
diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index 128f94c79c..53f46ab6af 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c | |||
@@ -74,7 +74,7 @@ bad: | |||
74 | return 0; | 74 | return 0; |
75 | } | 75 | } |
76 | 76 | ||
77 | #ifdef CONFIG_IPV6_MIP6 | 77 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
78 | /** | 78 | /** |
79 | * ipv6_rearrange_destopt - rearrange IPv6 destination options header | 79 | * ipv6_rearrange_destopt - rearrange IPv6 destination options header |
80 | * @iph: IPv6 header | 80 | * @iph: IPv6 header |
@@ -132,6 +132,8 @@ static void ipv6_rearrange_destopt(struct ipv6hdr *iph, struct ipv6_opt_hdr *des | |||
132 | bad: | 132 | bad: |
133 | return; | 133 | return; |
134 | } | 134 | } |
135 | #else | ||
136 | static void ipv6_rearrange_destopt(struct ipv6hdr *iph, struct ipv6_opt_hdr *destopt) {} | ||
135 | #endif | 137 | #endif |
136 | 138 | ||
137 | /** | 139 | /** |
@@ -189,10 +191,8 @@ static int ipv6_clear_mutable_options(struct ipv6hdr *iph, int len, int dir) | |||
189 | while (exthdr.raw < end) { | 191 | while (exthdr.raw < end) { |
190 | switch (nexthdr) { | 192 | switch (nexthdr) { |
191 | case NEXTHDR_DEST: | 193 | case NEXTHDR_DEST: |
192 | #ifdef CONFIG_IPV6_MIP6 | ||
193 | if (dir == XFRM_POLICY_OUT) | 194 | if (dir == XFRM_POLICY_OUT) |
194 | ipv6_rearrange_destopt(iph, exthdr.opth); | 195 | ipv6_rearrange_destopt(iph, exthdr.opth); |
195 | #endif | ||
196 | case NEXTHDR_HOP: | 196 | case NEXTHDR_HOP: |
197 | if (!zero_out_mutable_opts(exthdr.opth)) { | 197 | if (!zero_out_mutable_opts(exthdr.opth)) { |
198 | LIMIT_NETDEBUG( | 198 | LIMIT_NETDEBUG( |
@@ -228,7 +228,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
228 | u8 nexthdr; | 228 | u8 nexthdr; |
229 | char tmp_base[8]; | 229 | char tmp_base[8]; |
230 | struct { | 230 | struct { |
231 | #ifdef CONFIG_IPV6_MIP6 | 231 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
232 | struct in6_addr saddr; | 232 | struct in6_addr saddr; |
233 | #endif | 233 | #endif |
234 | struct in6_addr daddr; | 234 | struct in6_addr daddr; |
@@ -255,7 +255,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
255 | err = -ENOMEM; | 255 | err = -ENOMEM; |
256 | goto error; | 256 | goto error; |
257 | } | 257 | } |
258 | #ifdef CONFIG_IPV6_MIP6 | 258 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
259 | memcpy(tmp_ext, &top_iph->saddr, extlen); | 259 | memcpy(tmp_ext, &top_iph->saddr, extlen); |
260 | #else | 260 | #else |
261 | memcpy(tmp_ext, &top_iph->daddr, extlen); | 261 | memcpy(tmp_ext, &top_iph->daddr, extlen); |
@@ -294,7 +294,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
294 | 294 | ||
295 | memcpy(top_iph, tmp_base, sizeof(tmp_base)); | 295 | memcpy(top_iph, tmp_base, sizeof(tmp_base)); |
296 | if (tmp_ext) { | 296 | if (tmp_ext) { |
297 | #ifdef CONFIG_IPV6_MIP6 | 297 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
298 | memcpy(&top_iph->saddr, tmp_ext, extlen); | 298 | memcpy(&top_iph->saddr, tmp_ext, extlen); |
299 | #else | 299 | #else |
300 | memcpy(&top_iph->daddr, tmp_ext, extlen); | 300 | memcpy(&top_iph->daddr, tmp_ext, extlen); |
@@ -554,3 +554,4 @@ module_init(ah6_init); | |||
554 | module_exit(ah6_fini); | 554 | module_exit(ah6_fini); |
555 | 555 | ||
556 | MODULE_LICENSE("GPL"); | 556 | MODULE_LICENSE("GPL"); |
557 | MODULE_ALIAS_XFRM_TYPE(AF_INET6, XFRM_PROTO_AH); | ||
diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c index 9b81264eb7..b8c533fbdb 100644 --- a/net/ipv6/anycast.c +++ b/net/ipv6/anycast.c | |||
@@ -539,7 +539,7 @@ static int ac6_seq_show(struct seq_file *seq, void *v) | |||
539 | return 0; | 539 | return 0; |
540 | } | 540 | } |
541 | 541 | ||
542 | static struct seq_operations ac6_seq_ops = { | 542 | static const struct seq_operations ac6_seq_ops = { |
543 | .start = ac6_seq_start, | 543 | .start = ac6_seq_start, |
544 | .next = ac6_seq_next, | 544 | .next = ac6_seq_next, |
545 | .stop = ac6_seq_stop, | 545 | .stop = ac6_seq_stop, |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index b1fe7ac5dc..fe0f49024a 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -657,11 +657,10 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, | |||
657 | rthdr = (struct ipv6_rt_hdr *)CMSG_DATA(cmsg); | 657 | rthdr = (struct ipv6_rt_hdr *)CMSG_DATA(cmsg); |
658 | 658 | ||
659 | switch (rthdr->type) { | 659 | switch (rthdr->type) { |
660 | case IPV6_SRCRT_TYPE_0: | 660 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
661 | #ifdef CONFIG_IPV6_MIP6 | ||
662 | case IPV6_SRCRT_TYPE_2: | 661 | case IPV6_SRCRT_TYPE_2: |
663 | #endif | ||
664 | break; | 662 | break; |
663 | #endif | ||
665 | default: | 664 | default: |
666 | err = -EINVAL; | 665 | err = -EINVAL; |
667 | goto exit_f; | 666 | goto exit_f; |
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index 7107bb7e2e..2db31ce3c7 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c | |||
@@ -421,3 +421,4 @@ module_init(esp6_init); | |||
421 | module_exit(esp6_fini); | 421 | module_exit(esp6_fini); |
422 | 422 | ||
423 | MODULE_LICENSE("GPL"); | 423 | MODULE_LICENSE("GPL"); |
424 | MODULE_ALIAS_XFRM_TYPE(AF_INET6, XFRM_PROTO_ESP); | ||
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 14be0b9b77..c82d4d49f7 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
@@ -42,7 +42,7 @@ | |||
42 | #include <net/ndisc.h> | 42 | #include <net/ndisc.h> |
43 | #include <net/ip6_route.h> | 43 | #include <net/ip6_route.h> |
44 | #include <net/addrconf.h> | 44 | #include <net/addrconf.h> |
45 | #ifdef CONFIG_IPV6_MIP6 | 45 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
46 | #include <net/xfrm.h> | 46 | #include <net/xfrm.h> |
47 | #endif | 47 | #endif |
48 | 48 | ||
@@ -90,6 +90,7 @@ int ipv6_find_tlv(struct sk_buff *skb, int offset, int type) | |||
90 | bad: | 90 | bad: |
91 | return -1; | 91 | return -1; |
92 | } | 92 | } |
93 | EXPORT_SYMBOL_GPL(ipv6_find_tlv); | ||
93 | 94 | ||
94 | /* | 95 | /* |
95 | * Parsing tlv encoded headers. | 96 | * Parsing tlv encoded headers. |
@@ -196,7 +197,7 @@ bad: | |||
196 | Destination options header. | 197 | Destination options header. |
197 | *****************************/ | 198 | *****************************/ |
198 | 199 | ||
199 | #ifdef CONFIG_IPV6_MIP6 | 200 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
200 | static int ipv6_dest_hao(struct sk_buff **skbp, int optoff) | 201 | static int ipv6_dest_hao(struct sk_buff **skbp, int optoff) |
201 | { | 202 | { |
202 | struct sk_buff *skb = *skbp; | 203 | struct sk_buff *skb = *skbp; |
@@ -270,7 +271,7 @@ static int ipv6_dest_hao(struct sk_buff **skbp, int optoff) | |||
270 | #endif | 271 | #endif |
271 | 272 | ||
272 | static struct tlvtype_proc tlvprocdestopt_lst[] = { | 273 | static struct tlvtype_proc tlvprocdestopt_lst[] = { |
273 | #ifdef CONFIG_IPV6_MIP6 | 274 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
274 | { | 275 | { |
275 | .type = IPV6_TLV_HAO, | 276 | .type = IPV6_TLV_HAO, |
276 | .func = ipv6_dest_hao, | 277 | .func = ipv6_dest_hao, |
@@ -283,7 +284,7 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp) | |||
283 | { | 284 | { |
284 | struct sk_buff *skb = *skbp; | 285 | struct sk_buff *skb = *skbp; |
285 | struct inet6_skb_parm *opt = IP6CB(skb); | 286 | struct inet6_skb_parm *opt = IP6CB(skb); |
286 | #ifdef CONFIG_IPV6_MIP6 | 287 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
287 | __u16 dstbuf; | 288 | __u16 dstbuf; |
288 | #endif | 289 | #endif |
289 | struct dst_entry *dst; | 290 | struct dst_entry *dst; |
@@ -298,7 +299,7 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp) | |||
298 | } | 299 | } |
299 | 300 | ||
300 | opt->lastopt = opt->dst1 = skb_network_header_len(skb); | 301 | opt->lastopt = opt->dst1 = skb_network_header_len(skb); |
301 | #ifdef CONFIG_IPV6_MIP6 | 302 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
302 | dstbuf = opt->dst1; | 303 | dstbuf = opt->dst1; |
303 | #endif | 304 | #endif |
304 | 305 | ||
@@ -308,7 +309,7 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp) | |||
308 | skb = *skbp; | 309 | skb = *skbp; |
309 | skb->transport_header += (skb_transport_header(skb)[1] + 1) << 3; | 310 | skb->transport_header += (skb_transport_header(skb)[1] + 1) << 3; |
310 | opt = IP6CB(skb); | 311 | opt = IP6CB(skb); |
311 | #ifdef CONFIG_IPV6_MIP6 | 312 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
312 | opt->nhoff = dstbuf; | 313 | opt->nhoff = dstbuf; |
313 | #else | 314 | #else |
314 | opt->nhoff = opt->dst1; | 315 | opt->nhoff = opt->dst1; |
@@ -371,22 +372,13 @@ static int ipv6_rthdr_rcv(struct sk_buff **skbp) | |||
371 | struct rt0_hdr *rthdr; | 372 | struct rt0_hdr *rthdr; |
372 | int accept_source_route = ipv6_devconf.accept_source_route; | 373 | int accept_source_route = ipv6_devconf.accept_source_route; |
373 | 374 | ||
374 | if (accept_source_route < 0 || | 375 | idev = in6_dev_get(skb->dev); |
375 | ((idev = in6_dev_get(skb->dev)) == NULL)) { | 376 | if (idev) { |
376 | kfree_skb(skb); | 377 | if (accept_source_route > idev->cnf.accept_source_route) |
377 | return -1; | 378 | accept_source_route = idev->cnf.accept_source_route; |
378 | } | ||
379 | if (idev->cnf.accept_source_route < 0) { | ||
380 | in6_dev_put(idev); | 379 | in6_dev_put(idev); |
381 | kfree_skb(skb); | ||
382 | return -1; | ||
383 | } | 380 | } |
384 | 381 | ||
385 | if (accept_source_route > idev->cnf.accept_source_route) | ||
386 | accept_source_route = idev->cnf.accept_source_route; | ||
387 | |||
388 | in6_dev_put(idev); | ||
389 | |||
390 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || | 382 | if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) || |
391 | !pskb_may_pull(skb, (skb_transport_offset(skb) + | 383 | !pskb_may_pull(skb, (skb_transport_offset(skb) + |
392 | ((skb_transport_header(skb)[1] + 1) << 3)))) { | 384 | ((skb_transport_header(skb)[1] + 1) << 3)))) { |
@@ -398,24 +390,6 @@ static int ipv6_rthdr_rcv(struct sk_buff **skbp) | |||
398 | 390 | ||
399 | hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb); | 391 | hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb); |
400 | 392 | ||
401 | switch (hdr->type) { | ||
402 | #ifdef CONFIG_IPV6_MIP6 | ||
403 | case IPV6_SRCRT_TYPE_2: | ||
404 | break; | ||
405 | #endif | ||
406 | case IPV6_SRCRT_TYPE_0: | ||
407 | if (accept_source_route > 0) | ||
408 | break; | ||
409 | kfree_skb(skb); | ||
410 | return -1; | ||
411 | default: | ||
412 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | ||
413 | IPSTATS_MIB_INHDRERRORS); | ||
414 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, | ||
415 | (&hdr->type) - skb_network_header(skb)); | ||
416 | return -1; | ||
417 | } | ||
418 | |||
419 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) || | 393 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr) || |
420 | skb->pkt_type != PACKET_HOST) { | 394 | skb->pkt_type != PACKET_HOST) { |
421 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 395 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), |
@@ -427,7 +401,7 @@ static int ipv6_rthdr_rcv(struct sk_buff **skbp) | |||
427 | looped_back: | 401 | looped_back: |
428 | if (hdr->segments_left == 0) { | 402 | if (hdr->segments_left == 0) { |
429 | switch (hdr->type) { | 403 | switch (hdr->type) { |
430 | #ifdef CONFIG_IPV6_MIP6 | 404 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
431 | case IPV6_SRCRT_TYPE_2: | 405 | case IPV6_SRCRT_TYPE_2: |
432 | /* Silently discard type 2 header unless it was | 406 | /* Silently discard type 2 header unless it was |
433 | * processed by own | 407 | * processed by own |
@@ -453,18 +427,10 @@ looped_back: | |||
453 | } | 427 | } |
454 | 428 | ||
455 | switch (hdr->type) { | 429 | switch (hdr->type) { |
456 | case IPV6_SRCRT_TYPE_0: | 430 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
457 | if (hdr->hdrlen & 0x01) { | ||
458 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | ||
459 | IPSTATS_MIB_INHDRERRORS); | ||
460 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, | ||
461 | ((&hdr->hdrlen) - | ||
462 | skb_network_header(skb))); | ||
463 | return -1; | ||
464 | } | ||
465 | break; | ||
466 | #ifdef CONFIG_IPV6_MIP6 | ||
467 | case IPV6_SRCRT_TYPE_2: | 431 | case IPV6_SRCRT_TYPE_2: |
432 | if (accept_source_route < 0) | ||
433 | goto unknown_rh; | ||
468 | /* Silently discard invalid RTH type 2 */ | 434 | /* Silently discard invalid RTH type 2 */ |
469 | if (hdr->hdrlen != 2 || hdr->segments_left != 1) { | 435 | if (hdr->hdrlen != 2 || hdr->segments_left != 1) { |
470 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), | 436 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), |
@@ -474,6 +440,8 @@ looped_back: | |||
474 | } | 440 | } |
475 | break; | 441 | break; |
476 | #endif | 442 | #endif |
443 | default: | ||
444 | goto unknown_rh; | ||
477 | } | 445 | } |
478 | 446 | ||
479 | /* | 447 | /* |
@@ -520,7 +488,7 @@ looped_back: | |||
520 | addr += i - 1; | 488 | addr += i - 1; |
521 | 489 | ||
522 | switch (hdr->type) { | 490 | switch (hdr->type) { |
523 | #ifdef CONFIG_IPV6_MIP6 | 491 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
524 | case IPV6_SRCRT_TYPE_2: | 492 | case IPV6_SRCRT_TYPE_2: |
525 | if (xfrm6_input_addr(skb, (xfrm_address_t *)addr, | 493 | if (xfrm6_input_addr(skb, (xfrm_address_t *)addr, |
526 | (xfrm_address_t *)&ipv6_hdr(skb)->saddr, | 494 | (xfrm_address_t *)&ipv6_hdr(skb)->saddr, |
@@ -577,6 +545,12 @@ looped_back: | |||
577 | skb_push(skb, skb->data - skb_network_header(skb)); | 545 | skb_push(skb, skb->data - skb_network_header(skb)); |
578 | dst_input(skb); | 546 | dst_input(skb); |
579 | return -1; | 547 | return -1; |
548 | |||
549 | unknown_rh: | ||
550 | IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS); | ||
551 | icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, | ||
552 | (&hdr->type) - skb_network_header(skb)); | ||
553 | return -1; | ||
580 | } | 554 | } |
581 | 555 | ||
582 | static struct inet6_protocol rthdr_protocol = { | 556 | static struct inet6_protocol rthdr_protocol = { |
@@ -590,72 +564,6 @@ void __init ipv6_rthdr_init(void) | |||
590 | printk(KERN_ERR "ipv6_rthdr_init: Could not register protocol\n"); | 564 | printk(KERN_ERR "ipv6_rthdr_init: Could not register protocol\n"); |
591 | }; | 565 | }; |
592 | 566 | ||
593 | /* | ||
594 | This function inverts received rthdr. | ||
595 | NOTE: specs allow to make it automatically only if | ||
596 | packet authenticated. | ||
597 | |||
598 | I will not discuss it here (though, I am really pissed off at | ||
599 | this stupid requirement making rthdr idea useless) | ||
600 | |||
601 | Actually, it creates severe problems for us. | ||
602 | Embryonic requests has no associated sockets, | ||
603 | so that user have no control over it and | ||
604 | cannot not only to set reply options, but | ||
605 | even to know, that someone wants to connect | ||
606 | without success. :-( | ||
607 | |||
608 | For now we need to test the engine, so that I created | ||
609 | temporary (or permanent) backdoor. | ||
610 | If listening socket set IPV6_RTHDR to 2, then we invert header. | ||
611 | --ANK (980729) | ||
612 | */ | ||
613 | |||
614 | struct ipv6_txoptions * | ||
615 | ipv6_invert_rthdr(struct sock *sk, struct ipv6_rt_hdr *hdr) | ||
616 | { | ||
617 | /* Received rthdr: | ||
618 | |||
619 | [ H1 -> H2 -> ... H_prev ] daddr=ME | ||
620 | |||
621 | Inverted result: | ||
622 | [ H_prev -> ... -> H1 ] daddr =sender | ||
623 | |||
624 | Note, that IP output engine will rewrite this rthdr | ||
625 | by rotating it left by one addr. | ||
626 | */ | ||
627 | |||
628 | int n, i; | ||
629 | struct rt0_hdr *rthdr = (struct rt0_hdr*)hdr; | ||
630 | struct rt0_hdr *irthdr; | ||
631 | struct ipv6_txoptions *opt; | ||
632 | int hdrlen = ipv6_optlen(hdr); | ||
633 | |||
634 | if (hdr->segments_left || | ||
635 | hdr->type != IPV6_SRCRT_TYPE_0 || | ||
636 | hdr->hdrlen & 0x01) | ||
637 | return NULL; | ||
638 | |||
639 | n = hdr->hdrlen >> 1; | ||
640 | opt = sock_kmalloc(sk, sizeof(*opt) + hdrlen, GFP_ATOMIC); | ||
641 | if (opt == NULL) | ||
642 | return NULL; | ||
643 | memset(opt, 0, sizeof(*opt)); | ||
644 | opt->tot_len = sizeof(*opt) + hdrlen; | ||
645 | opt->srcrt = (void*)(opt+1); | ||
646 | opt->opt_nflen = hdrlen; | ||
647 | |||
648 | memcpy(opt->srcrt, hdr, sizeof(*hdr)); | ||
649 | irthdr = (struct rt0_hdr*)opt->srcrt; | ||
650 | irthdr->reserved = 0; | ||
651 | opt->srcrt->segments_left = n; | ||
652 | for (i=0; i<n; i++) | ||
653 | memcpy(irthdr->addr+i, rthdr->addr+(n-1-i), 16); | ||
654 | return opt; | ||
655 | } | ||
656 | |||
657 | EXPORT_SYMBOL_GPL(ipv6_invert_rthdr); | ||
658 | |||
659 | /********************************** | 567 | /********************************** |
660 | Hop-by-hop options. | 568 | Hop-by-hop options. |
661 | **********************************/ | 569 | **********************************/ |
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index e9bcce9e7b..6a6714d154 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
@@ -272,7 +272,7 @@ static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, st | |||
272 | return 0; | 272 | return 0; |
273 | } | 273 | } |
274 | 274 | ||
275 | #ifdef CONFIG_IPV6_MIP6 | 275 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
276 | static void mip6_addr_swap(struct sk_buff *skb) | 276 | static void mip6_addr_swap(struct sk_buff *skb) |
277 | { | 277 | { |
278 | struct ipv6hdr *iph = ipv6_hdr(skb); | 278 | struct ipv6hdr *iph = ipv6_hdr(skb); |
@@ -604,7 +604,7 @@ static void icmpv6_notify(struct sk_buff *skb, int type, int code, __be32 info) | |||
604 | 604 | ||
605 | read_lock(&raw_v6_lock); | 605 | read_lock(&raw_v6_lock); |
606 | if ((sk = sk_head(&raw_v6_htable[hash])) != NULL) { | 606 | if ((sk = sk_head(&raw_v6_htable[hash])) != NULL) { |
607 | while((sk = __raw_v6_lookup(sk, nexthdr, daddr, saddr, | 607 | while ((sk = __raw_v6_lookup(sk, nexthdr, saddr, daddr, |
608 | IP6CB(skb)->iif))) { | 608 | IP6CB(skb)->iif))) { |
609 | rawv6_err(sk, skb, NULL, type, code, inner_offset, info); | 609 | rawv6_err(sk, skb, NULL, type, code, inner_offset, info); |
610 | sk = sk_next(sk); | 610 | sk = sk_next(sk); |
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index c206a152ed..413a4ebb19 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c | |||
@@ -648,7 +648,7 @@ static int ip6fl_seq_show(struct seq_file *seq, void *v) | |||
648 | return 0; | 648 | return 0; |
649 | } | 649 | } |
650 | 650 | ||
651 | static struct seq_operations ip6fl_seq_ops = { | 651 | static const struct seq_operations ip6fl_seq_ops = { |
652 | .start = ip6fl_seq_start, | 652 | .start = ip6fl_seq_start, |
653 | .next = ip6fl_seq_next, | 653 | .next = ip6fl_seq_next, |
654 | .stop = ip6fl_seq_stop, | 654 | .stop = ip6fl_seq_stop, |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 4704b5fc30..50d86e94d9 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -521,6 +521,10 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from) | |||
521 | to->tc_index = from->tc_index; | 521 | to->tc_index = from->tc_index; |
522 | #endif | 522 | #endif |
523 | nf_copy(to, from); | 523 | nf_copy(to, from); |
524 | #if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \ | ||
525 | defined(CONFIG_NETFILTER_XT_TARGET_TRACE_MODULE) | ||
526 | to->nf_trace = from->nf_trace; | ||
527 | #endif | ||
524 | skb_copy_secmark(to, from); | 528 | skb_copy_secmark(to, from); |
525 | } | 529 | } |
526 | 530 | ||
@@ -543,7 +547,7 @@ int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) | |||
543 | found_rhdr = 1; | 547 | found_rhdr = 1; |
544 | break; | 548 | break; |
545 | case NEXTHDR_DEST: | 549 | case NEXTHDR_DEST: |
546 | #ifdef CONFIG_IPV6_MIP6 | 550 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
547 | if (ipv6_find_tlv(skb, offset, IPV6_TLV_HAO) >= 0) | 551 | if (ipv6_find_tlv(skb, offset, IPV6_TLV_HAO) >= 0) |
548 | break; | 552 | break; |
549 | #endif | 553 | #endif |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index a0902fbdb4..281aee42d3 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -883,8 +883,8 @@ static int ip6_tnl_xmit2(struct sk_buff *skb, | |||
883 | */ | 883 | */ |
884 | max_headroom += LL_RESERVED_SPACE(tdev); | 884 | max_headroom += LL_RESERVED_SPACE(tdev); |
885 | 885 | ||
886 | if (skb_headroom(skb) < max_headroom || | 886 | if (skb_headroom(skb) < max_headroom || skb_shared(skb) || |
887 | skb_cloned(skb) || skb_shared(skb)) { | 887 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { |
888 | struct sk_buff *new_skb; | 888 | struct sk_buff *new_skb; |
889 | 889 | ||
890 | if (!(new_skb = skb_realloc_headroom(skb, max_headroom))) | 890 | if (!(new_skb = skb_realloc_headroom(skb, max_headroom))) |
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c index 1ee50b5782..473f165310 100644 --- a/net/ipv6/ipcomp6.c +++ b/net/ipv6/ipcomp6.c | |||
@@ -500,4 +500,4 @@ MODULE_LICENSE("GPL"); | |||
500 | MODULE_DESCRIPTION("IP Payload Compression Protocol (IPComp) for IPv6 - RFC3173"); | 500 | MODULE_DESCRIPTION("IP Payload Compression Protocol (IPComp) for IPv6 - RFC3173"); |
501 | MODULE_AUTHOR("Mitsuru KANDA <mk@linux-ipv6.org>"); | 501 | MODULE_AUTHOR("Mitsuru KANDA <mk@linux-ipv6.org>"); |
502 | 502 | ||
503 | 503 | MODULE_ALIAS_XFRM_TYPE(AF_INET6, XFRM_PROTO_COMP); | |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index aa3d07c52a..d684639318 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -123,7 +123,7 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, int features) | |||
123 | struct ipv6hdr *ipv6h; | 123 | struct ipv6hdr *ipv6h; |
124 | struct inet6_protocol *ops; | 124 | struct inet6_protocol *ops; |
125 | 125 | ||
126 | if (!(features & NETIF_F_HW_CSUM)) | 126 | if (!(features & NETIF_F_V6_CSUM)) |
127 | features &= ~NETIF_F_SG; | 127 | features &= ~NETIF_F_SG; |
128 | 128 | ||
129 | if (unlikely(skb_shinfo(skb)->gso_type & | 129 | if (unlikely(skb_shinfo(skb)->gso_type & |
@@ -336,16 +336,12 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
336 | break; | 336 | break; |
337 | 337 | ||
338 | case IPV6_RECVRTHDR: | 338 | case IPV6_RECVRTHDR: |
339 | if (val < 0 || val > 2) | 339 | np->rxopt.bits.srcrt = valbool; |
340 | goto e_inval; | ||
341 | np->rxopt.bits.srcrt = val; | ||
342 | retv = 0; | 340 | retv = 0; |
343 | break; | 341 | break; |
344 | 342 | ||
345 | case IPV6_2292RTHDR: | 343 | case IPV6_2292RTHDR: |
346 | if (val < 0 || val > 2) | 344 | np->rxopt.bits.osrcrt = valbool; |
347 | goto e_inval; | ||
348 | np->rxopt.bits.osrcrt = val; | ||
349 | retv = 0; | 345 | retv = 0; |
350 | break; | 346 | break; |
351 | 347 | ||
@@ -416,11 +412,10 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
416 | if (optname == IPV6_RTHDR && opt && opt->srcrt) { | 412 | if (optname == IPV6_RTHDR && opt && opt->srcrt) { |
417 | struct ipv6_rt_hdr *rthdr = opt->srcrt; | 413 | struct ipv6_rt_hdr *rthdr = opt->srcrt; |
418 | switch (rthdr->type) { | 414 | switch (rthdr->type) { |
419 | case IPV6_SRCRT_TYPE_0: | 415 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
420 | #ifdef CONFIG_IPV6_MIP6 | ||
421 | case IPV6_SRCRT_TYPE_2: | 416 | case IPV6_SRCRT_TYPE_2: |
422 | #endif | ||
423 | break; | 417 | break; |
418 | #endif | ||
424 | default: | 419 | default: |
425 | goto sticky_done; | 420 | goto sticky_done; |
426 | } | 421 | } |
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 3e308fb41b..ae9881832a 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -2423,7 +2423,7 @@ static int igmp6_mc_seq_show(struct seq_file *seq, void *v) | |||
2423 | return 0; | 2423 | return 0; |
2424 | } | 2424 | } |
2425 | 2425 | ||
2426 | static struct seq_operations igmp6_mc_seq_ops = { | 2426 | static const struct seq_operations igmp6_mc_seq_ops = { |
2427 | .start = igmp6_mc_seq_start, | 2427 | .start = igmp6_mc_seq_start, |
2428 | .next = igmp6_mc_seq_next, | 2428 | .next = igmp6_mc_seq_next, |
2429 | .stop = igmp6_mc_seq_stop, | 2429 | .stop = igmp6_mc_seq_stop, |
@@ -2597,7 +2597,7 @@ static int igmp6_mcf_seq_show(struct seq_file *seq, void *v) | |||
2597 | return 0; | 2597 | return 0; |
2598 | } | 2598 | } |
2599 | 2599 | ||
2600 | static struct seq_operations igmp6_mcf_seq_ops = { | 2600 | static const struct seq_operations igmp6_mcf_seq_ops = { |
2601 | .start = igmp6_mcf_seq_start, | 2601 | .start = igmp6_mcf_seq_start, |
2602 | .next = igmp6_mcf_seq_next, | 2602 | .next = igmp6_mcf_seq_next, |
2603 | .stop = igmp6_mcf_seq_stop, | 2603 | .stop = igmp6_mcf_seq_stop, |
diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c index 13b7160fb8..8a1399ce38 100644 --- a/net/ipv6/mip6.c +++ b/net/ipv6/mip6.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <net/sock.h> | 30 | #include <net/sock.h> |
31 | #include <net/ipv6.h> | 31 | #include <net/ipv6.h> |
32 | #include <net/ip6_checksum.h> | 32 | #include <net/ip6_checksum.h> |
33 | #include <net/rawv6.h> | ||
33 | #include <net/xfrm.h> | 34 | #include <net/xfrm.h> |
34 | #include <net/mip6.h> | 35 | #include <net/mip6.h> |
35 | 36 | ||
@@ -86,7 +87,7 @@ static int mip6_mh_len(int type) | |||
86 | return len; | 87 | return len; |
87 | } | 88 | } |
88 | 89 | ||
89 | int mip6_mh_filter(struct sock *sk, struct sk_buff *skb) | 90 | static int mip6_mh_filter(struct sock *sk, struct sk_buff *skb) |
90 | { | 91 | { |
91 | struct ip6_mh *mh; | 92 | struct ip6_mh *mh; |
92 | 93 | ||
@@ -471,7 +472,7 @@ static struct xfrm_type mip6_rthdr_type = | |||
471 | .remote_addr = mip6_xfrm_addr, | 472 | .remote_addr = mip6_xfrm_addr, |
472 | }; | 473 | }; |
473 | 474 | ||
474 | int __init mip6_init(void) | 475 | static int __init mip6_init(void) |
475 | { | 476 | { |
476 | printk(KERN_INFO "Mobile IPv6\n"); | 477 | printk(KERN_INFO "Mobile IPv6\n"); |
477 | 478 | ||
@@ -483,18 +484,35 @@ int __init mip6_init(void) | |||
483 | printk(KERN_INFO "%s: can't add xfrm type(rthdr)\n", __FUNCTION__); | 484 | printk(KERN_INFO "%s: can't add xfrm type(rthdr)\n", __FUNCTION__); |
484 | goto mip6_rthdr_xfrm_fail; | 485 | goto mip6_rthdr_xfrm_fail; |
485 | } | 486 | } |
487 | if (rawv6_mh_filter_register(mip6_mh_filter) < 0) { | ||
488 | printk(KERN_INFO "%s: can't add rawv6 mh filter\n", __FUNCTION__); | ||
489 | goto mip6_rawv6_mh_fail; | ||
490 | } | ||
491 | |||
492 | |||
486 | return 0; | 493 | return 0; |
487 | 494 | ||
495 | mip6_rawv6_mh_fail: | ||
496 | xfrm_unregister_type(&mip6_rthdr_type, AF_INET6); | ||
488 | mip6_rthdr_xfrm_fail: | 497 | mip6_rthdr_xfrm_fail: |
489 | xfrm_unregister_type(&mip6_destopt_type, AF_INET6); | 498 | xfrm_unregister_type(&mip6_destopt_type, AF_INET6); |
490 | mip6_destopt_xfrm_fail: | 499 | mip6_destopt_xfrm_fail: |
491 | return -EAGAIN; | 500 | return -EAGAIN; |
492 | } | 501 | } |
493 | 502 | ||
494 | void __exit mip6_fini(void) | 503 | static void __exit mip6_fini(void) |
495 | { | 504 | { |
505 | if (rawv6_mh_filter_unregister(mip6_mh_filter) < 0) | ||
506 | printk(KERN_INFO "%s: can't remove rawv6 mh filter\n", __FUNCTION__); | ||
496 | if (xfrm_unregister_type(&mip6_rthdr_type, AF_INET6) < 0) | 507 | if (xfrm_unregister_type(&mip6_rthdr_type, AF_INET6) < 0) |
497 | printk(KERN_INFO "%s: can't remove xfrm type(rthdr)\n", __FUNCTION__); | 508 | printk(KERN_INFO "%s: can't remove xfrm type(rthdr)\n", __FUNCTION__); |
498 | if (xfrm_unregister_type(&mip6_destopt_type, AF_INET6) < 0) | 509 | if (xfrm_unregister_type(&mip6_destopt_type, AF_INET6) < 0) |
499 | printk(KERN_INFO "%s: can't remove xfrm type(destopt)\n", __FUNCTION__); | 510 | printk(KERN_INFO "%s: can't remove xfrm type(destopt)\n", __FUNCTION__); |
500 | } | 511 | } |
512 | |||
513 | module_init(mip6_init); | ||
514 | module_exit(mip6_fini); | ||
515 | |||
516 | MODULE_LICENSE("GPL"); | ||
517 | MODULE_ALIAS_XFRM_TYPE(AF_INET6, XFRM_PROTO_DSTOPTS); | ||
518 | MODULE_ALIAS_XFRM_TYPE(AF_INET6, XFRM_PROTO_ROUTING); | ||
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index d8b36451ba..0358e6066a 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -1062,7 +1062,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) | |||
1062 | pref = ra_msg->icmph.icmp6_router_pref; | 1062 | pref = ra_msg->icmph.icmp6_router_pref; |
1063 | /* 10b is handled as if it were 00b (medium) */ | 1063 | /* 10b is handled as if it were 00b (medium) */ |
1064 | if (pref == ICMPV6_ROUTER_PREF_INVALID || | 1064 | if (pref == ICMPV6_ROUTER_PREF_INVALID || |
1065 | in6_dev->cnf.accept_ra_rtr_pref) | 1065 | !in6_dev->cnf.accept_ra_rtr_pref) |
1066 | pref = ICMPV6_ROUTER_PREF_MEDIUM; | 1066 | pref = ICMPV6_ROUTER_PREF_MEDIUM; |
1067 | #endif | 1067 | #endif |
1068 | 1068 | ||
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 9aa6240266..aeda617246 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
@@ -96,13 +96,13 @@ ip6t_ext_hdr(u8 nexthdr) | |||
96 | } | 96 | } |
97 | 97 | ||
98 | /* Returns whether matches rule or not. */ | 98 | /* Returns whether matches rule or not. */ |
99 | static inline int | 99 | static inline bool |
100 | ip6_packet_match(const struct sk_buff *skb, | 100 | ip6_packet_match(const struct sk_buff *skb, |
101 | const char *indev, | 101 | const char *indev, |
102 | const char *outdev, | 102 | const char *outdev, |
103 | const struct ip6t_ip6 *ip6info, | 103 | const struct ip6t_ip6 *ip6info, |
104 | unsigned int *protoff, | 104 | unsigned int *protoff, |
105 | int *fragoff, int *hotdrop) | 105 | int *fragoff, bool *hotdrop) |
106 | { | 106 | { |
107 | size_t i; | 107 | size_t i; |
108 | unsigned long ret; | 108 | unsigned long ret; |
@@ -122,7 +122,7 @@ ip6_packet_match(const struct sk_buff *skb, | |||
122 | dprintf("DST: %u. Mask: %u. Target: %u.%s\n", ip->daddr, | 122 | dprintf("DST: %u. Mask: %u. Target: %u.%s\n", ip->daddr, |
123 | ipinfo->dmsk.s_addr, ipinfo->dst.s_addr, | 123 | ipinfo->dmsk.s_addr, ipinfo->dst.s_addr, |
124 | ipinfo->invflags & IP6T_INV_DSTIP ? " (INV)" : "");*/ | 124 | ipinfo->invflags & IP6T_INV_DSTIP ? " (INV)" : "");*/ |
125 | return 0; | 125 | return false; |
126 | } | 126 | } |
127 | 127 | ||
128 | /* Look for ifname matches; this should unroll nicely. */ | 128 | /* Look for ifname matches; this should unroll nicely. */ |
@@ -136,7 +136,7 @@ ip6_packet_match(const struct sk_buff *skb, | |||
136 | dprintf("VIA in mismatch (%s vs %s).%s\n", | 136 | dprintf("VIA in mismatch (%s vs %s).%s\n", |
137 | indev, ip6info->iniface, | 137 | indev, ip6info->iniface, |
138 | ip6info->invflags&IP6T_INV_VIA_IN ?" (INV)":""); | 138 | ip6info->invflags&IP6T_INV_VIA_IN ?" (INV)":""); |
139 | return 0; | 139 | return false; |
140 | } | 140 | } |
141 | 141 | ||
142 | for (i = 0, ret = 0; i < IFNAMSIZ/sizeof(unsigned long); i++) { | 142 | for (i = 0, ret = 0; i < IFNAMSIZ/sizeof(unsigned long); i++) { |
@@ -149,7 +149,7 @@ ip6_packet_match(const struct sk_buff *skb, | |||
149 | dprintf("VIA out mismatch (%s vs %s).%s\n", | 149 | dprintf("VIA out mismatch (%s vs %s).%s\n", |
150 | outdev, ip6info->outiface, | 150 | outdev, ip6info->outiface, |
151 | ip6info->invflags&IP6T_INV_VIA_OUT ?" (INV)":""); | 151 | ip6info->invflags&IP6T_INV_VIA_OUT ?" (INV)":""); |
152 | return 0; | 152 | return false; |
153 | } | 153 | } |
154 | 154 | ||
155 | /* ... might want to do something with class and flowlabel here ... */ | 155 | /* ... might want to do something with class and flowlabel here ... */ |
@@ -162,8 +162,8 @@ ip6_packet_match(const struct sk_buff *skb, | |||
162 | protohdr = ipv6_find_hdr(skb, protoff, -1, &_frag_off); | 162 | protohdr = ipv6_find_hdr(skb, protoff, -1, &_frag_off); |
163 | if (protohdr < 0) { | 163 | if (protohdr < 0) { |
164 | if (_frag_off == 0) | 164 | if (_frag_off == 0) |
165 | *hotdrop = 1; | 165 | *hotdrop = true; |
166 | return 0; | 166 | return false; |
167 | } | 167 | } |
168 | *fragoff = _frag_off; | 168 | *fragoff = _frag_off; |
169 | 169 | ||
@@ -174,34 +174,34 @@ ip6_packet_match(const struct sk_buff *skb, | |||
174 | 174 | ||
175 | if (ip6info->proto == protohdr) { | 175 | if (ip6info->proto == protohdr) { |
176 | if(ip6info->invflags & IP6T_INV_PROTO) { | 176 | if(ip6info->invflags & IP6T_INV_PROTO) { |
177 | return 0; | 177 | return false; |
178 | } | 178 | } |
179 | return 1; | 179 | return true; |
180 | } | 180 | } |
181 | 181 | ||
182 | /* We need match for the '-p all', too! */ | 182 | /* We need match for the '-p all', too! */ |
183 | if ((ip6info->proto != 0) && | 183 | if ((ip6info->proto != 0) && |
184 | !(ip6info->invflags & IP6T_INV_PROTO)) | 184 | !(ip6info->invflags & IP6T_INV_PROTO)) |
185 | return 0; | 185 | return false; |
186 | } | 186 | } |
187 | return 1; | 187 | return true; |
188 | } | 188 | } |
189 | 189 | ||
190 | /* should be ip6 safe */ | 190 | /* should be ip6 safe */ |
191 | static inline int | 191 | static inline bool |
192 | ip6_checkentry(const struct ip6t_ip6 *ipv6) | 192 | ip6_checkentry(const struct ip6t_ip6 *ipv6) |
193 | { | 193 | { |
194 | if (ipv6->flags & ~IP6T_F_MASK) { | 194 | if (ipv6->flags & ~IP6T_F_MASK) { |
195 | duprintf("Unknown flag bits set: %08X\n", | 195 | duprintf("Unknown flag bits set: %08X\n", |
196 | ipv6->flags & ~IP6T_F_MASK); | 196 | ipv6->flags & ~IP6T_F_MASK); |
197 | return 0; | 197 | return false; |
198 | } | 198 | } |
199 | if (ipv6->invflags & ~IP6T_INV_MASK) { | 199 | if (ipv6->invflags & ~IP6T_INV_MASK) { |
200 | duprintf("Unknown invflag bits set: %08X\n", | 200 | duprintf("Unknown invflag bits set: %08X\n", |
201 | ipv6->invflags & ~IP6T_INV_MASK); | 201 | ipv6->invflags & ~IP6T_INV_MASK); |
202 | return 0; | 202 | return false; |
203 | } | 203 | } |
204 | return 1; | 204 | return true; |
205 | } | 205 | } |
206 | 206 | ||
207 | static unsigned int | 207 | static unsigned int |
@@ -219,20 +219,20 @@ ip6t_error(struct sk_buff **pskb, | |||
219 | } | 219 | } |
220 | 220 | ||
221 | static inline | 221 | static inline |
222 | int do_match(struct ip6t_entry_match *m, | 222 | bool do_match(struct ip6t_entry_match *m, |
223 | const struct sk_buff *skb, | 223 | const struct sk_buff *skb, |
224 | const struct net_device *in, | 224 | const struct net_device *in, |
225 | const struct net_device *out, | 225 | const struct net_device *out, |
226 | int offset, | 226 | int offset, |
227 | unsigned int protoff, | 227 | unsigned int protoff, |
228 | int *hotdrop) | 228 | bool *hotdrop) |
229 | { | 229 | { |
230 | /* Stop iteration if it doesn't match */ | 230 | /* Stop iteration if it doesn't match */ |
231 | if (!m->u.kernel.match->match(skb, in, out, m->u.kernel.match, m->data, | 231 | if (!m->u.kernel.match->match(skb, in, out, m->u.kernel.match, m->data, |
232 | offset, protoff, hotdrop)) | 232 | offset, protoff, hotdrop)) |
233 | return 1; | 233 | return true; |
234 | else | 234 | else |
235 | return 0; | 235 | return false; |
236 | } | 236 | } |
237 | 237 | ||
238 | static inline struct ip6t_entry * | 238 | static inline struct ip6t_entry * |
@@ -241,6 +241,113 @@ get_entry(void *base, unsigned int offset) | |||
241 | return (struct ip6t_entry *)(base + offset); | 241 | return (struct ip6t_entry *)(base + offset); |
242 | } | 242 | } |
243 | 243 | ||
244 | /* All zeroes == unconditional rule. */ | ||
245 | static inline int | ||
246 | unconditional(const struct ip6t_ip6 *ipv6) | ||
247 | { | ||
248 | unsigned int i; | ||
249 | |||
250 | for (i = 0; i < sizeof(*ipv6); i++) | ||
251 | if (((char *)ipv6)[i]) | ||
252 | break; | ||
253 | |||
254 | return (i == sizeof(*ipv6)); | ||
255 | } | ||
256 | |||
257 | #if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \ | ||
258 | defined(CONFIG_NETFILTER_XT_TARGET_TRACE_MODULE) | ||
259 | /* This cries for unification! */ | ||
260 | static const char *hooknames[] = { | ||
261 | [NF_IP6_PRE_ROUTING] = "PREROUTING", | ||
262 | [NF_IP6_LOCAL_IN] = "INPUT", | ||
263 | [NF_IP6_FORWARD] = "FORWARD", | ||
264 | [NF_IP6_LOCAL_OUT] = "OUTPUT", | ||
265 | [NF_IP6_POST_ROUTING] = "POSTROUTING", | ||
266 | }; | ||
267 | |||
268 | enum nf_ip_trace_comments { | ||
269 | NF_IP6_TRACE_COMMENT_RULE, | ||
270 | NF_IP6_TRACE_COMMENT_RETURN, | ||
271 | NF_IP6_TRACE_COMMENT_POLICY, | ||
272 | }; | ||
273 | |||
274 | static const char *comments[] = { | ||
275 | [NF_IP6_TRACE_COMMENT_RULE] = "rule", | ||
276 | [NF_IP6_TRACE_COMMENT_RETURN] = "return", | ||
277 | [NF_IP6_TRACE_COMMENT_POLICY] = "policy", | ||
278 | }; | ||
279 | |||
280 | static struct nf_loginfo trace_loginfo = { | ||
281 | .type = NF_LOG_TYPE_LOG, | ||
282 | .u = { | ||
283 | .log = { | ||
284 | .level = 4, | ||
285 | .logflags = NF_LOG_MASK, | ||
286 | }, | ||
287 | }, | ||
288 | }; | ||
289 | |||
290 | static inline int | ||
291 | get_chainname_rulenum(struct ip6t_entry *s, struct ip6t_entry *e, | ||
292 | char *hookname, char **chainname, | ||
293 | char **comment, unsigned int *rulenum) | ||
294 | { | ||
295 | struct ip6t_standard_target *t = (void *)ip6t_get_target(s); | ||
296 | |||
297 | if (strcmp(t->target.u.kernel.target->name, IP6T_ERROR_TARGET) == 0) { | ||
298 | /* Head of user chain: ERROR target with chainname */ | ||
299 | *chainname = t->target.data; | ||
300 | (*rulenum) = 0; | ||
301 | } else if (s == e) { | ||
302 | (*rulenum)++; | ||
303 | |||
304 | if (s->target_offset == sizeof(struct ip6t_entry) | ||
305 | && strcmp(t->target.u.kernel.target->name, | ||
306 | IP6T_STANDARD_TARGET) == 0 | ||
307 | && t->verdict < 0 | ||
308 | && unconditional(&s->ipv6)) { | ||
309 | /* Tail of chains: STANDARD target (return/policy) */ | ||
310 | *comment = *chainname == hookname | ||
311 | ? (char *)comments[NF_IP6_TRACE_COMMENT_POLICY] | ||
312 | : (char *)comments[NF_IP6_TRACE_COMMENT_RETURN]; | ||
313 | } | ||
314 | return 1; | ||
315 | } else | ||
316 | (*rulenum)++; | ||
317 | |||
318 | return 0; | ||
319 | } | ||
320 | |||
321 | static void trace_packet(struct sk_buff *skb, | ||
322 | unsigned int hook, | ||
323 | const struct net_device *in, | ||
324 | const struct net_device *out, | ||
325 | char *tablename, | ||
326 | struct xt_table_info *private, | ||
327 | struct ip6t_entry *e) | ||
328 | { | ||
329 | void *table_base; | ||
330 | struct ip6t_entry *root; | ||
331 | char *hookname, *chainname, *comment; | ||
332 | unsigned int rulenum = 0; | ||
333 | |||
334 | table_base = (void *)private->entries[smp_processor_id()]; | ||
335 | root = get_entry(table_base, private->hook_entry[hook]); | ||
336 | |||
337 | hookname = chainname = (char *)hooknames[hook]; | ||
338 | comment = (char *)comments[NF_IP6_TRACE_COMMENT_RULE]; | ||
339 | |||
340 | IP6T_ENTRY_ITERATE(root, | ||
341 | private->size - private->hook_entry[hook], | ||
342 | get_chainname_rulenum, | ||
343 | e, hookname, &chainname, &comment, &rulenum); | ||
344 | |||
345 | nf_log_packet(AF_INET6, hook, skb, in, out, &trace_loginfo, | ||
346 | "TRACE: %s:%s:%s:%u ", | ||
347 | tablename, chainname, comment, rulenum); | ||
348 | } | ||
349 | #endif | ||
350 | |||
244 | /* Returns one of the generic firewall policies, like NF_ACCEPT. */ | 351 | /* Returns one of the generic firewall policies, like NF_ACCEPT. */ |
245 | unsigned int | 352 | unsigned int |
246 | ip6t_do_table(struct sk_buff **pskb, | 353 | ip6t_do_table(struct sk_buff **pskb, |
@@ -252,7 +359,7 @@ ip6t_do_table(struct sk_buff **pskb, | |||
252 | static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long)))); | 359 | static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long)))); |
253 | int offset = 0; | 360 | int offset = 0; |
254 | unsigned int protoff = 0; | 361 | unsigned int protoff = 0; |
255 | int hotdrop = 0; | 362 | bool hotdrop = false; |
256 | /* Initializing verdict to NF_DROP keeps gcc happy. */ | 363 | /* Initializing verdict to NF_DROP keeps gcc happy. */ |
257 | unsigned int verdict = NF_DROP; | 364 | unsigned int verdict = NF_DROP; |
258 | const char *indev, *outdev; | 365 | const char *indev, *outdev; |
@@ -298,6 +405,14 @@ ip6t_do_table(struct sk_buff **pskb, | |||
298 | 405 | ||
299 | t = ip6t_get_target(e); | 406 | t = ip6t_get_target(e); |
300 | IP_NF_ASSERT(t->u.kernel.target); | 407 | IP_NF_ASSERT(t->u.kernel.target); |
408 | |||
409 | #if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \ | ||
410 | defined(CONFIG_NETFILTER_XT_TARGET_TRACE_MODULE) | ||
411 | /* The packet is traced: log it */ | ||
412 | if (unlikely((*pskb)->nf_trace)) | ||
413 | trace_packet(*pskb, hook, in, out, | ||
414 | table->name, private, e); | ||
415 | #endif | ||
301 | /* Standard target? */ | 416 | /* Standard target? */ |
302 | if (!t->u.kernel.target->target) { | 417 | if (!t->u.kernel.target->target) { |
303 | int v; | 418 | int v; |
@@ -377,19 +492,6 @@ ip6t_do_table(struct sk_buff **pskb, | |||
377 | #endif | 492 | #endif |
378 | } | 493 | } |
379 | 494 | ||
380 | /* All zeroes == unconditional rule. */ | ||
381 | static inline int | ||
382 | unconditional(const struct ip6t_ip6 *ipv6) | ||
383 | { | ||
384 | unsigned int i; | ||
385 | |||
386 | for (i = 0; i < sizeof(*ipv6); i++) | ||
387 | if (((char *)ipv6)[i]) | ||
388 | break; | ||
389 | |||
390 | return (i == sizeof(*ipv6)); | ||
391 | } | ||
392 | |||
393 | /* Figures out from what hook each rule can be called: returns 0 if | 495 | /* Figures out from what hook each rule can be called: returns 0 if |
394 | there are loops. Puts hook bitmask in comefrom. */ | 496 | there are loops. Puts hook bitmask in comefrom. */ |
395 | static int | 497 | static int |
@@ -1282,16 +1384,16 @@ void ip6t_unregister_table(struct xt_table *table) | |||
1282 | } | 1384 | } |
1283 | 1385 | ||
1284 | /* Returns 1 if the type and code is matched by the range, 0 otherwise */ | 1386 | /* Returns 1 if the type and code is matched by the range, 0 otherwise */ |
1285 | static inline int | 1387 | static inline bool |
1286 | icmp6_type_code_match(u_int8_t test_type, u_int8_t min_code, u_int8_t max_code, | 1388 | icmp6_type_code_match(u_int8_t test_type, u_int8_t min_code, u_int8_t max_code, |
1287 | u_int8_t type, u_int8_t code, | 1389 | u_int8_t type, u_int8_t code, |
1288 | int invert) | 1390 | bool invert) |
1289 | { | 1391 | { |
1290 | return (type == test_type && code >= min_code && code <= max_code) | 1392 | return (type == test_type && code >= min_code && code <= max_code) |
1291 | ^ invert; | 1393 | ^ invert; |
1292 | } | 1394 | } |
1293 | 1395 | ||
1294 | static int | 1396 | static bool |
1295 | icmp6_match(const struct sk_buff *skb, | 1397 | icmp6_match(const struct sk_buff *skb, |
1296 | const struct net_device *in, | 1398 | const struct net_device *in, |
1297 | const struct net_device *out, | 1399 | const struct net_device *out, |
@@ -1299,22 +1401,22 @@ icmp6_match(const struct sk_buff *skb, | |||
1299 | const void *matchinfo, | 1401 | const void *matchinfo, |
1300 | int offset, | 1402 | int offset, |
1301 | unsigned int protoff, | 1403 | unsigned int protoff, |
1302 | int *hotdrop) | 1404 | bool *hotdrop) |
1303 | { | 1405 | { |
1304 | struct icmp6hdr _icmp, *ic; | 1406 | struct icmp6hdr _icmp, *ic; |
1305 | const struct ip6t_icmp *icmpinfo = matchinfo; | 1407 | const struct ip6t_icmp *icmpinfo = matchinfo; |
1306 | 1408 | ||
1307 | /* Must not be a fragment. */ | 1409 | /* Must not be a fragment. */ |
1308 | if (offset) | 1410 | if (offset) |
1309 | return 0; | 1411 | return false; |
1310 | 1412 | ||
1311 | ic = skb_header_pointer(skb, protoff, sizeof(_icmp), &_icmp); | 1413 | ic = skb_header_pointer(skb, protoff, sizeof(_icmp), &_icmp); |
1312 | if (ic == NULL) { | 1414 | if (ic == NULL) { |
1313 | /* We've been asked to examine this packet, and we | 1415 | /* We've been asked to examine this packet, and we |
1314 | can't. Hence, no choice but to drop. */ | 1416 | can't. Hence, no choice but to drop. */ |
1315 | duprintf("Dropping evil ICMP tinygram.\n"); | 1417 | duprintf("Dropping evil ICMP tinygram.\n"); |
1316 | *hotdrop = 1; | 1418 | *hotdrop = true; |
1317 | return 0; | 1419 | return false; |
1318 | } | 1420 | } |
1319 | 1421 | ||
1320 | return icmp6_type_code_match(icmpinfo->type, | 1422 | return icmp6_type_code_match(icmpinfo->type, |
@@ -1325,7 +1427,7 @@ icmp6_match(const struct sk_buff *skb, | |||
1325 | } | 1427 | } |
1326 | 1428 | ||
1327 | /* Called when user tries to insert an entry of this type. */ | 1429 | /* Called when user tries to insert an entry of this type. */ |
1328 | static int | 1430 | static bool |
1329 | icmp6_checkentry(const char *tablename, | 1431 | icmp6_checkentry(const char *tablename, |
1330 | const void *entry, | 1432 | const void *entry, |
1331 | const struct xt_match *match, | 1433 | const struct xt_match *match, |
@@ -1339,13 +1441,13 @@ icmp6_checkentry(const char *tablename, | |||
1339 | } | 1441 | } |
1340 | 1442 | ||
1341 | /* The built-in targets: standard (NULL) and error. */ | 1443 | /* The built-in targets: standard (NULL) and error. */ |
1342 | static struct xt_target ip6t_standard_target = { | 1444 | static struct xt_target ip6t_standard_target __read_mostly = { |
1343 | .name = IP6T_STANDARD_TARGET, | 1445 | .name = IP6T_STANDARD_TARGET, |
1344 | .targetsize = sizeof(int), | 1446 | .targetsize = sizeof(int), |
1345 | .family = AF_INET6, | 1447 | .family = AF_INET6, |
1346 | }; | 1448 | }; |
1347 | 1449 | ||
1348 | static struct xt_target ip6t_error_target = { | 1450 | static struct xt_target ip6t_error_target __read_mostly = { |
1349 | .name = IP6T_ERROR_TARGET, | 1451 | .name = IP6T_ERROR_TARGET, |
1350 | .target = ip6t_error, | 1452 | .target = ip6t_error, |
1351 | .targetsize = IP6T_FUNCTION_MAXNAMELEN, | 1453 | .targetsize = IP6T_FUNCTION_MAXNAMELEN, |
@@ -1362,7 +1464,7 @@ static struct nf_sockopt_ops ip6t_sockopts = { | |||
1362 | .get = do_ip6t_get_ctl, | 1464 | .get = do_ip6t_get_ctl, |
1363 | }; | 1465 | }; |
1364 | 1466 | ||
1365 | static struct xt_match icmp6_matchstruct = { | 1467 | static struct xt_match icmp6_matchstruct __read_mostly = { |
1366 | .name = "icmp6", | 1468 | .name = "icmp6", |
1367 | .match = &icmp6_match, | 1469 | .match = &icmp6_match, |
1368 | .matchsize = sizeof(struct ip6t_icmp), | 1470 | .matchsize = sizeof(struct ip6t_icmp), |
@@ -1395,7 +1497,7 @@ static int __init ip6_tables_init(void) | |||
1395 | if (ret < 0) | 1497 | if (ret < 0) |
1396 | goto err5; | 1498 | goto err5; |
1397 | 1499 | ||
1398 | printk("ip6_tables: (C) 2000-2006 Netfilter Core Team\n"); | 1500 | printk(KERN_INFO "ip6_tables: (C) 2000-2006 Netfilter Core Team\n"); |
1399 | return 0; | 1501 | return 0; |
1400 | 1502 | ||
1401 | err5: | 1503 | err5: |
diff --git a/net/ipv6/netfilter/ip6t_HL.c b/net/ipv6/netfilter/ip6t_HL.c index 4115a576ba..ad4d94310b 100644 --- a/net/ipv6/netfilter/ip6t_HL.c +++ b/net/ipv6/netfilter/ip6t_HL.c | |||
@@ -58,28 +58,28 @@ static unsigned int ip6t_hl_target(struct sk_buff **pskb, | |||
58 | return XT_CONTINUE; | 58 | return XT_CONTINUE; |
59 | } | 59 | } |
60 | 60 | ||
61 | static int ip6t_hl_checkentry(const char *tablename, | 61 | static bool ip6t_hl_checkentry(const char *tablename, |
62 | const void *entry, | 62 | const void *entry, |
63 | const struct xt_target *target, | 63 | const struct xt_target *target, |
64 | void *targinfo, | 64 | void *targinfo, |
65 | unsigned int hook_mask) | 65 | unsigned int hook_mask) |
66 | { | 66 | { |
67 | struct ip6t_HL_info *info = targinfo; | 67 | const struct ip6t_HL_info *info = targinfo; |
68 | 68 | ||
69 | if (info->mode > IP6T_HL_MAXMODE) { | 69 | if (info->mode > IP6T_HL_MAXMODE) { |
70 | printk(KERN_WARNING "ip6t_HL: invalid or unknown Mode %u\n", | 70 | printk(KERN_WARNING "ip6t_HL: invalid or unknown Mode %u\n", |
71 | info->mode); | 71 | info->mode); |
72 | return 0; | 72 | return false; |
73 | } | 73 | } |
74 | if ((info->mode != IP6T_HL_SET) && (info->hop_limit == 0)) { | 74 | if (info->mode != IP6T_HL_SET && info->hop_limit == 0) { |
75 | printk(KERN_WARNING "ip6t_HL: increment/decrement doesn't " | 75 | printk(KERN_WARNING "ip6t_HL: increment/decrement doesn't " |
76 | "make sense with value 0\n"); | 76 | "make sense with value 0\n"); |
77 | return 0; | 77 | return false; |
78 | } | 78 | } |
79 | return 1; | 79 | return true; |
80 | } | 80 | } |
81 | 81 | ||
82 | static struct xt_target ip6t_HL = { | 82 | static struct xt_target ip6t_HL __read_mostly = { |
83 | .name = "HL", | 83 | .name = "HL", |
84 | .family = AF_INET6, | 84 | .family = AF_INET6, |
85 | .target = ip6t_hl_target, | 85 | .target = ip6t_hl_target, |
diff --git a/net/ipv6/netfilter/ip6t_LOG.c b/net/ipv6/netfilter/ip6t_LOG.c index 5bb9cd3493..b05327ebd3 100644 --- a/net/ipv6/netfilter/ip6t_LOG.c +++ b/net/ipv6/netfilter/ip6t_LOG.c | |||
@@ -32,12 +32,6 @@ struct in_device; | |||
32 | #include <net/route.h> | 32 | #include <net/route.h> |
33 | #include <linux/netfilter_ipv6/ip6t_LOG.h> | 33 | #include <linux/netfilter_ipv6/ip6t_LOG.h> |
34 | 34 | ||
35 | #if 0 | ||
36 | #define DEBUGP printk | ||
37 | #else | ||
38 | #define DEBUGP(format, args...) | ||
39 | #endif | ||
40 | |||
41 | /* Use lock to serialize, so printks don't overlap */ | 35 | /* Use lock to serialize, so printks don't overlap */ |
42 | static DEFINE_SPINLOCK(log_lock); | 36 | static DEFINE_SPINLOCK(log_lock); |
43 | 37 | ||
@@ -48,7 +42,8 @@ static void dump_packet(const struct nf_loginfo *info, | |||
48 | { | 42 | { |
49 | u_int8_t currenthdr; | 43 | u_int8_t currenthdr; |
50 | int fragment; | 44 | int fragment; |
51 | struct ipv6hdr _ip6h, *ih; | 45 | struct ipv6hdr _ip6h; |
46 | const struct ipv6hdr *ih; | ||
52 | unsigned int ptr; | 47 | unsigned int ptr; |
53 | unsigned int hdrlen = 0; | 48 | unsigned int hdrlen = 0; |
54 | unsigned int logflags; | 49 | unsigned int logflags; |
@@ -78,7 +73,8 @@ static void dump_packet(const struct nf_loginfo *info, | |||
78 | ptr = ip6hoff + sizeof(struct ipv6hdr); | 73 | ptr = ip6hoff + sizeof(struct ipv6hdr); |
79 | currenthdr = ih->nexthdr; | 74 | currenthdr = ih->nexthdr; |
80 | while (currenthdr != NEXTHDR_NONE && ip6t_ext_hdr(currenthdr)) { | 75 | while (currenthdr != NEXTHDR_NONE && ip6t_ext_hdr(currenthdr)) { |
81 | struct ipv6_opt_hdr _hdr, *hp; | 76 | struct ipv6_opt_hdr _hdr; |
77 | const struct ipv6_opt_hdr *hp; | ||
82 | 78 | ||
83 | hp = skb_header_pointer(skb, ptr, sizeof(_hdr), &_hdr); | 79 | hp = skb_header_pointer(skb, ptr, sizeof(_hdr), &_hdr); |
84 | if (hp == NULL) { | 80 | if (hp == NULL) { |
@@ -92,7 +88,8 @@ static void dump_packet(const struct nf_loginfo *info, | |||
92 | 88 | ||
93 | switch (currenthdr) { | 89 | switch (currenthdr) { |
94 | case IPPROTO_FRAGMENT: { | 90 | case IPPROTO_FRAGMENT: { |
95 | struct frag_hdr _fhdr, *fh; | 91 | struct frag_hdr _fhdr; |
92 | const struct frag_hdr *fh; | ||
96 | 93 | ||
97 | printk("FRAG:"); | 94 | printk("FRAG:"); |
98 | fh = skb_header_pointer(skb, ptr, sizeof(_fhdr), | 95 | fh = skb_header_pointer(skb, ptr, sizeof(_fhdr), |
@@ -131,7 +128,8 @@ static void dump_packet(const struct nf_loginfo *info, | |||
131 | /* Max Length */ | 128 | /* Max Length */ |
132 | case IPPROTO_AH: | 129 | case IPPROTO_AH: |
133 | if (logflags & IP6T_LOG_IPOPT) { | 130 | if (logflags & IP6T_LOG_IPOPT) { |
134 | struct ip_auth_hdr _ahdr, *ah; | 131 | struct ip_auth_hdr _ahdr; |
132 | const struct ip_auth_hdr *ah; | ||
135 | 133 | ||
136 | /* Max length: 3 "AH " */ | 134 | /* Max length: 3 "AH " */ |
137 | printk("AH "); | 135 | printk("AH "); |
@@ -162,7 +160,8 @@ static void dump_packet(const struct nf_loginfo *info, | |||
162 | break; | 160 | break; |
163 | case IPPROTO_ESP: | 161 | case IPPROTO_ESP: |
164 | if (logflags & IP6T_LOG_IPOPT) { | 162 | if (logflags & IP6T_LOG_IPOPT) { |
165 | struct ip_esp_hdr _esph, *eh; | 163 | struct ip_esp_hdr _esph; |
164 | const struct ip_esp_hdr *eh; | ||
166 | 165 | ||
167 | /* Max length: 4 "ESP " */ | 166 | /* Max length: 4 "ESP " */ |
168 | printk("ESP "); | 167 | printk("ESP "); |
@@ -202,7 +201,8 @@ static void dump_packet(const struct nf_loginfo *info, | |||
202 | 201 | ||
203 | switch (currenthdr) { | 202 | switch (currenthdr) { |
204 | case IPPROTO_TCP: { | 203 | case IPPROTO_TCP: { |
205 | struct tcphdr _tcph, *th; | 204 | struct tcphdr _tcph; |
205 | const struct tcphdr *th; | ||
206 | 206 | ||
207 | /* Max length: 10 "PROTO=TCP " */ | 207 | /* Max length: 10 "PROTO=TCP " */ |
208 | printk("PROTO=TCP "); | 208 | printk("PROTO=TCP "); |
@@ -250,7 +250,8 @@ static void dump_packet(const struct nf_loginfo *info, | |||
250 | 250 | ||
251 | if ((logflags & IP6T_LOG_TCPOPT) | 251 | if ((logflags & IP6T_LOG_TCPOPT) |
252 | && th->doff * 4 > sizeof(struct tcphdr)) { | 252 | && th->doff * 4 > sizeof(struct tcphdr)) { |
253 | u_int8_t _opt[60 - sizeof(struct tcphdr)], *op; | 253 | u_int8_t _opt[60 - sizeof(struct tcphdr)]; |
254 | const u_int8_t *op; | ||
254 | unsigned int i; | 255 | unsigned int i; |
255 | unsigned int optsize = th->doff * 4 | 256 | unsigned int optsize = th->doff * 4 |
256 | - sizeof(struct tcphdr); | 257 | - sizeof(struct tcphdr); |
@@ -273,7 +274,8 @@ static void dump_packet(const struct nf_loginfo *info, | |||
273 | } | 274 | } |
274 | case IPPROTO_UDP: | 275 | case IPPROTO_UDP: |
275 | case IPPROTO_UDPLITE: { | 276 | case IPPROTO_UDPLITE: { |
276 | struct udphdr _udph, *uh; | 277 | struct udphdr _udph; |
278 | const struct udphdr *uh; | ||
277 | 279 | ||
278 | if (currenthdr == IPPROTO_UDP) | 280 | if (currenthdr == IPPROTO_UDP) |
279 | /* Max length: 10 "PROTO=UDP " */ | 281 | /* Max length: 10 "PROTO=UDP " */ |
@@ -298,7 +300,8 @@ static void dump_packet(const struct nf_loginfo *info, | |||
298 | break; | 300 | break; |
299 | } | 301 | } |
300 | case IPPROTO_ICMPV6: { | 302 | case IPPROTO_ICMPV6: { |
301 | struct icmp6hdr _icmp6h, *ic; | 303 | struct icmp6hdr _icmp6h; |
304 | const struct icmp6hdr *ic; | ||
302 | 305 | ||
303 | /* Max length: 13 "PROTO=ICMPv6 " */ | 306 | /* Max length: 13 "PROTO=ICMPv6 " */ |
304 | printk("PROTO=ICMPv6 "); | 307 | printk("PROTO=ICMPv6 "); |
@@ -448,27 +451,27 @@ ip6t_log_target(struct sk_buff **pskb, | |||
448 | } | 451 | } |
449 | 452 | ||
450 | 453 | ||
451 | static int ip6t_log_checkentry(const char *tablename, | 454 | static bool ip6t_log_checkentry(const char *tablename, |
452 | const void *entry, | 455 | const void *entry, |
453 | const struct xt_target *target, | 456 | const struct xt_target *target, |
454 | void *targinfo, | 457 | void *targinfo, |
455 | unsigned int hook_mask) | 458 | unsigned int hook_mask) |
456 | { | 459 | { |
457 | const struct ip6t_log_info *loginfo = targinfo; | 460 | const struct ip6t_log_info *loginfo = targinfo; |
458 | 461 | ||
459 | if (loginfo->level >= 8) { | 462 | if (loginfo->level >= 8) { |
460 | DEBUGP("LOG: level %u >= 8\n", loginfo->level); | 463 | pr_debug("LOG: level %u >= 8\n", loginfo->level); |
461 | return 0; | 464 | return false; |
462 | } | 465 | } |
463 | if (loginfo->prefix[sizeof(loginfo->prefix)-1] != '\0') { | 466 | if (loginfo->prefix[sizeof(loginfo->prefix)-1] != '\0') { |
464 | DEBUGP("LOG: prefix term %i\n", | 467 | pr_debug("LOG: prefix term %i\n", |
465 | loginfo->prefix[sizeof(loginfo->prefix)-1]); | 468 | loginfo->prefix[sizeof(loginfo->prefix)-1]); |
466 | return 0; | 469 | return false; |
467 | } | 470 | } |
468 | return 1; | 471 | return true; |
469 | } | 472 | } |
470 | 473 | ||
471 | static struct xt_target ip6t_log_reg = { | 474 | static struct xt_target ip6t_log_reg __read_mostly = { |
472 | .name = "LOG", | 475 | .name = "LOG", |
473 | .family = AF_INET6, | 476 | .family = AF_INET6, |
474 | .target = ip6t_log_target, | 477 | .target = ip6t_log_target, |
diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c index cb3d2415a0..2f487cda3b 100644 --- a/net/ipv6/netfilter/ip6t_REJECT.c +++ b/net/ipv6/netfilter/ip6t_REJECT.c | |||
@@ -34,12 +34,6 @@ MODULE_AUTHOR("Yasuyuki KOZAKAI <yasuyuki.kozakai@toshiba.co.jp>"); | |||
34 | MODULE_DESCRIPTION("IP6 tables REJECT target module"); | 34 | MODULE_DESCRIPTION("IP6 tables REJECT target module"); |
35 | MODULE_LICENSE("GPL"); | 35 | MODULE_LICENSE("GPL"); |
36 | 36 | ||
37 | #if 0 | ||
38 | #define DEBUGP printk | ||
39 | #else | ||
40 | #define DEBUGP(format, args...) | ||
41 | #endif | ||
42 | |||
43 | /* Send RST reply */ | 37 | /* Send RST reply */ |
44 | static void send_reset(struct sk_buff *oldskb) | 38 | static void send_reset(struct sk_buff *oldskb) |
45 | { | 39 | { |
@@ -54,7 +48,7 @@ static void send_reset(struct sk_buff *oldskb) | |||
54 | 48 | ||
55 | if ((!(ipv6_addr_type(&oip6h->saddr) & IPV6_ADDR_UNICAST)) || | 49 | if ((!(ipv6_addr_type(&oip6h->saddr) & IPV6_ADDR_UNICAST)) || |
56 | (!(ipv6_addr_type(&oip6h->daddr) & IPV6_ADDR_UNICAST))) { | 50 | (!(ipv6_addr_type(&oip6h->daddr) & IPV6_ADDR_UNICAST))) { |
57 | DEBUGP("ip6t_REJECT: addr is not unicast.\n"); | 51 | pr_debug("ip6t_REJECT: addr is not unicast.\n"); |
58 | return; | 52 | return; |
59 | } | 53 | } |
60 | 54 | ||
@@ -62,16 +56,17 @@ static void send_reset(struct sk_buff *oldskb) | |||
62 | tcphoff = ipv6_skip_exthdr(oldskb, ((u8*)(oip6h+1) - oldskb->data), &proto); | 56 | tcphoff = ipv6_skip_exthdr(oldskb, ((u8*)(oip6h+1) - oldskb->data), &proto); |
63 | 57 | ||
64 | if ((tcphoff < 0) || (tcphoff > oldskb->len)) { | 58 | if ((tcphoff < 0) || (tcphoff > oldskb->len)) { |
65 | DEBUGP("ip6t_REJECT: Can't get TCP header.\n"); | 59 | pr_debug("ip6t_REJECT: Can't get TCP header.\n"); |
66 | return; | 60 | return; |
67 | } | 61 | } |
68 | 62 | ||
69 | otcplen = oldskb->len - tcphoff; | 63 | otcplen = oldskb->len - tcphoff; |
70 | 64 | ||
71 | /* IP header checks: fragment, too short. */ | 65 | /* IP header checks: fragment, too short. */ |
72 | if ((proto != IPPROTO_TCP) || (otcplen < sizeof(struct tcphdr))) { | 66 | if (proto != IPPROTO_TCP || otcplen < sizeof(struct tcphdr)) { |
73 | DEBUGP("ip6t_REJECT: proto(%d) != IPPROTO_TCP, or too short. otcplen = %d\n", | 67 | pr_debug("ip6t_REJECT: proto(%d) != IPPROTO_TCP, " |
74 | proto, otcplen); | 68 | "or too short. otcplen = %d\n", |
69 | proto, otcplen); | ||
75 | return; | 70 | return; |
76 | } | 71 | } |
77 | 72 | ||
@@ -80,14 +75,14 @@ static void send_reset(struct sk_buff *oldskb) | |||
80 | 75 | ||
81 | /* No RST for RST. */ | 76 | /* No RST for RST. */ |
82 | if (otcph.rst) { | 77 | if (otcph.rst) { |
83 | DEBUGP("ip6t_REJECT: RST is set\n"); | 78 | pr_debug("ip6t_REJECT: RST is set\n"); |
84 | return; | 79 | return; |
85 | } | 80 | } |
86 | 81 | ||
87 | /* Check checksum. */ | 82 | /* Check checksum. */ |
88 | if (csum_ipv6_magic(&oip6h->saddr, &oip6h->daddr, otcplen, IPPROTO_TCP, | 83 | if (csum_ipv6_magic(&oip6h->saddr, &oip6h->daddr, otcplen, IPPROTO_TCP, |
89 | skb_checksum(oldskb, tcphoff, otcplen, 0))) { | 84 | skb_checksum(oldskb, tcphoff, otcplen, 0))) { |
90 | DEBUGP("ip6t_REJECT: TCP checksum is invalid\n"); | 85 | pr_debug("ip6t_REJECT: TCP checksum is invalid\n"); |
91 | return; | 86 | return; |
92 | } | 87 | } |
93 | 88 | ||
@@ -159,7 +154,7 @@ static void send_reset(struct sk_buff *oldskb) | |||
159 | tcph->check = csum_ipv6_magic(&ipv6_hdr(nskb)->saddr, | 154 | tcph->check = csum_ipv6_magic(&ipv6_hdr(nskb)->saddr, |
160 | &ipv6_hdr(nskb)->daddr, | 155 | &ipv6_hdr(nskb)->daddr, |
161 | sizeof(struct tcphdr), IPPROTO_TCP, | 156 | sizeof(struct tcphdr), IPPROTO_TCP, |
162 | csum_partial((char *)tcph, | 157 | csum_partial(tcph, |
163 | sizeof(struct tcphdr), 0)); | 158 | sizeof(struct tcphdr), 0)); |
164 | 159 | ||
165 | nf_ct_attach(nskb, oldskb); | 160 | nf_ct_attach(nskb, oldskb); |
@@ -186,7 +181,7 @@ static unsigned int reject6_target(struct sk_buff **pskb, | |||
186 | { | 181 | { |
187 | const struct ip6t_reject_info *reject = targinfo; | 182 | const struct ip6t_reject_info *reject = targinfo; |
188 | 183 | ||
189 | DEBUGP(KERN_DEBUG "%s: medium point\n", __FUNCTION__); | 184 | pr_debug("%s: medium point\n", __FUNCTION__); |
190 | /* WARNING: This code causes reentry within ip6tables. | 185 | /* WARNING: This code causes reentry within ip6tables. |
191 | This means that the ip6tables jump stack is now crap. We | 186 | This means that the ip6tables jump stack is now crap. We |
192 | must return an absolute verdict. --RR */ | 187 | must return an absolute verdict. --RR */ |
@@ -221,30 +216,30 @@ static unsigned int reject6_target(struct sk_buff **pskb, | |||
221 | return NF_DROP; | 216 | return NF_DROP; |
222 | } | 217 | } |
223 | 218 | ||
224 | static int check(const char *tablename, | 219 | static bool check(const char *tablename, |
225 | const void *entry, | 220 | const void *entry, |
226 | const struct xt_target *target, | 221 | const struct xt_target *target, |
227 | void *targinfo, | 222 | void *targinfo, |
228 | unsigned int hook_mask) | 223 | unsigned int hook_mask) |
229 | { | 224 | { |
230 | const struct ip6t_reject_info *rejinfo = targinfo; | 225 | const struct ip6t_reject_info *rejinfo = targinfo; |
231 | const struct ip6t_entry *e = entry; | 226 | const struct ip6t_entry *e = entry; |
232 | 227 | ||
233 | if (rejinfo->with == IP6T_ICMP6_ECHOREPLY) { | 228 | if (rejinfo->with == IP6T_ICMP6_ECHOREPLY) { |
234 | printk("ip6t_REJECT: ECHOREPLY is not supported.\n"); | 229 | printk("ip6t_REJECT: ECHOREPLY is not supported.\n"); |
235 | return 0; | 230 | return false; |
236 | } else if (rejinfo->with == IP6T_TCP_RESET) { | 231 | } else if (rejinfo->with == IP6T_TCP_RESET) { |
237 | /* Must specify that it's a TCP packet */ | 232 | /* Must specify that it's a TCP packet */ |
238 | if (e->ipv6.proto != IPPROTO_TCP | 233 | if (e->ipv6.proto != IPPROTO_TCP |
239 | || (e->ipv6.invflags & XT_INV_PROTO)) { | 234 | || (e->ipv6.invflags & XT_INV_PROTO)) { |
240 | DEBUGP("ip6t_REJECT: TCP_RESET illegal for non-tcp\n"); | 235 | printk("ip6t_REJECT: TCP_RESET illegal for non-tcp\n"); |
241 | return 0; | 236 | return false; |
242 | } | 237 | } |
243 | } | 238 | } |
244 | return 1; | 239 | return true; |
245 | } | 240 | } |
246 | 241 | ||
247 | static struct xt_target ip6t_reject_reg = { | 242 | static struct xt_target ip6t_reject_reg __read_mostly = { |
248 | .name = "REJECT", | 243 | .name = "REJECT", |
249 | .family = AF_INET6, | 244 | .family = AF_INET6, |
250 | .target = reject6_target, | 245 | .target = reject6_target, |
diff --git a/net/ipv6/netfilter/ip6t_ah.c b/net/ipv6/netfilter/ip6t_ah.c index d3c154371b..2a25fe25e0 100644 --- a/net/ipv6/netfilter/ip6t_ah.c +++ b/net/ipv6/netfilter/ip6t_ah.c | |||
@@ -23,25 +23,20 @@ MODULE_LICENSE("GPL"); | |||
23 | MODULE_DESCRIPTION("IPv6 AH match"); | 23 | MODULE_DESCRIPTION("IPv6 AH match"); |
24 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); | 24 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); |
25 | 25 | ||
26 | #if 0 | ||
27 | #define DEBUGP printk | ||
28 | #else | ||
29 | #define DEBUGP(format, args...) | ||
30 | #endif | ||
31 | |||
32 | /* Returns 1 if the spi is matched by the range, 0 otherwise */ | 26 | /* Returns 1 if the spi is matched by the range, 0 otherwise */ |
33 | static inline int | 27 | static inline bool |
34 | spi_match(u_int32_t min, u_int32_t max, u_int32_t spi, int invert) | 28 | spi_match(u_int32_t min, u_int32_t max, u_int32_t spi, bool invert) |
35 | { | 29 | { |
36 | int r=0; | 30 | bool r; |
37 | DEBUGP("ah spi_match:%c 0x%x <= 0x%x <= 0x%x",invert? '!':' ', | 31 | |
38 | min,spi,max); | 32 | pr_debug("ah spi_match:%c 0x%x <= 0x%x <= 0x%x", |
33 | invert ? '!' : ' ', min, spi, max); | ||
39 | r = (spi >= min && spi <= max) ^ invert; | 34 | r = (spi >= min && spi <= max) ^ invert; |
40 | DEBUGP(" result %s\n",r? "PASS\n" : "FAILED\n"); | 35 | pr_debug(" result %s\n", r ? "PASS" : "FAILED"); |
41 | return r; | 36 | return r; |
42 | } | 37 | } |
43 | 38 | ||
44 | static int | 39 | static bool |
45 | match(const struct sk_buff *skb, | 40 | match(const struct sk_buff *skb, |
46 | const struct net_device *in, | 41 | const struct net_device *in, |
47 | const struct net_device *out, | 42 | const struct net_device *out, |
@@ -49,9 +44,10 @@ match(const struct sk_buff *skb, | |||
49 | const void *matchinfo, | 44 | const void *matchinfo, |
50 | int offset, | 45 | int offset, |
51 | unsigned int protoff, | 46 | unsigned int protoff, |
52 | int *hotdrop) | 47 | bool *hotdrop) |
53 | { | 48 | { |
54 | struct ip_auth_hdr *ah, _ah; | 49 | struct ip_auth_hdr _ah; |
50 | const struct ip_auth_hdr *ah; | ||
55 | const struct ip6t_ah *ahinfo = matchinfo; | 51 | const struct ip6t_ah *ahinfo = matchinfo; |
56 | unsigned int ptr; | 52 | unsigned int ptr; |
57 | unsigned int hdrlen = 0; | 53 | unsigned int hdrlen = 0; |
@@ -60,40 +56,40 @@ match(const struct sk_buff *skb, | |||
60 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_AUTH, NULL); | 56 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_AUTH, NULL); |
61 | if (err < 0) { | 57 | if (err < 0) { |
62 | if (err != -ENOENT) | 58 | if (err != -ENOENT) |
63 | *hotdrop = 1; | 59 | *hotdrop = true; |
64 | return 0; | 60 | return false; |
65 | } | 61 | } |
66 | 62 | ||
67 | ah = skb_header_pointer(skb, ptr, sizeof(_ah), &_ah); | 63 | ah = skb_header_pointer(skb, ptr, sizeof(_ah), &_ah); |
68 | if (ah == NULL) { | 64 | if (ah == NULL) { |
69 | *hotdrop = 1; | 65 | *hotdrop = true; |
70 | return 0; | 66 | return false; |
71 | } | 67 | } |
72 | 68 | ||
73 | hdrlen = (ah->hdrlen + 2) << 2; | 69 | hdrlen = (ah->hdrlen + 2) << 2; |
74 | 70 | ||
75 | DEBUGP("IPv6 AH LEN %u %u ", hdrlen, ah->hdrlen); | 71 | pr_debug("IPv6 AH LEN %u %u ", hdrlen, ah->hdrlen); |
76 | DEBUGP("RES %04X ", ah->reserved); | 72 | pr_debug("RES %04X ", ah->reserved); |
77 | DEBUGP("SPI %u %08X\n", ntohl(ah->spi), ntohl(ah->spi)); | 73 | pr_debug("SPI %u %08X\n", ntohl(ah->spi), ntohl(ah->spi)); |
78 | 74 | ||
79 | DEBUGP("IPv6 AH spi %02X ", | 75 | pr_debug("IPv6 AH spi %02X ", |
80 | (spi_match(ahinfo->spis[0], ahinfo->spis[1], | 76 | spi_match(ahinfo->spis[0], ahinfo->spis[1], |
81 | ntohl(ah->spi), | 77 | ntohl(ah->spi), |
82 | !!(ahinfo->invflags & IP6T_AH_INV_SPI)))); | 78 | !!(ahinfo->invflags & IP6T_AH_INV_SPI))); |
83 | DEBUGP("len %02X %04X %02X ", | 79 | pr_debug("len %02X %04X %02X ", |
84 | ahinfo->hdrlen, hdrlen, | 80 | ahinfo->hdrlen, hdrlen, |
85 | (!ahinfo->hdrlen || | 81 | (!ahinfo->hdrlen || |
86 | (ahinfo->hdrlen == hdrlen) ^ | 82 | (ahinfo->hdrlen == hdrlen) ^ |
87 | !!(ahinfo->invflags & IP6T_AH_INV_LEN))); | 83 | !!(ahinfo->invflags & IP6T_AH_INV_LEN))); |
88 | DEBUGP("res %02X %04X %02X\n", | 84 | pr_debug("res %02X %04X %02X\n", |
89 | ahinfo->hdrres, ah->reserved, | 85 | ahinfo->hdrres, ah->reserved, |
90 | !(ahinfo->hdrres && ah->reserved)); | 86 | !(ahinfo->hdrres && ah->reserved)); |
91 | 87 | ||
92 | return (ah != NULL) | 88 | return (ah != NULL) |
93 | && | 89 | && |
94 | (spi_match(ahinfo->spis[0], ahinfo->spis[1], | 90 | spi_match(ahinfo->spis[0], ahinfo->spis[1], |
95 | ntohl(ah->spi), | 91 | ntohl(ah->spi), |
96 | !!(ahinfo->invflags & IP6T_AH_INV_SPI))) | 92 | !!(ahinfo->invflags & IP6T_AH_INV_SPI)) |
97 | && | 93 | && |
98 | (!ahinfo->hdrlen || | 94 | (!ahinfo->hdrlen || |
99 | (ahinfo->hdrlen == hdrlen) ^ | 95 | (ahinfo->hdrlen == hdrlen) ^ |
@@ -103,7 +99,7 @@ match(const struct sk_buff *skb, | |||
103 | } | 99 | } |
104 | 100 | ||
105 | /* Called when user tries to insert an entry of this type. */ | 101 | /* Called when user tries to insert an entry of this type. */ |
106 | static int | 102 | static bool |
107 | checkentry(const char *tablename, | 103 | checkentry(const char *tablename, |
108 | const void *entry, | 104 | const void *entry, |
109 | const struct xt_match *match, | 105 | const struct xt_match *match, |
@@ -113,13 +109,13 @@ checkentry(const char *tablename, | |||
113 | const struct ip6t_ah *ahinfo = matchinfo; | 109 | const struct ip6t_ah *ahinfo = matchinfo; |
114 | 110 | ||
115 | if (ahinfo->invflags & ~IP6T_AH_INV_MASK) { | 111 | if (ahinfo->invflags & ~IP6T_AH_INV_MASK) { |
116 | DEBUGP("ip6t_ah: unknown flags %X\n", ahinfo->invflags); | 112 | pr_debug("ip6t_ah: unknown flags %X\n", ahinfo->invflags); |
117 | return 0; | 113 | return false; |
118 | } | 114 | } |
119 | return 1; | 115 | return true; |
120 | } | 116 | } |
121 | 117 | ||
122 | static struct xt_match ah_match = { | 118 | static struct xt_match ah_match __read_mostly = { |
123 | .name = "ah", | 119 | .name = "ah", |
124 | .family = AF_INET6, | 120 | .family = AF_INET6, |
125 | .match = match, | 121 | .match = match, |
diff --git a/net/ipv6/netfilter/ip6t_eui64.c b/net/ipv6/netfilter/ip6t_eui64.c index 0f3dd932f0..34ba150bfe 100644 --- a/net/ipv6/netfilter/ip6t_eui64.c +++ b/net/ipv6/netfilter/ip6t_eui64.c | |||
@@ -19,7 +19,7 @@ MODULE_DESCRIPTION("IPv6 EUI64 address checking match"); | |||
19 | MODULE_LICENSE("GPL"); | 19 | MODULE_LICENSE("GPL"); |
20 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); | 20 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); |
21 | 21 | ||
22 | static int | 22 | static bool |
23 | match(const struct sk_buff *skb, | 23 | match(const struct sk_buff *skb, |
24 | const struct net_device *in, | 24 | const struct net_device *in, |
25 | const struct net_device *out, | 25 | const struct net_device *out, |
@@ -27,16 +27,16 @@ match(const struct sk_buff *skb, | |||
27 | const void *matchinfo, | 27 | const void *matchinfo, |
28 | int offset, | 28 | int offset, |
29 | unsigned int protoff, | 29 | unsigned int protoff, |
30 | int *hotdrop) | 30 | bool *hotdrop) |
31 | { | 31 | { |
32 | unsigned char eui64[8]; | 32 | unsigned char eui64[8]; |
33 | int i = 0; | 33 | int i = 0; |
34 | 34 | ||
35 | if (!(skb_mac_header(skb) >= skb->head && | 35 | if (!(skb_mac_header(skb) >= skb->head && |
36 | (skb_mac_header(skb) + ETH_HLEN) <= skb->data) && | 36 | skb_mac_header(skb) + ETH_HLEN <= skb->data) && |
37 | offset != 0) { | 37 | offset != 0) { |
38 | *hotdrop = 1; | 38 | *hotdrop = true; |
39 | return 0; | 39 | return false; |
40 | } | 40 | } |
41 | 41 | ||
42 | memset(eui64, 0, sizeof(eui64)); | 42 | memset(eui64, 0, sizeof(eui64)); |
@@ -50,19 +50,19 @@ match(const struct sk_buff *skb, | |||
50 | eui64[0] |= 0x02; | 50 | eui64[0] |= 0x02; |
51 | 51 | ||
52 | i = 0; | 52 | i = 0; |
53 | while ((ipv6_hdr(skb)->saddr.s6_addr[8 + i] == eui64[i]) | 53 | while (ipv6_hdr(skb)->saddr.s6_addr[8 + i] == eui64[i] |
54 | && (i < 8)) | 54 | && i < 8) |
55 | i++; | 55 | i++; |
56 | 56 | ||
57 | if (i == 8) | 57 | if (i == 8) |
58 | return 1; | 58 | return true; |
59 | } | 59 | } |
60 | } | 60 | } |
61 | 61 | ||
62 | return 0; | 62 | return false; |
63 | } | 63 | } |
64 | 64 | ||
65 | static struct xt_match eui64_match = { | 65 | static struct xt_match eui64_match __read_mostly = { |
66 | .name = "eui64", | 66 | .name = "eui64", |
67 | .family = AF_INET6, | 67 | .family = AF_INET6, |
68 | .match = match, | 68 | .match = match, |
diff --git a/net/ipv6/netfilter/ip6t_frag.c b/net/ipv6/netfilter/ip6t_frag.c index 5a5da71321..968aeba020 100644 --- a/net/ipv6/netfilter/ip6t_frag.c +++ b/net/ipv6/netfilter/ip6t_frag.c | |||
@@ -22,25 +22,19 @@ MODULE_LICENSE("GPL"); | |||
22 | MODULE_DESCRIPTION("IPv6 FRAG match"); | 22 | MODULE_DESCRIPTION("IPv6 FRAG match"); |
23 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); | 23 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); |
24 | 24 | ||
25 | #if 0 | ||
26 | #define DEBUGP printk | ||
27 | #else | ||
28 | #define DEBUGP(format, args...) | ||
29 | #endif | ||
30 | |||
31 | /* Returns 1 if the id is matched by the range, 0 otherwise */ | 25 | /* Returns 1 if the id is matched by the range, 0 otherwise */ |
32 | static inline int | 26 | static inline bool |
33 | id_match(u_int32_t min, u_int32_t max, u_int32_t id, int invert) | 27 | id_match(u_int32_t min, u_int32_t max, u_int32_t id, bool invert) |
34 | { | 28 | { |
35 | int r = 0; | 29 | bool r; |
36 | DEBUGP("frag id_match:%c 0x%x <= 0x%x <= 0x%x", invert ? '!' : ' ', | 30 | pr_debug("frag id_match:%c 0x%x <= 0x%x <= 0x%x", invert ? '!' : ' ', |
37 | min, id, max); | 31 | min, id, max); |
38 | r = (id >= min && id <= max) ^ invert; | 32 | r = (id >= min && id <= max) ^ invert; |
39 | DEBUGP(" result %s\n", r ? "PASS" : "FAILED"); | 33 | pr_debug(" result %s\n", r ? "PASS" : "FAILED"); |
40 | return r; | 34 | return r; |
41 | } | 35 | } |
42 | 36 | ||
43 | static int | 37 | static bool |
44 | match(const struct sk_buff *skb, | 38 | match(const struct sk_buff *skb, |
45 | const struct net_device *in, | 39 | const struct net_device *in, |
46 | const struct net_device *out, | 40 | const struct net_device *out, |
@@ -48,9 +42,10 @@ match(const struct sk_buff *skb, | |||
48 | const void *matchinfo, | 42 | const void *matchinfo, |
49 | int offset, | 43 | int offset, |
50 | unsigned int protoff, | 44 | unsigned int protoff, |
51 | int *hotdrop) | 45 | bool *hotdrop) |
52 | { | 46 | { |
53 | struct frag_hdr _frag, *fh; | 47 | struct frag_hdr _frag; |
48 | const struct frag_hdr *fh; | ||
54 | const struct ip6t_frag *fraginfo = matchinfo; | 49 | const struct ip6t_frag *fraginfo = matchinfo; |
55 | unsigned int ptr; | 50 | unsigned int ptr; |
56 | int err; | 51 | int err; |
@@ -58,53 +53,53 @@ match(const struct sk_buff *skb, | |||
58 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_FRAGMENT, NULL); | 53 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_FRAGMENT, NULL); |
59 | if (err < 0) { | 54 | if (err < 0) { |
60 | if (err != -ENOENT) | 55 | if (err != -ENOENT) |
61 | *hotdrop = 1; | 56 | *hotdrop = true; |
62 | return 0; | 57 | return false; |
63 | } | 58 | } |
64 | 59 | ||
65 | fh = skb_header_pointer(skb, ptr, sizeof(_frag), &_frag); | 60 | fh = skb_header_pointer(skb, ptr, sizeof(_frag), &_frag); |
66 | if (fh == NULL) { | 61 | if (fh == NULL) { |
67 | *hotdrop = 1; | 62 | *hotdrop = true; |
68 | return 0; | 63 | return false; |
69 | } | 64 | } |
70 | 65 | ||
71 | DEBUGP("INFO %04X ", fh->frag_off); | 66 | pr_debug("INFO %04X ", fh->frag_off); |
72 | DEBUGP("OFFSET %04X ", ntohs(fh->frag_off) & ~0x7); | 67 | pr_debug("OFFSET %04X ", ntohs(fh->frag_off) & ~0x7); |
73 | DEBUGP("RES %02X %04X", fh->reserved, ntohs(fh->frag_off) & 0x6); | 68 | pr_debug("RES %02X %04X", fh->reserved, ntohs(fh->frag_off) & 0x6); |
74 | DEBUGP("MF %04X ", fh->frag_off & htons(IP6_MF)); | 69 | pr_debug("MF %04X ", fh->frag_off & htons(IP6_MF)); |
75 | DEBUGP("ID %u %08X\n", ntohl(fh->identification), | 70 | pr_debug("ID %u %08X\n", ntohl(fh->identification), |
76 | ntohl(fh->identification)); | 71 | ntohl(fh->identification)); |
77 | 72 | ||
78 | DEBUGP("IPv6 FRAG id %02X ", | 73 | pr_debug("IPv6 FRAG id %02X ", |
79 | (id_match(fraginfo->ids[0], fraginfo->ids[1], | 74 | id_match(fraginfo->ids[0], fraginfo->ids[1], |
80 | ntohl(fh->identification), | 75 | ntohl(fh->identification), |
81 | !!(fraginfo->invflags & IP6T_FRAG_INV_IDS)))); | 76 | !!(fraginfo->invflags & IP6T_FRAG_INV_IDS))); |
82 | DEBUGP("res %02X %02X%04X %02X ", | 77 | pr_debug("res %02X %02X%04X %02X ", |
83 | (fraginfo->flags & IP6T_FRAG_RES), fh->reserved, | 78 | fraginfo->flags & IP6T_FRAG_RES, fh->reserved, |
84 | ntohs(fh->frag_off) & 0x6, | 79 | ntohs(fh->frag_off) & 0x6, |
85 | !((fraginfo->flags & IP6T_FRAG_RES) | 80 | !((fraginfo->flags & IP6T_FRAG_RES) |
86 | && (fh->reserved || (ntohs(fh->frag_off) & 0x06)))); | 81 | && (fh->reserved || (ntohs(fh->frag_off) & 0x06)))); |
87 | DEBUGP("first %02X %02X %02X ", | 82 | pr_debug("first %02X %02X %02X ", |
88 | (fraginfo->flags & IP6T_FRAG_FST), | 83 | fraginfo->flags & IP6T_FRAG_FST, |
89 | ntohs(fh->frag_off) & ~0x7, | 84 | ntohs(fh->frag_off) & ~0x7, |
90 | !((fraginfo->flags & IP6T_FRAG_FST) | 85 | !((fraginfo->flags & IP6T_FRAG_FST) |
91 | && (ntohs(fh->frag_off) & ~0x7))); | 86 | && (ntohs(fh->frag_off) & ~0x7))); |
92 | DEBUGP("mf %02X %02X %02X ", | 87 | pr_debug("mf %02X %02X %02X ", |
93 | (fraginfo->flags & IP6T_FRAG_MF), | 88 | fraginfo->flags & IP6T_FRAG_MF, |
94 | ntohs(fh->frag_off) & IP6_MF, | 89 | ntohs(fh->frag_off) & IP6_MF, |
95 | !((fraginfo->flags & IP6T_FRAG_MF) | 90 | !((fraginfo->flags & IP6T_FRAG_MF) |
96 | && !((ntohs(fh->frag_off) & IP6_MF)))); | 91 | && !((ntohs(fh->frag_off) & IP6_MF)))); |
97 | DEBUGP("last %02X %02X %02X\n", | 92 | pr_debug("last %02X %02X %02X\n", |
98 | (fraginfo->flags & IP6T_FRAG_NMF), | 93 | fraginfo->flags & IP6T_FRAG_NMF, |
99 | ntohs(fh->frag_off) & IP6_MF, | 94 | ntohs(fh->frag_off) & IP6_MF, |
100 | !((fraginfo->flags & IP6T_FRAG_NMF) | 95 | !((fraginfo->flags & IP6T_FRAG_NMF) |
101 | && (ntohs(fh->frag_off) & IP6_MF))); | 96 | && (ntohs(fh->frag_off) & IP6_MF))); |
102 | 97 | ||
103 | return (fh != NULL) | 98 | return (fh != NULL) |
104 | && | 99 | && |
105 | (id_match(fraginfo->ids[0], fraginfo->ids[1], | 100 | id_match(fraginfo->ids[0], fraginfo->ids[1], |
106 | ntohl(fh->identification), | 101 | ntohl(fh->identification), |
107 | !!(fraginfo->invflags & IP6T_FRAG_INV_IDS))) | 102 | !!(fraginfo->invflags & IP6T_FRAG_INV_IDS)) |
108 | && | 103 | && |
109 | !((fraginfo->flags & IP6T_FRAG_RES) | 104 | !((fraginfo->flags & IP6T_FRAG_RES) |
110 | && (fh->reserved || (ntohs(fh->frag_off) & 0x6))) | 105 | && (fh->reserved || (ntohs(fh->frag_off) & 0x6))) |
@@ -120,7 +115,7 @@ match(const struct sk_buff *skb, | |||
120 | } | 115 | } |
121 | 116 | ||
122 | /* Called when user tries to insert an entry of this type. */ | 117 | /* Called when user tries to insert an entry of this type. */ |
123 | static int | 118 | static bool |
124 | checkentry(const char *tablename, | 119 | checkentry(const char *tablename, |
125 | const void *ip, | 120 | const void *ip, |
126 | const struct xt_match *match, | 121 | const struct xt_match *match, |
@@ -130,13 +125,13 @@ checkentry(const char *tablename, | |||
130 | const struct ip6t_frag *fraginfo = matchinfo; | 125 | const struct ip6t_frag *fraginfo = matchinfo; |
131 | 126 | ||
132 | if (fraginfo->invflags & ~IP6T_FRAG_INV_MASK) { | 127 | if (fraginfo->invflags & ~IP6T_FRAG_INV_MASK) { |
133 | DEBUGP("ip6t_frag: unknown flags %X\n", fraginfo->invflags); | 128 | pr_debug("ip6t_frag: unknown flags %X\n", fraginfo->invflags); |
134 | return 0; | 129 | return false; |
135 | } | 130 | } |
136 | return 1; | 131 | return true; |
137 | } | 132 | } |
138 | 133 | ||
139 | static struct xt_match frag_match = { | 134 | static struct xt_match frag_match __read_mostly = { |
140 | .name = "frag", | 135 | .name = "frag", |
141 | .family = AF_INET6, | 136 | .family = AF_INET6, |
142 | .match = match, | 137 | .match = match, |
diff --git a/net/ipv6/netfilter/ip6t_hbh.c b/net/ipv6/netfilter/ip6t_hbh.c index d2373c7cd3..e6ca6018b1 100644 --- a/net/ipv6/netfilter/ip6t_hbh.c +++ b/net/ipv6/netfilter/ip6t_hbh.c | |||
@@ -25,12 +25,6 @@ MODULE_DESCRIPTION("IPv6 opts match"); | |||
25 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); | 25 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); |
26 | MODULE_ALIAS("ip6t_dst"); | 26 | MODULE_ALIAS("ip6t_dst"); |
27 | 27 | ||
28 | #if 0 | ||
29 | #define DEBUGP printk | ||
30 | #else | ||
31 | #define DEBUGP(format, args...) | ||
32 | #endif | ||
33 | |||
34 | /* | 28 | /* |
35 | * (Type & 0xC0) >> 6 | 29 | * (Type & 0xC0) >> 6 |
36 | * 0 -> ignorable | 30 | * 0 -> ignorable |
@@ -47,7 +41,7 @@ MODULE_ALIAS("ip6t_dst"); | |||
47 | * 5 -> RTALERT 2 x x | 41 | * 5 -> RTALERT 2 x x |
48 | */ | 42 | */ |
49 | 43 | ||
50 | static int | 44 | static bool |
51 | match(const struct sk_buff *skb, | 45 | match(const struct sk_buff *skb, |
52 | const struct net_device *in, | 46 | const struct net_device *in, |
53 | const struct net_device *out, | 47 | const struct net_device *out, |
@@ -55,45 +49,48 @@ match(const struct sk_buff *skb, | |||
55 | const void *matchinfo, | 49 | const void *matchinfo, |
56 | int offset, | 50 | int offset, |
57 | unsigned int protoff, | 51 | unsigned int protoff, |
58 | int *hotdrop) | 52 | bool *hotdrop) |
59 | { | 53 | { |
60 | struct ipv6_opt_hdr _optsh, *oh; | 54 | struct ipv6_opt_hdr _optsh; |
55 | const struct ipv6_opt_hdr *oh; | ||
61 | const struct ip6t_opts *optinfo = matchinfo; | 56 | const struct ip6t_opts *optinfo = matchinfo; |
62 | unsigned int temp; | 57 | unsigned int temp; |
63 | unsigned int ptr; | 58 | unsigned int ptr; |
64 | unsigned int hdrlen = 0; | 59 | unsigned int hdrlen = 0; |
65 | unsigned int ret = 0; | 60 | bool ret = false; |
66 | u8 _opttype, *tp = NULL; | 61 | u8 _opttype; |
67 | u8 _optlen, *lp = NULL; | 62 | u8 _optlen; |
63 | const u_int8_t *tp = NULL; | ||
64 | const u_int8_t *lp = NULL; | ||
68 | unsigned int optlen; | 65 | unsigned int optlen; |
69 | int err; | 66 | int err; |
70 | 67 | ||
71 | err = ipv6_find_hdr(skb, &ptr, match->data, NULL); | 68 | err = ipv6_find_hdr(skb, &ptr, match->data, NULL); |
72 | if (err < 0) { | 69 | if (err < 0) { |
73 | if (err != -ENOENT) | 70 | if (err != -ENOENT) |
74 | *hotdrop = 1; | 71 | *hotdrop = true; |
75 | return 0; | 72 | return false; |
76 | } | 73 | } |
77 | 74 | ||
78 | oh = skb_header_pointer(skb, ptr, sizeof(_optsh), &_optsh); | 75 | oh = skb_header_pointer(skb, ptr, sizeof(_optsh), &_optsh); |
79 | if (oh == NULL) { | 76 | if (oh == NULL) { |
80 | *hotdrop = 1; | 77 | *hotdrop = true; |
81 | return 0; | 78 | return false; |
82 | } | 79 | } |
83 | 80 | ||
84 | hdrlen = ipv6_optlen(oh); | 81 | hdrlen = ipv6_optlen(oh); |
85 | if (skb->len - ptr < hdrlen) { | 82 | if (skb->len - ptr < hdrlen) { |
86 | /* Packet smaller than it's length field */ | 83 | /* Packet smaller than it's length field */ |
87 | return 0; | 84 | return false; |
88 | } | 85 | } |
89 | 86 | ||
90 | DEBUGP("IPv6 OPTS LEN %u %u ", hdrlen, oh->hdrlen); | 87 | pr_debug("IPv6 OPTS LEN %u %u ", hdrlen, oh->hdrlen); |
91 | 88 | ||
92 | DEBUGP("len %02X %04X %02X ", | 89 | pr_debug("len %02X %04X %02X ", |
93 | optinfo->hdrlen, hdrlen, | 90 | optinfo->hdrlen, hdrlen, |
94 | (!(optinfo->flags & IP6T_OPTS_LEN) || | 91 | (!(optinfo->flags & IP6T_OPTS_LEN) || |
95 | ((optinfo->hdrlen == hdrlen) ^ | 92 | ((optinfo->hdrlen == hdrlen) ^ |
96 | !!(optinfo->invflags & IP6T_OPTS_INV_LEN)))); | 93 | !!(optinfo->invflags & IP6T_OPTS_INV_LEN)))); |
97 | 94 | ||
98 | ret = (oh != NULL) && | 95 | ret = (oh != NULL) && |
99 | (!(optinfo->flags & IP6T_OPTS_LEN) || | 96 | (!(optinfo->flags & IP6T_OPTS_LEN) || |
@@ -105,10 +102,10 @@ match(const struct sk_buff *skb, | |||
105 | if (!(optinfo->flags & IP6T_OPTS_OPTS)) { | 102 | if (!(optinfo->flags & IP6T_OPTS_OPTS)) { |
106 | return ret; | 103 | return ret; |
107 | } else if (optinfo->flags & IP6T_OPTS_NSTRICT) { | 104 | } else if (optinfo->flags & IP6T_OPTS_NSTRICT) { |
108 | DEBUGP("Not strict - not implemented"); | 105 | pr_debug("Not strict - not implemented"); |
109 | } else { | 106 | } else { |
110 | DEBUGP("Strict "); | 107 | pr_debug("Strict "); |
111 | DEBUGP("#%d ", optinfo->optsnr); | 108 | pr_debug("#%d ", optinfo->optsnr); |
112 | for (temp = 0; temp < optinfo->optsnr; temp++) { | 109 | for (temp = 0; temp < optinfo->optsnr; temp++) { |
113 | /* type field exists ? */ | 110 | /* type field exists ? */ |
114 | if (hdrlen < 1) | 111 | if (hdrlen < 1) |
@@ -120,12 +117,11 @@ match(const struct sk_buff *skb, | |||
120 | 117 | ||
121 | /* Type check */ | 118 | /* Type check */ |
122 | if (*tp != (optinfo->opts[temp] & 0xFF00) >> 8) { | 119 | if (*tp != (optinfo->opts[temp] & 0xFF00) >> 8) { |
123 | DEBUGP("Tbad %02X %02X\n", | 120 | pr_debug("Tbad %02X %02X\n", *tp, |
124 | *tp, | 121 | (optinfo->opts[temp] & 0xFF00) >> 8); |
125 | (optinfo->opts[temp] & 0xFF00) >> 8); | 122 | return false; |
126 | return 0; | ||
127 | } else { | 123 | } else { |
128 | DEBUGP("Tok "); | 124 | pr_debug("Tok "); |
129 | } | 125 | } |
130 | /* Length check */ | 126 | /* Length check */ |
131 | if (*tp) { | 127 | if (*tp) { |
@@ -142,23 +138,23 @@ match(const struct sk_buff *skb, | |||
142 | spec_len = optinfo->opts[temp] & 0x00FF; | 138 | spec_len = optinfo->opts[temp] & 0x00FF; |
143 | 139 | ||
144 | if (spec_len != 0x00FF && spec_len != *lp) { | 140 | if (spec_len != 0x00FF && spec_len != *lp) { |
145 | DEBUGP("Lbad %02X %04X\n", *lp, | 141 | pr_debug("Lbad %02X %04X\n", *lp, |
146 | spec_len); | 142 | spec_len); |
147 | return 0; | 143 | return false; |
148 | } | 144 | } |
149 | DEBUGP("Lok "); | 145 | pr_debug("Lok "); |
150 | optlen = *lp + 2; | 146 | optlen = *lp + 2; |
151 | } else { | 147 | } else { |
152 | DEBUGP("Pad1\n"); | 148 | pr_debug("Pad1\n"); |
153 | optlen = 1; | 149 | optlen = 1; |
154 | } | 150 | } |
155 | 151 | ||
156 | /* Step to the next */ | 152 | /* Step to the next */ |
157 | DEBUGP("len%04X \n", optlen); | 153 | pr_debug("len%04X \n", optlen); |
158 | 154 | ||
159 | if ((ptr > skb->len - optlen || hdrlen < optlen) && | 155 | if ((ptr > skb->len - optlen || hdrlen < optlen) && |
160 | (temp < optinfo->optsnr - 1)) { | 156 | temp < optinfo->optsnr - 1) { |
161 | DEBUGP("new pointer is too large! \n"); | 157 | pr_debug("new pointer is too large! \n"); |
162 | break; | 158 | break; |
163 | } | 159 | } |
164 | ptr += optlen; | 160 | ptr += optlen; |
@@ -167,14 +163,14 @@ match(const struct sk_buff *skb, | |||
167 | if (temp == optinfo->optsnr) | 163 | if (temp == optinfo->optsnr) |
168 | return ret; | 164 | return ret; |
169 | else | 165 | else |
170 | return 0; | 166 | return false; |
171 | } | 167 | } |
172 | 168 | ||
173 | return 0; | 169 | return false; |
174 | } | 170 | } |
175 | 171 | ||
176 | /* Called when user tries to insert an entry of this type. */ | 172 | /* Called when user tries to insert an entry of this type. */ |
177 | static int | 173 | static bool |
178 | checkentry(const char *tablename, | 174 | checkentry(const char *tablename, |
179 | const void *entry, | 175 | const void *entry, |
180 | const struct xt_match *match, | 176 | const struct xt_match *match, |
@@ -184,13 +180,13 @@ checkentry(const char *tablename, | |||
184 | const struct ip6t_opts *optsinfo = matchinfo; | 180 | const struct ip6t_opts *optsinfo = matchinfo; |
185 | 181 | ||
186 | if (optsinfo->invflags & ~IP6T_OPTS_INV_MASK) { | 182 | if (optsinfo->invflags & ~IP6T_OPTS_INV_MASK) { |
187 | DEBUGP("ip6t_opts: unknown flags %X\n", optsinfo->invflags); | 183 | pr_debug("ip6t_opts: unknown flags %X\n", optsinfo->invflags); |
188 | return 0; | 184 | return false; |
189 | } | 185 | } |
190 | return 1; | 186 | return true; |
191 | } | 187 | } |
192 | 188 | ||
193 | static struct xt_match opts_match[] = { | 189 | static struct xt_match opts_match[] __read_mostly = { |
194 | { | 190 | { |
195 | .name = "hbh", | 191 | .name = "hbh", |
196 | .family = AF_INET6, | 192 | .family = AF_INET6, |
diff --git a/net/ipv6/netfilter/ip6t_hl.c b/net/ipv6/netfilter/ip6t_hl.c index d606c0e6d6..ca29ec00dc 100644 --- a/net/ipv6/netfilter/ip6t_hl.c +++ b/net/ipv6/netfilter/ip6t_hl.c | |||
@@ -19,37 +19,37 @@ MODULE_AUTHOR("Maciej Soltysiak <solt@dns.toxicfilms.tv>"); | |||
19 | MODULE_DESCRIPTION("IP tables Hop Limit matching module"); | 19 | MODULE_DESCRIPTION("IP tables Hop Limit matching module"); |
20 | MODULE_LICENSE("GPL"); | 20 | MODULE_LICENSE("GPL"); |
21 | 21 | ||
22 | static int match(const struct sk_buff *skb, | 22 | static bool match(const struct sk_buff *skb, |
23 | const struct net_device *in, const struct net_device *out, | 23 | const struct net_device *in, const struct net_device *out, |
24 | const struct xt_match *match, const void *matchinfo, | 24 | const struct xt_match *match, const void *matchinfo, |
25 | int offset, unsigned int protoff, int *hotdrop) | 25 | int offset, unsigned int protoff, bool *hotdrop) |
26 | { | 26 | { |
27 | const struct ip6t_hl_info *info = matchinfo; | 27 | const struct ip6t_hl_info *info = matchinfo; |
28 | const struct ipv6hdr *ip6h = ipv6_hdr(skb); | 28 | const struct ipv6hdr *ip6h = ipv6_hdr(skb); |
29 | 29 | ||
30 | switch (info->mode) { | 30 | switch (info->mode) { |
31 | case IP6T_HL_EQ: | 31 | case IP6T_HL_EQ: |
32 | return (ip6h->hop_limit == info->hop_limit); | 32 | return ip6h->hop_limit == info->hop_limit; |
33 | break; | 33 | break; |
34 | case IP6T_HL_NE: | 34 | case IP6T_HL_NE: |
35 | return (!(ip6h->hop_limit == info->hop_limit)); | 35 | return ip6h->hop_limit != info->hop_limit; |
36 | break; | 36 | break; |
37 | case IP6T_HL_LT: | 37 | case IP6T_HL_LT: |
38 | return (ip6h->hop_limit < info->hop_limit); | 38 | return ip6h->hop_limit < info->hop_limit; |
39 | break; | 39 | break; |
40 | case IP6T_HL_GT: | 40 | case IP6T_HL_GT: |
41 | return (ip6h->hop_limit > info->hop_limit); | 41 | return ip6h->hop_limit > info->hop_limit; |
42 | break; | 42 | break; |
43 | default: | 43 | default: |
44 | printk(KERN_WARNING "ip6t_hl: unknown mode %d\n", | 44 | printk(KERN_WARNING "ip6t_hl: unknown mode %d\n", |
45 | info->mode); | 45 | info->mode); |
46 | return 0; | 46 | return false; |
47 | } | 47 | } |
48 | 48 | ||
49 | return 0; | 49 | return false; |
50 | } | 50 | } |
51 | 51 | ||
52 | static struct xt_match hl_match = { | 52 | static struct xt_match hl_match __read_mostly = { |
53 | .name = "hl", | 53 | .name = "hl", |
54 | .family = AF_INET6, | 54 | .family = AF_INET6, |
55 | .match = match, | 55 | .match = match, |
diff --git a/net/ipv6/netfilter/ip6t_ipv6header.c b/net/ipv6/netfilter/ip6t_ipv6header.c index fd6a086909..2c65c2f9a4 100644 --- a/net/ipv6/netfilter/ip6t_ipv6header.c +++ b/net/ipv6/netfilter/ip6t_ipv6header.c | |||
@@ -26,7 +26,7 @@ MODULE_LICENSE("GPL"); | |||
26 | MODULE_DESCRIPTION("IPv6 headers match"); | 26 | MODULE_DESCRIPTION("IPv6 headers match"); |
27 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); | 27 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); |
28 | 28 | ||
29 | static int | 29 | static bool |
30 | ipv6header_match(const struct sk_buff *skb, | 30 | ipv6header_match(const struct sk_buff *skb, |
31 | const struct net_device *in, | 31 | const struct net_device *in, |
32 | const struct net_device *out, | 32 | const struct net_device *out, |
@@ -34,7 +34,7 @@ ipv6header_match(const struct sk_buff *skb, | |||
34 | const void *matchinfo, | 34 | const void *matchinfo, |
35 | int offset, | 35 | int offset, |
36 | unsigned int protoff, | 36 | unsigned int protoff, |
37 | int *hotdrop) | 37 | bool *hotdrop) |
38 | { | 38 | { |
39 | const struct ip6t_ipv6header_info *info = matchinfo; | 39 | const struct ip6t_ipv6header_info *info = matchinfo; |
40 | unsigned int temp; | 40 | unsigned int temp; |
@@ -58,7 +58,7 @@ ipv6header_match(const struct sk_buff *skb, | |||
58 | 58 | ||
59 | /* Is there enough space for the next ext header? */ | 59 | /* Is there enough space for the next ext header? */ |
60 | if (len < (int)sizeof(struct ipv6_opt_hdr)) | 60 | if (len < (int)sizeof(struct ipv6_opt_hdr)) |
61 | return 0; | 61 | return false; |
62 | /* No more exthdr -> evaluate */ | 62 | /* No more exthdr -> evaluate */ |
63 | if (nexthdr == NEXTHDR_NONE) { | 63 | if (nexthdr == NEXTHDR_NONE) { |
64 | temp |= MASK_NONE; | 64 | temp |= MASK_NONE; |
@@ -74,9 +74,9 @@ ipv6header_match(const struct sk_buff *skb, | |||
74 | BUG_ON(hp == NULL); | 74 | BUG_ON(hp == NULL); |
75 | 75 | ||
76 | /* Calculate the header length */ | 76 | /* Calculate the header length */ |
77 | if (nexthdr == NEXTHDR_FRAGMENT) { | 77 | if (nexthdr == NEXTHDR_FRAGMENT) |
78 | hdrlen = 8; | 78 | hdrlen = 8; |
79 | } else if (nexthdr == NEXTHDR_AUTH) | 79 | else if (nexthdr == NEXTHDR_AUTH) |
80 | hdrlen = (hp->hdrlen + 2) << 2; | 80 | hdrlen = (hp->hdrlen + 2) << 2; |
81 | else | 81 | else |
82 | hdrlen = ipv6_optlen(hp); | 82 | hdrlen = ipv6_optlen(hp); |
@@ -99,7 +99,7 @@ ipv6header_match(const struct sk_buff *skb, | |||
99 | temp |= MASK_DSTOPTS; | 99 | temp |= MASK_DSTOPTS; |
100 | break; | 100 | break; |
101 | default: | 101 | default: |
102 | return 0; | 102 | return false; |
103 | break; | 103 | break; |
104 | } | 104 | } |
105 | 105 | ||
@@ -110,7 +110,7 @@ ipv6header_match(const struct sk_buff *skb, | |||
110 | break; | 110 | break; |
111 | } | 111 | } |
112 | 112 | ||
113 | if ((nexthdr != NEXTHDR_NONE) && (nexthdr != NEXTHDR_ESP)) | 113 | if (nexthdr != NEXTHDR_NONE && nexthdr != NEXTHDR_ESP) |
114 | temp |= MASK_PROTO; | 114 | temp |= MASK_PROTO; |
115 | 115 | ||
116 | if (info->modeflag) | 116 | if (info->modeflag) |
@@ -124,7 +124,7 @@ ipv6header_match(const struct sk_buff *skb, | |||
124 | } | 124 | } |
125 | } | 125 | } |
126 | 126 | ||
127 | static int | 127 | static bool |
128 | ipv6header_checkentry(const char *tablename, | 128 | ipv6header_checkentry(const char *tablename, |
129 | const void *ip, | 129 | const void *ip, |
130 | const struct xt_match *match, | 130 | const struct xt_match *match, |
@@ -136,12 +136,12 @@ ipv6header_checkentry(const char *tablename, | |||
136 | /* invflags is 0 or 0xff in hard mode */ | 136 | /* invflags is 0 or 0xff in hard mode */ |
137 | if ((!info->modeflag) && info->invflags != 0x00 && | 137 | if ((!info->modeflag) && info->invflags != 0x00 && |
138 | info->invflags != 0xFF) | 138 | info->invflags != 0xFF) |
139 | return 0; | 139 | return false; |
140 | 140 | ||
141 | return 1; | 141 | return true; |
142 | } | 142 | } |
143 | 143 | ||
144 | static struct xt_match ip6t_ipv6header_match = { | 144 | static struct xt_match ip6t_ipv6header_match __read_mostly = { |
145 | .name = "ipv6header", | 145 | .name = "ipv6header", |
146 | .family = AF_INET6, | 146 | .family = AF_INET6, |
147 | .match = &ipv6header_match, | 147 | .match = &ipv6header_match, |
diff --git a/net/ipv6/netfilter/ip6t_mh.c b/net/ipv6/netfilter/ip6t_mh.c index c2a909893a..0fa714092d 100644 --- a/net/ipv6/netfilter/ip6t_mh.c +++ b/net/ipv6/netfilter/ip6t_mh.c | |||
@@ -31,16 +31,13 @@ MODULE_LICENSE("GPL"); | |||
31 | #endif | 31 | #endif |
32 | 32 | ||
33 | /* Returns 1 if the type is matched by the range, 0 otherwise */ | 33 | /* Returns 1 if the type is matched by the range, 0 otherwise */ |
34 | static inline int | 34 | static inline bool |
35 | type_match(u_int8_t min, u_int8_t max, u_int8_t type, int invert) | 35 | type_match(u_int8_t min, u_int8_t max, u_int8_t type, bool invert) |
36 | { | 36 | { |
37 | int ret; | 37 | return (type >= min && type <= max) ^ invert; |
38 | |||
39 | ret = (type >= min && type <= max) ^ invert; | ||
40 | return ret; | ||
41 | } | 38 | } |
42 | 39 | ||
43 | static int | 40 | static bool |
44 | match(const struct sk_buff *skb, | 41 | match(const struct sk_buff *skb, |
45 | const struct net_device *in, | 42 | const struct net_device *in, |
46 | const struct net_device *out, | 43 | const struct net_device *out, |
@@ -48,29 +45,30 @@ match(const struct sk_buff *skb, | |||
48 | const void *matchinfo, | 45 | const void *matchinfo, |
49 | int offset, | 46 | int offset, |
50 | unsigned int protoff, | 47 | unsigned int protoff, |
51 | int *hotdrop) | 48 | bool *hotdrop) |
52 | { | 49 | { |
53 | struct ip6_mh _mh, *mh; | 50 | struct ip6_mh _mh; |
51 | const struct ip6_mh *mh; | ||
54 | const struct ip6t_mh *mhinfo = matchinfo; | 52 | const struct ip6t_mh *mhinfo = matchinfo; |
55 | 53 | ||
56 | /* Must not be a fragment. */ | 54 | /* Must not be a fragment. */ |
57 | if (offset) | 55 | if (offset) |
58 | return 0; | 56 | return false; |
59 | 57 | ||
60 | mh = skb_header_pointer(skb, protoff, sizeof(_mh), &_mh); | 58 | mh = skb_header_pointer(skb, protoff, sizeof(_mh), &_mh); |
61 | if (mh == NULL) { | 59 | if (mh == NULL) { |
62 | /* We've been asked to examine this packet, and we | 60 | /* We've been asked to examine this packet, and we |
63 | can't. Hence, no choice but to drop. */ | 61 | can't. Hence, no choice but to drop. */ |
64 | duprintf("Dropping evil MH tinygram.\n"); | 62 | duprintf("Dropping evil MH tinygram.\n"); |
65 | *hotdrop = 1; | 63 | *hotdrop = true; |
66 | return 0; | 64 | return false; |
67 | } | 65 | } |
68 | 66 | ||
69 | if (mh->ip6mh_proto != IPPROTO_NONE) { | 67 | if (mh->ip6mh_proto != IPPROTO_NONE) { |
70 | duprintf("Dropping invalid MH Payload Proto: %u\n", | 68 | duprintf("Dropping invalid MH Payload Proto: %u\n", |
71 | mh->ip6mh_proto); | 69 | mh->ip6mh_proto); |
72 | *hotdrop = 1; | 70 | *hotdrop = true; |
73 | return 0; | 71 | return false; |
74 | } | 72 | } |
75 | 73 | ||
76 | return type_match(mhinfo->types[0], mhinfo->types[1], mh->ip6mh_type, | 74 | return type_match(mhinfo->types[0], mhinfo->types[1], mh->ip6mh_type, |
@@ -78,7 +76,7 @@ match(const struct sk_buff *skb, | |||
78 | } | 76 | } |
79 | 77 | ||
80 | /* Called when user tries to insert an entry of this type. */ | 78 | /* Called when user tries to insert an entry of this type. */ |
81 | static int | 79 | static bool |
82 | mh_checkentry(const char *tablename, | 80 | mh_checkentry(const char *tablename, |
83 | const void *entry, | 81 | const void *entry, |
84 | const struct xt_match *match, | 82 | const struct xt_match *match, |
@@ -91,7 +89,7 @@ mh_checkentry(const char *tablename, | |||
91 | return !(mhinfo->invflags & ~IP6T_MH_INV_MASK); | 89 | return !(mhinfo->invflags & ~IP6T_MH_INV_MASK); |
92 | } | 90 | } |
93 | 91 | ||
94 | static struct xt_match mh_match = { | 92 | static struct xt_match mh_match __read_mostly = { |
95 | .name = "mh", | 93 | .name = "mh", |
96 | .family = AF_INET6, | 94 | .family = AF_INET6, |
97 | .checkentry = mh_checkentry, | 95 | .checkentry = mh_checkentry, |
diff --git a/net/ipv6/netfilter/ip6t_owner.c b/net/ipv6/netfilter/ip6t_owner.c index 43738bba00..6036613aef 100644 --- a/net/ipv6/netfilter/ip6t_owner.c +++ b/net/ipv6/netfilter/ip6t_owner.c | |||
@@ -23,7 +23,7 @@ MODULE_DESCRIPTION("IP6 tables owner matching module"); | |||
23 | MODULE_LICENSE("GPL"); | 23 | MODULE_LICENSE("GPL"); |
24 | 24 | ||
25 | 25 | ||
26 | static int | 26 | static bool |
27 | match(const struct sk_buff *skb, | 27 | match(const struct sk_buff *skb, |
28 | const struct net_device *in, | 28 | const struct net_device *in, |
29 | const struct net_device *out, | 29 | const struct net_device *out, |
@@ -31,29 +31,27 @@ match(const struct sk_buff *skb, | |||
31 | const void *matchinfo, | 31 | const void *matchinfo, |
32 | int offset, | 32 | int offset, |
33 | unsigned int protoff, | 33 | unsigned int protoff, |
34 | int *hotdrop) | 34 | bool *hotdrop) |
35 | { | 35 | { |
36 | const struct ip6t_owner_info *info = matchinfo; | 36 | const struct ip6t_owner_info *info = matchinfo; |
37 | 37 | ||
38 | if (!skb->sk || !skb->sk->sk_socket || !skb->sk->sk_socket->file) | 38 | if (!skb->sk || !skb->sk->sk_socket || !skb->sk->sk_socket->file) |
39 | return 0; | 39 | return false; |
40 | 40 | ||
41 | if (info->match & IP6T_OWNER_UID) { | 41 | if (info->match & IP6T_OWNER_UID) |
42 | if ((skb->sk->sk_socket->file->f_uid != info->uid) ^ | 42 | if ((skb->sk->sk_socket->file->f_uid != info->uid) ^ |
43 | !!(info->invert & IP6T_OWNER_UID)) | 43 | !!(info->invert & IP6T_OWNER_UID)) |
44 | return 0; | 44 | return false; |
45 | } | ||
46 | 45 | ||
47 | if (info->match & IP6T_OWNER_GID) { | 46 | if (info->match & IP6T_OWNER_GID) |
48 | if ((skb->sk->sk_socket->file->f_gid != info->gid) ^ | 47 | if ((skb->sk->sk_socket->file->f_gid != info->gid) ^ |
49 | !!(info->invert & IP6T_OWNER_GID)) | 48 | !!(info->invert & IP6T_OWNER_GID)) |
50 | return 0; | 49 | return false; |
51 | } | ||
52 | 50 | ||
53 | return 1; | 51 | return true; |
54 | } | 52 | } |
55 | 53 | ||
56 | static int | 54 | static bool |
57 | checkentry(const char *tablename, | 55 | checkentry(const char *tablename, |
58 | const void *ip, | 56 | const void *ip, |
59 | const struct xt_match *match, | 57 | const struct xt_match *match, |
@@ -65,12 +63,12 @@ checkentry(const char *tablename, | |||
65 | if (info->match & (IP6T_OWNER_PID | IP6T_OWNER_SID)) { | 63 | if (info->match & (IP6T_OWNER_PID | IP6T_OWNER_SID)) { |
66 | printk("ipt_owner: pid and sid matching " | 64 | printk("ipt_owner: pid and sid matching " |
67 | "not supported anymore\n"); | 65 | "not supported anymore\n"); |
68 | return 0; | 66 | return false; |
69 | } | 67 | } |
70 | return 1; | 68 | return true; |
71 | } | 69 | } |
72 | 70 | ||
73 | static struct xt_match owner_match = { | 71 | static struct xt_match owner_match __read_mostly = { |
74 | .name = "owner", | 72 | .name = "owner", |
75 | .family = AF_INET6, | 73 | .family = AF_INET6, |
76 | .match = match, | 74 | .match = match, |
diff --git a/net/ipv6/netfilter/ip6t_rt.c b/net/ipv6/netfilter/ip6t_rt.c index 81ab00d8c1..357cea703b 100644 --- a/net/ipv6/netfilter/ip6t_rt.c +++ b/net/ipv6/netfilter/ip6t_rt.c | |||
@@ -24,25 +24,19 @@ MODULE_LICENSE("GPL"); | |||
24 | MODULE_DESCRIPTION("IPv6 RT match"); | 24 | MODULE_DESCRIPTION("IPv6 RT match"); |
25 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); | 25 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); |
26 | 26 | ||
27 | #if 0 | ||
28 | #define DEBUGP printk | ||
29 | #else | ||
30 | #define DEBUGP(format, args...) | ||
31 | #endif | ||
32 | |||
33 | /* Returns 1 if the id is matched by the range, 0 otherwise */ | 27 | /* Returns 1 if the id is matched by the range, 0 otherwise */ |
34 | static inline int | 28 | static inline bool |
35 | segsleft_match(u_int32_t min, u_int32_t max, u_int32_t id, int invert) | 29 | segsleft_match(u_int32_t min, u_int32_t max, u_int32_t id, bool invert) |
36 | { | 30 | { |
37 | int r = 0; | 31 | bool r; |
38 | DEBUGP("rt segsleft_match:%c 0x%x <= 0x%x <= 0x%x", | 32 | pr_debug("rt segsleft_match:%c 0x%x <= 0x%x <= 0x%x", |
39 | invert ? '!' : ' ', min, id, max); | 33 | invert ? '!' : ' ', min, id, max); |
40 | r = (id >= min && id <= max) ^ invert; | 34 | r = (id >= min && id <= max) ^ invert; |
41 | DEBUGP(" result %s\n", r ? "PASS" : "FAILED"); | 35 | pr_debug(" result %s\n", r ? "PASS" : "FAILED"); |
42 | return r; | 36 | return r; |
43 | } | 37 | } |
44 | 38 | ||
45 | static int | 39 | static bool |
46 | match(const struct sk_buff *skb, | 40 | match(const struct sk_buff *skb, |
47 | const struct net_device *in, | 41 | const struct net_device *in, |
48 | const struct net_device *out, | 42 | const struct net_device *out, |
@@ -50,59 +44,61 @@ match(const struct sk_buff *skb, | |||
50 | const void *matchinfo, | 44 | const void *matchinfo, |
51 | int offset, | 45 | int offset, |
52 | unsigned int protoff, | 46 | unsigned int protoff, |
53 | int *hotdrop) | 47 | bool *hotdrop) |
54 | { | 48 | { |
55 | struct ipv6_rt_hdr _route, *rh; | 49 | struct ipv6_rt_hdr _route; |
50 | const struct ipv6_rt_hdr *rh; | ||
56 | const struct ip6t_rt *rtinfo = matchinfo; | 51 | const struct ip6t_rt *rtinfo = matchinfo; |
57 | unsigned int temp; | 52 | unsigned int temp; |
58 | unsigned int ptr; | 53 | unsigned int ptr; |
59 | unsigned int hdrlen = 0; | 54 | unsigned int hdrlen = 0; |
60 | unsigned int ret = 0; | 55 | bool ret = false; |
61 | struct in6_addr *ap, _addr; | 56 | struct in6_addr _addr; |
57 | const struct in6_addr *ap; | ||
62 | int err; | 58 | int err; |
63 | 59 | ||
64 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_ROUTING, NULL); | 60 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_ROUTING, NULL); |
65 | if (err < 0) { | 61 | if (err < 0) { |
66 | if (err != -ENOENT) | 62 | if (err != -ENOENT) |
67 | *hotdrop = 1; | 63 | *hotdrop = true; |
68 | return 0; | 64 | return false; |
69 | } | 65 | } |
70 | 66 | ||
71 | rh = skb_header_pointer(skb, ptr, sizeof(_route), &_route); | 67 | rh = skb_header_pointer(skb, ptr, sizeof(_route), &_route); |
72 | if (rh == NULL) { | 68 | if (rh == NULL) { |
73 | *hotdrop = 1; | 69 | *hotdrop = true; |
74 | return 0; | 70 | return false; |
75 | } | 71 | } |
76 | 72 | ||
77 | hdrlen = ipv6_optlen(rh); | 73 | hdrlen = ipv6_optlen(rh); |
78 | if (skb->len - ptr < hdrlen) { | 74 | if (skb->len - ptr < hdrlen) { |
79 | /* Pcket smaller than its length field */ | 75 | /* Pcket smaller than its length field */ |
80 | return 0; | 76 | return false; |
81 | } | 77 | } |
82 | 78 | ||
83 | DEBUGP("IPv6 RT LEN %u %u ", hdrlen, rh->hdrlen); | 79 | pr_debug("IPv6 RT LEN %u %u ", hdrlen, rh->hdrlen); |
84 | DEBUGP("TYPE %04X ", rh->type); | 80 | pr_debug("TYPE %04X ", rh->type); |
85 | DEBUGP("SGS_LEFT %u %02X\n", rh->segments_left, rh->segments_left); | 81 | pr_debug("SGS_LEFT %u %02X\n", rh->segments_left, rh->segments_left); |
86 | 82 | ||
87 | DEBUGP("IPv6 RT segsleft %02X ", | 83 | pr_debug("IPv6 RT segsleft %02X ", |
88 | (segsleft_match(rtinfo->segsleft[0], rtinfo->segsleft[1], | 84 | segsleft_match(rtinfo->segsleft[0], rtinfo->segsleft[1], |
89 | rh->segments_left, | 85 | rh->segments_left, |
90 | !!(rtinfo->invflags & IP6T_RT_INV_SGS)))); | 86 | !!(rtinfo->invflags & IP6T_RT_INV_SGS))); |
91 | DEBUGP("type %02X %02X %02X ", | 87 | pr_debug("type %02X %02X %02X ", |
92 | rtinfo->rt_type, rh->type, | 88 | rtinfo->rt_type, rh->type, |
93 | (!(rtinfo->flags & IP6T_RT_TYP) || | 89 | (!(rtinfo->flags & IP6T_RT_TYP) || |
94 | ((rtinfo->rt_type == rh->type) ^ | 90 | ((rtinfo->rt_type == rh->type) ^ |
95 | !!(rtinfo->invflags & IP6T_RT_INV_TYP)))); | 91 | !!(rtinfo->invflags & IP6T_RT_INV_TYP)))); |
96 | DEBUGP("len %02X %04X %02X ", | 92 | pr_debug("len %02X %04X %02X ", |
97 | rtinfo->hdrlen, hdrlen, | 93 | rtinfo->hdrlen, hdrlen, |
98 | (!(rtinfo->flags & IP6T_RT_LEN) || | 94 | !(rtinfo->flags & IP6T_RT_LEN) || |
99 | ((rtinfo->hdrlen == hdrlen) ^ | 95 | ((rtinfo->hdrlen == hdrlen) ^ |
100 | !!(rtinfo->invflags & IP6T_RT_INV_LEN)))); | 96 | !!(rtinfo->invflags & IP6T_RT_INV_LEN))); |
101 | DEBUGP("res %02X %02X %02X ", | 97 | pr_debug("res %02X %02X %02X ", |
102 | (rtinfo->flags & IP6T_RT_RES), | 98 | rtinfo->flags & IP6T_RT_RES, |
103 | ((struct rt0_hdr *)rh)->reserved, | 99 | ((const struct rt0_hdr *)rh)->reserved, |
104 | !((rtinfo->flags & IP6T_RT_RES) && | 100 | !((rtinfo->flags & IP6T_RT_RES) && |
105 | (((struct rt0_hdr *)rh)->reserved))); | 101 | (((const struct rt0_hdr *)rh)->reserved))); |
106 | 102 | ||
107 | ret = (rh != NULL) | 103 | ret = (rh != NULL) |
108 | && | 104 | && |
@@ -129,18 +125,18 @@ match(const struct sk_buff *skb, | |||
129 | ret = (*rp == 0); | 125 | ret = (*rp == 0); |
130 | } | 126 | } |
131 | 127 | ||
132 | DEBUGP("#%d ", rtinfo->addrnr); | 128 | pr_debug("#%d ", rtinfo->addrnr); |
133 | if (!(rtinfo->flags & IP6T_RT_FST)) { | 129 | if (!(rtinfo->flags & IP6T_RT_FST)) { |
134 | return ret; | 130 | return ret; |
135 | } else if (rtinfo->flags & IP6T_RT_FST_NSTRICT) { | 131 | } else if (rtinfo->flags & IP6T_RT_FST_NSTRICT) { |
136 | DEBUGP("Not strict "); | 132 | pr_debug("Not strict "); |
137 | if (rtinfo->addrnr > (unsigned int)((hdrlen - 8) / 16)) { | 133 | if (rtinfo->addrnr > (unsigned int)((hdrlen - 8) / 16)) { |
138 | DEBUGP("There isn't enough space\n"); | 134 | pr_debug("There isn't enough space\n"); |
139 | return 0; | 135 | return false; |
140 | } else { | 136 | } else { |
141 | unsigned int i = 0; | 137 | unsigned int i = 0; |
142 | 138 | ||
143 | DEBUGP("#%d ", rtinfo->addrnr); | 139 | pr_debug("#%d ", rtinfo->addrnr); |
144 | for (temp = 0; | 140 | for (temp = 0; |
145 | temp < (unsigned int)((hdrlen - 8) / 16); | 141 | temp < (unsigned int)((hdrlen - 8) / 16); |
146 | temp++) { | 142 | temp++) { |
@@ -154,25 +150,25 @@ match(const struct sk_buff *skb, | |||
154 | BUG_ON(ap == NULL); | 150 | BUG_ON(ap == NULL); |
155 | 151 | ||
156 | if (ipv6_addr_equal(ap, &rtinfo->addrs[i])) { | 152 | if (ipv6_addr_equal(ap, &rtinfo->addrs[i])) { |
157 | DEBUGP("i=%d temp=%d;\n", i, temp); | 153 | pr_debug("i=%d temp=%d;\n", i, temp); |
158 | i++; | 154 | i++; |
159 | } | 155 | } |
160 | if (i == rtinfo->addrnr) | 156 | if (i == rtinfo->addrnr) |
161 | break; | 157 | break; |
162 | } | 158 | } |
163 | DEBUGP("i=%d #%d\n", i, rtinfo->addrnr); | 159 | pr_debug("i=%d #%d\n", i, rtinfo->addrnr); |
164 | if (i == rtinfo->addrnr) | 160 | if (i == rtinfo->addrnr) |
165 | return ret; | 161 | return ret; |
166 | else | 162 | else |
167 | return 0; | 163 | return false; |
168 | } | 164 | } |
169 | } else { | 165 | } else { |
170 | DEBUGP("Strict "); | 166 | pr_debug("Strict "); |
171 | if (rtinfo->addrnr > (unsigned int)((hdrlen - 8) / 16)) { | 167 | if (rtinfo->addrnr > (unsigned int)((hdrlen - 8) / 16)) { |
172 | DEBUGP("There isn't enough space\n"); | 168 | pr_debug("There isn't enough space\n"); |
173 | return 0; | 169 | return false; |
174 | } else { | 170 | } else { |
175 | DEBUGP("#%d ", rtinfo->addrnr); | 171 | pr_debug("#%d ", rtinfo->addrnr); |
176 | for (temp = 0; temp < rtinfo->addrnr; temp++) { | 172 | for (temp = 0; temp < rtinfo->addrnr; temp++) { |
177 | ap = skb_header_pointer(skb, | 173 | ap = skb_header_pointer(skb, |
178 | ptr | 174 | ptr |
@@ -185,20 +181,20 @@ match(const struct sk_buff *skb, | |||
185 | if (!ipv6_addr_equal(ap, &rtinfo->addrs[temp])) | 181 | if (!ipv6_addr_equal(ap, &rtinfo->addrs[temp])) |
186 | break; | 182 | break; |
187 | } | 183 | } |
188 | DEBUGP("temp=%d #%d\n", temp, rtinfo->addrnr); | 184 | pr_debug("temp=%d #%d\n", temp, rtinfo->addrnr); |
189 | if ((temp == rtinfo->addrnr) && | 185 | if (temp == rtinfo->addrnr && |
190 | (temp == (unsigned int)((hdrlen - 8) / 16))) | 186 | temp == (unsigned int)((hdrlen - 8) / 16)) |
191 | return ret; | 187 | return ret; |
192 | else | 188 | else |
193 | return 0; | 189 | return false; |
194 | } | 190 | } |
195 | } | 191 | } |
196 | 192 | ||
197 | return 0; | 193 | return false; |
198 | } | 194 | } |
199 | 195 | ||
200 | /* Called when user tries to insert an entry of this type. */ | 196 | /* Called when user tries to insert an entry of this type. */ |
201 | static int | 197 | static bool |
202 | checkentry(const char *tablename, | 198 | checkentry(const char *tablename, |
203 | const void *entry, | 199 | const void *entry, |
204 | const struct xt_match *match, | 200 | const struct xt_match *match, |
@@ -208,21 +204,21 @@ checkentry(const char *tablename, | |||
208 | const struct ip6t_rt *rtinfo = matchinfo; | 204 | const struct ip6t_rt *rtinfo = matchinfo; |
209 | 205 | ||
210 | if (rtinfo->invflags & ~IP6T_RT_INV_MASK) { | 206 | if (rtinfo->invflags & ~IP6T_RT_INV_MASK) { |
211 | DEBUGP("ip6t_rt: unknown flags %X\n", rtinfo->invflags); | 207 | pr_debug("ip6t_rt: unknown flags %X\n", rtinfo->invflags); |
212 | return 0; | 208 | return false; |
213 | } | 209 | } |
214 | if ((rtinfo->flags & (IP6T_RT_RES | IP6T_RT_FST_MASK)) && | 210 | if ((rtinfo->flags & (IP6T_RT_RES | IP6T_RT_FST_MASK)) && |
215 | (!(rtinfo->flags & IP6T_RT_TYP) || | 211 | (!(rtinfo->flags & IP6T_RT_TYP) || |
216 | (rtinfo->rt_type != 0) || | 212 | (rtinfo->rt_type != 0) || |
217 | (rtinfo->invflags & IP6T_RT_INV_TYP))) { | 213 | (rtinfo->invflags & IP6T_RT_INV_TYP))) { |
218 | DEBUGP("`--rt-type 0' required before `--rt-0-*'"); | 214 | pr_debug("`--rt-type 0' required before `--rt-0-*'"); |
219 | return 0; | 215 | return false; |
220 | } | 216 | } |
221 | 217 | ||
222 | return 1; | 218 | return true; |
223 | } | 219 | } |
224 | 220 | ||
225 | static struct xt_match rt_match = { | 221 | static struct xt_match rt_match __read_mostly = { |
226 | .name = "rt", | 222 | .name = "rt", |
227 | .family = AF_INET6, | 223 | .family = AF_INET6, |
228 | .match = match, | 224 | .match = match, |
diff --git a/net/ipv6/netfilter/ip6table_mangle.c b/net/ipv6/netfilter/ip6table_mangle.c index f2d26495f4..f0a9efa67f 100644 --- a/net/ipv6/netfilter/ip6table_mangle.c +++ b/net/ipv6/netfilter/ip6table_mangle.c | |||
@@ -21,12 +21,6 @@ MODULE_DESCRIPTION("ip6tables mangle table"); | |||
21 | (1 << NF_IP6_LOCAL_OUT) | \ | 21 | (1 << NF_IP6_LOCAL_OUT) | \ |
22 | (1 << NF_IP6_POST_ROUTING)) | 22 | (1 << NF_IP6_POST_ROUTING)) |
23 | 23 | ||
24 | #if 0 | ||
25 | #define DEBUGP(x, args...) printk(KERN_DEBUG x, ## args) | ||
26 | #else | ||
27 | #define DEBUGP(x, args...) | ||
28 | #endif | ||
29 | |||
30 | static struct | 24 | static struct |
31 | { | 25 | { |
32 | struct ip6t_replace repl; | 26 | struct ip6t_replace repl; |
diff --git a/net/ipv6/netfilter/ip6table_raw.c b/net/ipv6/netfilter/ip6table_raw.c index 0acda45d45..ec290e4ebd 100644 --- a/net/ipv6/netfilter/ip6table_raw.c +++ b/net/ipv6/netfilter/ip6table_raw.c | |||
@@ -8,12 +8,6 @@ | |||
8 | 8 | ||
9 | #define RAW_VALID_HOOKS ((1 << NF_IP6_PRE_ROUTING) | (1 << NF_IP6_LOCAL_OUT)) | 9 | #define RAW_VALID_HOOKS ((1 << NF_IP6_PRE_ROUTING) | (1 << NF_IP6_LOCAL_OUT)) |
10 | 10 | ||
11 | #if 0 | ||
12 | #define DEBUGP(x, args...) printk(KERN_DEBUG x, ## args) | ||
13 | #else | ||
14 | #define DEBUGP(x, args...) | ||
15 | #endif | ||
16 | |||
17 | static struct | 11 | static struct |
18 | { | 12 | { |
19 | struct ip6t_replace repl; | 13 | struct ip6t_replace repl; |
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c index 1b1797f1f3..36df2218b6 100644 --- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c +++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | |||
@@ -26,12 +26,6 @@ | |||
26 | #include <net/netfilter/nf_conntrack_l3proto.h> | 26 | #include <net/netfilter/nf_conntrack_l3proto.h> |
27 | #include <net/netfilter/nf_conntrack_core.h> | 27 | #include <net/netfilter/nf_conntrack_core.h> |
28 | 28 | ||
29 | #if 0 | ||
30 | #define DEBUGP printk | ||
31 | #else | ||
32 | #define DEBUGP(format, args...) | ||
33 | #endif | ||
34 | |||
35 | static int ipv6_pkt_to_tuple(const struct sk_buff *skb, unsigned int nhoff, | 29 | static int ipv6_pkt_to_tuple(const struct sk_buff *skb, unsigned int nhoff, |
36 | struct nf_conntrack_tuple *tuple) | 30 | struct nf_conntrack_tuple *tuple) |
37 | { | 31 | { |
@@ -92,7 +86,7 @@ static int ipv6_print_conntrack(struct seq_file *s, | |||
92 | * - Note also special handling of AUTH header. Thanks to IPsec wizards. | 86 | * - Note also special handling of AUTH header. Thanks to IPsec wizards. |
93 | */ | 87 | */ |
94 | 88 | ||
95 | int nf_ct_ipv6_skip_exthdr(struct sk_buff *skb, int start, u8 *nexthdrp, | 89 | int nf_ct_ipv6_skip_exthdr(const struct sk_buff *skb, int start, u8 *nexthdrp, |
96 | int len) | 90 | int len) |
97 | { | 91 | { |
98 | u8 nexthdr = *nexthdrp; | 92 | u8 nexthdr = *nexthdrp; |
@@ -123,22 +117,25 @@ int nf_ct_ipv6_skip_exthdr(struct sk_buff *skb, int start, u8 *nexthdrp, | |||
123 | return start; | 117 | return start; |
124 | } | 118 | } |
125 | 119 | ||
126 | static int | 120 | static int ipv6_get_l4proto(const struct sk_buff *skb, unsigned int nhoff, |
127 | ipv6_prepare(struct sk_buff **pskb, unsigned int hooknum, unsigned int *dataoff, | 121 | unsigned int *dataoff, u_int8_t *protonum) |
128 | u_int8_t *protonum) | ||
129 | { | 122 | { |
130 | unsigned int extoff = (u8 *)(ipv6_hdr(*pskb) + 1) - (*pskb)->data; | 123 | unsigned int extoff = nhoff + sizeof(struct ipv6hdr); |
131 | unsigned char pnum = ipv6_hdr(*pskb)->nexthdr; | 124 | unsigned char pnum; |
132 | int protoff = nf_ct_ipv6_skip_exthdr(*pskb, extoff, &pnum, | 125 | int protoff; |
133 | (*pskb)->len - extoff); | 126 | |
127 | if (skb_copy_bits(skb, nhoff + offsetof(struct ipv6hdr, nexthdr), | ||
128 | &pnum, sizeof(pnum)) != 0) { | ||
129 | pr_debug("ip6_conntrack_core: can't get nexthdr\n"); | ||
130 | return -NF_ACCEPT; | ||
131 | } | ||
132 | protoff = nf_ct_ipv6_skip_exthdr(skb, extoff, &pnum, skb->len - extoff); | ||
134 | /* | 133 | /* |
135 | * (protoff == (*pskb)->len) mean that the packet doesn't have no data | 134 | * (protoff == skb->len) mean that the packet doesn't have no data |
136 | * except of IPv6 & ext headers. but it's tracked anyway. - YK | 135 | * except of IPv6 & ext headers. but it's tracked anyway. - YK |
137 | */ | 136 | */ |
138 | if ((protoff < 0) || (protoff > (*pskb)->len)) { | 137 | if ((protoff < 0) || (protoff > skb->len)) { |
139 | DEBUGP("ip6_conntrack_core: can't find proto in pkt\n"); | 138 | pr_debug("ip6_conntrack_core: can't find proto in pkt\n"); |
140 | NF_CT_STAT_INC_ATOMIC(error); | ||
141 | NF_CT_STAT_INC_ATOMIC(invalid); | ||
142 | return -NF_ACCEPT; | 139 | return -NF_ACCEPT; |
143 | } | 140 | } |
144 | 141 | ||
@@ -147,11 +144,6 @@ ipv6_prepare(struct sk_buff **pskb, unsigned int hooknum, unsigned int *dataoff, | |||
147 | return NF_ACCEPT; | 144 | return NF_ACCEPT; |
148 | } | 145 | } |
149 | 146 | ||
150 | static u_int32_t ipv6_get_features(const struct nf_conntrack_tuple *tuple) | ||
151 | { | ||
152 | return NF_CT_F_BASIC; | ||
153 | } | ||
154 | |||
155 | static unsigned int ipv6_confirm(unsigned int hooknum, | 147 | static unsigned int ipv6_confirm(unsigned int hooknum, |
156 | struct sk_buff **pskb, | 148 | struct sk_buff **pskb, |
157 | const struct net_device *in, | 149 | const struct net_device *in, |
@@ -183,7 +175,7 @@ static unsigned int ipv6_confirm(unsigned int hooknum, | |||
183 | protoff = nf_ct_ipv6_skip_exthdr(*pskb, extoff, &pnum, | 175 | protoff = nf_ct_ipv6_skip_exthdr(*pskb, extoff, &pnum, |
184 | (*pskb)->len - extoff); | 176 | (*pskb)->len - extoff); |
185 | if (protoff > (*pskb)->len || pnum == NEXTHDR_FRAGMENT) { | 177 | if (protoff > (*pskb)->len || pnum == NEXTHDR_FRAGMENT) { |
186 | DEBUGP("proto header not found\n"); | 178 | pr_debug("proto header not found\n"); |
187 | return NF_ACCEPT; | 179 | return NF_ACCEPT; |
188 | } | 180 | } |
189 | 181 | ||
@@ -381,14 +373,14 @@ static int ipv6_nfattr_to_tuple(struct nfattr *tb[], | |||
381 | } | 373 | } |
382 | #endif | 374 | #endif |
383 | 375 | ||
384 | struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv6 = { | 376 | struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv6 __read_mostly = { |
385 | .l3proto = PF_INET6, | 377 | .l3proto = PF_INET6, |
386 | .name = "ipv6", | 378 | .name = "ipv6", |
387 | .pkt_to_tuple = ipv6_pkt_to_tuple, | 379 | .pkt_to_tuple = ipv6_pkt_to_tuple, |
388 | .invert_tuple = ipv6_invert_tuple, | 380 | .invert_tuple = ipv6_invert_tuple, |
389 | .print_tuple = ipv6_print_tuple, | 381 | .print_tuple = ipv6_print_tuple, |
390 | .print_conntrack = ipv6_print_conntrack, | 382 | .print_conntrack = ipv6_print_conntrack, |
391 | .prepare = ipv6_prepare, | 383 | .get_l4proto = ipv6_get_l4proto, |
392 | #if defined(CONFIG_NF_CT_NETLINK) || defined(CONFIG_NF_CT_NETLINK_MODULE) | 384 | #if defined(CONFIG_NF_CT_NETLINK) || defined(CONFIG_NF_CT_NETLINK_MODULE) |
393 | .tuple_to_nfattr = ipv6_tuple_to_nfattr, | 385 | .tuple_to_nfattr = ipv6_tuple_to_nfattr, |
394 | .nfattr_to_tuple = ipv6_nfattr_to_tuple, | 386 | .nfattr_to_tuple = ipv6_nfattr_to_tuple, |
@@ -397,7 +389,6 @@ struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv6 = { | |||
397 | .ctl_table_path = nf_net_netfilter_sysctl_path, | 389 | .ctl_table_path = nf_net_netfilter_sysctl_path, |
398 | .ctl_table = nf_ct_ipv6_sysctl_table, | 390 | .ctl_table = nf_ct_ipv6_sysctl_table, |
399 | #endif | 391 | #endif |
400 | .get_features = ipv6_get_features, | ||
401 | .me = THIS_MODULE, | 392 | .me = THIS_MODULE, |
402 | }; | 393 | }; |
403 | 394 | ||
diff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c index 8814b95b23..ab154fb900 100644 --- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c +++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | |||
@@ -27,12 +27,6 @@ | |||
27 | 27 | ||
28 | static unsigned long nf_ct_icmpv6_timeout __read_mostly = 30*HZ; | 28 | static unsigned long nf_ct_icmpv6_timeout __read_mostly = 30*HZ; |
29 | 29 | ||
30 | #if 0 | ||
31 | #define DEBUGP printk | ||
32 | #else | ||
33 | #define DEBUGP(format, args...) | ||
34 | #endif | ||
35 | |||
36 | static int icmpv6_pkt_to_tuple(const struct sk_buff *skb, | 30 | static int icmpv6_pkt_to_tuple(const struct sk_buff *skb, |
37 | unsigned int dataoff, | 31 | unsigned int dataoff, |
38 | struct nf_conntrack_tuple *tuple) | 32 | struct nf_conntrack_tuple *tuple) |
@@ -125,8 +119,8 @@ static int icmpv6_new(struct nf_conn *conntrack, | |||
125 | 119 | ||
126 | if (type < 0 || type >= sizeof(valid_new) || !valid_new[type]) { | 120 | if (type < 0 || type >= sizeof(valid_new) || !valid_new[type]) { |
127 | /* Can't create a new ICMPv6 `conn' with this. */ | 121 | /* Can't create a new ICMPv6 `conn' with this. */ |
128 | DEBUGP("icmpv6: can't create new conn with type %u\n", | 122 | pr_debug("icmpv6: can't create new conn with type %u\n", |
129 | type + 128); | 123 | type + 128); |
130 | NF_CT_DUMP_TUPLE(&conntrack->tuplehash[0].tuple); | 124 | NF_CT_DUMP_TUPLE(&conntrack->tuplehash[0].tuple); |
131 | return 0; | 125 | return 0; |
132 | } | 126 | } |
@@ -142,60 +136,36 @@ icmpv6_error_message(struct sk_buff *skb, | |||
142 | { | 136 | { |
143 | struct nf_conntrack_tuple intuple, origtuple; | 137 | struct nf_conntrack_tuple intuple, origtuple; |
144 | struct nf_conntrack_tuple_hash *h; | 138 | struct nf_conntrack_tuple_hash *h; |
145 | struct icmp6hdr _hdr, *hp; | ||
146 | unsigned int inip6off; | ||
147 | struct nf_conntrack_l4proto *inproto; | 139 | struct nf_conntrack_l4proto *inproto; |
148 | u_int8_t inprotonum; | ||
149 | unsigned int inprotoff; | ||
150 | 140 | ||
151 | NF_CT_ASSERT(skb->nfct == NULL); | 141 | NF_CT_ASSERT(skb->nfct == NULL); |
152 | 142 | ||
153 | hp = skb_header_pointer(skb, icmp6off, sizeof(_hdr), &_hdr); | 143 | /* Are they talking about one of our connections? */ |
154 | if (hp == NULL) { | 144 | if (!nf_ct_get_tuplepr(skb, |
155 | DEBUGP("icmpv6_error: Can't get ICMPv6 hdr.\n"); | 145 | skb_network_offset(skb) |
156 | return -NF_ACCEPT; | 146 | + sizeof(struct ipv6hdr) |
157 | } | 147 | + sizeof(struct icmp6hdr), |
158 | 148 | PF_INET6, &origtuple)) { | |
159 | inip6off = icmp6off + sizeof(_hdr); | 149 | pr_debug("icmpv6_error: Can't get tuple\n"); |
160 | if (skb_copy_bits(skb, inip6off+offsetof(struct ipv6hdr, nexthdr), | ||
161 | &inprotonum, sizeof(inprotonum)) != 0) { | ||
162 | DEBUGP("icmpv6_error: Can't get nexthdr in inner IPv6 header.\n"); | ||
163 | return -NF_ACCEPT; | ||
164 | } | ||
165 | inprotoff = nf_ct_ipv6_skip_exthdr(skb, | ||
166 | inip6off + sizeof(struct ipv6hdr), | ||
167 | &inprotonum, | ||
168 | skb->len - inip6off | ||
169 | - sizeof(struct ipv6hdr)); | ||
170 | |||
171 | if ((inprotoff > skb->len) || (inprotonum == NEXTHDR_FRAGMENT)) { | ||
172 | DEBUGP("icmpv6_error: Can't get protocol header in ICMPv6 payload.\n"); | ||
173 | return -NF_ACCEPT; | 150 | return -NF_ACCEPT; |
174 | } | 151 | } |
175 | 152 | ||
176 | /* rcu_read_lock()ed by nf_hook_slow */ | 153 | /* rcu_read_lock()ed by nf_hook_slow */ |
177 | inproto = __nf_ct_l4proto_find(PF_INET6, inprotonum); | 154 | inproto = __nf_ct_l4proto_find(PF_INET6, origtuple.dst.protonum); |
178 | |||
179 | /* Are they talking about one of our connections? */ | ||
180 | if (!nf_ct_get_tuple(skb, inip6off, inprotoff, PF_INET6, inprotonum, | ||
181 | &origtuple, &nf_conntrack_l3proto_ipv6, inproto)) { | ||
182 | DEBUGP("icmpv6_error: Can't get tuple\n"); | ||
183 | return -NF_ACCEPT; | ||
184 | } | ||
185 | 155 | ||
186 | /* Ordinarily, we'd expect the inverted tupleproto, but it's | 156 | /* Ordinarily, we'd expect the inverted tupleproto, but it's |
187 | been preserved inside the ICMP. */ | 157 | been preserved inside the ICMP. */ |
188 | if (!nf_ct_invert_tuple(&intuple, &origtuple, | 158 | if (!nf_ct_invert_tuple(&intuple, &origtuple, |
189 | &nf_conntrack_l3proto_ipv6, inproto)) { | 159 | &nf_conntrack_l3proto_ipv6, inproto)) { |
190 | DEBUGP("icmpv6_error: Can't invert tuple\n"); | 160 | pr_debug("icmpv6_error: Can't invert tuple\n"); |
191 | return -NF_ACCEPT; | 161 | return -NF_ACCEPT; |
192 | } | 162 | } |
193 | 163 | ||
194 | *ctinfo = IP_CT_RELATED; | 164 | *ctinfo = IP_CT_RELATED; |
195 | 165 | ||
196 | h = nf_conntrack_find_get(&intuple, NULL); | 166 | h = nf_conntrack_find_get(&intuple); |
197 | if (!h) { | 167 | if (!h) { |
198 | DEBUGP("icmpv6_error: no match\n"); | 168 | pr_debug("icmpv6_error: no match\n"); |
199 | return -NF_ACCEPT; | 169 | return -NF_ACCEPT; |
200 | } else { | 170 | } else { |
201 | if (NF_CT_DIRECTION(h) == IP_CT_DIR_REPLY) | 171 | if (NF_CT_DIRECTION(h) == IP_CT_DIR_REPLY) |
@@ -306,7 +276,7 @@ static struct ctl_table icmpv6_sysctl_table[] = { | |||
306 | }; | 276 | }; |
307 | #endif /* CONFIG_SYSCTL */ | 277 | #endif /* CONFIG_SYSCTL */ |
308 | 278 | ||
309 | struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 = | 279 | struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 __read_mostly = |
310 | { | 280 | { |
311 | .l3proto = PF_INET6, | 281 | .l3proto = PF_INET6, |
312 | .l4proto = IPPROTO_ICMPV6, | 282 | .l4proto = IPPROTO_ICMPV6, |
@@ -327,5 +297,3 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 = | |||
327 | .ctl_table = icmpv6_sysctl_table, | 297 | .ctl_table = icmpv6_sysctl_table, |
328 | #endif | 298 | #endif |
329 | }; | 299 | }; |
330 | |||
331 | EXPORT_SYMBOL(nf_conntrack_l4proto_icmpv6); | ||
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 347ab76082..25442a8c1b 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
@@ -44,12 +44,6 @@ | |||
44 | #include <linux/kernel.h> | 44 | #include <linux/kernel.h> |
45 | #include <linux/module.h> | 45 | #include <linux/module.h> |
46 | 46 | ||
47 | #if 0 | ||
48 | #define DEBUGP printk | ||
49 | #else | ||
50 | #define DEBUGP(format, args...) | ||
51 | #endif | ||
52 | |||
53 | #define NF_CT_FRAG6_HIGH_THRESH 262144 /* == 256*1024 */ | 47 | #define NF_CT_FRAG6_HIGH_THRESH 262144 /* == 256*1024 */ |
54 | #define NF_CT_FRAG6_LOW_THRESH 196608 /* == 192*1024 */ | 48 | #define NF_CT_FRAG6_LOW_THRESH 196608 /* == 192*1024 */ |
55 | #define NF_CT_FRAG6_TIMEOUT IPV6_FRAG_TIMEOUT | 49 | #define NF_CT_FRAG6_TIMEOUT IPV6_FRAG_TIMEOUT |
@@ -343,7 +337,7 @@ nf_ct_frag6_create(unsigned int hash, __be32 id, struct in6_addr *src, str | |||
343 | struct nf_ct_frag6_queue *fq; | 337 | struct nf_ct_frag6_queue *fq; |
344 | 338 | ||
345 | if ((fq = frag_alloc_queue()) == NULL) { | 339 | if ((fq = frag_alloc_queue()) == NULL) { |
346 | DEBUGP("Can't alloc new queue\n"); | 340 | pr_debug("Can't alloc new queue\n"); |
347 | goto oom; | 341 | goto oom; |
348 | } | 342 | } |
349 | 343 | ||
@@ -393,7 +387,7 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, | |||
393 | int offset, end; | 387 | int offset, end; |
394 | 388 | ||
395 | if (fq->last_in & COMPLETE) { | 389 | if (fq->last_in & COMPLETE) { |
396 | DEBUGP("Allready completed\n"); | 390 | pr_debug("Allready completed\n"); |
397 | goto err; | 391 | goto err; |
398 | } | 392 | } |
399 | 393 | ||
@@ -402,7 +396,7 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, | |||
402 | ((u8 *)(fhdr + 1) - (u8 *)(ipv6_hdr(skb) + 1))); | 396 | ((u8 *)(fhdr + 1) - (u8 *)(ipv6_hdr(skb) + 1))); |
403 | 397 | ||
404 | if ((unsigned int)end > IPV6_MAXPLEN) { | 398 | if ((unsigned int)end > IPV6_MAXPLEN) { |
405 | DEBUGP("offset is too large.\n"); | 399 | pr_debug("offset is too large.\n"); |
406 | return -1; | 400 | return -1; |
407 | } | 401 | } |
408 | 402 | ||
@@ -420,7 +414,7 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, | |||
420 | */ | 414 | */ |
421 | if (end < fq->len || | 415 | if (end < fq->len || |
422 | ((fq->last_in & LAST_IN) && end != fq->len)) { | 416 | ((fq->last_in & LAST_IN) && end != fq->len)) { |
423 | DEBUGP("already received last fragment\n"); | 417 | pr_debug("already received last fragment\n"); |
424 | goto err; | 418 | goto err; |
425 | } | 419 | } |
426 | fq->last_in |= LAST_IN; | 420 | fq->last_in |= LAST_IN; |
@@ -433,13 +427,13 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, | |||
433 | /* RFC2460 says always send parameter problem in | 427 | /* RFC2460 says always send parameter problem in |
434 | * this case. -DaveM | 428 | * this case. -DaveM |
435 | */ | 429 | */ |
436 | DEBUGP("the end of this fragment is not rounded to 8 bytes.\n"); | 430 | pr_debug("end of fragment not rounded to 8 bytes.\n"); |
437 | return -1; | 431 | return -1; |
438 | } | 432 | } |
439 | if (end > fq->len) { | 433 | if (end > fq->len) { |
440 | /* Some bits beyond end -> corruption. */ | 434 | /* Some bits beyond end -> corruption. */ |
441 | if (fq->last_in & LAST_IN) { | 435 | if (fq->last_in & LAST_IN) { |
442 | DEBUGP("last packet already reached.\n"); | 436 | pr_debug("last packet already reached.\n"); |
443 | goto err; | 437 | goto err; |
444 | } | 438 | } |
445 | fq->len = end; | 439 | fq->len = end; |
@@ -451,11 +445,11 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, | |||
451 | 445 | ||
452 | /* Point into the IP datagram 'data' part. */ | 446 | /* Point into the IP datagram 'data' part. */ |
453 | if (!pskb_pull(skb, (u8 *) (fhdr + 1) - skb->data)) { | 447 | if (!pskb_pull(skb, (u8 *) (fhdr + 1) - skb->data)) { |
454 | DEBUGP("queue: message is too short.\n"); | 448 | pr_debug("queue: message is too short.\n"); |
455 | goto err; | 449 | goto err; |
456 | } | 450 | } |
457 | if (pskb_trim_rcsum(skb, end - offset)) { | 451 | if (pskb_trim_rcsum(skb, end - offset)) { |
458 | DEBUGP("Can't trim\n"); | 452 | pr_debug("Can't trim\n"); |
459 | goto err; | 453 | goto err; |
460 | } | 454 | } |
461 | 455 | ||
@@ -480,11 +474,11 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, | |||
480 | if (i > 0) { | 474 | if (i > 0) { |
481 | offset += i; | 475 | offset += i; |
482 | if (end <= offset) { | 476 | if (end <= offset) { |
483 | DEBUGP("overlap\n"); | 477 | pr_debug("overlap\n"); |
484 | goto err; | 478 | goto err; |
485 | } | 479 | } |
486 | if (!pskb_pull(skb, i)) { | 480 | if (!pskb_pull(skb, i)) { |
487 | DEBUGP("Can't pull\n"); | 481 | pr_debug("Can't pull\n"); |
488 | goto err; | 482 | goto err; |
489 | } | 483 | } |
490 | if (skb->ip_summed != CHECKSUM_UNNECESSARY) | 484 | if (skb->ip_summed != CHECKSUM_UNNECESSARY) |
@@ -503,7 +497,7 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, | |||
503 | /* Eat head of the next overlapped fragment | 497 | /* Eat head of the next overlapped fragment |
504 | * and leave the loop. The next ones cannot overlap. | 498 | * and leave the loop. The next ones cannot overlap. |
505 | */ | 499 | */ |
506 | DEBUGP("Eat head of the overlapped parts.: %d", i); | 500 | pr_debug("Eat head of the overlapped parts.: %d", i); |
507 | if (!pskb_pull(next, i)) | 501 | if (!pskb_pull(next, i)) |
508 | goto err; | 502 | goto err; |
509 | 503 | ||
@@ -586,13 +580,13 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev) | |||
586 | sizeof(struct ipv6hdr) + fq->len - | 580 | sizeof(struct ipv6hdr) + fq->len - |
587 | sizeof(struct frag_hdr)); | 581 | sizeof(struct frag_hdr)); |
588 | if (payload_len > IPV6_MAXPLEN) { | 582 | if (payload_len > IPV6_MAXPLEN) { |
589 | DEBUGP("payload len is too large.\n"); | 583 | pr_debug("payload len is too large.\n"); |
590 | goto out_oversize; | 584 | goto out_oversize; |
591 | } | 585 | } |
592 | 586 | ||
593 | /* Head of list must not be cloned. */ | 587 | /* Head of list must not be cloned. */ |
594 | if (skb_cloned(head) && pskb_expand_head(head, 0, 0, GFP_ATOMIC)) { | 588 | if (skb_cloned(head) && pskb_expand_head(head, 0, 0, GFP_ATOMIC)) { |
595 | DEBUGP("skb is cloned but can't expand head"); | 589 | pr_debug("skb is cloned but can't expand head"); |
596 | goto out_oom; | 590 | goto out_oom; |
597 | } | 591 | } |
598 | 592 | ||
@@ -604,7 +598,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev) | |||
604 | int i, plen = 0; | 598 | int i, plen = 0; |
605 | 599 | ||
606 | if ((clone = alloc_skb(0, GFP_ATOMIC)) == NULL) { | 600 | if ((clone = alloc_skb(0, GFP_ATOMIC)) == NULL) { |
607 | DEBUGP("Can't alloc skb\n"); | 601 | pr_debug("Can't alloc skb\n"); |
608 | goto out_oom; | 602 | goto out_oom; |
609 | } | 603 | } |
610 | clone->next = head->next; | 604 | clone->next = head->next; |
@@ -719,11 +713,11 @@ find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff) | |||
719 | return -1; | 713 | return -1; |
720 | } | 714 | } |
721 | if (len < (int)sizeof(struct ipv6_opt_hdr)) { | 715 | if (len < (int)sizeof(struct ipv6_opt_hdr)) { |
722 | DEBUGP("too short\n"); | 716 | pr_debug("too short\n"); |
723 | return -1; | 717 | return -1; |
724 | } | 718 | } |
725 | if (nexthdr == NEXTHDR_NONE) { | 719 | if (nexthdr == NEXTHDR_NONE) { |
726 | DEBUGP("next header is none\n"); | 720 | pr_debug("next header is none\n"); |
727 | return -1; | 721 | return -1; |
728 | } | 722 | } |
729 | if (skb_copy_bits(skb, start, &hdr, sizeof(hdr))) | 723 | if (skb_copy_bits(skb, start, &hdr, sizeof(hdr))) |
@@ -764,7 +758,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) | |||
764 | 758 | ||
765 | /* Jumbo payload inhibits frag. header */ | 759 | /* Jumbo payload inhibits frag. header */ |
766 | if (ipv6_hdr(skb)->payload_len == 0) { | 760 | if (ipv6_hdr(skb)->payload_len == 0) { |
767 | DEBUGP("payload len = 0\n"); | 761 | pr_debug("payload len = 0\n"); |
768 | return skb; | 762 | return skb; |
769 | } | 763 | } |
770 | 764 | ||
@@ -773,14 +767,14 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) | |||
773 | 767 | ||
774 | clone = skb_clone(skb, GFP_ATOMIC); | 768 | clone = skb_clone(skb, GFP_ATOMIC); |
775 | if (clone == NULL) { | 769 | if (clone == NULL) { |
776 | DEBUGP("Can't clone skb\n"); | 770 | pr_debug("Can't clone skb\n"); |
777 | return skb; | 771 | return skb; |
778 | } | 772 | } |
779 | 773 | ||
780 | NFCT_FRAG6_CB(clone)->orig = skb; | 774 | NFCT_FRAG6_CB(clone)->orig = skb; |
781 | 775 | ||
782 | if (!pskb_may_pull(clone, fhoff + sizeof(*fhdr))) { | 776 | if (!pskb_may_pull(clone, fhoff + sizeof(*fhdr))) { |
783 | DEBUGP("message is too short.\n"); | 777 | pr_debug("message is too short.\n"); |
784 | goto ret_orig; | 778 | goto ret_orig; |
785 | } | 779 | } |
786 | 780 | ||
@@ -789,7 +783,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) | |||
789 | fhdr = (struct frag_hdr *)skb_transport_header(clone); | 783 | fhdr = (struct frag_hdr *)skb_transport_header(clone); |
790 | 784 | ||
791 | if (!(fhdr->frag_off & htons(0xFFF9))) { | 785 | if (!(fhdr->frag_off & htons(0xFFF9))) { |
792 | DEBUGP("Invalid fragment offset\n"); | 786 | pr_debug("Invalid fragment offset\n"); |
793 | /* It is not a fragmented frame */ | 787 | /* It is not a fragmented frame */ |
794 | goto ret_orig; | 788 | goto ret_orig; |
795 | } | 789 | } |
@@ -799,7 +793,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) | |||
799 | 793 | ||
800 | fq = fq_find(fhdr->identification, &hdr->saddr, &hdr->daddr); | 794 | fq = fq_find(fhdr->identification, &hdr->saddr, &hdr->daddr); |
801 | if (fq == NULL) { | 795 | if (fq == NULL) { |
802 | DEBUGP("Can't find and can't create new queue\n"); | 796 | pr_debug("Can't find and can't create new queue\n"); |
803 | goto ret_orig; | 797 | goto ret_orig; |
804 | } | 798 | } |
805 | 799 | ||
@@ -807,7 +801,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) | |||
807 | 801 | ||
808 | if (nf_ct_frag6_queue(fq, clone, fhdr, nhoff) < 0) { | 802 | if (nf_ct_frag6_queue(fq, clone, fhdr, nhoff) < 0) { |
809 | spin_unlock(&fq->lock); | 803 | spin_unlock(&fq->lock); |
810 | DEBUGP("Can't insert skb to queue\n"); | 804 | pr_debug("Can't insert skb to queue\n"); |
811 | fq_put(fq, NULL); | 805 | fq_put(fq, NULL); |
812 | goto ret_orig; | 806 | goto ret_orig; |
813 | } | 807 | } |
@@ -815,7 +809,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) | |||
815 | if (fq->last_in == (FIRST_IN|LAST_IN) && fq->meat == fq->len) { | 809 | if (fq->last_in == (FIRST_IN|LAST_IN) && fq->meat == fq->len) { |
816 | ret_skb = nf_ct_frag6_reasm(fq, dev); | 810 | ret_skb = nf_ct_frag6_reasm(fq, dev); |
817 | if (ret_skb == NULL) | 811 | if (ret_skb == NULL) |
818 | DEBUGP("Can't reassemble fragmented packets\n"); | 812 | pr_debug("Can't reassemble fragmented packets\n"); |
819 | } | 813 | } |
820 | spin_unlock(&fq->lock); | 814 | spin_unlock(&fq->lock); |
821 | 815 | ||
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index a58459a766..e27383d855 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -49,7 +49,7 @@ | |||
49 | #include <net/udp.h> | 49 | #include <net/udp.h> |
50 | #include <net/inet_common.h> | 50 | #include <net/inet_common.h> |
51 | #include <net/tcp_states.h> | 51 | #include <net/tcp_states.h> |
52 | #ifdef CONFIG_IPV6_MIP6 | 52 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
53 | #include <net/mip6.h> | 53 | #include <net/mip6.h> |
54 | #endif | 54 | #endif |
55 | 55 | ||
@@ -137,6 +137,28 @@ static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb) | |||
137 | return 0; | 137 | return 0; |
138 | } | 138 | } |
139 | 139 | ||
140 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) | ||
141 | static int (*mh_filter)(struct sock *sock, struct sk_buff *skb); | ||
142 | |||
143 | int rawv6_mh_filter_register(int (*filter)(struct sock *sock, | ||
144 | struct sk_buff *skb)) | ||
145 | { | ||
146 | rcu_assign_pointer(mh_filter, filter); | ||
147 | return 0; | ||
148 | } | ||
149 | EXPORT_SYMBOL(rawv6_mh_filter_register); | ||
150 | |||
151 | int rawv6_mh_filter_unregister(int (*filter)(struct sock *sock, | ||
152 | struct sk_buff *skb)) | ||
153 | { | ||
154 | rcu_assign_pointer(mh_filter, NULL); | ||
155 | synchronize_rcu(); | ||
156 | return 0; | ||
157 | } | ||
158 | EXPORT_SYMBOL(rawv6_mh_filter_unregister); | ||
159 | |||
160 | #endif | ||
161 | |||
140 | /* | 162 | /* |
141 | * demultiplex raw sockets. | 163 | * demultiplex raw sockets. |
142 | * (should consider queueing the skb in the sock receive_queue | 164 | * (should consider queueing the skb in the sock receive_queue |
@@ -178,16 +200,22 @@ int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr) | |||
178 | case IPPROTO_ICMPV6: | 200 | case IPPROTO_ICMPV6: |
179 | filtered = icmpv6_filter(sk, skb); | 201 | filtered = icmpv6_filter(sk, skb); |
180 | break; | 202 | break; |
181 | #ifdef CONFIG_IPV6_MIP6 | 203 | |
204 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) | ||
182 | case IPPROTO_MH: | 205 | case IPPROTO_MH: |
206 | { | ||
183 | /* XXX: To validate MH only once for each packet, | 207 | /* XXX: To validate MH only once for each packet, |
184 | * this is placed here. It should be after checking | 208 | * this is placed here. It should be after checking |
185 | * xfrm policy, however it doesn't. The checking xfrm | 209 | * xfrm policy, however it doesn't. The checking xfrm |
186 | * policy is placed in rawv6_rcv() because it is | 210 | * policy is placed in rawv6_rcv() because it is |
187 | * required for each socket. | 211 | * required for each socket. |
188 | */ | 212 | */ |
189 | filtered = mip6_mh_filter(sk, skb); | 213 | int (*filter)(struct sock *sock, struct sk_buff *skb); |
214 | |||
215 | filter = rcu_dereference(mh_filter); | ||
216 | filtered = filter ? filter(sk, skb) : 0; | ||
190 | break; | 217 | break; |
218 | } | ||
191 | #endif | 219 | #endif |
192 | default: | 220 | default: |
193 | filtered = 0; | 221 | filtered = 0; |
@@ -611,9 +639,7 @@ static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | |||
611 | struct iovec *iov; | 639 | struct iovec *iov; |
612 | u8 __user *type = NULL; | 640 | u8 __user *type = NULL; |
613 | u8 __user *code = NULL; | 641 | u8 __user *code = NULL; |
614 | #ifdef CONFIG_IPV6_MIP6 | ||
615 | u8 len = 0; | 642 | u8 len = 0; |
616 | #endif | ||
617 | int probed = 0; | 643 | int probed = 0; |
618 | int i; | 644 | int i; |
619 | 645 | ||
@@ -646,7 +672,6 @@ static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | |||
646 | probed = 1; | 672 | probed = 1; |
647 | } | 673 | } |
648 | break; | 674 | break; |
649 | #ifdef CONFIG_IPV6_MIP6 | ||
650 | case IPPROTO_MH: | 675 | case IPPROTO_MH: |
651 | if (iov->iov_base && iov->iov_len < 1) | 676 | if (iov->iov_base && iov->iov_len < 1) |
652 | break; | 677 | break; |
@@ -660,7 +685,6 @@ static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg) | |||
660 | len += iov->iov_len; | 685 | len += iov->iov_len; |
661 | 686 | ||
662 | break; | 687 | break; |
663 | #endif | ||
664 | default: | 688 | default: |
665 | probed = 1; | 689 | probed = 1; |
666 | break; | 690 | break; |
@@ -1256,7 +1280,7 @@ static int raw6_seq_show(struct seq_file *seq, void *v) | |||
1256 | return 0; | 1280 | return 0; |
1257 | } | 1281 | } |
1258 | 1282 | ||
1259 | static struct seq_operations raw6_seq_ops = { | 1283 | static const struct seq_operations raw6_seq_ops = { |
1260 | .start = raw6_seq_start, | 1284 | .start = raw6_seq_start, |
1261 | .next = raw6_seq_next, | 1285 | .next = raw6_seq_next, |
1262 | .stop = raw6_seq_stop, | 1286 | .stop = raw6_seq_stop, |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 1efa95a99f..eb20bb690a 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -532,7 +532,8 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
532 | */ | 532 | */ |
533 | max_headroom = LL_RESERVED_SPACE(tdev)+sizeof(struct iphdr); | 533 | max_headroom = LL_RESERVED_SPACE(tdev)+sizeof(struct iphdr); |
534 | 534 | ||
535 | if (skb_headroom(skb) < max_headroom || skb_cloned(skb) || skb_shared(skb)) { | 535 | if (skb_headroom(skb) < max_headroom || skb_shared(skb) || |
536 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { | ||
536 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); | 537 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); |
537 | if (!new_skb) { | 538 | if (!new_skb) { |
538 | ip_rt_put(rt); | 539 | ip_rt_put(rt); |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 193d9d60bb..d67fb1ef75 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -484,17 +484,6 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, | |||
484 | 484 | ||
485 | if (dst == NULL) { | 485 | if (dst == NULL) { |
486 | opt = np->opt; | 486 | opt = np->opt; |
487 | if (opt == NULL && | ||
488 | np->rxopt.bits.osrcrt == 2 && | ||
489 | treq->pktopts) { | ||
490 | struct sk_buff *pktopts = treq->pktopts; | ||
491 | struct inet6_skb_parm *rxopt = IP6CB(pktopts); | ||
492 | if (rxopt->srcrt) | ||
493 | opt = ipv6_invert_rthdr(sk, | ||
494 | (struct ipv6_rt_hdr *)(skb_network_header(pktopts) + | ||
495 | rxopt->srcrt)); | ||
496 | } | ||
497 | |||
498 | if (opt && opt->srcrt) { | 487 | if (opt && opt->srcrt) { |
499 | struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; | 488 | struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; |
500 | ipv6_addr_copy(&final, &fl.fl6_dst); | 489 | ipv6_addr_copy(&final, &fl.fl6_dst); |
@@ -1391,15 +1380,6 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1391 | if (sk_acceptq_is_full(sk)) | 1380 | if (sk_acceptq_is_full(sk)) |
1392 | goto out_overflow; | 1381 | goto out_overflow; |
1393 | 1382 | ||
1394 | if (np->rxopt.bits.osrcrt == 2 && | ||
1395 | opt == NULL && treq->pktopts) { | ||
1396 | struct inet6_skb_parm *rxopt = IP6CB(treq->pktopts); | ||
1397 | if (rxopt->srcrt) | ||
1398 | opt = ipv6_invert_rthdr(sk, | ||
1399 | (struct ipv6_rt_hdr *)(skb_network_header(treq->pktopts) + | ||
1400 | rxopt->srcrt)); | ||
1401 | } | ||
1402 | |||
1403 | if (dst == NULL) { | 1383 | if (dst == NULL) { |
1404 | struct in6_addr *final_p = NULL, final; | 1384 | struct in6_addr *final_p = NULL, final; |
1405 | struct flowi fl; | 1385 | struct flowi fl; |
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 1faa2ea80a..3ec0c4770e 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <net/ip.h> | 18 | #include <net/ip.h> |
19 | #include <net/ipv6.h> | 19 | #include <net/ipv6.h> |
20 | #include <net/ip6_route.h> | 20 | #include <net/ip6_route.h> |
21 | #ifdef CONFIG_IPV6_MIP6 | 21 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
22 | #include <net/mip6.h> | 22 | #include <net/mip6.h> |
23 | #endif | 23 | #endif |
24 | 24 | ||
@@ -318,7 +318,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl) | |||
318 | fl->proto = nexthdr; | 318 | fl->proto = nexthdr; |
319 | return; | 319 | return; |
320 | 320 | ||
321 | #ifdef CONFIG_IPV6_MIP6 | 321 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
322 | case IPPROTO_MH: | 322 | case IPPROTO_MH: |
323 | if (pskb_may_pull(skb, nh + offset + 3 - skb->data)) { | 323 | if (pskb_may_pull(skb, nh + offset + 3 - skb->data)) { |
324 | struct ip6_mh *mh; | 324 | struct ip6_mh *mh; |
diff --git a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c index baa461b9f7..cdadb48474 100644 --- a/net/ipv6/xfrm6_state.c +++ b/net/ipv6/xfrm6_state.c | |||
@@ -65,7 +65,7 @@ __xfrm6_state_sort(struct xfrm_state **dst, struct xfrm_state **src, int n) | |||
65 | goto end; | 65 | goto end; |
66 | 66 | ||
67 | /* Rule 2: select MIPv6 RO or inbound trigger */ | 67 | /* Rule 2: select MIPv6 RO or inbound trigger */ |
68 | #ifdef CONFIG_IPV6_MIP6 | 68 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
69 | for (i = 0; i < n; i++) { | 69 | for (i = 0; i < n; i++) { |
70 | if (src[i] && | 70 | if (src[i] && |
71 | (src[i]->props.mode == XFRM_MODE_ROUTEOPTIMIZATION || | 71 | (src[i]->props.mode == XFRM_MODE_ROUTEOPTIMIZATION || |
@@ -130,7 +130,7 @@ __xfrm6_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n) | |||
130 | goto end; | 130 | goto end; |
131 | 131 | ||
132 | /* Rule 2: select MIPv6 RO or inbound trigger */ | 132 | /* Rule 2: select MIPv6 RO or inbound trigger */ |
133 | #ifdef CONFIG_IPV6_MIP6 | 133 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
134 | for (i = 0; i < n; i++) { | 134 | for (i = 0; i < n; i++) { |
135 | if (src[i] && | 135 | if (src[i] && |
136 | (src[i]->mode == XFRM_MODE_ROUTEOPTIMIZATION || | 136 | (src[i]->mode == XFRM_MODE_ROUTEOPTIMIZATION || |
diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c index 5502cc948d..6f87dd568d 100644 --- a/net/ipv6/xfrm6_tunnel.c +++ b/net/ipv6/xfrm6_tunnel.c | |||
@@ -379,3 +379,4 @@ static void __exit xfrm6_tunnel_fini(void) | |||
379 | module_init(xfrm6_tunnel_init); | 379 | module_init(xfrm6_tunnel_init); |
380 | module_exit(xfrm6_tunnel_fini); | 380 | module_exit(xfrm6_tunnel_fini); |
381 | MODULE_LICENSE("GPL"); | 381 | MODULE_LICENSE("GPL"); |
382 | MODULE_ALIAS_XFRM_TYPE(AF_INET6, XFRM_PROTO_IPV6); | ||