1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <linux/module.h>
25#include <linux/kernel.h>
26#include <linux/ip.h>
27#include <linux/netdevice.h>
28#include <linux/skbuff.h>
29#include <linux/if_arp.h>
30#include <linux/if_ether.h>
31#include <linux/if_vlan.h>
32#include <linux/if_pppox.h>
33#include <linux/ppp_defs.h>
34#include <linux/netfilter_bridge.h>
35#include <linux/netfilter_ipv4.h>
36#include <linux/netfilter_ipv6.h>
37#include <linux/netfilter_arp.h>
38#include <linux/in_route.h>
39#include <linux/inetdevice.h>
40
41#include <net/ip.h>
42#include <net/ipv6.h>
43#include <net/route.h>
44
45#include <asm/uaccess.h>
46#include "br_private.h"
47#ifdef CONFIG_SYSCTL
48#include <linux/sysctl.h>
49#endif
50
51#define skb_origaddr(skb) (((struct bridge_skb_cb *) \
52 (skb->nf_bridge->data))->daddr.ipv4)
53#define store_orig_dstaddr(skb) (skb_origaddr(skb) = ip_hdr(skb)->daddr)
54#define dnat_took_place(skb) (skb_origaddr(skb) != ip_hdr(skb)->daddr)
55
56#ifdef CONFIG_SYSCTL
57static struct ctl_table_header *brnf_sysctl_header;
58static int brnf_call_iptables __read_mostly = 1;
59static int brnf_call_ip6tables __read_mostly = 1;
60static int brnf_call_arptables __read_mostly = 1;
61static int brnf_filter_vlan_tagged __read_mostly = 1;
62static int brnf_filter_pppoe_tagged __read_mostly = 1;
63#else
64#define brnf_filter_vlan_tagged 1
65#define brnf_filter_pppoe_tagged 1
66#endif
67
68static inline __be16 vlan_proto(const struct sk_buff *skb)
69{
70 return vlan_eth_hdr(skb)->h_vlan_encapsulated_proto;
71}
72
73#define IS_VLAN_IP(skb) \
74 (skb->protocol == htons(ETH_P_8021Q) && \
75 vlan_proto(skb) == htons(ETH_P_IP) && \
76 brnf_filter_vlan_tagged)
77
78#define IS_VLAN_IPV6(skb) \
79 (skb->protocol == htons(ETH_P_8021Q) && \
80 vlan_proto(skb) == htons(ETH_P_IPV6) &&\
81 brnf_filter_vlan_tagged)
82
83#define IS_VLAN_ARP(skb) \
84 (skb->protocol == htons(ETH_P_8021Q) && \
85 vlan_proto(skb) == htons(ETH_P_ARP) && \
86 brnf_filter_vlan_tagged)
87
88static inline __be16 pppoe_proto(const struct sk_buff *skb)
89{
90 return *((__be16 *)(skb_mac_header(skb) + ETH_HLEN +
91 sizeof(struct pppoe_hdr)));
92}
93
94#define IS_PPPOE_IP(skb) \
95 (skb->protocol == htons(ETH_P_PPP_SES) && \
96 pppoe_proto(skb) == htons(PPP_IP) && \
97 brnf_filter_pppoe_tagged)
98
99#define IS_PPPOE_IPV6(skb) \
100 (skb->protocol == htons(ETH_P_PPP_SES) && \
101 pppoe_proto(skb) == htons(PPP_IPV6) && \
102 brnf_filter_pppoe_tagged)
103
104static void fake_update_pmtu(struct dst_entry *dst, u32 mtu)
105{
106}
107
108static struct dst_ops fake_dst_ops = {
109 .family = AF_INET,
110 .protocol = __constant_htons(ETH_P_IP),
111 .update_pmtu = fake_update_pmtu,
112 .entry_size = sizeof(struct rtable),
113 .entries = ATOMIC_INIT(0),
114};
115
116
117
118
119
120
121
122
123void br_netfilter_rtable_init(struct net_bridge *br)
124{
125 struct rtable *rt = &br->fake_rtable;
126
127 atomic_set(&rt->u.dst.__refcnt, 1);
128 rt->u.dst.dev = br->dev;
129 rt->u.dst.path = &rt->u.dst;
130 rt->u.dst.metrics[RTAX_MTU - 1] = 1500;
131 rt->u.dst.flags = DST_NOXFRM;
132 rt->u.dst.ops = &fake_dst_ops;
133}
134
135static inline struct rtable *bridge_parent_rtable(const struct net_device *dev)
136{
137 struct net_bridge_port *port = rcu_dereference(dev->br_port);
138
139 return port ? &port->br->fake_rtable : NULL;
140}
141
142static inline struct net_device *bridge_parent(const struct net_device *dev)
143{
144 struct net_bridge_port *port = rcu_dereference(dev->br_port);
145
146 return port ? port->br->dev : NULL;
147}
148
149static inline struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb)
150{
151 skb->nf_bridge = kzalloc(sizeof(struct nf_bridge_info), GFP_ATOMIC);
152 if (likely(skb->nf_bridge))
153 atomic_set(&(skb->nf_bridge->use), 1);
154
155 return skb->nf_bridge;
156}
157
158static inline struct nf_bridge_info *nf_bridge_unshare(struct sk_buff *skb)
159{
160 struct nf_bridge_info *nf_bridge = skb->nf_bridge;
161
162 if (atomic_read(&nf_bridge->use) > 1) {
163 struct nf_bridge_info *tmp = nf_bridge_alloc(skb);
164
165 if (tmp) {
166 memcpy(tmp, nf_bridge, sizeof(struct nf_bridge_info));
167 atomic_set(&tmp->use, 1);
168 nf_bridge_put(nf_bridge);
169 }
170 nf_bridge = tmp;
171 }
172 return nf_bridge;
173}
174
175static inline void nf_bridge_push_encap_header(struct sk_buff *skb)
176{
177 unsigned int len = nf_bridge_encap_header_len(skb);
178
179 skb_push(skb, len);
180 skb->network_header -= len;
181}
182
183static inline void nf_bridge_pull_encap_header(struct sk_buff *skb)
184{
185 unsigned int len = nf_bridge_encap_header_len(skb);
186
187 skb_pull(skb, len);
188 skb->network_header += len;
189}
190
191static inline void nf_bridge_pull_encap_header_rcsum(struct sk_buff *skb)
192{
193 unsigned int len = nf_bridge_encap_header_len(skb);
194
195 skb_pull_rcsum(skb, len);
196 skb->network_header += len;
197}
198
199static inline void nf_bridge_save_header(struct sk_buff *skb)
200{
201 int header_size = ETH_HLEN + nf_bridge_encap_header_len(skb);
202
203 skb_copy_from_linear_data_offset(skb, -header_size,
204 skb->nf_bridge->data, header_size);
205}
206
207
208
209
210
211int nf_bridge_copy_header(struct sk_buff *skb)
212{
213 int err;
214 int header_size = ETH_HLEN + nf_bridge_encap_header_len(skb);
215
216 err = skb_cow_head(skb, header_size);
217 if (err)
218 return err;
219
220 skb_copy_to_linear_data_offset(skb, -header_size,
221 skb->nf_bridge->data, header_size);
222 __skb_push(skb, nf_bridge_encap_header_len(skb));
223 return 0;
224}
225
226
227
228
229static int br_nf_pre_routing_finish_ipv6(struct sk_buff *skb)
230{
231 struct nf_bridge_info *nf_bridge = skb->nf_bridge;
232
233 if (nf_bridge->mask & BRNF_PKT_TYPE) {
234 skb->pkt_type = PACKET_OTHERHOST;
235 nf_bridge->mask ^= BRNF_PKT_TYPE;
236 }
237 nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING;
238
239 skb->rtable = bridge_parent_rtable(nf_bridge->physindev);
240 if (!skb->rtable) {
241 kfree_skb(skb);
242 return 0;
243 }
244 dst_hold(&skb->rtable->u.dst);
245
246 skb->dev = nf_bridge->physindev;
247 nf_bridge_push_encap_header(skb);
248 NF_HOOK_THRESH(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
249 br_handle_frame_finish, 1);
250
251 return 0;
252}
253
254static void __br_dnat_complain(void)
255{
256 static unsigned long last_complaint;
257
258 if (jiffies - last_complaint >= 5 * HZ) {
259 printk(KERN_WARNING "Performing cross-bridge DNAT requires IP "
260 "forwarding to be enabled\n");
261 last_complaint = jiffies;
262 }
263}
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb)
315{
316 if (skb->pkt_type == PACKET_OTHERHOST) {
317 skb->pkt_type = PACKET_HOST;
318 skb->nf_bridge->mask |= BRNF_PKT_TYPE;
319 }
320 skb->nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING;
321
322 skb->dev = bridge_parent(skb->dev);
323 if (skb->dev) {
324 struct dst_entry *dst = skb->dst;
325
326 nf_bridge_pull_encap_header(skb);
327
328 if (dst->hh)
329 return neigh_hh_output(dst->hh, skb);
330 else if (dst->neighbour)
331 return dst->neighbour->output(skb);
332 }
333 kfree_skb(skb);
334 return 0;
335}
336
337static int br_nf_pre_routing_finish(struct sk_buff *skb)
338{
339 struct net_device *dev = skb->dev;
340 struct iphdr *iph = ip_hdr(skb);
341 struct nf_bridge_info *nf_bridge = skb->nf_bridge;
342 int err;
343
344 if (nf_bridge->mask & BRNF_PKT_TYPE) {
345 skb->pkt_type = PACKET_OTHERHOST;
346 nf_bridge->mask ^= BRNF_PKT_TYPE;
347 }
348 nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING;
349 if (dnat_took_place(skb)) {
350 if ((err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) {
351 struct rtable *rt;
352 struct flowi fl = {
353 .nl_u = {
354 .ip4_u = {
355 .daddr = iph->daddr,
356 .saddr = 0,
357 .tos = RT_TOS(iph->tos) },
358 },
359 .proto = 0,
360 };
361 struct in_device *in_dev = __in_dev_get_rcu(dev);
362
363
364
365
366
367
368
369
370 if (err != -EHOSTUNREACH || !in_dev || IN_DEV_FORWARD(in_dev))
371 goto free_skb;
372
373 if (!ip_route_output_key(&init_net, &rt, &fl)) {
374
375
376 if (((struct dst_entry *)rt)->dev == dev) {
377 skb->dst = (struct dst_entry *)rt;
378 goto bridged_dnat;
379 }
380
381
382
383
384 __br_dnat_complain();
385 dst_release((struct dst_entry *)rt);
386 }
387free_skb:
388 kfree_skb(skb);
389 return 0;
390 } else {
391 if (skb->dst->dev == dev) {
392bridged_dnat:
393
394
395 nf_bridge->mask |= BRNF_BRIDGED_DNAT;
396 skb->dev = nf_bridge->physindev;
397 nf_bridge_push_encap_header(skb);
398 NF_HOOK_THRESH(PF_BRIDGE, NF_BR_PRE_ROUTING,
399 skb, skb->dev, NULL,
400 br_nf_pre_routing_finish_bridge,
401 1);
402 return 0;
403 }
404 memcpy(eth_hdr(skb)->h_dest, dev->dev_addr, ETH_ALEN);
405 skb->pkt_type = PACKET_HOST;
406 }
407 } else {
408 skb->rtable = bridge_parent_rtable(nf_bridge->physindev);
409 if (!skb->rtable) {
410 kfree_skb(skb);
411 return 0;
412 }
413 dst_hold(&skb->rtable->u.dst);
414 }
415
416 skb->dev = nf_bridge->physindev;
417 nf_bridge_push_encap_header(skb);
418 NF_HOOK_THRESH(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
419 br_handle_frame_finish, 1);
420
421 return 0;
422}
423
424
425static struct net_device *setup_pre_routing(struct sk_buff *skb)
426{
427 struct nf_bridge_info *nf_bridge = skb->nf_bridge;
428
429 if (skb->pkt_type == PACKET_OTHERHOST) {
430 skb->pkt_type = PACKET_HOST;
431 nf_bridge->mask |= BRNF_PKT_TYPE;
432 }
433
434 nf_bridge->mask |= BRNF_NF_BRIDGE_PREROUTING;
435 nf_bridge->physindev = skb->dev;
436 skb->dev = bridge_parent(skb->dev);
437
438 return skb->dev;
439}
440
441
442static int check_hbh_len(struct sk_buff *skb)
443{
444 unsigned char *raw = (u8 *)(ipv6_hdr(skb) + 1);
445 u32 pkt_len;
446 const unsigned char *nh = skb_network_header(skb);
447 int off = raw - nh;
448 int len = (raw[1] + 1) << 3;
449
450 if ((raw + len) - skb->data > skb_headlen(skb))
451 goto bad;
452
453 off += 2;
454 len -= 2;
455
456 while (len > 0) {
457 int optlen = nh[off + 1] + 2;
458
459 switch (nh[off]) {
460 case IPV6_TLV_PAD0:
461 optlen = 1;
462 break;
463
464 case IPV6_TLV_PADN:
465 break;
466
467 case IPV6_TLV_JUMBO:
468 if (nh[off + 1] != 4 || (off & 3) != 2)
469 goto bad;
470 pkt_len = ntohl(*(__be32 *) (nh + off + 2));
471 if (pkt_len <= IPV6_MAXPLEN ||
472 ipv6_hdr(skb)->payload_len)
473 goto bad;
474 if (pkt_len > skb->len - sizeof(struct ipv6hdr))
475 goto bad;
476 if (pskb_trim_rcsum(skb,
477 pkt_len + sizeof(struct ipv6hdr)))
478 goto bad;
479 nh = skb_network_header(skb);
480 break;
481 default:
482 if (optlen > len)
483 goto bad;
484 break;
485 }
486 off += optlen;
487 len -= optlen;
488 }
489 if (len == 0)
490 return 0;
491bad:
492 return -1;
493
494}
495
496
497
498static unsigned int br_nf_pre_routing_ipv6(unsigned int hook,
499 struct sk_buff *skb,
500 const struct net_device *in,
501 const struct net_device *out,
502 int (*okfn)(struct sk_buff *))
503{
504 struct ipv6hdr *hdr;
505 u32 pkt_len;
506
507 if (skb->len < sizeof(struct ipv6hdr))
508 goto inhdr_error;
509
510 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
511 goto inhdr_error;
512
513 hdr = ipv6_hdr(skb);
514
515 if (hdr->version != 6)
516 goto inhdr_error;
517
518 pkt_len = ntohs(hdr->payload_len);
519
520 if (pkt_len || hdr->nexthdr != NEXTHDR_HOP) {
521 if (pkt_len + sizeof(struct ipv6hdr) > skb->len)
522 goto inhdr_error;
523 if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr)))
524 goto inhdr_error;
525 }
526 if (hdr->nexthdr == NEXTHDR_HOP && check_hbh_len(skb))
527 goto inhdr_error;
528
529 nf_bridge_put(skb->nf_bridge);
530 if (!nf_bridge_alloc(skb))
531 return NF_DROP;
532 if (!setup_pre_routing(skb))
533 return NF_DROP;
534
535 NF_HOOK(PF_INET6, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
536 br_nf_pre_routing_finish_ipv6);
537
538 return NF_STOLEN;
539
540inhdr_error:
541 return NF_DROP;
542}
543
544
545
546
547
548
549
550static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff *skb,
551 const struct net_device *in,
552 const struct net_device *out,
553 int (*okfn)(struct sk_buff *))
554{
555 struct iphdr *iph;
556 __u32 len = nf_bridge_encap_header_len(skb);
557
558 if (unlikely(!pskb_may_pull(skb, len)))
559 goto out;
560
561 if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) ||
562 IS_PPPOE_IPV6(skb)) {
563#ifdef CONFIG_SYSCTL
564 if (!brnf_call_ip6tables)
565 return NF_ACCEPT;
566#endif
567 nf_bridge_pull_encap_header_rcsum(skb);
568 return br_nf_pre_routing_ipv6(hook, skb, in, out, okfn);
569 }
570#ifdef CONFIG_SYSCTL
571 if (!brnf_call_iptables)
572 return NF_ACCEPT;
573#endif
574
575 if (skb->protocol != htons(ETH_P_IP) && !IS_VLAN_IP(skb) &&
576 !IS_PPPOE_IP(skb))
577 return NF_ACCEPT;
578
579 nf_bridge_pull_encap_header_rcsum(skb);
580
581 if (!pskb_may_pull(skb, sizeof(struct iphdr)))
582 goto inhdr_error;
583
584 iph = ip_hdr(skb);
585 if (iph->ihl < 5 || iph->version != 4)
586 goto inhdr_error;
587
588 if (!pskb_may_pull(skb, 4 * iph->ihl))
589 goto inhdr_error;
590
591 iph = ip_hdr(skb);
592 if (ip_fast_csum((__u8 *) iph, iph->ihl) != 0)
593 goto inhdr_error;
594
595 len = ntohs(iph->tot_len);
596 if (skb->len < len || len < 4 * iph->ihl)
597 goto inhdr_error;
598
599 pskb_trim_rcsum(skb, len);
600
601 nf_bridge_put(skb->nf_bridge);
602 if (!nf_bridge_alloc(skb))
603 return NF_DROP;
604 if (!setup_pre_routing(skb))
605 return NF_DROP;
606 store_orig_dstaddr(skb);
607
608 NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
609 br_nf_pre_routing_finish);
610
611 return NF_STOLEN;
612
613inhdr_error:
614
615out:
616 return NF_DROP;
617}
618
619
620
621
622
623
624
625
626
627static unsigned int br_nf_local_in(unsigned int hook, struct sk_buff *skb,
628 const struct net_device *in,
629 const struct net_device *out,
630 int (*okfn)(struct sk_buff *))
631{
632 if (skb->rtable && skb->rtable == bridge_parent_rtable(in)) {
633 dst_release(&skb->rtable->u.dst);
634 skb->rtable = NULL;
635 }
636
637 return NF_ACCEPT;
638}
639
640
641static int br_nf_forward_finish(struct sk_buff *skb)
642{
643 struct nf_bridge_info *nf_bridge = skb->nf_bridge;
644 struct net_device *in;
645
646 if (skb->protocol != htons(ETH_P_ARP) && !IS_VLAN_ARP(skb)) {
647 in = nf_bridge->physindev;
648 if (nf_bridge->mask & BRNF_PKT_TYPE) {
649 skb->pkt_type = PACKET_OTHERHOST;
650 nf_bridge->mask ^= BRNF_PKT_TYPE;
651 }
652 } else {
653 in = *((struct net_device **)(skb->cb));
654 }
655 nf_bridge_push_encap_header(skb);
656 NF_HOOK_THRESH(PF_BRIDGE, NF_BR_FORWARD, skb, in,
657 skb->dev, br_forward_finish, 1);
658 return 0;
659}
660
661
662
663
664
665
666static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff *skb,
667 const struct net_device *in,
668 const struct net_device *out,
669 int (*okfn)(struct sk_buff *))
670{
671 struct nf_bridge_info *nf_bridge;
672 struct net_device *parent;
673 int pf;
674
675 if (!skb->nf_bridge)
676 return NF_ACCEPT;
677
678
679
680 if (!nf_bridge_unshare(skb))
681 return NF_DROP;
682
683 parent = bridge_parent(out);
684 if (!parent)
685 return NF_DROP;
686
687 if (skb->protocol == htons(ETH_P_IP) || IS_VLAN_IP(skb) ||
688 IS_PPPOE_IP(skb))
689 pf = PF_INET;
690 else
691 pf = PF_INET6;
692
693 nf_bridge_pull_encap_header(skb);
694
695 nf_bridge = skb->nf_bridge;
696 if (skb->pkt_type == PACKET_OTHERHOST) {
697 skb->pkt_type = PACKET_HOST;
698 nf_bridge->mask |= BRNF_PKT_TYPE;
699 }
700
701
702 nf_bridge->mask |= BRNF_BRIDGED;
703 nf_bridge->physoutdev = skb->dev;
704
705 NF_HOOK(pf, NF_INET_FORWARD, skb, bridge_parent(in), parent,
706 br_nf_forward_finish);
707
708 return NF_STOLEN;
709}
710
711static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff *skb,
712 const struct net_device *in,
713 const struct net_device *out,
714 int (*okfn)(struct sk_buff *))
715{
716 struct net_device **d = (struct net_device **)(skb->cb);
717
718#ifdef CONFIG_SYSCTL
719 if (!brnf_call_arptables)
720 return NF_ACCEPT;
721#endif
722
723 if (skb->protocol != htons(ETH_P_ARP)) {
724 if (!IS_VLAN_ARP(skb))
725 return NF_ACCEPT;
726 nf_bridge_pull_encap_header(skb);
727 }
728
729 if (arp_hdr(skb)->ar_pln != 4) {
730 if (IS_VLAN_ARP(skb))
731 nf_bridge_push_encap_header(skb);
732 return NF_ACCEPT;
733 }
734 *d = (struct net_device *)in;
735 NF_HOOK(NF_ARP, NF_ARP_FORWARD, skb, (struct net_device *)in,
736 (struct net_device *)out, br_nf_forward_finish);
737
738 return NF_STOLEN;
739}
740
741
742
743
744
745
746
747
748
749
750
751
752
753static unsigned int br_nf_local_out(unsigned int hook, struct sk_buff *skb,
754 const struct net_device *in,
755 const struct net_device *out,
756 int (*okfn)(struct sk_buff *))
757{
758 struct net_device *realindev;
759 struct nf_bridge_info *nf_bridge;
760
761 if (!skb->nf_bridge)
762 return NF_ACCEPT;
763
764
765
766 if (!nf_bridge_unshare(skb))
767 return NF_DROP;
768
769 nf_bridge = skb->nf_bridge;
770 if (!(nf_bridge->mask & BRNF_BRIDGED_DNAT))
771 return NF_ACCEPT;
772
773
774
775 nf_bridge->physoutdev = skb->dev;
776 realindev = nf_bridge->physindev;
777
778 if (nf_bridge->mask & BRNF_PKT_TYPE) {
779 skb->pkt_type = PACKET_OTHERHOST;
780 nf_bridge->mask ^= BRNF_PKT_TYPE;
781 }
782 nf_bridge_push_encap_header(skb);
783
784 NF_HOOK(PF_BRIDGE, NF_BR_FORWARD, skb, realindev, skb->dev,
785 br_forward_finish);
786 return NF_STOLEN;
787}
788
789static int br_nf_dev_queue_xmit(struct sk_buff *skb)
790{
791 if (skb->protocol == htons(ETH_P_IP) &&
792 skb->len > skb->dev->mtu &&
793 !skb_is_gso(skb))
794 return ip_fragment(skb, br_dev_queue_push_xmit);
795 else
796 return br_dev_queue_push_xmit(skb);
797}
798
799
800static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff *skb,
801 const struct net_device *in,
802 const struct net_device *out,
803 int (*okfn)(struct sk_buff *))
804{
805 struct nf_bridge_info *nf_bridge = skb->nf_bridge;
806 struct net_device *realoutdev = bridge_parent(skb->dev);
807 int pf;
808
809#ifdef CONFIG_NETFILTER_DEBUG
810
811
812 if (skb_mac_header(skb) < skb->head ||
813 skb_mac_header(skb) + ETH_HLEN > skb->data) {
814 printk(KERN_CRIT "br_netfilter: Argh!! br_nf_post_routing: "
815 "bad mac.raw pointer.\n");
816 goto print_error;
817 }
818#endif
819
820 if (!nf_bridge)
821 return NF_ACCEPT;
822
823 if (!(nf_bridge->mask & (BRNF_BRIDGED | BRNF_BRIDGED_DNAT)))
824 return NF_ACCEPT;
825
826 if (!realoutdev)
827 return NF_DROP;
828
829 if (skb->protocol == htons(ETH_P_IP) || IS_VLAN_IP(skb) ||
830 IS_PPPOE_IP(skb))
831 pf = PF_INET;
832 else
833 pf = PF_INET6;
834
835#ifdef CONFIG_NETFILTER_DEBUG
836 if (skb->dst == NULL) {
837 printk(KERN_INFO "br_netfilter post_routing: skb->dst == NULL\n");
838 goto print_error;
839 }
840#endif
841
842
843
844 if (skb->pkt_type == PACKET_OTHERHOST) {
845 skb->pkt_type = PACKET_HOST;
846 nf_bridge->mask |= BRNF_PKT_TYPE;
847 }
848
849 nf_bridge_pull_encap_header(skb);
850 nf_bridge_save_header(skb);
851
852 NF_HOOK(pf, NF_INET_POST_ROUTING, skb, NULL, realoutdev,
853 br_nf_dev_queue_xmit);
854
855 return NF_STOLEN;
856
857#ifdef CONFIG_NETFILTER_DEBUG
858print_error:
859 if (skb->dev != NULL) {
860 printk("[%s]", skb->dev->name);
861 if (realoutdev)
862 printk("[%s]", realoutdev->name);
863 }
864 printk(" head:%p, raw:%p, data:%p\n", skb->head, skb_mac_header(skb),
865 skb->data);
866 dump_stack();
867 return NF_ACCEPT;
868#endif
869}
870
871
872
873
874static unsigned int ip_sabotage_in(unsigned int hook, struct sk_buff *skb,
875 const struct net_device *in,
876 const struct net_device *out,
877 int (*okfn)(struct sk_buff *))
878{
879 if (skb->nf_bridge &&
880 !(skb->nf_bridge->mask & BRNF_NF_BRIDGE_PREROUTING)) {
881 return NF_STOP;
882 }
883
884 return NF_ACCEPT;
885}
886
887
888
889
890
891static struct nf_hook_ops br_nf_ops[] __read_mostly = {
892 { .hook = br_nf_pre_routing,
893 .owner = THIS_MODULE,
894 .pf = PF_BRIDGE,
895 .hooknum = NF_BR_PRE_ROUTING,
896 .priority = NF_BR_PRI_BRNF, },
897 { .hook = br_nf_local_in,
898 .owner = THIS_MODULE,
899 .pf = PF_BRIDGE,
900 .hooknum = NF_BR_LOCAL_IN,
901 .priority = NF_BR_PRI_BRNF, },
902 { .hook = br_nf_forward_ip,
903 .owner = THIS_MODULE,
904 .pf = PF_BRIDGE,
905 .hooknum = NF_BR_FORWARD,
906 .priority = NF_BR_PRI_BRNF - 1, },
907 { .hook = br_nf_forward_arp,
908 .owner = THIS_MODULE,
909 .pf = PF_BRIDGE,
910 .hooknum = NF_BR_FORWARD,
911 .priority = NF_BR_PRI_BRNF, },
912 { .hook = br_nf_local_out,
913 .owner = THIS_MODULE,
914 .pf = PF_BRIDGE,
915 .hooknum = NF_BR_LOCAL_OUT,
916 .priority = NF_BR_PRI_FIRST, },
917 { .hook = br_nf_post_routing,
918 .owner = THIS_MODULE,
919 .pf = PF_BRIDGE,
920 .hooknum = NF_BR_POST_ROUTING,
921 .priority = NF_BR_PRI_LAST, },
922 { .hook = ip_sabotage_in,
923 .owner = THIS_MODULE,
924 .pf = PF_INET,
925 .hooknum = NF_INET_PRE_ROUTING,
926 .priority = NF_IP_PRI_FIRST, },
927 { .hook = ip_sabotage_in,
928 .owner = THIS_MODULE,
929 .pf = PF_INET6,
930 .hooknum = NF_INET_PRE_ROUTING,
931 .priority = NF_IP6_PRI_FIRST, },
932};
933
934#ifdef CONFIG_SYSCTL
935static
936int brnf_sysctl_call_tables(ctl_table * ctl, int write, struct file *filp,
937 void __user * buffer, size_t * lenp, loff_t * ppos)
938{
939 int ret;
940
941 ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
942
943 if (write && *(int *)(ctl->data))
944 *(int *)(ctl->data) = 1;
945 return ret;
946}
947
948static ctl_table brnf_table[] = {
949 {
950 .procname = "bridge-nf-call-arptables",
951 .data = &brnf_call_arptables,
952 .maxlen = sizeof(int),
953 .mode = 0644,
954 .proc_handler = &brnf_sysctl_call_tables,
955 },
956 {
957 .procname = "bridge-nf-call-iptables",
958 .data = &brnf_call_iptables,
959 .maxlen = sizeof(int),
960 .mode = 0644,
961 .proc_handler = &brnf_sysctl_call_tables,
962 },
963 {
964 .procname = "bridge-nf-call-ip6tables",
965 .data = &brnf_call_ip6tables,
966 .maxlen = sizeof(int),
967 .mode = 0644,
968 .proc_handler = &brnf_sysctl_call_tables,
969 },
970 {
971 .procname = "bridge-nf-filter-vlan-tagged",
972 .data = &brnf_filter_vlan_tagged,
973 .maxlen = sizeof(int),
974 .mode = 0644,
975 .proc_handler = &brnf_sysctl_call_tables,
976 },
977 {
978 .procname = "bridge-nf-filter-pppoe-tagged",
979 .data = &brnf_filter_pppoe_tagged,
980 .maxlen = sizeof(int),
981 .mode = 0644,
982 .proc_handler = &brnf_sysctl_call_tables,
983 },
984 { .ctl_name = 0 }
985};
986
987static struct ctl_path brnf_path[] = {
988 { .procname = "net", .ctl_name = CTL_NET, },
989 { .procname = "bridge", .ctl_name = NET_BRIDGE, },
990 { }
991};
992#endif
993
994int __init br_netfilter_init(void)
995{
996 int ret;
997
998 ret = nf_register_hooks(br_nf_ops, ARRAY_SIZE(br_nf_ops));
999 if (ret < 0)
1000 return ret;
1001#ifdef CONFIG_SYSCTL
1002 brnf_sysctl_header = register_sysctl_paths(brnf_path, brnf_table);
1003 if (brnf_sysctl_header == NULL) {
1004 printk(KERN_WARNING
1005 "br_netfilter: can't register to sysctl.\n");
1006 nf_unregister_hooks(br_nf_ops, ARRAY_SIZE(br_nf_ops));
1007 return -ENOMEM;
1008 }
1009#endif
1010 printk(KERN_NOTICE "Bridge firewalling registered\n");
1011 return 0;
1012}
1013
1014void br_netfilter_fini(void)
1015{
1016 nf_unregister_hooks(br_nf_ops, ARRAY_SIZE(br_nf_ops));
1017#ifdef CONFIG_SYSCTL
1018 unregister_sysctl_table(brnf_sysctl_header);
1019#endif
1020}
1021