diff options
| -rw-r--r-- | net/bridge/br_netfilter.c | 116 |
1 files changed, 63 insertions, 53 deletions
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 70a395baaa01..cf18d0235ccb 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
| @@ -136,7 +136,7 @@ static void __br_dnat_complain(void) | |||
| 136 | 136 | ||
| 137 | if (jiffies - last_complaint >= 5 * HZ) { | 137 | if (jiffies - last_complaint >= 5 * HZ) { |
| 138 | printk(KERN_WARNING "Performing cross-bridge DNAT requires IP " | 138 | printk(KERN_WARNING "Performing cross-bridge DNAT requires IP " |
| 139 | "forwarding to be enabled\n"); | 139 | "forwarding to be enabled\n"); |
| 140 | last_complaint = jiffies; | 140 | last_complaint = jiffies; |
| 141 | } | 141 | } |
| 142 | } | 142 | } |
| @@ -218,12 +218,17 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb) | |||
| 218 | nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING; | 218 | nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING; |
| 219 | 219 | ||
| 220 | if (dnat_took_place(skb)) { | 220 | if (dnat_took_place(skb)) { |
| 221 | if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, | 221 | if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev)) { |
| 222 | dev)) { | ||
| 223 | struct rtable *rt; | 222 | struct rtable *rt; |
| 224 | struct flowi fl = { .nl_u = | 223 | struct flowi fl = { |
| 225 | { .ip4_u = { .daddr = iph->daddr, .saddr = 0 , | 224 | .nl_u = { |
| 226 | .tos = RT_TOS(iph->tos)} }, .proto = 0}; | 225 | .ip4_u = { |
| 226 | .daddr = iph->daddr, | ||
| 227 | .saddr = 0, | ||
| 228 | .tos = RT_TOS(iph->tos) }, | ||
| 229 | }, | ||
| 230 | .proto = 0, | ||
| 231 | }; | ||
| 227 | 232 | ||
| 228 | if (!ip_route_output_key(&rt, &fl)) { | 233 | if (!ip_route_output_key(&rt, &fl)) { |
| 229 | /* - Bridged-and-DNAT'ed traffic doesn't | 234 | /* - Bridged-and-DNAT'ed traffic doesn't |
| @@ -257,8 +262,7 @@ bridged_dnat: | |||
| 257 | 1); | 262 | 1); |
| 258 | return 0; | 263 | return 0; |
| 259 | } | 264 | } |
| 260 | memcpy(eth_hdr(skb)->h_dest, dev->dev_addr, | 265 | memcpy(eth_hdr(skb)->h_dest, dev->dev_addr, ETH_ALEN); |
| 261 | ETH_ALEN); | ||
| 262 | skb->pkt_type = PACKET_HOST; | 266 | skb->pkt_type = PACKET_HOST; |
| 263 | } | 267 | } |
| 264 | } else { | 268 | } else { |
| @@ -297,10 +301,10 @@ static struct net_device *setup_pre_routing(struct sk_buff *skb) | |||
| 297 | /* We only check the length. A bridge shouldn't do any hop-by-hop stuff anyway */ | 301 | /* We only check the length. A bridge shouldn't do any hop-by-hop stuff anyway */ |
| 298 | static int check_hbh_len(struct sk_buff *skb) | 302 | static int check_hbh_len(struct sk_buff *skb) |
| 299 | { | 303 | { |
| 300 | unsigned char *raw = (u8*)(skb->nh.ipv6h+1); | 304 | unsigned char *raw = (u8 *) (skb->nh.ipv6h + 1); |
| 301 | u32 pkt_len; | 305 | u32 pkt_len; |
| 302 | int off = raw - skb->nh.raw; | 306 | int off = raw - skb->nh.raw; |
| 303 | int len = (raw[1]+1)<<3; | 307 | int len = (raw[1] + 1) << 3; |
| 304 | 308 | ||
| 305 | if ((raw + len) - skb->data > skb_headlen(skb)) | 309 | if ((raw + len) - skb->data > skb_headlen(skb)) |
| 306 | goto bad; | 310 | goto bad; |
| @@ -309,7 +313,7 @@ static int check_hbh_len(struct sk_buff *skb) | |||
| 309 | len -= 2; | 313 | len -= 2; |
| 310 | 314 | ||
| 311 | while (len > 0) { | 315 | while (len > 0) { |
| 312 | int optlen = skb->nh.raw[off+1]+2; | 316 | int optlen = skb->nh.raw[off + 1] + 2; |
| 313 | 317 | ||
| 314 | switch (skb->nh.raw[off]) { | 318 | switch (skb->nh.raw[off]) { |
| 315 | case IPV6_TLV_PAD0: | 319 | case IPV6_TLV_PAD0: |
| @@ -320,16 +324,16 @@ static int check_hbh_len(struct sk_buff *skb) | |||
| 320 | break; | 324 | break; |
| 321 | 325 | ||
| 322 | case IPV6_TLV_JUMBO: | 326 | case IPV6_TLV_JUMBO: |
| 323 | if (skb->nh.raw[off+1] != 4 || (off&3) != 2) | 327 | if (skb->nh.raw[off + 1] != 4 || (off & 3) != 2) |
| 324 | goto bad; | 328 | goto bad; |
| 325 | pkt_len = ntohl(*(u32*)(skb->nh.raw+off+2)); | 329 | pkt_len = ntohl(*(u32 *) (skb->nh.raw + off + 2)); |
| 326 | if (pkt_len <= IPV6_MAXPLEN || | 330 | if (pkt_len <= IPV6_MAXPLEN || |
| 327 | skb->nh.ipv6h->payload_len) | 331 | skb->nh.ipv6h->payload_len) |
| 328 | goto bad; | 332 | goto bad; |
| 329 | if (pkt_len > skb->len - sizeof(struct ipv6hdr)) | 333 | if (pkt_len > skb->len - sizeof(struct ipv6hdr)) |
| 330 | goto bad; | 334 | goto bad; |
| 331 | if (pskb_trim_rcsum(skb, | 335 | if (pskb_trim_rcsum(skb, |
| 332 | pkt_len+sizeof(struct ipv6hdr))) | 336 | pkt_len + sizeof(struct ipv6hdr))) |
| 333 | goto bad; | 337 | goto bad; |
| 334 | break; | 338 | break; |
| 335 | default: | 339 | default: |
| @@ -350,8 +354,10 @@ bad: | |||
| 350 | /* Replicate the checks that IPv6 does on packet reception and pass the packet | 354 | /* Replicate the checks that IPv6 does on packet reception and pass the packet |
| 351 | * to ip6tables, which doesn't support NAT, so things are fairly simple. */ | 355 | * to ip6tables, which doesn't support NAT, so things are fairly simple. */ |
| 352 | static unsigned int br_nf_pre_routing_ipv6(unsigned int hook, | 356 | static unsigned int br_nf_pre_routing_ipv6(unsigned int hook, |
| 353 | struct sk_buff *skb, const struct net_device *in, | 357 | struct sk_buff *skb, |
| 354 | const struct net_device *out, int (*okfn)(struct sk_buff *)) | 358 | const struct net_device *in, |
| 359 | const struct net_device *out, | ||
| 360 | int (*okfn)(struct sk_buff *)) | ||
| 355 | { | 361 | { |
| 356 | struct ipv6hdr *hdr; | 362 | struct ipv6hdr *hdr; |
| 357 | u32 pkt_len; | 363 | u32 pkt_len; |
| @@ -381,9 +387,9 @@ static unsigned int br_nf_pre_routing_ipv6(unsigned int hook, | |||
| 381 | } | 387 | } |
| 382 | } | 388 | } |
| 383 | if (hdr->nexthdr == NEXTHDR_HOP && check_hbh_len(skb)) | 389 | if (hdr->nexthdr == NEXTHDR_HOP && check_hbh_len(skb)) |
| 384 | goto inhdr_error; | 390 | goto inhdr_error; |
| 385 | 391 | ||
| 386 | nf_bridge_put(skb->nf_bridge); | 392 | nf_bridge_put(skb->nf_bridge); |
| 387 | if ((nf_bridge = nf_bridge_alloc(skb)) == NULL) | 393 | if ((nf_bridge = nf_bridge_alloc(skb)) == NULL) |
| 388 | return NF_DROP; | 394 | return NF_DROP; |
| 389 | if (!setup_pre_routing(skb)) | 395 | if (!setup_pre_routing(skb)) |
| @@ -452,15 +458,15 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb, | |||
| 452 | if (iph->ihl < 5 || iph->version != 4) | 458 | if (iph->ihl < 5 || iph->version != 4) |
| 453 | goto inhdr_error; | 459 | goto inhdr_error; |
| 454 | 460 | ||
| 455 | if (!pskb_may_pull(skb, 4*iph->ihl)) | 461 | if (!pskb_may_pull(skb, 4 * iph->ihl)) |
| 456 | goto inhdr_error; | 462 | goto inhdr_error; |
| 457 | 463 | ||
| 458 | iph = skb->nh.iph; | 464 | iph = skb->nh.iph; |
| 459 | if (ip_fast_csum((__u8 *)iph, iph->ihl) != 0) | 465 | if (ip_fast_csum((__u8 *) iph, iph->ihl) != 0) |
| 460 | goto inhdr_error; | 466 | goto inhdr_error; |
| 461 | 467 | ||
| 462 | len = ntohs(iph->tot_len); | 468 | len = ntohs(iph->tot_len); |
| 463 | if (skb->len < len || len < 4*iph->ihl) | 469 | if (skb->len < len || len < 4 * iph->ihl) |
| 464 | goto inhdr_error; | 470 | goto inhdr_error; |
| 465 | 471 | ||
| 466 | if (skb->len > len) { | 472 | if (skb->len > len) { |
| @@ -469,7 +475,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb, | |||
| 469 | skb->ip_summed = CHECKSUM_NONE; | 475 | skb->ip_summed = CHECKSUM_NONE; |
| 470 | } | 476 | } |
| 471 | 477 | ||
| 472 | nf_bridge_put(skb->nf_bridge); | 478 | nf_bridge_put(skb->nf_bridge); |
| 473 | if ((nf_bridge = nf_bridge_alloc(skb)) == NULL) | 479 | if ((nf_bridge = nf_bridge_alloc(skb)) == NULL) |
| 474 | return NF_DROP; | 480 | return NF_DROP; |
| 475 | if (!setup_pre_routing(skb)) | 481 | if (!setup_pre_routing(skb)) |
| @@ -482,7 +488,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb, | |||
| 482 | return NF_STOLEN; | 488 | return NF_STOLEN; |
| 483 | 489 | ||
| 484 | inhdr_error: | 490 | inhdr_error: |
| 485 | // IP_INC_STATS_BH(IpInHdrErrors); | 491 | // IP_INC_STATS_BH(IpInHdrErrors); |
| 486 | out: | 492 | out: |
| 487 | return NF_DROP; | 493 | return NF_DROP; |
| 488 | } | 494 | } |
| @@ -496,8 +502,9 @@ out: | |||
| 496 | * register an IPv4 PRE_ROUTING 'sabotage' hook that will | 502 | * register an IPv4 PRE_ROUTING 'sabotage' hook that will |
| 497 | * prevent this from happening. */ | 503 | * prevent this from happening. */ |
| 498 | static unsigned int br_nf_local_in(unsigned int hook, struct sk_buff **pskb, | 504 | static unsigned int br_nf_local_in(unsigned int hook, struct sk_buff **pskb, |
| 499 | const struct net_device *in, const struct net_device *out, | 505 | const struct net_device *in, |
| 500 | int (*okfn)(struct sk_buff *)) | 506 | const struct net_device *out, |
| 507 | int (*okfn)(struct sk_buff *)) | ||
| 501 | { | 508 | { |
| 502 | struct sk_buff *skb = *pskb; | 509 | struct sk_buff *skb = *pskb; |
| 503 | 510 | ||
| @@ -509,7 +516,6 @@ static unsigned int br_nf_local_in(unsigned int hook, struct sk_buff **pskb, | |||
| 509 | return NF_ACCEPT; | 516 | return NF_ACCEPT; |
| 510 | } | 517 | } |
| 511 | 518 | ||
| 512 | |||
| 513 | /* PF_BRIDGE/FORWARD *************************************************/ | 519 | /* PF_BRIDGE/FORWARD *************************************************/ |
| 514 | static int br_nf_forward_finish(struct sk_buff *skb) | 520 | static int br_nf_forward_finish(struct sk_buff *skb) |
| 515 | { | 521 | { |
| @@ -531,7 +537,7 @@ static int br_nf_forward_finish(struct sk_buff *skb) | |||
| 531 | skb->nh.raw -= VLAN_HLEN; | 537 | skb->nh.raw -= VLAN_HLEN; |
| 532 | } | 538 | } |
| 533 | NF_HOOK_THRESH(PF_BRIDGE, NF_BR_FORWARD, skb, in, | 539 | NF_HOOK_THRESH(PF_BRIDGE, NF_BR_FORWARD, skb, in, |
| 534 | skb->dev, br_forward_finish, 1); | 540 | skb->dev, br_forward_finish, 1); |
| 535 | return 0; | 541 | return 0; |
| 536 | } | 542 | } |
| 537 | 543 | ||
| @@ -541,8 +547,9 @@ static int br_nf_forward_finish(struct sk_buff *skb) | |||
| 541 | * because of the physdev module. For ARP, indev and outdev are the | 547 | * because of the physdev module. For ARP, indev and outdev are the |
| 542 | * bridge ports. */ | 548 | * bridge ports. */ |
| 543 | static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff **pskb, | 549 | static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff **pskb, |
| 544 | const struct net_device *in, const struct net_device *out, | 550 | const struct net_device *in, |
| 545 | int (*okfn)(struct sk_buff *)) | 551 | const struct net_device *out, |
| 552 | int (*okfn)(struct sk_buff *)) | ||
| 546 | { | 553 | { |
| 547 | struct sk_buff *skb = *pskb; | 554 | struct sk_buff *skb = *pskb; |
| 548 | struct nf_bridge_info *nf_bridge; | 555 | struct nf_bridge_info *nf_bridge; |
| @@ -584,8 +591,9 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff **pskb, | |||
| 584 | } | 591 | } |
| 585 | 592 | ||
| 586 | static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff **pskb, | 593 | static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff **pskb, |
| 587 | const struct net_device *in, const struct net_device *out, | 594 | const struct net_device *in, |
| 588 | int (*okfn)(struct sk_buff *)) | 595 | const struct net_device *out, |
| 596 | int (*okfn)(struct sk_buff *)) | ||
| 589 | { | 597 | { |
| 590 | struct sk_buff *skb = *pskb; | 598 | struct sk_buff *skb = *pskb; |
| 591 | struct vlan_ethhdr *hdr = vlan_eth_hdr(skb); | 599 | struct vlan_ethhdr *hdr = vlan_eth_hdr(skb); |
| @@ -617,7 +625,6 @@ static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff **pskb, | |||
| 617 | return NF_STOLEN; | 625 | return NF_STOLEN; |
| 618 | } | 626 | } |
| 619 | 627 | ||
| 620 | |||
| 621 | /* PF_BRIDGE/LOCAL_OUT ***********************************************/ | 628 | /* PF_BRIDGE/LOCAL_OUT ***********************************************/ |
| 622 | static int br_nf_local_out_finish(struct sk_buff *skb) | 629 | static int br_nf_local_out_finish(struct sk_buff *skb) |
| 623 | { | 630 | { |
| @@ -627,7 +634,7 @@ static int br_nf_local_out_finish(struct sk_buff *skb) | |||
| 627 | } | 634 | } |
| 628 | 635 | ||
| 629 | NF_HOOK_THRESH(PF_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev, | 636 | NF_HOOK_THRESH(PF_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev, |
| 630 | br_forward_finish, NF_BR_PRI_FIRST + 1); | 637 | br_forward_finish, NF_BR_PRI_FIRST + 1); |
| 631 | 638 | ||
| 632 | return 0; | 639 | return 0; |
| 633 | } | 640 | } |
| @@ -653,8 +660,9 @@ static int br_nf_local_out_finish(struct sk_buff *skb) | |||
| 653 | * even routed packets that didn't arrive on a bridge interface have their | 660 | * even routed packets that didn't arrive on a bridge interface have their |
| 654 | * nf_bridge->physindev set. */ | 661 | * nf_bridge->physindev set. */ |
| 655 | static unsigned int br_nf_local_out(unsigned int hook, struct sk_buff **pskb, | 662 | static unsigned int br_nf_local_out(unsigned int hook, struct sk_buff **pskb, |
| 656 | const struct net_device *in, const struct net_device *out, | 663 | const struct net_device *in, |
| 657 | int (*okfn)(struct sk_buff *)) | 664 | const struct net_device *out, |
| 665 | int (*okfn)(struct sk_buff *)) | ||
| 658 | { | 666 | { |
| 659 | struct net_device *realindev, *realoutdev; | 667 | struct net_device *realindev, *realoutdev; |
| 660 | struct sk_buff *skb = *pskb; | 668 | struct sk_buff *skb = *pskb; |
| @@ -716,7 +724,7 @@ static unsigned int br_nf_local_out(unsigned int hook, struct sk_buff **pskb, | |||
| 716 | /* IP forwarded traffic has a physindev, locally | 724 | /* IP forwarded traffic has a physindev, locally |
| 717 | * generated traffic hasn't. */ | 725 | * generated traffic hasn't. */ |
| 718 | if (realindev != NULL) { | 726 | if (realindev != NULL) { |
| 719 | if (!(nf_bridge->mask & BRNF_DONT_TAKE_PARENT) ) { | 727 | if (!(nf_bridge->mask & BRNF_DONT_TAKE_PARENT)) { |
| 720 | struct net_device *parent = bridge_parent(realindev); | 728 | struct net_device *parent = bridge_parent(realindev); |
| 721 | if (parent) | 729 | if (parent) |
| 722 | realindev = parent; | 730 | realindev = parent; |
| @@ -738,8 +746,9 @@ out: | |||
| 738 | 746 | ||
| 739 | /* PF_BRIDGE/POST_ROUTING ********************************************/ | 747 | /* PF_BRIDGE/POST_ROUTING ********************************************/ |
| 740 | static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb, | 748 | static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb, |
| 741 | const struct net_device *in, const struct net_device *out, | 749 | const struct net_device *in, |
| 742 | int (*okfn)(struct sk_buff *)) | 750 | const struct net_device *out, |
| 751 | int (*okfn)(struct sk_buff *)) | ||
| 743 | { | 752 | { |
| 744 | struct sk_buff *skb = *pskb; | 753 | struct sk_buff *skb = *pskb; |
| 745 | struct nf_bridge_info *nf_bridge = (*pskb)->nf_bridge; | 754 | struct nf_bridge_info *nf_bridge = (*pskb)->nf_bridge; |
| @@ -752,7 +761,7 @@ static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb, | |||
| 752 | * keep the check just to be sure... */ | 761 | * keep the check just to be sure... */ |
| 753 | if (skb->mac.raw < skb->head || skb->mac.raw + ETH_HLEN > skb->data) { | 762 | if (skb->mac.raw < skb->head || skb->mac.raw + ETH_HLEN > skb->data) { |
| 754 | printk(KERN_CRIT "br_netfilter: Argh!! br_nf_post_routing: " | 763 | printk(KERN_CRIT "br_netfilter: Argh!! br_nf_post_routing: " |
| 755 | "bad mac.raw pointer."); | 764 | "bad mac.raw pointer."); |
| 756 | goto print_error; | 765 | goto print_error; |
| 757 | } | 766 | } |
| 758 | #endif | 767 | #endif |
| @@ -794,7 +803,7 @@ static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb, | |||
| 794 | realoutdev = nf_bridge->netoutdev; | 803 | realoutdev = nf_bridge->netoutdev; |
| 795 | #endif | 804 | #endif |
| 796 | NF_HOOK(pf, NF_IP_POST_ROUTING, skb, NULL, realoutdev, | 805 | NF_HOOK(pf, NF_IP_POST_ROUTING, skb, NULL, realoutdev, |
| 797 | br_dev_queue_push_xmit); | 806 | br_dev_queue_push_xmit); |
| 798 | 807 | ||
| 799 | return NF_STOLEN; | 808 | return NF_STOLEN; |
| 800 | 809 | ||
| @@ -806,18 +815,18 @@ print_error: | |||
| 806 | printk("[%s]", realoutdev->name); | 815 | printk("[%s]", realoutdev->name); |
| 807 | } | 816 | } |
| 808 | printk(" head:%p, raw:%p, data:%p\n", skb->head, skb->mac.raw, | 817 | printk(" head:%p, raw:%p, data:%p\n", skb->head, skb->mac.raw, |
| 809 | skb->data); | 818 | skb->data); |
| 810 | return NF_ACCEPT; | 819 | return NF_ACCEPT; |
| 811 | #endif | 820 | #endif |
| 812 | } | 821 | } |
| 813 | 822 | ||
| 814 | |||
| 815 | /* IP/SABOTAGE *****************************************************/ | 823 | /* IP/SABOTAGE *****************************************************/ |
| 816 | /* Don't hand locally destined packets to PF_INET(6)/PRE_ROUTING | 824 | /* Don't hand locally destined packets to PF_INET(6)/PRE_ROUTING |
| 817 | * for the second time. */ | 825 | * for the second time. */ |
| 818 | static unsigned int ip_sabotage_in(unsigned int hook, struct sk_buff **pskb, | 826 | static unsigned int ip_sabotage_in(unsigned int hook, struct sk_buff **pskb, |
| 819 | const struct net_device *in, const struct net_device *out, | 827 | const struct net_device *in, |
| 820 | int (*okfn)(struct sk_buff *)) | 828 | const struct net_device *out, |
| 829 | int (*okfn)(struct sk_buff *)) | ||
| 821 | { | 830 | { |
| 822 | if ((*pskb)->nf_bridge && | 831 | if ((*pskb)->nf_bridge && |
| 823 | !((*pskb)->nf_bridge->mask & BRNF_NF_BRIDGE_PREROUTING)) { | 832 | !((*pskb)->nf_bridge->mask & BRNF_NF_BRIDGE_PREROUTING)) { |
| @@ -831,18 +840,18 @@ static unsigned int ip_sabotage_in(unsigned int hook, struct sk_buff **pskb, | |||
| 831 | * and PF_INET(6)/POST_ROUTING until we have done the forwarding | 840 | * and PF_INET(6)/POST_ROUTING until we have done the forwarding |
| 832 | * decision in the bridge code and have determined nf_bridge->physoutdev. */ | 841 | * decision in the bridge code and have determined nf_bridge->physoutdev. */ |
| 833 | static unsigned int ip_sabotage_out(unsigned int hook, struct sk_buff **pskb, | 842 | static unsigned int ip_sabotage_out(unsigned int hook, struct sk_buff **pskb, |
| 834 | const struct net_device *in, const struct net_device *out, | 843 | const struct net_device *in, |
| 835 | int (*okfn)(struct sk_buff *)) | 844 | const struct net_device *out, |
| 845 | int (*okfn)(struct sk_buff *)) | ||
| 836 | { | 846 | { |
| 837 | struct sk_buff *skb = *pskb; | 847 | struct sk_buff *skb = *pskb; |
| 838 | 848 | ||
| 839 | if ((out->hard_start_xmit == br_dev_xmit && | 849 | if ((out->hard_start_xmit == br_dev_xmit && |
| 840 | okfn != br_nf_forward_finish && | 850 | okfn != br_nf_forward_finish && |
| 841 | okfn != br_nf_local_out_finish && | 851 | okfn != br_nf_local_out_finish && okfn != br_dev_queue_push_xmit) |
| 842 | okfn != br_dev_queue_push_xmit) | ||
| 843 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | 852 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
| 844 | || ((out->priv_flags & IFF_802_1Q_VLAN) && | 853 | || ((out->priv_flags & IFF_802_1Q_VLAN) && |
| 845 | VLAN_DEV_INFO(out)->real_dev->hard_start_xmit == br_dev_xmit) | 854 | VLAN_DEV_INFO(out)->real_dev->hard_start_xmit == br_dev_xmit) |
| 846 | #endif | 855 | #endif |
| 847 | ) { | 856 | ) { |
| 848 | struct nf_bridge_info *nf_bridge; | 857 | struct nf_bridge_info *nf_bridge; |
| @@ -967,8 +976,8 @@ static struct nf_hook_ops br_nf_ops[] = { | |||
| 967 | 976 | ||
| 968 | #ifdef CONFIG_SYSCTL | 977 | #ifdef CONFIG_SYSCTL |
| 969 | static | 978 | static |
| 970 | int brnf_sysctl_call_tables(ctl_table *ctl, int write, struct file * filp, | 979 | int brnf_sysctl_call_tables(ctl_table * ctl, int write, struct file *filp, |
| 971 | void __user *buffer, size_t *lenp, loff_t *ppos) | 980 | void __user * buffer, size_t * lenp, loff_t * ppos) |
| 972 | { | 981 | { |
| 973 | int ret; | 982 | int ret; |
| 974 | 983 | ||
| @@ -1055,7 +1064,8 @@ int br_netfilter_init(void) | |||
| 1055 | #ifdef CONFIG_SYSCTL | 1064 | #ifdef CONFIG_SYSCTL |
| 1056 | brnf_sysctl_header = register_sysctl_table(brnf_net_table, 0); | 1065 | brnf_sysctl_header = register_sysctl_table(brnf_net_table, 0); |
| 1057 | if (brnf_sysctl_header == NULL) { | 1066 | if (brnf_sysctl_header == NULL) { |
| 1058 | printk(KERN_WARNING "br_netfilter: can't register to sysctl.\n"); | 1067 | printk(KERN_WARNING |
| 1068 | "br_netfilter: can't register to sysctl.\n"); | ||
| 1059 | for (i = 0; i < ARRAY_SIZE(br_nf_ops); i++) | 1069 | for (i = 0; i < ARRAY_SIZE(br_nf_ops); i++) |
| 1060 | nf_unregister_hook(&br_nf_ops[i]); | 1070 | nf_unregister_hook(&br_nf_ops[i]); |
| 1061 | return -EFAULT; | 1071 | return -EFAULT; |
