All of lore.kernel.org
 help / color / mirror / Atom feed
From: Patrick McHardy <kaber@trash.net>
To: Urs Thuermann <urs@isnogud.escape.de>
Cc: netdev@vger.kernel.org, David Miller <davem@davemloft.net>,
	Thomas Gleixner <tglx@linutronix.de>,
	Oliver Hartkopp <oliver@hartkopp.net>,
	Oliver Hartkopp <oliver.hartkopp@volkswagen.de>,
	Urs Thuermann <urs.thuermann@volkswagen.de>
Subject: Re: [PATCH 5/7] CAN: Add virtual CAN netdevice driver
Date: Tue, 18 Sep 2007 17:02:53 +0200	[thread overview]
Message-ID: <46EFE89D.7050006@trash.net> (raw)
In-Reply-To: <20070917100440.18347.5@janus.isnogud.escape.de>

Urs Thuermann wrote:
> This patch adds the virtual CAN bus (vcan) network driver.
> The vcan device is just a loopback device for CAN frames, no
> real CAN hardware is involved.
> 
> Signed-off-by: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
> Signed-off-by: Urs Thuermann <urs.thuermann@volkswagen.de>
> 

Also looks mostly fine, a few comments below.

> +++ net-2.6.24/drivers/net/can/vcan.c	2007-09-17 11:17:45.000000000 +0200
> +#include <linux/module.h>
> +#include <linux/init.h>
> +#include <linux/netdevice.h>
> +#include <linux/if_arp.h>
> +#include <linux/if_ether.h>
> +#include <linux/can.h>
> +#include <net/rtnetlink.h>
> +
> +static __initdata const char banner[] =
> +	KERN_INFO "vcan: Virtual CAN interface driver\n";
> +
> +MODULE_DESCRIPTION("virtual CAN interface");
> +MODULE_LICENSE("Dual BSD/GPL");
> +MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
> +
> +#ifdef CONFIG_CAN_DEBUG_DEVICES
> +static int debug;
> +module_param(debug, int, S_IRUGO);
> +#endif
> +
> +/* To be moved to linux/can/dev.h */
> +#ifdef CONFIG_CAN_DEBUG_DEVICES
> +#define DBG(args...)       (debug & 1 ? \
> +			       (printk(KERN_DEBUG "vcan %s: ", __func__), \
> +				printk(args)) : 0)
> +#else
> +#define DBG(args...)
> +#endif
> +
> +
> +/*
> + * CAN test feature:
> + * Enable the loopback on driver level for testing the CAN core loopback modes.
> + * See Documentation/networking/can.txt for details.
> + */
> +
> +static int loopback; /* loopback testing. Default: 0 (Off) */
> +module_param(loopback, int, S_IRUGO);
> +MODULE_PARM_DESC(loopback, "Loop back frames (for testing). Default: 0 (Off)");


I would still prefer to have this on a per-device level configured
through netlink, but since we currently don't support specifying
flags for new devices anyways, I won't argue about it anymore
(OTOH, if you'd agree I could send a patch to add this feature
to the rtnl_link API).

> +
> +struct vcan_priv {
> +	struct net_device *dev;
> +	struct list_head list;
> +};


This is not needed anymore. The rtnl_link_unregister function calls
the ->dellink function for each device of this type. Check out the
current dummy.c driver.

> +static LIST_HEAD(vcan_devs);
> +
> +static int vcan_open(struct net_device *dev)
> +{
> +	DBG("%s: interface up\n", dev->name);
> +
> +	netif_start_queue(dev);
> +	return 0;
> +}
> +
> +static int vcan_stop(struct net_device *dev)
> +{
> +	DBG("%s: interface down\n", dev->name);
> +
> +	netif_stop_queue(dev);
> +	return 0;
> +}
> +
> +static void vcan_rx(struct sk_buff *skb, struct net_device *dev)
> +{
> +	struct net_device_stats *stats = &dev->stats;
> +
> +	stats->rx_packets++;
> +	stats->rx_bytes += skb->len;
> +
> +	skb->protocol  = htons(ETH_P_CAN);
> +	skb->pkt_type  = PACKET_BROADCAST;
> +	skb->dev       = dev;
> +	skb->ip_summed = CHECKSUM_UNNECESSARY;
> +
> +	DBG("received skbuff on interface %d\n", dev->ifindex);
> +
> +	netif_rx(skb);
> +}
> +
> +static int vcan_tx(struct sk_buff *skb, struct net_device *dev)
> +{
> +	struct net_device_stats *stats = &dev->stats;
> +	int loop;
> +
> +	DBG("sending skbuff on interface %s\n", dev->name);
> +
> +	stats->tx_packets++;
> +	stats->tx_bytes += skb->len;
> +
> +	/* set flag whether this packet has to be looped back */
> +	loop = skb->pkt_type == PACKET_LOOPBACK;
> +
> +	if (!loopback) {
> +		/* no loopback handling available inside this driver */
> +
> +		if (loop) {
> +			/*
> +			 * only count the packets here, because the
> +			 * CAN core already did the loopback for us
> +			 */
> +			stats->rx_packets++;
> +			stats->rx_bytes += skb->len;
> +		}
> +		kfree_skb(skb);
> +		return 0;
> +	}
> +
> +	/* 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;
> +
> +			skb = skb_clone(old_skb, GFP_ATOMIC);
> +			DBG(KERN_INFO "%s: %s: freeing old skbuff %p, "
> +			    "using new skbuff %p\n",
> +			    dev->name, __FUNCTION__, old_skb, skb);
> +			kfree_skb(old_skb);

skb_share_check()?

> +			if (!skb)
> +				return 0;
> +		} else
> +			skb_orphan(skb);
> +
> +		/* receive with packet counting */
> +		skb->sk = srcsk;


Where is the socket used and what makes sure it still exists?

> +		vcan_rx(skb, dev);
> +	} else {
> +		/* no looped packets => no counting */
> +		kfree_skb(skb);
> +	}
> +	return 0;
> +}
> +
> +static void vcan_setup(struct net_device *dev)
> +{
> +	DBG("dev %s\n", dev->name);
> +
> +	dev->type              = ARPHRD_CAN;
> +	dev->mtu               = sizeof(struct can_frame);
> +	dev->hard_header_len   = 0;
> +	dev->addr_len          = 0;
> +	dev->tx_queue_len      = 0;
> +	dev->flags             = IFF_NOARP;
> +
> +	/* set flags according to driver capabilities */
> +	if (loopback)
> +		dev->flags |= IFF_LOOPBACK;
> +
> +	dev->open              = vcan_open;
> +	dev->stop              = vcan_stop;
> +	dev->hard_start_xmit   = vcan_tx;
> +	dev->destructor        = free_netdev;
> +
> +}
> +
> +static int vcan_newlink(struct net_device *dev,
> +			struct nlattr *tb[], struct nlattr *data[])
> +{
> +	struct vcan_priv *priv = netdev_priv(dev);
> +	int err;
> +
> +	err = register_netdevice(dev);
> +	if (err < 0)
> +		return err;
> +
> +	priv->dev = dev;
> +	list_add_tail(&priv->list, &vcan_devs);
> +	return 0;
> +}
> +
> +static void vcan_dellink(struct net_device *dev)
> +{
> +	struct vcan_priv *priv = netdev_priv(dev);
> +
> +	list_del(&priv->list);
> +	unregister_netdevice(dev);
> +}


Both the addlink and dellink function can be removed, the default
for addlink is register_netdevice, the default for unregister
is unregister_netdevice (and the list is not needed anymore as
mentioned above).

> +
> +static struct rtnl_link_ops vcan_link_ops __read_mostly = {
> +       .kind           = "vcan",
> +       .priv_size      = sizeof(struct vcan_priv),
> +       .setup          = vcan_setup,
> +       .newlink        = vcan_newlink,
> +       .dellink        = vcan_dellink,
> +};
> +
> +static __init int vcan_init_module(void)
> +{
> +	int err;
> +
> +	printk(banner);
> +
> +	if (loopback)
> +		printk(KERN_INFO "vcan: enabled loopback on driver level.\n");
> +
> +	rtnl_lock();
> +	err = __rtnl_link_register(&vcan_link_ops);
> +	rtnl_unlock();


Just using rtnl_link_register here is fine.

> +	return err;
> +}
> +
> +static __exit void vcan_cleanup_module(void)
> +{
> +	struct vcan_priv *priv, *n;
> +
> +	rtnl_lock();
> +	list_for_each_entry_safe(priv, n, &vcan_devs, list)
> +		vcan_dellink(priv->dev);
> +	__rtnl_link_unregister(&vcan_link_ops);
> +	rtnl_unlock();


and rtnl_link_unregister (without manual cleanup) here.

  reply	other threads:[~2007-09-18 15:09 UTC|newest]

Thread overview: 119+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 1/7] CAN: Allocate protocol numbers for PF_CAN Urs Thuermann
2007-09-18 13:31   ` Patrick McHardy
2007-09-17 10:03 ` [PATCH 2/7] CAN: Add PF_CAN core module Urs Thuermann
2007-09-17 15:50   ` Paul E. McKenney
2007-09-18 13:31   ` Patrick McHardy
2007-09-18 14:54     ` Urs Thuermann
2007-09-18 15:07       ` Patrick McHardy
2007-09-18 21:20     ` Urs Thuermann
2007-09-19  8:27       ` Patrick McHardy
2007-09-20  8:53         ` Urs Thuermann
2007-09-20 10:33           ` Patrick McHardy
2007-09-20 11:30             ` Urs Thuermann
2007-09-20 11:43               ` Patrick McHardy
2007-09-17 10:03 ` [PATCH 3/7] CAN: Add raw protocol Urs Thuermann
2007-09-18 14:13   ` Patrick McHardy
2007-09-18 21:49     ` Urs Thuermann
2007-09-19  8:34       ` Patrick McHardy
2007-09-17 10:03 ` [PATCH 4/7] CAN: Add broadcast manager (bcm) protocol 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 [this message]
2007-09-18 22:24     ` Urs Thuermann
2007-09-19  6:26       ` Oliver Hartkopp
2007-09-19  8:41       ` Patrick McHardy
2007-09-17 10:03 ` [PATCH 6/7] CAN: Add maintainer entries Urs Thuermann
2007-09-17 10:03 ` [PATCH 7/7] CAN: Add documentation Urs Thuermann
2007-09-17 17:30   ` Randy Dunlap
2007-09-17 20:22     ` Urs Thuermann
2007-09-17 20:37       ` Thomas Gleixner
2007-09-17 20:49         ` Urs Thuermann
2007-09-17 22:57           ` Randy Dunlap
2007-09-17 23:19             ` Urs Thuermann
2007-09-18  6:51           ` Bill Fink
2007-09-18  7:20             ` 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-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-30 13:11 [patch 0/7] CAN: Add new PF_CAN protocol family, update 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
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-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=46EFE89D.7050006@trash.net \
    --to=kaber@trash.net \
    --cc=davem@davemloft.net \
    --cc=netdev@vger.kernel.org \
    --cc=oliver.hartkopp@volkswagen.de \
    --cc=oliver@hartkopp.net \
    --cc=tglx@linutronix.de \
    --cc=urs.thuermann@volkswagen.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.