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. 升级到EFCore2.0

    EF Core 2.0上周已经发布了 文章内容基于vs2017,请大家先安装好vs2017(15.3). 本篇文章主要讲下差异点,跟之前一样的就不再重复了. 文章目录(差异点): 一.新建项目, EF ...

  2. 楼房 洛谷1382 && codevs2995

    P1382 楼房 题目描述 地平线(x轴)上有n个矩(lou)形(fang),用三个整数h[i],l[i],r[i]来表示第i个矩形:矩形左下角为(l[i],0),右上角为(r[i],h[i]).地平 ...

  3. BZOJ4651 & 洛谷1173 & UOJ220:[NOI2016]网格——题解(附debug数据)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4651 https://www.luogu.org/problemnew/show/P1173#su ...

  4. BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4945 https://www.luogu.org/problemnew/show/P3825 ht ...

  5. BZOJ2724:[Violet 6]蒲公英——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2724 输入格式 第一行两个整数n,m,表示有n株蒲公英,m次询问. 接下来一行 n 个空格分隔的整数 ...

  6. 我们自己写的solr查询的代码作为search项目中的dao

    我们自己写的solr查询的代码作为search项目中的dao,但是启动时会报错: 其实就是说 searchServiceImpl 中我们 Autowired 的 SearchDao 类 spring ...

  7. some interesting words

    No one gets rich betting against the market. Never bet against the Fed. Bulls make money, bears make ...

  8. Lodash js数据操作库

    https://lodash.com/docs/4.17.4

  9. 如何生成Java Key以及sign一个jar

    1. 生成Java Key: keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize mydomain ...

  10. iOS 隐藏/显示导航栏

    一.隐藏导航栏 [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBa ...