(新手问题)linux网络驱动的默认open函数干了什么工作

aoxuely 2018-12-14 03:32:55
小弟是linux驱动开发的新手,最近应boss命令,要开发出一个自定义功能的网络驱动
首先是编写正常的最简单的虚拟网卡代码,在net_device_ops结构体中没有添加.ndo_open对应的函数,只添加了.ndo_start_xmit函数,代码执行正常,该网卡名字为mynet0,使用ifconfig mynet0 3.3.3.3命令配置好ip地址后,能在ifconfig命令下看到对应的网卡设备。并且成功在ndo_start_xmit对应的函数中返回了数据包。由于我在ndo_start_xmit对应的函数中设置返回了ping数据包的响应包,所以可以ping通与3.3.3.3在同一个网段的所有IP地址,比如我使用ping 3.3.3.3 或者3.3.3.4或者3.3.3.100这三个地址均可以ping通

可是当我添加了.ndo_open函数后,使用ifconfig mynet0 3.3.3.3 命令对ip进行配置后再次使用ifconfig命令看不到对应的设备,但ifconfig -a命令可以看到已经安装了对应的网卡设备mynet0(并且ip也变成了3.3.3.3),但直接使用ifconfig命令是看不到设备的。这个时候,我ping 3.3.3.3这个地址可以通,但是ping3.3.3.4则说找不到网络,猜测是因为此时3.3.3.3已经变成了环回地址,直接走的本地环回网卡.

那么问题来了,因为中断申请,dma缓冲空间的申请理应在open函数中完成,但是使用我自己编写的open函数不能正常工作,使用默认的open函数才能正常工作,是否是因为open函数中需要进行特殊的操作才能完成达到默认函数的功能呢?

附上net_device_ops结构体以及小弟自己编写的open函数代码

static int net_open(struct net_device * ndev)
{
//ifconfig mynet0 up 命令会导致此函数的调用
printk(KERN_INFO"enter net_open\n");
netif_start_queue(ndev);
printk(KERN_INFO"exit net_open\n");
}

static struct net_device_ops net_ops =
{
// .ndo_open = net_open,
.ndo_start_xmit = net_start_xmit,
};
...全文
696 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly 100% 2018-12-26
  • 打赏
  • 举报
回复
你这个还是因为调用判断了返回值啊,如果不判断也就无所谓了
aoxuely 2018-12-16
  • 打赏
  • 举报
回复
问题解决了是因为我的open函数中没有return,加上return 0;就好了

1,319

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧