Commit 26267bf9 authored by Felix Fietkau's avatar Felix Fietkau Committed by David S. Miller
Browse files

netfilter: flowtable: bridge vlan hardware offload and switchdev



The switch might have already added the VLAN tag through PVID hardware
offload. Keep this extra VLAN in the flowtable but skip it on egress.

Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 73f97025
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -870,6 +870,7 @@ struct net_device_path {
				DEV_PATH_BR_VLAN_KEEP,
				DEV_PATH_BR_VLAN_TAG,
				DEV_PATH_BR_VLAN_UNTAG,
				DEV_PATH_BR_VLAN_UNTAG_HW,
			}		vlan_mode;
			u16		vlan_id;
			__be16		vlan_proto;
+5 −3
Original line number Diff line number Diff line
@@ -123,9 +123,10 @@ struct flow_offload_tuple {
	/* All members above are keys for lookups, see flow_offload_hash(). */
	struct { }			__hash;

	u8				dir:4,
	u8				dir:2,
					xmit_type:2,
					encap_num:2;
					encap_num:2,
					in_vlan_ingress:2;
	u16				mtu;
	union {
		struct dst_entry	*dst_cache;
@@ -185,7 +186,8 @@ struct nf_flow_route {
				u16		id;
				__be16		proto;
			} encap[NF_FLOW_TABLE_ENCAP_MAX];
			u8			num_encaps;
			u8			num_encaps:2,
						ingress_vlans:2;
		} in;
		struct {
			u32			ifindex;
+1 −0
Original line number Diff line number Diff line
@@ -422,6 +422,7 @@ static int br_fill_forward_path(struct net_device_path_ctx *ctx,
		ctx->vlan[ctx->num_vlans].proto = path->bridge.vlan_proto;
		ctx->num_vlans++;
		break;
	case DEV_PATH_BR_VLAN_UNTAG_HW:
	case DEV_PATH_BR_VLAN_UNTAG:
		ctx->num_vlans--;
		break;
+2 −0
Original line number Diff line number Diff line
@@ -1386,6 +1386,8 @@ int br_vlan_fill_forward_path_mode(struct net_bridge *br,

	if (path->bridge.vlan_mode == DEV_PATH_BR_VLAN_TAG)
		path->bridge.vlan_mode = DEV_PATH_BR_VLAN_KEEP;
	else if (v->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
		path->bridge.vlan_mode = DEV_PATH_BR_VLAN_UNTAG_HW;
	else
		path->bridge.vlan_mode = DEV_PATH_BR_VLAN_UNTAG;

+2 −0
Original line number Diff line number Diff line
@@ -95,6 +95,8 @@ static int flow_offload_fill_route(struct flow_offload *flow,
	for (i = route->tuple[dir].in.num_encaps - 1; i >= 0; i--) {
		flow_tuple->encap[j].id = route->tuple[dir].in.encap[i].id;
		flow_tuple->encap[j].proto = route->tuple[dir].in.encap[i].proto;
		if (route->tuple[dir].in.ingress_vlans & BIT(i))
			flow_tuple->in_vlan_ingress |= BIT(j);
		j++;
	}
	flow_tuple->encap_num = route->tuple[dir].in.num_encaps;
Loading