[PATCH] bridge: Support nf_call_{ip,ip6,arp}tables attributes
Maximilian Riemensberger
riemensberger at cadami.net
Tue Sep 13 14:16:01 PDT 2022
The bridge driver allows passing bridged frames to netfilter. Add
bridge config options nf_call_iptables, nf_call_ip6tables,
nf_call_arptables to opt in.
Signed-off-by: Maximilian Riemensberger <riemensberger at cadami.net>
---
bridge.c | 15 +++++++++++++++
system-dummy.c | 6 ++++--
system-linux.c | 3 +++
system.h | 4 ++++
4 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/bridge.c b/bridge.c
index 7e61b9d..153e41f 100644
--- a/bridge.c
+++ b/bridge.c
@@ -43,6 +43,9 @@ enum {
BRIDGE_ATTR_HAS_VLANS,
BRIDGE_ATTR_STP_KERNEL,
BRIDGE_ATTR_STP_PROTO,
+ BRIDGE_ATTR_NF_CALL_IPTABLES,
+ BRIDGE_ATTR_NF_CALL_IP6TABLES,
+ BRIDGE_ATTR_NF_CALL_ARPTABLES,
__BRIDGE_ATTR_MAX
};
@@ -66,6 +69,9 @@ static const struct blobmsg_policy bridge_attrs[__BRIDGE_ATTR_MAX] = {
[BRIDGE_ATTR_HAS_VLANS] = { "__has_vlans", BLOBMSG_TYPE_BOOL }, /* internal */
[BRIDGE_ATTR_STP_KERNEL] = { "stp_kernel", BLOBMSG_TYPE_BOOL },
[BRIDGE_ATTR_STP_PROTO] = { "stp_proto", BLOBMSG_TYPE_STRING },
+ [BRIDGE_ATTR_NF_CALL_IPTABLES] = { "nf_call_iptables", BLOBMSG_TYPE_BOOL },
+ [BRIDGE_ATTR_NF_CALL_IP6TABLES] = { "nf_call_ip6tables", BLOBMSG_TYPE_BOOL },
+ [BRIDGE_ATTR_NF_CALL_ARPTABLES] = { "nf_call_arptables", BLOBMSG_TYPE_BOOL },
};
static const struct uci_blob_param_info bridge_attr_info[__BRIDGE_ATTR_MAX] = {
@@ -1114,6 +1120,15 @@ bridge_apply_settings(struct bridge_state *bst, struct blob_attr **tb)
if ((cur = tb[BRIDGE_ATTR_VLAN_FILTERING]))
cfg->vlan_filtering = blobmsg_get_bool(cur);
+
+ if ((cur = tb[BRIDGE_ATTR_NF_CALL_IPTABLES]))
+ cfg->nf_call_iptables = blobmsg_get_bool(cur);
+
+ if ((cur = tb[BRIDGE_ATTR_NF_CALL_IP6TABLES]))
+ cfg->nf_call_ip6tables = blobmsg_get_bool(cur);
+
+ if ((cur = tb[BRIDGE_ATTR_NF_CALL_ARPTABLES]))
+ cfg->nf_call_arptables = blobmsg_get_bool(cur);
}
static enum dev_change_type
diff --git a/system-dummy.c b/system-dummy.c
index b13bc87..811404d 100644
--- a/system-dummy.c
+++ b/system-dummy.c
@@ -32,8 +32,10 @@ int system_init(void)
int system_bridge_addbr(struct device *bridge, struct bridge_config *cfg)
{
- D(SYSTEM, "brctl addbr %s vlan_filtering=%d\n",
- bridge->ifname, cfg->vlan_filtering);
+ D(SYSTEM,
+ "brctl addbr %s vlan_filtering=%d nf_call_iptables=%d nf_call_ip6tables=%d nf_call_arptables=%d\n",
+ bridge->ifname, cfg->vlan_filtering, cfg->nf_call_iptables,
+ cfg->nf_call_ip6tables, cfg->nf_call_arptables);
return 0;
}
diff --git a/system-linux.c b/system-linux.c
index 0f13a99..71e9ec6 100644
--- a/system-linux.c
+++ b/system-linux.c
@@ -1342,6 +1342,9 @@ int system_bridge_addbr(struct device *bridge, struct bridge_config *cfg)
}
nla_put_u8(msg, IFLA_BR_VLAN_FILTERING, !!cfg->vlan_filtering);
+ nla_put_u8(msg, IFLA_BR_NF_CALL_IPTABLES, !!cfg->nf_call_iptables);
+ nla_put_u8(msg, IFLA_BR_NF_CALL_IP6TABLES, !!cfg->nf_call_ip6tables);
+ nla_put_u8(msg, IFLA_BR_NF_CALL_ARPTABLES, !!cfg->nf_call_arptables);
nla_put_u16(msg, IFLA_BR_PRIORITY, cfg->priority);
nla_put_u32(msg, IFLA_BR_HELLO_TIME, sec_to_jiffies(cfg->hello_time));
nla_put_u32(msg, IFLA_BR_MAX_AGE, sec_to_jiffies(cfg->max_age));
diff --git a/system.h b/system.h
index 0f08c26..c551b13 100644
--- a/system.h
+++ b/system.h
@@ -208,6 +208,10 @@ struct bridge_config {
int hash_max;
bool vlan_filtering;
+
+ bool nf_call_iptables;
+ bool nf_call_ip6tables;
+ bool nf_call_arptables;
};
enum macvlan_opt {
--
2.25.1
More information about the openwrt-devel
mailing list