From: Oliver Hartkopp <socketcan@hartkopp.net>
To: Urs Thuermann <urs@isnogud.escape.de>, Patrick McHardy <kaber@trash.net>
Cc: David Miller <davem@davemloft.net>,
Thomas Gleixner <tglx@linutronix.de>,
Oliver Hartkopp <oliver.hartkopp@volkswagen.de>,
netdev@vger.kernel.org
Subject: Re: [patch 5/7] CAN: Add virtual CAN netdevice driver
Date: Mon, 04 Jun 2007 20:26:53 +0200 [thread overview]
Message-ID: <4664596D.1030800@hartkopp.net> (raw)
In-Reply-To: <46643EB2.2060204@hartkopp.net>
Oliver Hartkopp wrote:
> I think, it goes into the right direction to use skb->pkt_type. The flag
> should really be somewhere inside the skb as all back references into
> the sk would become sticky in the implementation.
>
> But regarding the use of skb->pkt_type i would suggest to take a closer
> look on the definitions in include/linux/if_packet.h and how the
> pkt_type is to be used inside the kernel. In my opinion we should use ...
>
> * TX-Path:
> PACKET_OTHERHOST: send the CAN frame without loopback
> PACKET_BROADCAST : send the CAN frame with loopback (aka local broadcast)
>
> See an example of this approach in drivers/net/arcnet/rfc1051.c :
> http://www.linux-m32r.org/lxr/http/source/drivers/net/arcnet/rfc1051.c?a=i386#L99
>
> * RX-Path:
> PACKET_HOST : just an incoming CAN frame for this host
>
> Any comments? ACKs?
>
> Best regards,
> Oliver
>
>
>
The updated changes would look like this. Of course it has been tested
and is working fine :-)
Regards,
Oliver
Index: net/can/af_can.c
===================================================================
--- net/can/af_can.c (revision 325)
+++ net/can/af_can.c (working copy)
@@ -257,7 +257,6 @@
*/
int can_send(struct sk_buff *skb, int loop)
{
- struct sock **tx_sk = (struct sock **)skb->cb;
int err;
if (skb->dev->type != ARPHRD_CAN) {
@@ -265,30 +264,43 @@
return -EPERM;
}
+ skb->protocol = htons(ETH_P_CAN);
+
if (loop) {
/* local loopback of sent CAN frames (default) */
- /* indication for the CAN driver: do loopback */
- *tx_sk = skb->sk;
+ /*
+ * This packet is not only sent on the CAN bus but
+ * also broadcasted to local subscribers on this host.
+ */
+ skb->pkt_type = PACKET_BROADCAST;
/*
- * The reference to the originating sock may be also required
+ * The reference to the originating sock may be required
* by the receiving socket to indicate (and ignore) his own
- * sent data. Example: can_raw sockopt CAN_RAW_RECV_OWN_MSGS
+ * sent data. Example: can_raw sockopt CAN_RAW_RECV_OWN_MSGS.
+ * Therefore we have to ensure that skb->sk remains the
+ * reference to the originating sock by restoring skb->sk
+ * after each skb_clone() or skb_orphan() usage.
+ * skb->sk is usually unused and unset in the rx path.
*/
/* interface not capabable to do the loopback itself? */
if (!(skb->dev->flags & IFF_LOOPBACK)) {
+ struct sock *srcsk = skb->sk;
struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
/* perform the local loopback here */
- newskb->protocol = htons(ETH_P_CAN);
newskb->ip_summed = CHECKSUM_UNNECESSARY;
+ newskb->sk = srcsk;
netif_rx(newskb);
}
} else {
- /* indication for the CAN driver: no loopback required */
- *tx_sk = NULL;
+ /*
+ * Indication for the CAN driver: No loopback required!
+ * This packet is only transmitted to the CAN bus.
+ */
+ skb->pkt_type = PACKET_OTHERHOST;
}
if (!(skb->dev->flags & IFF_UP))
@@ -581,10 +593,12 @@
static inline void deliver(struct sk_buff *skb, struct receiver *r)
{
+ struct sock *srcsk = skb->sk;
struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
DBG("skbuff %p cloned to %p\n", skb, clone);
if (clone) {
+ clone->sk = srcsk;
r->func(clone, r->data);
r->matches++;
}
Index: net/can/raw.c
===================================================================
--- net/can/raw.c (revision 325)
+++ net/can/raw.c (working copy)
@@ -154,7 +154,7 @@
if (!ro->recv_own_msgs) {
/* check the received tx sock reference */
- if (*(struct sock **)skb->cb == sk) {
+ if (skb->sk == sk) {
DBG("trashed own tx msg\n");
kfree_skb(skb);
return;
Index: drivers/net/can/vcan.c
===================================================================
--- drivers/net/can/vcan.c (revision 325)
+++ drivers/net/can/vcan.c (working copy)
@@ -133,6 +133,7 @@
skb->protocol = htons(ETH_P_CAN);
skb->dev = dev;
skb->ip_summed = CHECKSUM_UNNECESSARY;
+ skb->pkt_type = PACKET_HOST;
DBG("received skbuff on interface %d\n", dev->ifindex);
@@ -149,8 +150,8 @@
stats->tx_packets++;
stats->tx_bytes += skb->len;
- /* tx socket reference pointer: Loopback required if not NULL */
- loop = *(struct sock **)skb->cb != NULL;
+ /* indication for CAN netdevice drivers that loopback is required */
+ loop = (skb->pkt_type == PACKET_BROADCAST);
if (!loopback) {
/* no loopback handling available inside this driver */
@@ -170,6 +171,8 @@
/* perform standard loopback handling for CAN network interfaces */
if (loop) {
+ struct sock *srcsk = skb->sk;
+
if (atomic_read(&skb->users) != 1) {
struct sk_buff *old_skb = skb;
@@ -183,6 +186,8 @@
} else
skb_orphan(skb);
+ skb->sk = srcsk;
+
/* receive with packet counting */
vcan_rx(skb, dev);
} else {
next prev parent reply other threads:[~2007-06-04 18:27 UTC|newest]
Thread overview: 97+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-30 13:11 [patch 0/7] CAN: Add new PF_CAN protocol family, update Urs Thuermann
2007-05-30 13:11 ` [patch 1/7] CAN: Allocate protocol numbers for PF_CAN Urs Thuermann
2007-05-30 13:11 ` [patch 2/7] CAN: Add PF_CAN core module Urs Thuermann
2007-05-30 13:11 ` [patch 3/7] CAN: Add raw protocol Urs Thuermann
2007-05-30 13:11 ` [patch 4/7] CAN: Add broadcast manager (bcm) protocol Urs Thuermann
2007-05-30 13:11 ` [patch 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
2007-05-30 17:13 ` Patrick McHardy
2007-05-30 18:39 ` Oliver Hartkopp
2007-05-30 19:16 ` Patrick McHardy
2007-05-30 19:48 ` Oliver Hartkopp
2007-05-30 19:58 ` Patrick McHardy
2007-05-31 5:13 ` Oliver Hartkopp
2007-05-31 20:25 ` Oliver Hartkopp
2007-06-01 14:54 ` Patrick McHardy
2007-06-02 9:51 ` Oliver Hartkopp
2007-06-02 19:58 ` Oliver Hartkopp
2007-06-03 19:16 ` Oliver Hartkopp
2007-06-04 11:53 ` Patrick McHardy
2007-06-04 12:44 ` Urs Thuermann
2007-06-06 11:39 ` Patrick McHardy
2007-06-04 12:17 ` Urs Thuermann
2007-06-04 16:32 ` Oliver Hartkopp
2007-06-04 18:26 ` Oliver Hartkopp [this message]
2007-06-02 8:09 ` Urs Thuermann
2007-06-03 18:27 ` Patrick McHardy
2007-05-30 17:28 ` Stephen Hemminger
2007-05-30 18:57 ` Oliver Hartkopp
2007-05-30 19:01 ` Stephen Hemminger
2007-05-30 19:25 ` Oliver Hartkopp
2007-05-30 13:11 ` [patch 6/7] CAN: Add maintainer entries Urs Thuermann
2007-05-30 13:11 ` [patch 7/7] CAN: Add documentation Urs Thuermann
-- strict thread matches above, loose matches on Subject: below --
2007-11-16 15:02 [PATCH 0/7] CAN: New PF_CAN protocol family for 2.6.25, update Urs Thuermann
2007-11-16 15:02 ` [PATCH 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
2007-11-14 12:13 [PATCH 0/7] CAN: New PF_CAN protocol family for 2.6.25 Urs Thuermann
2007-11-14 12:13 ` [PATCH 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
2007-11-14 12:51 ` Patrick McHardy
2007-11-14 13:36 ` Urs Thuermann
2007-11-14 13:45 ` Patrick McHardy
2007-10-05 10:49 [PATCH 0/7] CAN: Add new PF_CAN protocol family, try #10 Urs Thuermann
2007-10-05 10:49 ` [PATCH 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
2007-10-02 13:10 [PATCH 0/7] CAN: Add new PF_CAN protocol family, try #9 Urs Thuermann
2007-10-02 13:10 ` [PATCH 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
2007-10-02 14:20 ` Arnaldo Carvalho de Melo
2007-10-02 15:07 ` Oliver Hartkopp
2007-10-02 16:46 ` Arnaldo Carvalho de Melo
2007-10-02 21:02 ` Oliver Hartkopp
2007-10-02 21:43 ` Arnaldo Carvalho de Melo
2007-10-02 21:50 ` David Miller
2007-10-03 7:06 ` Oliver Hartkopp
2007-10-02 21:52 ` Stephen Hemminger
2007-10-02 22:04 ` David Miller
2007-10-03 17:47 ` Oliver Hartkopp
2007-10-04 11:52 ` Urs Thuermann
2007-09-25 12:20 [PATCH 0/7] CAN: Add new PF_CAN protocol family, try #8 Urs Thuermann
2007-09-25 12:20 ` [PATCH 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
2007-09-25 13:26 ` YOSHIFUJI Hideaki / 吉藤英明
2007-09-25 14:00 ` Urs Thuermann
2007-09-25 14:47 ` Patrick McHardy
2007-09-25 17:55 ` Oliver Hartkopp
2007-09-25 17:53 ` Patrick McHardy
2007-09-25 19:09 ` Oliver Hartkopp
2007-09-20 18:43 [PATCH 0/7] CAN: Add new PF_CAN protocol family, try #7 Urs Thuermann
2007-09-20 18:43 ` [PATCH 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
2007-09-27 15:54 ` Eric W. Biederman
2007-09-27 16:16 ` Eric W. Biederman
2007-09-27 19:18 ` David Miller
2007-09-28 8:48 ` Oliver Hartkopp
2007-09-28 16:52 ` Eric W. Biederman
2007-09-28 18:33 ` Oliver Hartkopp
2007-09-17 10:03 [PATCH 0/7] CAN: Add new PF_CAN protocol family, try #6 Urs Thuermann
2007-09-17 10:03 ` [PATCH 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
2007-09-18 15:02 ` Patrick McHardy
2007-09-18 22:24 ` Urs Thuermann
2007-09-19 6:26 ` Oliver Hartkopp
2007-09-19 8:41 ` Patrick McHardy
2007-08-04 2:06 [patch 0/7] CAN: Add new PF_CAN protocol family, try #5 Urs Thuermann
2007-08-04 2:07 ` [patch 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
2007-06-22 3:44 [patch 0/7] CAN: Add new PF_CAN protocol family, try #3 Urs Thuermann
2007-06-22 3:44 ` [patch 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
2007-06-22 11:02 ` Patrick McHardy
2007-06-22 12:22 ` Urs Thuermann
2007-06-22 12:38 ` Patrick McHardy
2007-06-23 12:05 ` Oliver Hartkopp
2007-06-23 12:52 ` Patrick McHardy
2007-06-23 15:13 ` Oliver Hartkopp
2007-06-23 16:25 ` Patrick McHardy
2007-06-23 16:42 ` Oliver Hartkopp
2007-06-23 17:13 ` Patrick McHardy
2007-07-04 11:37 ` Urs Thuermann
2007-07-04 14:01 ` Patrick McHardy
2007-07-09 11:37 ` Urs Thuermann
2007-07-09 14:18 ` Patrick McHardy
2007-07-09 15:27 ` Oliver Hartkopp
2007-07-11 19:41 ` Oliver Hartkopp
2007-07-11 22:52 ` Patrick McHardy
2007-07-16 6:05 ` Oliver Hartkopp
2007-07-16 8:37 ` David Miller
2007-07-16 13:08 ` Patrick McHardy
2007-07-16 16:27 ` Oliver Hartkopp
2007-07-16 13:07 ` Patrick McHardy
2007-07-16 16:00 ` Oliver Hartkopp
2007-06-23 21:01 ` David Miller
2007-06-23 21:44 ` Oliver Hartkopp
2007-06-23 20:51 ` David Miller
2007-06-23 21:49 ` Oliver Hartkopp
2007-05-16 14:51 [patch 0/7] CAN: Add new PF_CAN protocol family Urs Thuermann
2007-05-16 14:51 ` [patch 5/7] CAN: Add virtual CAN netdevice driver Urs Thuermann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4664596D.1030800@hartkopp.net \
--to=socketcan@hartkopp.net \
--cc=davem@davemloft.net \
--cc=kaber@trash.net \
--cc=netdev@vger.kernel.org \
--cc=oliver.hartkopp@volkswagen.de \
--cc=tglx@linutronix.de \
--cc=urs@isnogud.escape.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).