netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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 {



  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).