inetdev_init为传入设备分配和绑定ip控制块,查看其调用关系如下:

 /**
* fs_initcall(inet_init)
* |-->inet_init
* |-->ip_init
* |-->ip_rt_init
* |-->devinet_init
* |-->inetdev_event
*      |---->inetdev_init
* |---->inetdev_destroy
*/

inetdev_init && inetdev_destroy在devinet_init中注册通知链事件,在设备注册NETDEV_REGISTER和修改mtuNETDEV_CHANGEMTU时调用inetdev_init,在设备注销NETDEV_UNREGISTER时调用inetdev_destroy;

 /* 为指定网络设备分配并绑定ip控制块 */
static struct in_device *inetdev_init(struct net_device *dev)
{
struct in_device *in_dev;
int err = -ENOMEM; ASSERT_RTNL(); /* 分配ip地址控制块 */
in_dev = kzalloc(sizeof(*in_dev), GFP_KERNEL);
if (!in_dev)
goto out;
/* 拷贝配置信息 */
memcpy(&in_dev->cnf, dev_net(dev)->ipv4.devconf_dflt,
sizeof(in_dev->cnf));
in_dev->cnf.sysctl = NULL;
/* 设置所属设备 */
in_dev->dev = dev; /*分配邻居项参数 */
in_dev->arp_parms = neigh_parms_alloc(dev, &arp_tbl);
if (!in_dev->arp_parms)
goto out_kfree;
/* 若允许转发 */
if (IPV4_DEVCONF(in_dev->cnf, FORWARDING))
/* 禁用设备的lro功能,大包不合并 */
dev_disable_lro(dev);
/* Reference in_dev->dev */
dev_hold(dev);
/* Account for reference dev->ip_ptr (below) */
in_dev_hold(in_dev); err = devinet_sysctl_register(in_dev);
if (err) {
in_dev->dead = ;
in_dev_put(in_dev);
in_dev = NULL;
goto out;
}
/* 组播初始化 */
ip_mc_init_dev(in_dev); /* 设备启动,则启动组播 */
if (dev->flags & IFF_UP)
ip_mc_up(in_dev); /* we can receive as soon as ip_ptr is set -- do this last */
/* 将配置块赋值给设备ip_ptr指针 */
rcu_assign_pointer(dev->ip_ptr, in_dev);
out:
return in_dev ?: ERR_PTR(err);
out_kfree:
kfree(in_dev);
in_dev = NULL;
goto out;
}
 /* 销毁控制块 */
static void inetdev_destroy(struct in_device *in_dev)
{
struct in_ifaddr *ifa;
struct net_device *dev; ASSERT_RTNL(); dev = in_dev->dev; /* 设置控制块销毁标记 */
in_dev->dead = ; /* 销毁组播 */
ip_mc_destroy_dev(in_dev); /* 遍历ip地址列表 */
while ((ifa = in_dev->ifa_list) != NULL) {
/* 删除地址 */
inet_del_ifa(in_dev, &in_dev->ifa_list, );
inet_free_ifa(ifa);
} /* 设备的ip控制块赋值为NULL */
RCU_INIT_POINTER(dev->ip_ptr, NULL); /* sysctl注销 */
devinet_sysctl_unregister(in_dev); /* 释放邻居项参数 */
neigh_parms_release(&arp_tbl, in_dev->arp_parms); /* 关闭arp */
arp_ifdown(dev); /* 减少ip控制块引用 */
call_rcu(&in_dev->rcu_head, in_dev_rcu_put);
}

inetdev_init && inetdev_destroy的更多相关文章

  1. IP编址

    IP地址 /include/linux/inetdevice.h,定义IPV4专用的网络设备相关的结构.宏等 /net/ipv4/devinet.c.支持IPV4特性的设备操作接口 数据组织 net_ ...

随机推荐

  1. 第64天:CSS常用命名规范,有用!

    CSS常用命名,必须记住 一.常用命名 标题:title 摘要:summary 箭头:arrow 商标:label 网站标志:logo 转角/圆角:corner 横幅广告:banner 子菜单:sub ...

  2. Xshell访问本地或者远程Linux虚拟机

    背景 在本地PC机上安装了VMware workstation和Ubuntu系统,但是每次访问虚拟机都需要输入登陆密码,比较不方便.为此,通过Xshell来访问虚拟机,提高工作效率. 步骤 1.打开虚 ...

  3. Springboot @Transactional 事务不回滚

    一.异常捕获的原因 这里Exception异常,他又分为运行时异常RuntimeException和非运行时异常 可查的异常(checked exceptions):Exception下除了Runti ...

  4. JSP页面中的Meta标签详解

    Meta标签详解 相信大家在平时开发中最常接触的页面就是html和jsp了,可在这两个页面中有一个Meta标签你天天都会看见,可是你真的了解这个标签的一些其他用处吗?今天给大家介绍一些该标签的其他应用 ...

  5. 高效率JavaScript代码的编写技巧

    使用DocumentFragment优化多次append 添加多个dom元素时,先将元素append到DocumentFragment中,最后统一将DocumentFragment添加到页面.该做法可 ...

  6. ios的hitTest方法以及不规则区域内触摸事件处理方法

    概述 在正常的使用场景中,我们处理了比较多的矩形区域内触摸事件,比如UIButton.UIControl.一般来说,这些控件的图形以及触摸区域都是矩形或者圆角矩形的.但是在一些特殊应用场景中我们有时不 ...

  7. 【题解】Crash的数字表格 BZOJ 2154 莫比乌斯反演

    题目传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=2154 人生中第一道自己做出来的莫比乌斯反演 人生中第一篇用LaTeX写数学公式的博客 大 ...

  8. 手脱ASProtect v1.23 RC1(有Stolen Code)之以壳解壳

    1.载入PEID ASProtect v1.23 RC1 2.载入OD,不勾选内存访问异常,其他异常全部勾选 > 01C06D00 push SoWorker.006DC001 ; //入口点 ...

  9. Qt ------ 初始化构造函数参数,parent

    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setup ...

  10. Azure Pipelines

    https://docs.microsoft.com/en-us/azure/devops/pipelines/?view=vsts