bgp使用tcp连接,每个bgp实例自身是peer的一个tcp server端,同时也是peer的tcp client端。

1、在bgp_create之后都建立自己的socket服务端开始监听179端口:

 bgp = bgp_create(as, name);
     bgp_router_id_set(bgp, &router_id_zebra);
     *bgp_val = bgp;

     /* Create BGP server socket, if first instance.  */
     if (list_isempty(bm->bgp)
         && !bgp_option_check(BGP_OPT_NO_LISTEN)) {
         ) return BGP_ERR_INVALID_VALUE;
     }

     listnode_add(bm->bgp, bgp);

bgp_socket里完成server socket的创建与监听。

2、在bgp_start函数里开始对peer的connect操作。在connect之前会清楚一些peer的设置,避免与上一个连接session的混淆。

 status = bgp_connect(peer);

如果定义了HAVE_DECL_TCP_MD5SIG宏,或者更老的linux 2.4内核版本的宏 HAVE_TCP_MD5_LINUX24,即会添加TCP MD5签名验证选项。

为了跟上时代的步伐,这里我们就只看高版本的内核了。

 ;
     struct tcp_md5sig md5sig;
     union sockunion *su2, *susock;

     ......

     memset(&md5sig, , sizeof(md5sig));
     memcpy(&md5sig.tcpm_addr, su2, sizeof(*su2));
     md5sig.tcpm_keylen = keylen;
     if (keylen) memcpy(md5sig.tcpm_key, password, keylen);
     sockunion_free(susock);

     ) {
         /* ENOENT is harmless.  It is returned when we clear a password for which
        one was not previously set. */
         ;
         else zlog_err("sockopt_tcp_signature: setsockopt(%d): %s",
                       sock, safe_strerror(errno));
     }
     return ret;

上面的代码即完成MD5SIG选项。

如果md5值不正确或者密码错误,内核会丢弃当前的报文。

4.1.3版本内核对md5sig的结构定义:

 struct tcp_md5sig {
     struct __kernel_sockaddr_storage tcpm_addr;    /* address associated */
     __u16    __tcpm_pad1;                /* zero */
     __u16    tcpm_keylen;                /* key length */
     __u32    __tcpm_pad2;                /* zero */
     __u8    tcpm_key[TCP_MD5SIG_MAXKEYLEN];        /* key (binary) */
 };

在int tcp_v4_rcv(struct sk_buff *skb)函数里:

 #ifdef CONFIG_TCP_MD5SIG
     /*
      * We really want to reject the packet as early as possible
      * if:
      *  o We're expecting an MD5'd packet and this is no MD5 tcp option
      *  o There is an MD5 option and we're not expecting one
      */
     if (tcp_v4_inbound_md5_hash(sk, skb))
         goto discard_and_relse;
 #endif

因此在服务端,直接由内核在tcp接收处理时就完成了签名验证。

quagga源码学习--BGP协议对等体连接tcp md5签名认证选项的更多相关文章

  1. quagga源码学习--BGP协议路由更新

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

  2. Dubbo源码学习--服务是如何发布的

    相关文章: Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 ServiceBean ServiceBean 实现ApplicationListener接口监听Conte ...

  3. Redis源码学习:字符串

    Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串, ...

  4. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  5. jQuery源码学习感想

    还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...

  6. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  7. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  8. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

  9. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

随机推荐

  1. redis客户端连接异常

    本文参考:http://mdba.cn/2015/04/02/redistwemproxy-%e5%ae%a2%e6%88%b7%e7%ab%af%e8%bf%9e%e6%8e%a5%e5%bc%82 ...

  2. javascript(js)小数精度丢失的解决方案

    原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况. javascript(js)的小数点加减乘除问题,是一个js的bug如0.3* ...

  3. (原创)JS闭包看代码理解

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  4. 谷歌浏览器如何设置可以解决Ajax跨域问题?

    Ajax本身是不支持跨域的,跨域问题其实很简单,通过浏览器的相应设置可以完成两个不同的服务器或两个不同服务下的项目互相访问.希望大家给予评价及投票. 方法/步骤   首先谷歌快捷方式上右击,在下拉列表 ...

  5. 了解GDAL的图像处理/Python

    GDAL是一个操作各种栅格地理数据格式的库.包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据(GIS对栅格, ...

  6. cocos2dx开发笔记

    1.帧动画:SpriteTest=>SpriteAnimationSplit 2.sourceinsight显示代码行 option->document option->editin ...

  7. 织梦dedecms后台添加图片style全部都变成st&lt;x&gt;yle的解决办法

    可乐站长在建站的时候,上传缩略图喜欢输入图片路径,不喜欢上传图片,有几次我上传图片路径为:/style/image/**.jpg,然后返回修改后,图片为路径却为:/st<x>yle/ima ...

  8. XMPP登录应用

    一.导入框架 1.XMMP框架,写入头文件,设置XMPPStreamDelegate代理,定义 XMPPStream *_xmppStream; 2.libresolv.dylib 3.libxml2 ...

  9. 读书笔记之 - javascript 设计模式 - 代理模式

    代理(proxy)是一个对象,它可以用来控制对另一对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替本体被实例化,并使其可被远程访 ...

  10. Alert Views

    Alert views display a concise and informative alert message to the user. Alert views convey importan ...