Skip to content

Commit 031a416

Browse files
svenauhagenPaolo Abeni
authored andcommitted
net: mvpp2: parser fix PPPoE
In PPPoE add all IPv4 header option length to the parser and adjust the L3 and L4 offset accordingly. Currently the L4 match does not work with PPPoE and all packets are matched as L3 IP4 OPT. Fixes: 3f51850 ("ethernet: Add new driver for Marvell Armada 375 network unit") Signed-off-by: Sven Auhagen <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent a587a84 commit 031a416

File tree

1 file changed

+34
-48
lines changed

1 file changed

+34
-48
lines changed

drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c

Lines changed: 34 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1607,59 +1607,45 @@ static int mvpp2_prs_vlan_init(struct platform_device *pdev, struct mvpp2 *priv)
16071607
static int mvpp2_prs_pppoe_init(struct mvpp2 *priv)
16081608
{
16091609
struct mvpp2_prs_entry pe;
1610-
int tid;
1611-
1612-
/* IPv4 over PPPoE with options */
1613-
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
1614-
MVPP2_PE_LAST_FREE_TID);
1615-
if (tid < 0)
1616-
return tid;
1617-
1618-
memset(&pe, 0, sizeof(pe));
1619-
mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_PPPOE);
1620-
pe.index = tid;
1621-
1622-
mvpp2_prs_match_etype(&pe, 0, PPP_IP);
1623-
1624-
mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_IP4);
1625-
mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_IP4_OPT,
1626-
MVPP2_PRS_RI_L3_PROTO_MASK);
1627-
/* goto ipv4 dest-address (skip eth_type + IP-header-size - 4) */
1628-
mvpp2_prs_sram_shift_set(&pe, MVPP2_ETH_TYPE_LEN +
1629-
sizeof(struct iphdr) - 4,
1630-
MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
1631-
/* Set L3 offset */
1632-
mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L3,
1633-
MVPP2_ETH_TYPE_LEN,
1634-
MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
1635-
1636-
/* Update shadow table and hw entry */
1637-
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_PPPOE);
1638-
mvpp2_prs_hw_write(priv, &pe);
1610+
int tid, ihl;
16391611

1640-
/* IPv4 over PPPoE without options */
1641-
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
1642-
MVPP2_PE_LAST_FREE_TID);
1643-
if (tid < 0)
1644-
return tid;
1612+
/* IPv4 over PPPoE with header length >= 5 */
1613+
for (ihl = MVPP2_PRS_IPV4_IHL_MIN; ihl <= MVPP2_PRS_IPV4_IHL_MAX; ihl++) {
1614+
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
1615+
MVPP2_PE_LAST_FREE_TID);
1616+
if (tid < 0)
1617+
return tid;
16451618

1646-
pe.index = tid;
1619+
memset(&pe, 0, sizeof(pe));
1620+
mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_PPPOE);
1621+
pe.index = tid;
16471622

1648-
mvpp2_prs_tcam_data_byte_set(&pe, MVPP2_ETH_TYPE_LEN,
1649-
MVPP2_PRS_IPV4_HEAD |
1650-
MVPP2_PRS_IPV4_IHL_MIN,
1651-
MVPP2_PRS_IPV4_HEAD_MASK |
1652-
MVPP2_PRS_IPV4_IHL_MASK);
1623+
mvpp2_prs_match_etype(&pe, 0, PPP_IP);
1624+
mvpp2_prs_tcam_data_byte_set(&pe, MVPP2_ETH_TYPE_LEN,
1625+
MVPP2_PRS_IPV4_HEAD | ihl,
1626+
MVPP2_PRS_IPV4_HEAD_MASK |
1627+
MVPP2_PRS_IPV4_IHL_MASK);
16531628

1654-
/* Clear ri before updating */
1655-
pe.sram[MVPP2_PRS_SRAM_RI_WORD] = 0x0;
1656-
pe.sram[MVPP2_PRS_SRAM_RI_CTRL_WORD] = 0x0;
1657-
mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_IP4,
1658-
MVPP2_PRS_RI_L3_PROTO_MASK);
1629+
mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_IP4);
1630+
mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_IP4,
1631+
MVPP2_PRS_RI_L3_PROTO_MASK);
1632+
/* goto ipv4 dst-address (skip eth_type + IP-header-size - 4) */
1633+
mvpp2_prs_sram_shift_set(&pe, MVPP2_ETH_TYPE_LEN +
1634+
sizeof(struct iphdr) - 4,
1635+
MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
1636+
/* Set L3 offset */
1637+
mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L3,
1638+
MVPP2_ETH_TYPE_LEN,
1639+
MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
1640+
/* Set L4 offset */
1641+
mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L4,
1642+
MVPP2_ETH_TYPE_LEN + (ihl * 4),
1643+
MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
16591644

1660-
/* Update shadow table and hw entry */
1661-
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_PPPOE);
1662-
mvpp2_prs_hw_write(priv, &pe);
1645+
/* Update shadow table and hw entry */
1646+
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_PPPOE);
1647+
mvpp2_prs_hw_write(priv, &pe);
1648+
}
16631649

16641650
/* IPv6 over PPPoE */
16651651
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,

0 commit comments

Comments
 (0)