One solution is to set up a dummy link using PPP/SLIP/PLIP,
but this seems (to me) too much overhead for too little gain.
This driver provides a small alternative. Thus you can do
-
+
[when not running slip]
ifconfig dummy slip.addr.ess.here up
[to go to slip]
Alan Cox, 30th May 1994
*/
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netdevice.h>
{
struct sockaddr *sa = p;
- if (!is_valid_ether_addr(sa->sa_data))
+ if (!is_valid_ether_addr(sa->sa_data))
return -EADDRNOTAVAIL;
-
+
memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
return 0;
}
{
}
-#ifdef CONFIG_NET_FASTROUTE
-static int dummy_accept_fastpath(struct net_device *dev, struct dst_entry *dst)
-{
- return -1;
-}
-#endif
-
static void __init dummy_setup(struct net_device *dev)
{
/* Initialize the device structure. */
dev->hard_start_xmit = dummy_xmit;
dev->set_multicast_list = set_multicast_list;
dev->set_mac_address = dummy_set_address;
-#ifdef CONFIG_NET_FASTROUTE
- dev->accept_fastpath = dummy_accept_fastpath;
-#endif
/* Fill in device structure with ethernet-generic values. */
ether_setup(dev);
dev->tx_queue_len = 0;
+ dev->change_mtu = NULL;
dev->flags |= IFF_NOARP;
dev->flags &= ~IFF_MULTICAST;
SET_MODULE_OWNER(dev);
static int dummy_xmit(struct sk_buff *skb, struct net_device *dev)
{
- struct net_device_stats *stats = dev->priv;
+ struct net_device_stats *stats = netdev_priv(dev);
stats->tx_packets++;
stats->tx_bytes+=skb->len;
static struct net_device_stats *dummy_get_stats(struct net_device *dev)
{
- return dev->priv;
+ return netdev_priv(dev);
}
static struct net_device **dummies;
free_netdev(dev_dummy);
dev_dummy = NULL;
} else {
- dummies[index] = dev_dummy;
+ dummies[index] = dev_dummy;
}
return err;
{
unregister_netdev(dummies[index]);
free_netdev(dummies[index]);
-}
+}
static int __init dummy_init_module(void)
-{
+{
int i, err = 0;
- dummies = kmalloc(numdummies * sizeof(void *), GFP_KERNEL);
+ dummies = kmalloc(numdummies * sizeof(void *), GFP_KERNEL);
if (!dummies)
- return -ENOMEM;
+ return -ENOMEM;
for (i = 0; i < numdummies && !err; i++)
- err = dummy_init_one(i);
- if (err) {
+ err = dummy_init_one(i);
+ if (err) {
+ i--;
while (--i >= 0)
dummy_free_one(i);
}
return err;
-}
+}
static void __exit dummy_cleanup_module(void)
{
int i;
- for (i = 0; i < numdummies; i++)
- dummy_free_one(i);
- kfree(dummies);
+ for (i = 0; i < numdummies; i++)
+ dummy_free_one(i);
+ kfree(dummies);
}
module_init(dummy_init_module);