loopback.c
-
/*
-
* INET An implementation of the TCP/IP protocol suite for the LINUX
-
* operating system. INET is implemented using the BSD Socket
-
* interface as the means of communication with the user level.
-
*
-
* Pseudo-driver for the loopback interface.
-
*
-
* Version: @(#)loopback.c 1.0.4b 08/16/93
-
*
-
* Authors: Ross Biro
-
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
-
* Donald Becker, <becker@scyld.com>
-
*
-
* Alan Cox : Fixed oddments for NET3.014
-
* Alan Cox : Rejig for NET3.029 snap #3
-
* Alan Cox : Fixed NET3.029 bugs and sped up
-
* Larry McVoy : Tiny tweak to double performance
-
* Alan Cox : Backed out LMV's tweak - the linux mm
-
* can't take it...
-
* Michael Griffith: Don't bother computing the checksums
-
* on packets received on the loopback
-
* interface.
-
* Alexey Kuznetsov: Potential hang under some extreme
-
* cases removed.
-
*
-
* This program is free software; you can redistribute it and/or
-
* modify it under the terms of the GNU General Public License
-
* as published by the Free Software Foundation; either version
-
* 2 of the License, or (at your option) any later version.
-
*/
-
#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>
-
#include <net/net_namespace.h>
-
-
-
unsigned long bytes = 0;
-
unsigned long packets = 0;
-
-
-
static int loopback_xmit(struct sk_buff *skb, struct net_device *dev)
-
{
-
skb_orphan(skb);
-
skb->protocol = eth_type_trans(skb,dev);
-
-
bytes += skb->len;
-
packets++;
-
-
netif_rx(skb);
-
-
return 0;
-
}
-
-
static struct net_device_stats *loopback_get_stats(struct net_device *dev)
-
{
-
struct net_device_stats *stats = &dev->stats;
-
-
stats->rx_packets = packets;
-
stats->tx_packets = packets;
-
stats->rx_bytes = bytes;
-
stats->tx_bytes = bytes;
-
return stats;
-
}
-
-
static const struct net_device_ops loopback_ops = {
-
.ndo_start_xmit= loopback_xmit,
-
.ndo_get_stats = loopback_get_stats,
-
};
-
-
/*
-
* The loopback device is special. There is only one instance
-
* per network namespace.
-
*/
-
static void loopback_setup(struct net_device *dev)
-
{
-
-
-
dev->mtu = (16 * 1024) + 20 + 20 + 12;//有
-
dev->flags = IFF_LOOPBACK;//有
-
dev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
-
dev->header_ops = ð_header_ops;//有
-
dev->netdev_ops = &loopback_ops;//有
-
}
-
-
/* Setup and register the loopback device. */
-
static __net_init int loopback_net_init(struct net *net)
-
{
-
struct net_device *dev;
-
int err;
-
err = -ENOMEM;
-
dev = alloc_netdev(0, "lo", loopback_setup);
-
if (!dev)
-
goto out;
-
-
err = register_netdev(dev);
-
if (err)
-
goto out_free_netdev;
-
-
net->loopback_dev = dev;
-
return 0;
-
-
-
out_free_netdev:
-
free_netdev(dev);
-
out:
-
if (net == &init_net)
-
panic("loopback: Failed to register netdevice: %d\n", err);
-
return err;
-
}
-
-
static __net_exit void loopback_net_exit(struct net *net)
-
{
-
struct net_device *dev = net->loopback_dev;
-
-
unregister_netdev(dev);
-
}
-
-
/* Registered in net/core/dev.c */
-
struct pernet_operations __net_initdata loopback_net_ops = {
-
.init = loopback_net_init,
-
.exit = loopback_net_exit,
-
};
编译内核代码,并在开发板上运行,可通过ifconfig命令查看回环网卡信息,也可通过ping命令ping通,下图是不加那一行
ping不通的图,
阅读(2778) | 评论(0) | 转发(0) |