]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
Updated changes in rev727 to Kernel 2.4 path.
authorhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Tue, 6 May 2008 14:01:24 +0000 (14:01 +0000)
committerhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Tue, 6 May 2008 14:01:24 +0000 (14:01 +0000)
git-svn-id: svn://svn.berlios.de//socketcan/trunk@728 030b6a49-0b11-0410-94ab-b0dab22257f2

kernel/2.4/net/can/af_can.c

index 609997b3e0350c693bf8d39746c1f1d880728a47..308a03cfd27764fdd01c3327c4f7e2b435809435 100644 (file)
@@ -198,6 +198,7 @@ static int can_create(struct socket *sock, int protocol)
  */
 int can_send(struct sk_buff *skb, int loop)
 {
+       struct sk_buff *newskb = NULL;
        int err;
 
        if (skb->dev->type != ARPHRD_CAN) {
@@ -236,8 +237,7 @@ int can_send(struct sk_buff *skb, int loop)
                         * If the interface is not capable to do loopback
                         * itself, we do it here.
                         */
-                       struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
-
+                       newskb = skb_clone(skb, GFP_ATOMIC);
                        if (!newskb) {
                                kfree_skb(skb);
                                return -ENOMEM;
@@ -246,7 +246,6 @@ int can_send(struct sk_buff *skb, int loop)
                        newskb->sk = skb->sk;
                        newskb->ip_summed = CHECKSUM_UNNECESSARY;
                        newskb->pkt_type = PACKET_BROADCAST;
-                       netif_rx(newskb);
                }
        } else {
                /* indication for the CAN driver: no loopback required */
@@ -258,11 +257,20 @@ int can_send(struct sk_buff *skb, int loop)
        if (err > 0)
                err = net_xmit_errno(err);
 
+       if (err) {
+               if (newskb)
+                       kfree_skb(newskb);
+               return err;
+       }
+
+       if (newskb)
+               netif_rx(newskb);
+
        /* update statistics */
        can_stats.tx_frames++;
        can_stats.tx_frames_delta++;
 
-       return err;
+       return 0;
 }
 EXPORT_SYMBOL(can_send);