}
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);
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++;
}
}
/* 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);
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);
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);