Chinaunix首页 | 论坛 | 博客
  • 博客访问: 825569
  • 博文数量: 264
  • 博客积分: 592
  • 博客等级: 中士
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 22:02
文章分类

全部博文(264)

文章存档

2019年(2)

2018年(1)

2017年(1)

2016年(4)

2015年(14)

2014年(57)

2013年(88)

2012年(97)

分类: LINUX

2014-02-12 15:59:58

转:http://blog.csdn.net/nerdx/article/details/12842237
  1. //  相同子网:  
  2. //      掩码相同,网络地址相同  
  3.   
  4. //  为设备配置ip地址  
  5. //  函数主要任务:  
  6. //      1.合理性检查;  
  7. //          1.1 相同子网内该地址没有被添加过  
  8. //          1.2 相同子网内的地址scope应该相同  
  9. //      2.将ifa插入到in_device->ifa_list中  
  10. //      3.通知netlink,inetaddr_chain 新地址的加入  
  11.   
  12. //  注:地址在in_device->ifa_list中的排列:  
  13. //          1.主地址:插入的如果为主地址,则按照scope从大到小的顺序排列  
  14. //          2.辅地址: 总是插入到列表的最尾端  
  15.   
  16. //  调用路径:inet_rtm_newaddr->inet_insert_ifa  
  17. 1.1 static int inet_insert_ifa(struct in_ifaddr *ifa)  
  18. {  
  19.     struct in_device *in_dev = ifa->ifa_dev;  
  20.     struct in_ifaddr *ifa1, **ifap, **last_primary;  
  21.   
  22.     //辅地址标志  
  23.     ifa->ifa_flags &= ~IFA_F_SECONDARY;  
  24.     //主地址列表  
  25.     last_primary = &in_dev->ifa_list;  
  26.     //遍历主地址列表  
  27.     for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL;  
  28.          ifap = &ifa1->ifa_next) {  
  29.           
  30.         if (!(ifa1->ifa_flags & IFA_F_SECONDARY) &&//主地址  
  31.             ifa->ifa_scope <= ifa1->ifa_scope)//ifa的scope小于等于主地址的scope  
  32.             last_primary = &ifa1->ifa_next;  
  33.         //相同子网:  
  34.         //  子网掩码长度相同的情况,网络地址相同  
  35.         if (ifa1->ifa_mask == ifa->ifa_mask &&  
  36.             inet_ifa_match(ifa1->ifa_address, ifa)) {//网络地址有重叠  
  37.             if (ifa1->ifa_local == ifa->ifa_local) {//本地地址相同  
  38.                 inet_free_ifa(ifa);//重复添加  
  39.                 return -EEXIST;  
  40.             }  
  41.             if (ifa1->ifa_scope != ifa->ifa_scope) {  
  42.                 inet_free_ifa(ifa);  
  43.                 return -EINVAL;  
  44.             }  
  45.             //子网掩码长度相同,网络地址有重叠,设置为辅地址  
  46.             ifa->ifa_flags |= IFA_F_SECONDARY;  
  47.         }  
  48.     }  
  49.     //加入新子网  
  50.     //  子网掩码或网络地址没有重叠  
  51.     if (!(ifa->ifa_flags & IFA_F_SECONDARY)) {  
  52.         net_srandom(ifa->ifa_local);  
  53.         ifap = last_primary;  
  54.     }  
  55.     //上一个scope大于本ip地址的主地址  
  56.     ifa->ifa_next = *ifap;  
  57.     *ifap = ifa;  
  58.   
  59.     //向netlink发送消息,新添加了ip地址  
  60.     rtmsg_ifa(RTM_NEWADDR, ifa);  
  61.     //通知inetaddr_chain,ip地址加入到设备  
  62.     notifier_call_chain(&inetaddr_chain, NETDEV_UP, ifa);  
  63.   
  64.     return 0;  
  65. }  
  66.   
  67. //  删除设备的ip地址  
  68. //  函数主要任务:  
  69. //      1.如果为主地址,则删除同一子网内的所有辅地址  
  70. //      2.删除该地址  
  71. //      3.通知netlink,inetaddr_chain  
  72.   
  73. //  调用路径:inet_rtm_deladdr->inet_del_ifa  
  74. 1.2 static void inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,  
  75.              int destroy)  
  76. {  
  77.     struct in_ifaddr *ifa1 = *ifap;  
  78.   
  79.     //1.删除主地址,同一子网内所有辅助地址都被删除  
  80.     if (!(ifa1->ifa_flags & IFA_F_SECONDARY)) {  
  81.         struct in_ifaddr *ifa;  
  82.         struct in_ifaddr **ifap1 = &ifa1->ifa_next;  
  83.   
  84.         while ((ifa = *ifap1) != NULL) {  
  85.             if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||  
  86.                 ifa1->ifa_mask != ifa->ifa_mask ||  
  87.                 !inet_ifa_match(ifa1->ifa_address, ifa)) {  
  88.                 ifap1 = &ifa->ifa_next;  
  89.                 continue;  
  90.             }  
  91.             //同一子网内的辅助地址  
  92.             *ifap1 = ifa->ifa_next;  
  93.             //通知netlink,inetaddr_chain  
  94.             rtmsg_ifa(RTM_DELADDR, ifa);  
  95.             notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa);  
  96.             //释放ifa  
  97.             inet_free_ifa(ifa);  
  98.         }  
  99.     }  
  100.   
  101.     //将地址从地址列表删除  
  102.     *ifap = ifa1->ifa_next;  
  103.   
  104.     //通知netlink,inetaddr_chain,地址删除  
  105.     rtmsg_ifa(RTM_DELADDR, ifa1);  
  106.     notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);  
  107.     //释放ifa  
  108.     if (destroy) {  
  109.         inet_free_ifa(ifa1);  
  110.         //如果没有配置的地址信息,释放配置信息控制块  
  111.         if (!in_dev->ifa_list)  
  112.             inetdev_destroy(in_dev);  
  113.     }  
  114. }  
阅读(1096) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~