Skip to content

Commit e36bfd1

Browse files
ericwoudopsiff
authored andcommitted
net: ethernet: mtk_ppe_offload: Allow QinQ, double ETH_P_8021Q only
[ Upstream commit 7fe0353 ] mtk_foe_entry_set_vlan() in mtk_ppe.c already supports double vlan tagging, but mtk_flow_offload_replace() in mtk_ppe_offload.c only allows for 1 vlan tag, optionally in combination with pppoe and dsa tags. However, mtk_foe_entry_set_vlan() only allows for setting the vlan id. The protocol cannot be set, it is always ETH_P_8021Q, for inner and outer tag. This patch adds QinQ support to mtk_flow_offload_replace(), only in the case that both inner and outer tags are ETH_P_8021Q. Only PPPoE-in-Q (as before) and Q-in-Q are allowed. A combination of PPPoE and Q-in-Q is not allowed. Signed-off-by: Eric Woudstra <ericwouds@gmail.com> Link: https://patch.msgid.link/20250225201509.20843-1-ericwouds@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org> (cherry picked from commit 7b8fe48cc86b6c71e337bd178b98b59ba3d115b0)
1 parent 5b94587 commit e36bfd1

1 file changed

Lines changed: 11 additions & 11 deletions

File tree

drivers/net/ethernet/mediatek/mtk_ppe_offload.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ struct mtk_flow_data {
3434
u16 vlan_in;
3535

3636
struct {
37-
u16 id;
38-
__be16 proto;
37+
struct {
38+
u16 id;
39+
__be16 proto;
40+
} vlans[2];
3941
u8 num;
4042
} vlan;
4143
struct {
@@ -330,18 +332,19 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f,
330332
case FLOW_ACTION_CSUM:
331333
break;
332334
case FLOW_ACTION_VLAN_PUSH:
333-
if (data.vlan.num == 1 ||
335+
if (data.vlan.num + data.pppoe.num == 2 ||
334336
act->vlan.proto != htons(ETH_P_8021Q))
335337
return -EOPNOTSUPP;
336338

337-
data.vlan.id = act->vlan.vid;
338-
data.vlan.proto = act->vlan.proto;
339+
data.vlan.vlans[data.vlan.num].id = act->vlan.vid;
340+
data.vlan.vlans[data.vlan.num].proto = act->vlan.proto;
339341
data.vlan.num++;
340342
break;
341343
case FLOW_ACTION_VLAN_POP:
342344
break;
343345
case FLOW_ACTION_PPPOE_PUSH:
344-
if (data.pppoe.num == 1)
346+
if (data.pppoe.num == 1 ||
347+
data.vlan.num == 2)
345348
return -EOPNOTSUPP;
346349

347350
data.pppoe.sid = act->pppoe.sid;
@@ -431,12 +434,9 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f,
431434
if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE)
432435
foe.bridge.vlan = data.vlan_in;
433436

434-
if (data.vlan.num == 1) {
435-
if (data.vlan.proto != htons(ETH_P_8021Q))
436-
return -EOPNOTSUPP;
437+
for (i = 0; i < data.vlan.num; i++)
438+
mtk_foe_entry_set_vlan(eth, &foe, data.vlan.vlans[i].id);
437439

438-
mtk_foe_entry_set_vlan(eth, &foe, data.vlan.id);
439-
}
440440
if (data.pppoe.num == 1)
441441
mtk_foe_entry_set_pppoe(eth, &foe, data.pppoe.sid);
442442

0 commit comments

Comments
 (0)