我有以下要求。我想用一个内核模块来改变我选择的一个netdev的ifindex。我知道它作为一个键,不能在运行时改变。创建的接口基于英特尔e1000驱动程序。为了实现改变,考虑了以下几点:1.取消注册_netdev(设备);1.//修改dev-〉ifindex1.//以某种方式将网络设备恢复到操作状态,尝试register_netdev,但这当然会导致内核死机你能告诉我这是否可能吗?我对linux内核驱动程序很陌生。谢谢大家!
tsm1rwdh1#
我想我已经找到了解决这个问题的窍门/方法:1.创建虚拟网络名称空间1.使用dev_change_net_namespace(struct net_device *dev, struct net *net, const char *pat)移动设备到这个名称空间1.然后使用__dev_change_net_namespace(struct net_device *dev, struct net *net, const char *pat, int new_ifindex)将dev移动到具有所需new_ifindex的init_net1.删除虚拟网络名称空间在我的内核中,__dev_change_net_namespace(struct net_device *dev, struct net *net, const char *pat, int new_ifindex)并不存在,但是创建它并不困难,因为它只在没有提供new_ifindex的情况下才会拾取它,或者检查提供的new_ifindex是否当前在命名空间中使用还没有测试,但很快就会了。
dev_change_net_namespace(struct net_device *dev, struct net *net, const char *pat)
__dev_change_net_namespace(struct net_device *dev, struct net *net, const char *pat, int new_ifindex)
1条答案
按热度按时间tsm1rwdh1#
我想我已经找到了解决这个问题的窍门/方法:
1.创建虚拟网络名称空间
1.使用
dev_change_net_namespace(struct net_device *dev, struct net *net, const char *pat)
移动设备到这个名称空间1.然后使用
__dev_change_net_namespace(struct net_device *dev, struct net *net, const char *pat, int new_ifindex)
将dev移动到具有所需new_ifindex的init_net1.删除虚拟网络名称空间
在我的内核中,
__dev_change_net_namespace(struct net_device *dev, struct net *net, const char *pat, int new_ifindex)
并不存在,但是创建它并不困难,因为它只在没有提供new_ifindex的情况下才会拾取它,或者检查提供的new_ifindex是否当前在命名空间中使用还没有测试,但很快就会了。