]> git.ipfire.org Git - people/arne_f/kernel.git/blobdiff - drivers/net/wan/lapbether.c
drivers/net/wan/lapbether: Set network_header before transmitting
[people/arne_f/kernel.git] / drivers / net / wan / lapbether.c
index 63f749078a1f1051f3f46bec13f1f60c7c64ea5f..15177a54b17d708bc4028e04a302967e531df2ae 100644 (file)
@@ -160,6 +160,12 @@ static netdev_tx_t lapbeth_xmit(struct sk_buff *skb,
        if (!netif_running(dev))
                goto drop;
 
+       /* There should be a pseudo header of 1 byte added by upper layers.
+        * Check to make sure it is there before reading it.
+        */
+       if (skb->len < 1)
+               goto drop;
+
        switch (skb->data[0]) {
        case X25_IFACE_DATA:
                break;
@@ -207,6 +213,8 @@ static void lapbeth_data_transmit(struct net_device *ndev, struct sk_buff *skb)
 
        skb->dev = dev = lapbeth->ethdev;
 
+       skb_reset_network_header(skb);
+
        dev_hard_header(skb, dev, ETH_P_DEC, bcast_addr, NULL, 0);
 
        dev_queue_xmit(skb);
@@ -308,7 +316,7 @@ static void lapbeth_setup(struct net_device *dev)
        dev->netdev_ops      = &lapbeth_netdev_ops;
        dev->needs_free_netdev = true;
        dev->type            = ARPHRD_X25;
-       dev->hard_header_len = 3;
+       dev->hard_header_len = 0;
        dev->mtu             = 1000;
        dev->addr_len        = 0;
 }
@@ -329,6 +337,16 @@ static int lapbeth_new_device(struct net_device *dev)
        if (!ndev)
                goto out;
 
+       /* When transmitting data:
+        * first this driver removes a pseudo header of 1 byte,
+        * then the lapb module prepends an LAPB header of at most 3 bytes,
+        * then this driver prepends a length field of 2 bytes,
+        * then the underlying Ethernet device prepends its own header.
+        */
+       ndev->needed_headroom = -1 + 3 + 2 + dev->hard_header_len
+                                          + dev->needed_headroom;
+       ndev->needed_tailroom = dev->needed_tailroom;
+
        lapbeth = netdev_priv(ndev);
        lapbeth->axdev = ndev;
 
@@ -346,7 +364,6 @@ out:
 fail:
        dev_put(dev);
        free_netdev(ndev);
-       kfree(lapbeth);
        goto out;
 }