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. Socket_SSH-1

    服务器端: import socket,os server=socket.socket() server.bind(('localhost',9999)) server.listen() while ...

  2. CenOS shell脚本

    1.先查看脚本解释器 [es@bigdata-senior01 ~]$ echo $SHELL /bin/bash 2.编写最简单的脚本 vi test.sh#第一行的脚本声明(#!)用来告诉系统使用 ...

  3. BZOJ2286:[SDOI2011]消耗战——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  4. HDU5446:Unknown Treasure——题解

    http://acm.hdu.edu.cn/showproblem.php?pid=5446 求C(n,m)%(p1p2…pk)的值,其中pi均为质数. 参考:https://www.cnblogs. ...

  5. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

    P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...

  6. UVA.548 Tree(二叉树 DFS)

    UVA.548 Tree(二叉树 DFS) 题意分析 给出一棵树的中序遍历和后序遍历,从所有叶子节点中找到一个使得其到根节点的权值最小.若有多个,输出叶子节点本身权值小的那个节点. 先递归建树,然后D ...

  7. UVA.10881 Piotr's Ants (思维题)

    UVA.10881 Piotr's Ants (思维题) 题意分析 有一根长度为L cm的木棍,上有n只蚂蚁,蚂蚁要么向左爬,要么向右,速度均为1cm/s,若2只蚂蚁相撞,则蚂蚁同时调头.求解第T秒时 ...

  8. 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队

    传送门 Description 涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum ...

  9. VS 2013 with update安装失败(kb2829760)解决方案

    update过程中遇到kb2829760补丁无法更新而导致vs安装失败的解决方法: 1.安装KB2829760: 2.安装KB2829760中文语言包: 3.安装VS2013 with update. ...

  10. selenium - webdriver - 设置元素等待

    隐式等待:implicitly_wait(value), value默认是0 from selenium import webdriverfrom selenium.common.exceptions ...