lkml.org 
[lkml]   [2020]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.5 091/542] wan/hdlc_x25: fix skb handling
    Date
    From: Martin Schiller <ms@dev.tdt.de>

    [ Upstream commit 953c4a08dfc9ffe763a8340ac10f459d6c6cc4eb ]

    o call skb_reset_network_header() before hdlc->xmit()
    o change skb proto to HDLC (0x0019) before hdlc->xmit()
    o call dev_queue_xmit_nit() before hdlc->xmit()

    This changes make it possible to trace (tcpdump) outgoing layer2
    (ETH_P_HDLC) packets

    Additionally call skb_reset_network_header() after each skb_push() /
    skb_pull().

    Signed-off-by: Martin Schiller <ms@dev.tdt.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wan/hdlc_x25.c | 13 +++++++++++--
    1 file changed, 11 insertions(+), 2 deletions(-)

    diff --git a/drivers/net/wan/hdlc_x25.c b/drivers/net/wan/hdlc_x25.c
    index 5643675ff7241..bf78073ee7fd9 100644
    --- a/drivers/net/wan/hdlc_x25.c
    +++ b/drivers/net/wan/hdlc_x25.c
    @@ -62,11 +62,12 @@ static int x25_data_indication(struct net_device *dev, struct sk_buff *skb)
    {
    unsigned char *ptr;

    - skb_push(skb, 1);
    -
    if (skb_cow(skb, 1))
    return NET_RX_DROP;

    + skb_push(skb, 1);
    + skb_reset_network_header(skb);
    +
    ptr = skb->data;
    *ptr = X25_IFACE_DATA;

    @@ -79,6 +80,13 @@ static int x25_data_indication(struct net_device *dev, struct sk_buff *skb)
    static void x25_data_transmit(struct net_device *dev, struct sk_buff *skb)
    {
    hdlc_device *hdlc = dev_to_hdlc(dev);
    +
    + skb_reset_network_header(skb);
    + skb->protocol = hdlc_type_trans(skb, dev);
    +
    + if (dev_nit_active(dev))
    + dev_queue_xmit_nit(skb, dev);
    +
    hdlc->xmit(skb, dev); /* Ignore return value :-( */
    }

    @@ -93,6 +101,7 @@ static netdev_tx_t x25_xmit(struct sk_buff *skb, struct net_device *dev)
    switch (skb->data[0]) {
    case X25_IFACE_DATA: /* Data to be transmitted */
    skb_pull(skb, 1);
    + skb_reset_network_header(skb);
    if ((result = lapb_data_request(dev, skb)) != LAPB_OK)
    dev_kfree_skb(skb);
    return NETDEV_TX_OK;
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-02-14 19:18    [W:6.428 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site