#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/socket.h>
#include <linux/errno.h>
#include <linux/fcntl.h>
#include <linux/in.h>
#include <linux/init.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/inet.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/ethtool.h>
#include <net/sock.h>
#include <net/checksum.h>
#include <linux/if_ether.h> /* For the statistics structure. */
#include <linux/if_arp.h> /* For ARPHRD_ETHER */
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/percpu.h>
static int loopback_xmit(struct sk_buff *skb, struct net_device *dev)
{
skb->protocol = eth_type_trans(skb,dev);
netif_rx(skb);
return 0;
}
static struct net_device_stats *get_stats(struct net_device *dev)
{
struct net_device_stats *stats = &dev->stats;
unsigned long bytes = 0;
unsigned long packets = 0;
stats->rx_packets = packets;
stats->tx_packets = packets;
stats->rx_bytes = bytes;
stats->tx_bytes = bytes;
return stats;
}
struct net_device loopback_dev = {
.name = "lookback",
.hard_start_xmit = loopback_xmit,
.mtu = (16 * 1024) + 20 + 20 + 12,
.get_stats = &get_stats,
.hard_header_len = ETH_HLEN,
.type = ARPHRD_LOOPBACK,
.flags = IFF_LOOPBACK,
.hard_header = eth_header,
.addr_len = ETH_ALEN,
.features = NETIF_F_SG | NETIF_F_FRAGLIST
#ifdef LOOPBACK_TSO
| NETIF_F_TSO
#endif
| NETIF_F_NO_CSUM | NETIF_F_HIGHDMA
| NETIF_F_LLTX,
};
static int loopback_init()
{
return register_netdev(&loopback_dev);
}
module_init(loopback_init);