Phonet: fix flawed "SYN/ACK" logic
[linux-3.10.git] / net / phonet / pep-gprs.c
index 6a91a32a80c135277fdae3f0b67572d5df2f92b6..d01208968c830c5fa7a7484ea15ae059fc7015d6 100644 (file)
@@ -96,11 +96,11 @@ static int gprs_recv(struct gprs_dev *gp, struct sk_buff *skb)
                goto drop;
        }
 
-       if (likely(skb_headroom(skb) & 3)) {
+       if (skb_headroom(skb) & 3) {
                struct sk_buff *rskb, *fs;
                int flen = 0;
 
-               /* Phonet Pipe data header is misaligned (3 bytes),
+               /* Phonet Pipe data header may be misaligned (3 bytes),
                 * so wrap the IP packet as a single fragment of an head-less
                 * socket buffer. The network stack will pull what it needs,
                 * but at least, the whole IP payload is not memcpy'd. */
@@ -115,10 +115,10 @@ static int gprs_recv(struct gprs_dev *gp, struct sk_buff *skb)
                rskb->truesize += rskb->len;
 
                /* Avoid nested fragments */
-               for (fs = skb_shinfo(skb)->frag_list; fs; fs = fs->next)
+               skb_walk_frags(skb, fs)
                        flen += fs->len;
                skb->next = skb_shinfo(skb)->frag_list;
-               skb_shinfo(skb)->frag_list = NULL;
+               skb_frag_list_init(skb);
                skb->len -= flen;
                skb->data_len -= flen;
                skb->truesize -= flen;
@@ -183,7 +183,7 @@ static int gprs_close(struct net_device *dev)
        return 0;
 }
 
-static int gprs_xmit(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t gprs_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct gprs_dev *gp = netdev_priv(dev);
        struct sock *sk = gp->sk;
@@ -195,7 +195,7 @@ static int gprs_xmit(struct sk_buff *skb, struct net_device *dev)
                break;
        default:
                dev_kfree_skb(skb);
-               return 0;
+               return NETDEV_TX_OK;
        }
 
        skb_orphan(skb);
@@ -207,15 +207,15 @@ static int gprs_xmit(struct sk_buff *skb, struct net_device *dev)
                                dev->name, err);
                dev->stats.tx_aborted_errors++;
                dev->stats.tx_errors++;
-               dev_kfree_skb(skb);
        } else {
                dev->stats.tx_packets++;
                dev->stats.tx_bytes += len;
        }
 
-       if (!pep_writeable(sk))
-               netif_stop_queue(dev);
-       return 0;
+       netif_stop_queue(dev);
+       if (pep_writeable(sk))
+               netif_wake_queue(dev);
+       return NETDEV_TX_OK;
 }
 
 static int gprs_set_mtu(struct net_device *dev, int new_mtu)