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

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
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -35,14 +35,12 @@ static struct sk_buff *rtl4a_tag_xmit(struct sk_buff *skb,
				      struct net_device *dev)
{
	struct dsa_port *dp = dsa_slave_to_port(dev);
	__be16 *p;
	u8 *tag;
	u16 *p;
	u16 out;

	/* Pad out to at least 60 bytes */
	if (unlikely(eth_skb_pad(skb)))
		return NULL;
	if (skb_cow_head(skb, RTL4_A_HDR_LEN) < 0)
	if (unlikely(__skb_put_padto(skb, ETH_ZLEN, false)))
		return NULL;

	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,
	tag = skb->data + 2 * ETH_ALEN;

	/* Set Ethertype */
	p = (u16 *)tag;
	p = (__be16 *)tag;
	*p = htons(RTL4_A_ETHERTYPE);

	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;
	p = (u16 *)(tag + 2);
	p = (__be16 *)(tag + 2);
	*p = htons(out);

	return skb;