diff options
| author | Patrick McHardy <kaber@trash.net> | 2006-07-25 01:54:55 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2006-07-25 01:54:55 -0400 |
| commit | 10ea6ac895418bd0d23900e3330daa6ba0836d26 (patch) | |
| tree | 299c04f0a248bf2432f1d729f792221c7ed26515 | |
| parent | 28658c8967da9083be83af0a37be3b190bae79da (diff) | |
[NETFILTER]: bridge netfilter: add deferred output hooks to feature-removal-schedule
Add bridge netfilter deferred output hooks to feature-removal-schedule
and disable them by default. Until their removal they will be
activated by the physdev match when needed.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | Documentation/feature-removal-schedule.txt | 16 | ||||
| -rw-r--r-- | include/linux/netfilter_bridge.h | 2 | ||||
| -rw-r--r-- | net/bridge/br_netfilter.c | 5 | ||||
| -rw-r--r-- | net/netfilter/xt_physdev.c | 15 |
4 files changed, 38 insertions, 0 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 9d3a0775a11d..87851efb0228 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
| @@ -258,3 +258,19 @@ Why: These drivers never compiled since they were added to the kernel | |||
| 258 | Who: Jean Delvare <khali@linux-fr.org> | 258 | Who: Jean Delvare <khali@linux-fr.org> |
| 259 | 259 | ||
| 260 | --------------------------- | 260 | --------------------------- |
| 261 | |||
| 262 | What: Bridge netfilter deferred IPv4/IPv6 output hook calling | ||
| 263 | When: January 2007 | ||
| 264 | Why: The deferred output hooks are a layering violation causing unusual | ||
| 265 | and broken behaviour on bridge devices. Examples of things they | ||
| 266 | break include QoS classifation using the MARK or CLASSIFY targets, | ||
| 267 | the IPsec policy match and connection tracking with VLANs on a | ||
| 268 | bridge. Their only use is to enable bridge output port filtering | ||
| 269 | within iptables with the physdev match, which can also be done by | ||
| 270 | combining iptables and ebtables using netfilter marks. Until it | ||
| 271 | will get removed the hook deferral is disabled by default and is | ||
| 272 | only enabled when needed. | ||
| 273 | |||
| 274 | Who: Patrick McHardy <kaber@trash.net> | ||
| 275 | |||
| 276 | --------------------------- | ||
diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h index 87764022cc67..31f02ba036ce 100644 --- a/include/linux/netfilter_bridge.h +++ b/include/linux/netfilter_bridge.h | |||
| @@ -79,6 +79,8 @@ struct bridge_skb_cb { | |||
| 79 | __u32 ipv4; | 79 | __u32 ipv4; |
| 80 | } daddr; | 80 | } daddr; |
| 81 | }; | 81 | }; |
| 82 | |||
| 83 | extern int brnf_deferred_hooks; | ||
| 82 | #endif /* CONFIG_BRIDGE_NETFILTER */ | 84 | #endif /* CONFIG_BRIDGE_NETFILTER */ |
| 83 | 85 | ||
| 84 | #endif /* __KERNEL__ */ | 86 | #endif /* __KERNEL__ */ |
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index cbc8a389a0a8..05b3de888243 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
| @@ -61,6 +61,9 @@ static int brnf_filter_vlan_tagged = 1; | |||
| 61 | #define brnf_filter_vlan_tagged 1 | 61 | #define brnf_filter_vlan_tagged 1 |
| 62 | #endif | 62 | #endif |
| 63 | 63 | ||
| 64 | int brnf_deferred_hooks; | ||
| 65 | EXPORT_SYMBOL_GPL(brnf_deferred_hooks); | ||
| 66 | |||
| 64 | static __be16 inline vlan_proto(const struct sk_buff *skb) | 67 | static __be16 inline vlan_proto(const struct sk_buff *skb) |
| 65 | { | 68 | { |
| 66 | return vlan_eth_hdr(skb)->h_vlan_encapsulated_proto; | 69 | return vlan_eth_hdr(skb)->h_vlan_encapsulated_proto; |
| @@ -890,6 +893,8 @@ static unsigned int ip_sabotage_out(unsigned int hook, struct sk_buff **pskb, | |||
| 890 | return NF_ACCEPT; | 893 | return NF_ACCEPT; |
| 891 | else if (ip->version == 6 && !brnf_call_ip6tables) | 894 | else if (ip->version == 6 && !brnf_call_ip6tables) |
| 892 | return NF_ACCEPT; | 895 | return NF_ACCEPT; |
| 896 | else if (!brnf_deferred_hooks) | ||
| 897 | return NF_ACCEPT; | ||
| 893 | #endif | 898 | #endif |
| 894 | if (hook == NF_IP_POST_ROUTING) | 899 | if (hook == NF_IP_POST_ROUTING) |
| 895 | return NF_ACCEPT; | 900 | return NF_ACCEPT; |
diff --git a/net/netfilter/xt_physdev.c b/net/netfilter/xt_physdev.c index 5fe4c9df17f5..a9f4f6f3c628 100644 --- a/net/netfilter/xt_physdev.c +++ b/net/netfilter/xt_physdev.c | |||
| @@ -113,6 +113,21 @@ checkentry(const char *tablename, | |||
| 113 | if (!(info->bitmask & XT_PHYSDEV_OP_MASK) || | 113 | if (!(info->bitmask & XT_PHYSDEV_OP_MASK) || |
| 114 | info->bitmask & ~XT_PHYSDEV_OP_MASK) | 114 | info->bitmask & ~XT_PHYSDEV_OP_MASK) |
| 115 | return 0; | 115 | return 0; |
| 116 | if (brnf_deferred_hooks == 0 && | ||
| 117 | info->bitmask & XT_PHYSDEV_OP_OUT && | ||
| 118 | (!(info->bitmask & XT_PHYSDEV_OP_BRIDGED) || | ||
| 119 | info->invert & XT_PHYSDEV_OP_BRIDGED) && | ||
| 120 | hook_mask & ((1 << NF_IP_LOCAL_OUT) | (1 << NF_IP_FORWARD) | | ||
| 121 | (1 << NF_IP_POST_ROUTING))) { | ||
| 122 | printk(KERN_WARNING "physdev match: using --physdev-out in the " | ||
| 123 | "OUTPUT, FORWARD and POSTROUTING chains for non-bridged " | ||
| 124 | "traffic is deprecated and breaks other things, it will " | ||
| 125 | "be removed in January 2007. See Documentation/" | ||
| 126 | "feature-removal-schedule.txt for details. This doesn't " | ||
| 127 | "affect you in case you're using it for purely bridged " | ||
| 128 | "traffic.\n"); | ||
| 129 | brnf_deferred_hooks = 1; | ||
| 130 | } | ||
| 116 | return 1; | 131 | return 1; |
| 117 | } | 132 | } |
| 118 | 133 | ||
