BGP的核心就是交换路由,所以关键的部分还是在路由的更新与撤销上面,这之间包含了冗长的属性,community等等处理过程,不做详述。

bgp_read函数是路由更新的事件处理函数,在收到BGP_MSG_UPDATE消息的时候开始调用bgp_update_receive函数处理。

 switch (i) {
         case NLRI_UPDATE:
         case NLRI_MP_UPDATE:
             nlri_ret = bgp_nlri_parse(peer, NLRI_ATTR_ARG, &nlris[i]);
             break;
         case NLRI_WITHDRAW:
         case NLRI_MP_WITHDRAW:
             nlri_ret = bgp_nlri_parse(peer, NULL, &nlris[i]);
         }

上面是更新路由与撤销路由。比如在cli输入clear ip bgp 命令的时候会撤销路由。

nlri是(network layer reachable infomation)的缩写。

在bgp_nlri_parse里对bgp UPDATE消息内容进行处理,遍历消息内容里的全部路由前缀,开始bgp_update调用。

 /* Normal process. */
         if (attr)
             ret = bgp_update(peer, &p, attr, packet->afi, packet->safi,
                              ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, );
         else
             ret = bgp_withdraw(peer, &p, attr, packet->afi, packet->safi,
                                ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);

在bgp_update中对本节点以及所有的邻居的路由信息都进行更新,主要的更新是在bgp_process函数里。

 switch (bgp_node_table(rn)->type) {
     case BGP_TABLE_MAIN:
         work_queue_add(bm->process_main_queue, pqnode);
         break;
     case BGP_TABLE_RSCLIENT:
         work_queue_add(bm->process_rsclient_queue, pqnode);
         break;
     }

可以看到,最后都是在工作队列里进行更新。对应初始化的时候设置的工作函数:

     bm->process_main_queue->spec.workfunc = &bgp_process_main;
     bm->process_main_queue->spec.del_item_data = &bgp_processq_del;
     bm->process_main_queue->spec.max_retries = ;
     bm->process_main_queue->spec.hold = ;

     bm->process_rsclient_queue->spec.workfunc = &bgp_process_rsclient;
     bm->process_rsclient_queue->spec.del_item_data = &bgp_processq_del;
     bm->process_rsclient_queue->spec.max_retries = ;
     bm->process_rsclient_queue->spec.hold = ;

对本节点(即服务端),在bgp_process_main里最终发送给了zserv。

 zapi_ipv4_route(ZEBRA_IPV4_ROUTE_ADD, zclient, (struct prefix_ipv4 *)p, &api);

对于邻居(即通过neighbor命令配置的),在bgp_process_rsclient中分别如下处理

如果是添加或者更新,则添加到fifo队列中:

 /* Add new advertisement to advertisement attribute list. */
     bgp_advertise_add(adv->baa, adv);

     FIFO_ADD(&peer->sync[afi][safi]->update, &adv->fifo);

如果是撤销路由,则:

 /* Add to synchronization entry for withdraw announcement.  */
         FIFO_ADD(&peer->sync[afi][safi]->withdraw, &adv->fifo);

         /* Schedule packet write. */
         BGP_WRITE_ON(peer->t_write, bgp_write, peer->fd);

都是在thread任务调度的bgp_write的事件中处理。

quagga源码学习--BGP协议路由更新的更多相关文章

  1. quagga源码学习--BGP协议的初始化

    quagga支持BGP-4,BGP-4+协议,支持多协议(mpls,isis,ospf等等)以及单播,组播路由的导入和分发. 具体的协议,这里就不附录了,网络上有很多资料,或者RFC. 协议源码的学习 ...

  2. quagga源码学习--BGP协议中的routemap

    路由策略的基础知识 定义 路由策略(Routing Policy)作用于路由,主要实现了路由过滤和路由属性设置等功能,它通过改变路由属性(包括可达性)来改变网络流量所经过的路径. 目的 路由器在发布. ...

  3. quagga源码学习--BGP协议对等体连接建立的状态机

    创建完bgp peer之后,就要bgp start了,不然费那么大劲创建出来不做事情就销毁了,就很尴尬了. 那么对等体一旦start起来,就会进入各自的状态,在不同的状态下处理各自的事件消息. 下面列 ...

  4. quagga源码学习--BGP协议创建对等体

    现有的路由协议都是通过分布式协议逐个配置协商运行的,协议协议,一个就不需要协议咯,至少2个才能够协议着做事情嘛,不过呢,这样就出现网元过多配置困难的问题,对网管软件要求也越来越高, SDN或许可能改变 ...

  5. quagga源码学习--BGP协议对等体连接tcp md5签名认证选项

    bgp使用tcp连接,每个bgp实例自身是peer的一个tcp server端,同时也是peer的tcp client端. 1.在bgp_create之后都建立自己的socket服务端开始监听179端 ...

  6. nginx源码学习资源(不断更新)

    nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...

  7. nginx源码学习资源(不断更新)转

    原文地址:http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx ...

  8. ASP.NET Core MVC 源码学习:Routing 路由

    前言 最近打算抽时间看一下 ASP.NET Core MVC 的源码,特此把自己学习到的内容记录下来,也算是做个笔记吧. 路由作为 MVC 的基本部分,所以在学习 MVC 的其他源码之前还是先学习一下 ...

  9. ss源码学习--从协议建立到完成一次代理请求

    上一次介绍了ss源码中各个事件处理函数完成的工作,这次具体分析一下协议的建立以及请求数据的传输过程. 因为ss的local和server共用一个类以及一系列的事件处理函数,所以看起来稍显复杂.下面来将 ...

随机推荐

  1. Java面试题总结(一)

    Java面试总结 面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和 ...

  2. Unity随记

    //切换场景时怎么能让音乐不停? /////////////////////////////////////////////////////////////////// //切换场景时怎么防止某个物体 ...

  3. static总结

    [本文链接] http://www.cnblogs.com/hellogiser/p/static.html [分析] [内存分配方式] 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局 ...

  4. 关于 ArtifactTransferException: Failure to transfer

    eclipse 在导入maven project后,pom.xml有可能出现这种错误. 这里update maven project解决了:右键点击Maven项目->Maven->Upda ...

  5. Samba nsswitch/pam_winbind.c文件输入验证漏洞

    漏洞名称: Samba nsswitch/pam_winbind.c文件输入验证漏洞 CNNVD编号: CNNVD-201312-047 发布时间: 2013-12-05 更新时间: 2013-12- ...

  6. Apache配置允许文件索引

    这两天在看bootstrap的文档,所以在本地搭建了一个web server. 这里记下Apache的一个小配置: LISTEN *:8000 <VirtualHost *:8000> A ...

  7. phpcms V9利用num++实现多样形式列表标签调用

    在首页或者频道页调用文章列表的时候,经常会使用到左右对称或者每五行出现一条横线的调用形式. 其实代码很简单,利用num++的循环方式,以及{if}{/if}进行样式判断即可.代码如下: {pc:con ...

  8. multi-threaded copy command - robocopy

    we can copy files by the powerful robocopy tool, and it allow copy using muliti-threaded as well. As ...

  9. LuaFramework热更新过程(及可更新的loading界面实现)

          1.名词解释: 资源包:点击 LuaFramework  |  Build XXX(平台名) Resource,框架会自动将自定义指定的资源打包到StreamingAssets文件夹,这个 ...

  10. PHP面向对象编程基本原则

    首先祝大家节日快乐!!! 额,不知道你们剁手没,小梦是没有!整整已经错过了第九个年头! 小伙伴是不是有一种感觉,PHP入门的时候简直爱不释手,总是把 "PHP是世界上最好的语言" ...