按照之前模块的思路,从新整了一个比较小的系统,
最后结果是这样的~
============================================================================
/ # insmod test.ko
[k]myns_init
[k]my_net_init
[k]mynet_setup
[k]mynet_init
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 00:E0:4A:BC:15:E7
inet addr:192.168.10.20 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1726 errors:0 dropped:0 overruns:0 frame:0
TX packets:701 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2256049 (2.1 MiB) TX bytes:120754 (117.9 KiB)
Interrupt:108 Base address:0x300
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:E0:4A:BC:15:E7
inet addr:192.168.10.20 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1733 errors:0 dropped:0 overruns:0 frame:0
TX packets:709 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2257043 (2.1 MiB) TX bytes:123858 (120.9 KiB)
Interrupt:108 Base address:0x300
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
sxt Link encap:Ethernet HWaddr 00:26:7A:01:02:03
[NO FLAGS] MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:98
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # ifconfig sxt 1.1.1.1
[k]mynet_open
/ # ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1): 56 data bytes
64 bytes from 1.1.1.1: seq=0 ttl=64 time=0.552 ms
^C
--- 1.1.1.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.552/0.552/0.552 ms
/ #
============================================================================
下面是源码:
#include "fhead.h"
int mynet_init(struct net_device *dev)
{
printk("[k]%s\n",__func__);
return 0;
}
int mynet_open(struct net_device *dev)
{
printk("[k]%s\n",__func__);
return 0;
}
int mynet_stop(struct net_device *dev)
{
printk("[k]%s\n",__func__);
return 0;
}
void mynet_setup(struct net_device * dev)
{
printk("[k]%s\n",__func__);
dev->init = mynet_init;
dev->mtu = 1500;
dev->type = ARPHRD_ETHER;
dev->hard_header_len = 14;
dev->addr_len = 6;
dev->mc_count = 2;
dev->dev_addr[0] = 0x0;
dev->dev_addr[1] = 0x26;
dev->dev_addr[2] = 0x7a;
dev->dev_addr[3] = 0x01;
dev->dev_addr[4] = 0x02;
dev->dev_addr[5] = 0x03;
dev->broadcast[0] = 0xff;
dev->broadcast[1] = 0xff;
dev->broadcast[2] = 0xff;
dev->broadcast[3] = 0xff;
dev->broadcast[4] = 0xff;
dev->broadcast[5] = 0xff;
dev->tx_queue_len = 98;
dev->open = mynet_open;
dev->stop = mynet_stop;
}
int my_net_init(struct net *net)
{
printk("[k]%s\n",__func__);
struct net_device *dev;
dev = alloc_netdev(0,"sxt",mynet_setup);
dev_net_set(dev,net);
register_netdev(dev);
return 0;
}
void my_net_exit(struct net *net)
{
}
struct pernet_operations my_net_ops =
{
.init = my_net_init,
.exit = my_net_exit,
};
int __init myns_init(void)
{
printk("[k]%s\n",__func__);
return register_pernet_device(&my_net_ops);
}
module_init(myns_init);
MODULE_LICENSE("GPL");