Commit 9eb8bc59 authored by DENG Qingfang's avatar DENG Qingfang Committed by David S. Miller

net: dsa: tag_rtl4_a: fix egress tags

Commit 86dd9868 has several issues, but was accepted too soon
before anyone could take a look.

- Double free. dsa_slave_xmit() will free the skb if the xmit function
  returns NULL, but the skb is already freed by eth_skb_pad(). Use
  __skb_put_padto() to avoid that.
- Unnecessary allocation. It has been done by DSA core since commit
  a3b0b647.
- A u16 pointer points to skb data. It should be __be16 for network
  byte order.
- Typo in comments. "numer" -> "number".

Fixes: 86dd9868 ("net: dsa: tag_rtl4_a: Support also egress tags")
Signed-off-by: default avatarDENG Qingfang <dqfext@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 826d8217
...@@ -35,14 +35,12 @@ static struct sk_buff *rtl4a_tag_xmit(struct sk_buff *skb, ...@@ -35,14 +35,12 @@ static struct sk_buff *rtl4a_tag_xmit(struct sk_buff *skb,
struct net_device *dev) struct net_device *dev)
{ {
struct dsa_port *dp = dsa_slave_to_port(dev); struct dsa_port *dp = dsa_slave_to_port(dev);
__be16 *p;
u8 *tag; u8 *tag;
u16 *p;
u16 out; u16 out;
/* Pad out to at least 60 bytes */ /* Pad out to at least 60 bytes */
if (unlikely(eth_skb_pad(skb))) if (unlikely(__skb_put_padto(skb, ETH_ZLEN, false)))
return NULL;
if (skb_cow_head(skb, RTL4_A_HDR_LEN) < 0)
return NULL; return NULL;
netdev_dbg(dev, "add realtek tag to package to port %d\n", netdev_dbg(dev, "add realtek tag to package to port %d\n",
...@@ -53,13 +51,13 @@ static struct sk_buff *rtl4a_tag_xmit(struct sk_buff *skb, ...@@ -53,13 +51,13 @@ static struct sk_buff *rtl4a_tag_xmit(struct sk_buff *skb,
tag = skb->data + 2 * ETH_ALEN; tag = skb->data + 2 * ETH_ALEN;
/* Set Ethertype */ /* Set Ethertype */
p = (u16 *)tag; p = (__be16 *)tag;
*p = htons(RTL4_A_ETHERTYPE); *p = htons(RTL4_A_ETHERTYPE);
out = (RTL4_A_PROTOCOL_RTL8366RB << 12) | (2 << 8); out = (RTL4_A_PROTOCOL_RTL8366RB << 12) | (2 << 8);
/* The lower bits is the port numer */ /* The lower bits is the port number */
out |= (u8)dp->index; out |= (u8)dp->index;
p = (u16 *)(tag + 2); p = (__be16 *)(tag + 2);
*p = htons(out); *p = htons(out);
return skb; return skb;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment