]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
Add (untested) support for kernels before 2.6.21.
authorthuermann <thuermann@030b6a49-0b11-0410-94ab-b0dab22257f2>
Thu, 21 Jun 2007 13:02:24 +0000 (13:02 +0000)
committerthuermann <thuermann@030b6a49-0b11-0410-94ab-b0dab22257f2>
Thu, 21 Jun 2007 13:02:24 +0000 (13:02 +0000)
git-svn-id: svn://svn.berlios.de//socketcan/trunk@386 030b6a49-0b11-0410-94ab-b0dab22257f2

kernel/2.6/net/can/af_can.c
kernel/2.6/net/can/bcm.c
kernel/2.6/net/can/raw.c

index 68cd67d0f270592c4015769aec2561e50983b7ff..5b00c6aa0b07deedb4bf4777e24029ae70c91f98 100644 (file)
@@ -291,7 +291,11 @@ int can_send(struct sk_buff *skb, int loop)
                        }
 
                        newskb->sk = skb->sk;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
                        newskb->iif = 0;
+#else
+                       newskb->input_dev = NULL;
+#endif
                        newskb->ip_summed = CHECKSUM_UNNECESSARY;
                        newskb->pkt_type = PACKET_BROADCAST;
                        netif_rx(newskb);
@@ -586,7 +590,11 @@ static inline void deliver(struct sk_buff *skb, struct receiver *r)
        DBG("skbuff %p cloned to %p\n", skb, clone);
        if (clone) {
                clone->sk  = skb->sk;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
                clone->iif = skb->iif;
+#else
+               clone->input_dev = skb->input_dev;
+#endif
                r->func(clone, r->data);
                r->matches++;
        }
index 36652b39863a7d0d84d3021c8ae2836d447fe0c6..704357be0b819b378a918dfae9937b0142a6dc4e 100644 (file)
@@ -393,7 +393,13 @@ static void bcm_send_to_user(struct bcm_op *op, struct bcm_msg_head *head,
        }
 
        /* restore originator for recvfrom() */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
        skb->iif = op->rx_ifindex;
+#else
+       skb->input_dev = dev_get_by_index(op->rx_ifindex);
+       if (skb->input_dev)
+               dev_put(skb->input_dev);
+#endif
 
        if (head->nframes) {
                memcpy(skb_put(skb, datalen), frames, datalen);
@@ -1725,7 +1731,17 @@ static int bcm_recvmsg(struct kiocb *iocb, struct socket *sock,
                msg->msg_namelen = sizeof(*addr);
                memset(addr, 0, sizeof(*addr));
                addr->can_family  = AF_CAN;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
                addr->can_ifindex = skb->iif;
+#else
+               /* FIXME: Race condition, skb->input_dev might disappear
+                *        while skb is waiting on the queue.
+                */
+               if (skb->input_dev)
+                       addr->can_ifindex = skb->input_dev->ifindex;
+               else
+                       addr->can_ifindex = 0;
+#endif
        }
 
        DBG("freeing sock %p, skbuff %p\n", sk, skb);
index dd7ef83d074994eb47b811743b70e31f6e07325f..5eb4bf697fda6d9a8dba2cd9a718cf5e742255a3 100644 (file)
@@ -709,7 +709,14 @@ static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
                msg->msg_namelen = sizeof(*addr);
                memset(addr, 0, sizeof(*addr));
                addr->can_family  = AF_CAN;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
                addr->can_ifindex = skb->iif;
+#else
+               /* FIXME: Race condition, skb->input_dev might disappear
+                *        while skb is waiting on the queue.
+                */
+               addr->can_ifindex = skb->input_dev->ifindex;
+#endif
        }
 
        DBG("freeing sock %p, skbuff %p\n", sk, skb);