这几天学习《The Linux Networking Architecture: Design and Implementation of Network
Protocols in the Linux Kernel》。学习了Netword Devices一节,根据书中的介绍,仿照ifconfig的输出,写了一个从内核输出网卡信息的模块。
本文包括输出结果和源代码。
源代码如下:
/*
* kifcfg.c - list dev info
* use the list of dev_base
*
* Author: Zhou Weicheng
* Date: 2006/6/20
*/
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include
#include
#include
#include
#include
#include
#include
static void get_dev_info()
{
int n = 1;
struct net_device *dev = dev_base;
struct net_device_stats *stats;
char type[32];
struct in_device *ind = NULL;
struct in_ifaddr *ina = NULL;
while (dev) {
if (dev->type == ARPHRD_ETHER)
sprintf(type, "Ethernet");
else if (dev->type == ARPHRD_LOOPBACK)
sprintf(type, "Local Loopback");
else
sprintf(type, "%d", dev->type);
stats = dev->get_stats(dev);
printk("%s\t", dev->name);
printk("Link encap:%s ", type);
printk("HWaddr %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
dev->dev_addr[0], dev->dev_addr[1],
dev->dev_addr[2], dev->dev_addr[3],
dev->dev_addr[4], dev->dev_addr[5]
);
/*ind = (struct in_device *)dev->ip_ptr;*/
ind = in_dev_get(dev);
if (ind) {
ina = (struct in_ifaddr *)ind->ifa_list;
if (ina)
printk("\tinet addr:%u.%u.%u.%u Bcast:%u.%u.%u.%u Mask:%u.%u.%u.%u\n",
NIPQUAD(ina->ifa_address),
NIPQUAD(ina->ifa_broadcast),
NIPQUAD(ina->ifa_mask));
}
printk("\t");
if (dev->flags & IFF_UP) printk("UP ");
if (dev->flags & IFF_BROADCAST) printk("BROADCAST ");
if (dev->flags & IFF_RUNNING) printk("RUNNING ");
if (dev->flags & IFF_LOOPBACK) printk("LOOPBACK ");
if (dev->flags & IFF_MULTICAST) printk("MULTICAST ");
printk("MTU:%d\n", dev->mtu);
printk("\t");
printk("RX packets:%lu errors:%lu dropped:%lu overruns:%lu frame:%lu\n",
stats->rx_packets, stats->rx_errors, stats->rx_dropped,
stats->rx_over_errors, stats->rx_frame_errors);
printk("\t");
printk("TX packets:%lu errors:%lu dropped:%lu overruns:%lu carrier:%lu\n",
stats->tx_packets, stats->tx_errors, stats->tx_dropped,
stats->tx_aborted_errors, stats->tx_carrier_errors);
printk("\t");
printk("RX Bytes:%lu TX Bytes:%lu\n",
stats->rx_bytes, stats->tx_bytes);
printk("\t");
printk("Interrupt:%d Base address:0x%lx\n",
dev->irq, dev->base_addr);
printk("\n");
n++;
dev = dev->next;
}
}
static int __init init(void)
{
get_dev_info();
return 0;
}
static void __exit fini(void)
{
return;
}
module_init(init);
module_exit(fini);
输出结果如下:
eth0 Link encap:Ethernet HWaddr 00:0C:29:1A:0E:2C
inet addr:10.21.4.87 Bcast:10.21.255.255 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500
RX packets:14525 errors:0 dropped:0 overruns:0 frame:0
TX packets:6720 errors:0 dropped:0 overruns:0 carrier:0
RX Bytes:1358898 TX Bytes:1078741
Interrupt:16 Base address:0x1080
eth1 Link encap:Ethernet HWaddr 00:0C:29:1A:0E:36
inet addr:1.1.1.1 Bcast:1.1.1.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500
RX packets:5897 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
RX Bytes:597582 TX Bytes:468
Interrupt:17 Base address:0x1400
lo Link encap:Local Loopback HWaddr 00:00:00:00:00:00
inet addr:127.0.0.1 Bcast:0.0.0.0 Mask:255.0.0.0
UP LOOPBACK MTU:16436
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
RX Bytes:0 TX Bytes:0
Interrupt:0 Base address:0x0
sit0 Link encap:776 HWaddr 00:00:00:00:00:00
MTU:1480
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
RX Bytes:0 TX Bytes:0
Interrupt:0 Base address:0x0
阅读(2615) | 评论(0) | 转发(0) |