1 /* dummy.c: a dummy net driver 3 The purpose of this driver is to provide a device to point a 4 route through, but not to actually transmit packets. 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. 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 15 [when not running slip] 16 ifconfig dummy slip.addr.ess.here up 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 26 Nick Holloway, 27th May 1994 27 [I tweaked this explanation a little but that's all] 28 Alan Cox, 30th May 1994 31 /* To have statistics (just packets sent) define this */ 33 #include <linux/config.h> 34 #include <linux/module.h> 35 #include <linux/kernel.h> 36 #include <linux/netdevice.h> 37 #include <linux/init.h> 39 static intdummy_xmit(struct sk_buff
*skb
,struct net_device
*dev
); 40 static struct net_device_stats
*dummy_get_stats(struct net_device
*dev
); 42 /* fake multicast ability */ 43 static voidset_multicast_list(struct net_device
*dev
) 47 #ifdef CONFIG_NET_FASTROUTE 48 static intdummy_accept_fastpath(struct net_device
*dev
,struct dst_entry
*dst
) 54 static int __init
dummy_init(struct net_device
*dev
) 56 /* Initialize the device structure. */ 57 dev
->hard_start_xmit
= dummy_xmit
; 59 dev
->priv
=kmalloc(sizeof(struct net_device_stats
), GFP_KERNEL
); 62 memset(dev
->priv
,0,sizeof(struct net_device_stats
)); 63 dev
->get_stats
= dummy_get_stats
; 65 dev
->set_multicast_list
= set_multicast_list
; 67 /* Fill in the fields of the device structure with ethernet-generic values. */ 70 dev
->flags
|= IFF_NOARP
; 71 dev
->flags
&= ~IFF_MULTICAST
; 72 #ifdef CONFIG_NET_FASTROUTE 73 dev
->accept_fastpath
= dummy_accept_fastpath
; 79 static intdummy_xmit(struct sk_buff
*skb
,struct net_device
*dev
) 81 struct net_device_stats
*stats
; 83 stats
= (struct net_device_stats
*)dev
->priv
; 85 stats
->tx_bytes
+=skb
->len
; 91 static struct net_device_stats
*dummy_get_stats(struct net_device
*dev
) 96 static struct net_device dev_dummy
; 98 static int __init
dummy_init_module(void) 102 dev_dummy
.init
= dummy_init
; 103 SET_MODULE_OWNER(&dev_dummy
); 105 /* Find a name for this unit */ 106 err
=dev_alloc_name(&dev_dummy
,"dummy%d"); 109 if(register_netdev(&dev_dummy
) !=0) 114 static void __exit
dummy_cleanup_module(void) 116 unregister_netdev(&dev_dummy
); 117 kfree(dev_dummy
.priv
); 119 memset(&dev_dummy
,0,sizeof(dev_dummy
)); 120 dev_dummy
.init
= dummy_init
; 123 module_init(dummy_init_module
); 124 module_exit(dummy_cleanup_module
);