lkml.org 
[lkml]   [2019]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net-next 25/26] net: stmmac: selftests: Add selftest for VLAN TX Offload
    Date
    Add 2 new selftests for VLAN Insertion offloading. Tests are for inner
    and outer VLAN offloading.

    Signed-off-by: Jose Abreu <joabreu@synopsys.com>
    ---
    Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
    Cc: Alexandre Torgue <alexandre.torgue@st.com>
    Cc: Jose Abreu <joabreu@synopsys.com>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
    Cc: netdev@vger.kernel.org
    Cc: linux-stm32@st-md-mailman.stormreply.com
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: linux-kernel@vger.kernel.org
    ---
    .../net/ethernet/stmicro/stmmac/stmmac_selftests.c | 81 ++++++++++++++++++++++
    1 file changed, 81 insertions(+)

    diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c
    index acfab86431b1..a0da35b2b4c2 100644
    --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c
    +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c
    @@ -731,6 +731,9 @@ static int stmmac_test_vlan_validate(struct sk_buff *skb,
    struct ethhdr *ehdr;
    struct udphdr *uhdr;
    struct iphdr *ihdr;
    + u16 proto;
    +
    + proto = tpriv->double_vlan ? ETH_P_8021AD : ETH_P_8021Q;

    skb = skb_unshare(skb, GFP_ATOMIC);
    if (!skb)
    @@ -740,6 +743,12 @@ static int stmmac_test_vlan_validate(struct sk_buff *skb,
    goto out;
    if (skb_headlen(skb) < (STMMAC_TEST_PKT_SIZE - ETH_HLEN))
    goto out;
    + if (tpriv->vlan_id) {
    + if (skb->vlan_proto != htons(proto))
    + goto out;
    + if (skb->vlan_tci != tpriv->vlan_id)
    + goto out;
    + }

    ehdr = (struct ethhdr *)skb_mac_header(skb);
    if (!ether_addr_equal(ehdr->h_dest, tpriv->packet->dst))
    @@ -1084,6 +1093,70 @@ static int stmmac_test_reg_sar(struct stmmac_priv *priv)
    return ret;
    }

    +static int stmmac_test_vlanoff_common(struct stmmac_priv *priv, bool svlan)
    +{
    + struct stmmac_packet_attrs attr = { };
    + struct stmmac_test_priv *tpriv;
    + struct sk_buff *skb = NULL;
    + int ret = 0;
    + u16 proto;
    +
    + if (!priv->dma_cap.vlins)
    + return -EOPNOTSUPP;
    +
    + tpriv = kzalloc(sizeof(*tpriv), GFP_KERNEL);
    + if (!tpriv)
    + return -ENOMEM;
    +
    + proto = svlan ? ETH_P_8021AD : ETH_P_8021Q;
    +
    + tpriv->ok = false;
    + tpriv->double_vlan = svlan;
    + init_completion(&tpriv->comp);
    +
    + tpriv->pt.type = htons(ETH_P_IP);
    + tpriv->pt.func = stmmac_test_vlan_validate;
    + tpriv->pt.dev = priv->dev;
    + tpriv->pt.af_packet_priv = tpriv;
    + tpriv->packet = &attr;
    + tpriv->vlan_id = 0x123;
    + dev_add_pack(&tpriv->pt);
    +
    + ret = vlan_vid_add(priv->dev, htons(proto), tpriv->vlan_id);
    + if (ret)
    + goto cleanup;
    +
    + attr.dst = priv->dev->dev_addr;
    +
    + skb = stmmac_test_get_udp_skb(priv, &attr);
    + if (!skb) {
    + ret = -ENOMEM;
    + goto vlan_del;
    + }
    +
    + __vlan_hwaccel_put_tag(skb, htons(proto), tpriv->vlan_id);
    + ret = __stmmac_test_loopback(priv, &attr);
    +
    +vlan_del:
    + vlan_vid_del(priv->dev, htons(proto), tpriv->vlan_id);
    +cleanup:
    + dev_remove_pack(&tpriv->pt);
    + kfree(tpriv);
    + return ret;
    +}
    +
    +static int stmmac_test_vlanoff(struct stmmac_priv *priv)
    +{
    + return stmmac_test_vlanoff_common(priv, false);
    +}
    +
    +static int stmmac_test_svlanoff(struct stmmac_priv *priv)
    +{
    + if (!priv->dma_cap.dvlan)
    + return -EOPNOTSUPP;
    + return stmmac_test_vlanoff_common(priv, true);
    +}
    +
    #define STMMAC_LOOPBACK_NONE 0
    #define STMMAC_LOOPBACK_MAC 1
    #define STMMAC_LOOPBACK_PHY 2
    @@ -1161,6 +1234,14 @@ static const struct stmmac_test {
    .name = "SA Replacement (reg)",
    .lb = STMMAC_LOOPBACK_PHY,
    .fn = stmmac_test_reg_sar,
    + }, {
    + .name = "VLAN TX Insertion ",
    + .lb = STMMAC_LOOPBACK_PHY,
    + .fn = stmmac_test_vlanoff,
    + }, {
    + .name = "SVLAN TX Insertion ",
    + .lb = STMMAC_LOOPBACK_PHY,
    + .fn = stmmac_test_svlanoff,
    },
    };

    --
    2.7.4
    \
     
     \ /
      Last update: 2019-08-05 18:48    [W:2.563 / U:0.336 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site