linux-bk/drivers/net/dummy.c
<<
>>
Prefs
   1/* dummy.c: a dummy net driver
   2
   3        The purpose of this driver is to provide a device to point a
   4        route through, but not to actually transmit packets.
   5
   6        Why?  If you have a machine whose only connection is an occasional
   7        PPP/SLIP/PLIP link, you can only connect to your own hostname
   8        when the link is up.  Otherwise you have to use localhost.
   9        This isn't very consistent.
  10
  11        One solution is to set up a dummy link using PPP/SLIP/PLIP,
  12        but this seems (to me) too much overhead for too little gain.
  13        This driver provides a small alternative. Thus you can do
  14        
  15        [when not running slip]
  16                ifconfig dummy slip.addr.ess.here up
  17        [to go to slip]
  18                ifconfig dummy down
  19                dip whatever
  20
  21        This was written by looking at Donald Becker's skeleton driver
  22        and the loopback driver.  I then threw away anything that didn't
  23        apply!  Thanks to Alan Cox for the key clue on what to do with
  24        misguided packets.
  25
  26                        Nick Holloway, 27th May 1994
  27        [I tweaked this explanation a little but that's all]
  28                        Alan Cox, 30th May 1994
  29*/
  30
  31#include <linux/config.h>
  32#include <linux/module.h>
  33#include <linux/kernel.h>
  34#include <linux/netdevice.h>
  35#include <linux/init.h>
  36
  37static int dummy_xmit(struct sk_buff *skb, struct net_device *dev);
  38static struct net_device_stats *dummy_get_stats(struct net_device *dev);
  39
  40/* fake multicast ability */
  41static void set_multicast_list(struct net_device *dev)
  42{
  43}
  44
  45#ifdef CONFIG_NET_FASTROUTE
  46static int dummy_accept_fastpath(struct net_device *dev, struct dst_entry *dst)
  47{
  48        return -1;
  49}
  50#endif
  51
  52static void __init dummy_setup(struct net_device *dev)
  53{
  54        /* Initialize the device structure. */
  55        dev->get_stats = dummy_get_stats;
  56        dev->hard_start_xmit = dummy_xmit;
  57        dev->set_multicast_list = set_multicast_list;
  58#ifdef CONFIG_NET_FASTROUTE
  59        dev->accept_fastpath = dummy_accept_fastpath;
  60#endif
  61
  62        /* Fill in device structure with ethernet-generic values. */
  63        ether_setup(dev);
  64        dev->tx_queue_len = 0;
  65        dev->flags |= IFF_NOARP;
  66        dev->flags &= ~IFF_MULTICAST;
  67        SET_MODULE_OWNER(dev);
  68}
  69
  70static int dummy_xmit(struct sk_buff *skb, struct net_device *dev)
  71{
  72        struct net_device_stats *stats = dev->priv;
  73
  74        stats->tx_packets++;
  75        stats->tx_bytes+=skb->len;
  76
  77        dev_kfree_skb(skb);
  78        return 0;
  79}
  80
  81static struct net_device_stats *dummy_get_stats(struct net_device *dev)
  82{
  83        return dev->priv;
  84}
  85
  86static struct net_device *dev_dummy;
  87
  88static int __init dummy_init_module(void)
  89{
  90        int err;
  91
  92        dev_dummy = alloc_netdev(sizeof(struct net_device_stats),
  93                                 "dummy%d", dummy_setup);
  94
  95        if (!dev_dummy)
  96                return -ENOMEM;
  97
  98        if ((err = register_netdev(dev_dummy))) {
  99                kfree(dev_dummy);
 100                dev_dummy = NULL;
 101        }
 102        return err;
 103}
 104
 105static void __exit dummy_cleanup_module(void)
 106{
 107        unregister_netdev(dev_dummy);
 108        free_netdev(dev_dummy);
 109        dev_dummy = NULL;
 110}
 111
 112module_init(dummy_init_module);
 113module_exit(dummy_cleanup_module);
 114MODULE_LICENSE("GPL");
 115
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.