本文主要是介绍回环网卡驱动设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在Linux虚拟终端上输入ifconfig命令,可以查看网卡状态。输入该命令后,一般可以看到eth0,以及lo两个网卡。eth0是平台上的第一个以太网卡,lo实际上是loop的缩写,是一个回环网卡。一般来说,如果平台没有连接网络,此时使用ping命令是无法ping成功的,而当你去ping 127.0.0.2或者127.0.0.3这一类地址时,即使没有联网也是能成功的,这里使用的就是回环网卡。回环网卡并不是尝试去连接其它设备,而是连接自己。回环网卡一般用于测试(可测试本机的TCP/IP协议是否安装成功,或硬件是否出问题)
回环网卡驱动不是内核模块,因此没有module_init()和module_exit()函数。
驱动程序的编写与以太网卡相似
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/if_ether.h> /* For the statistics structure. */unsigned long bytes = 0;
unsigned long packets = 0;static int loopback_xmit(struct sk_buff *skb, struct net_device *dev)
{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->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,
};
这篇关于回环网卡驱动设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!