- 论坛徽章:
- 0
|
网卡是kernel标准的,之前用的dm9000的网卡,这个ks8851的网卡驱动是从2.6.33.7的内核里移植过来的(现在的内核是2.6.21)。
我是用的busybox1.7.3的根文件系统,ifconfig命令应该是被它解析的。从我目前理解这个ifconfig eth0 down的过程:
首先调用的是net/core/dev.c 里的 dev_ioctl() 然后调用dev_ifsioc()然后调用dev_change_flags()然后调用net/ipv4/fib_frontend.c中fib_netdev_event()然后调用fib_disable_ip()然后调用net/ipv4/fib_semantics.c中的fib_sync_down()中
/*
Update FIB if:
- local address disappeared -> we must delete all the entries
referring to it.
- device went down -> we must shutdown all nexthops going via it.
*/
int fib_sync_down(__be32 local, struct net_device *dev, int force)
{
int ret = 0;
int scope = RT_SCOPE_NOWHERE;
if (force)
scope = -1;
if (local && fib_info_laddrhash) {
unsigned int hash = fib_laddr_hashfn(local);
struct hlist_head *head = &fib_info_laddrhash[hash];
struct hlist_node *node;
struct fib_info *fi;
hlist_for_each_entry(fi, node, head, fib_lhash) {
if (fi->fib_prefsrc == local) {
fi->fib_flags |= RTNH_F_DEAD;
ret++;
}
}
}
if (dev) {
struct fib_info *prev_fi = NULL;
unsigned int hash = fib_devindex_hashfn(dev->ifindex);
struct hlist_head *head = &fib_info_devhash[hash];
struct hlist_node *node;
struct fib_nh *nh;
hlist_for_each_entry(nh, node, head, nh_hash) {
struct fib_info *fi = nh->nh_parent;
int dead;
BUG_ON(!fi->fib_nhs);
if (nh->nh_dev != dev || fi == prev_fi)
continue;
prev_fi = fi;
dead = 0;
change_nexthops(fi) {
if (nh->nh_flags&RTNH_F_DEAD)
dead++;
else if (nh->nh_dev == dev &&
nh->nh_scope != scope) {
nh->nh_flags |= RTNH_F_DEAD;
#ifdef CONFIG_IP_ROUTE_MULTIPATH
spin_lock_bh(&fib_multipath_lock);
fi->fib_power -= nh->nh_power;
nh->nh_power = 0;
spin_unlock_bh(&fib_multipath_lock);
#endif
dead++;
}
#ifdef CONFIG_IP_ROUTE_MULTIPATH
if (force > 1 && nh->nh_dev == dev) {
dead = fi->fib_nhs;
break;
}
#endif
} endfor_nexthops(fi)
if (dead == fi->fib_nhs) {
fi->fib_flags |= RTNH_F_DEAD;
ret++;
}
}
}
return ret;
}
最后死在了红色的那句上,现在弄不清这个是网络核心的代码,如何这里出了问题,一定是传参的问题,但找了一段时间发现只有dev这个变量时传进来的,还有网卡驱动的ioctl什么时候会调用那?
回复 2# Godbach
|
|