forked from luck/tmp_suning_uos_patched
net: dsa: tag_rtl4_a: fix egress tags
commit 9eb8bc593a5eed167dac2029abef343854c5ba75 upstream. Commit 86dd9868b878 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 a3b0b6479700. - A u16 pointer points to skb data. It should be __be16 for network byte order. - Typo in comments. "numer" -> "number". Fixes: 86dd9868b878 ("net: dsa: tag_rtl4_a: Support also egress tags") Signed-off-by: DENG Qingfang <dqfext@gmail.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
389055e7b9
commit
68277f69a8
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user