OpenDaylight BGP 开发者指引


译者:changhe188,OpenDaylight布道者

概述

本段提供了对feature odl-bgpcep-bgp-all的概述,该功能将会安装所有和BGP(边界网关协议)相关的组件,包括建立连接、存储RIB(路由信息库)中的数据,显示网络拓扑概况中的数据。

BGP架构

每一个功能在BGPCEP的代码库中都表现为一个模块(module)。下图中展示了这些功能之间的联系。

bgp_dependency_tree.jpg


图5.1 BGP依赖树

关键API与接口

BGP概念

本模块包括在RFC4271、RFC4760、RFC4456、RFC1997和RFC4360中定义的基础的BGP概念。

所有的概念都在一个yang模型中被描述:bgp-types.yang。

在生成类之外,只存在一个类NextHopUtil,它包含了用来序列化和解析NextHop的方法。

BGP解析器

基BGP解析器包括在RFC4271、RFC4760、RFC1997和RFC4360中定义的消息和属性。

API模块在YANG中定义了BGP消息。

IMPL模块包含用于BGP消息和激活器(Activator)类的实际解析器和序列化器。

SPI模块包含用于将解析器注册进激活器中所需的帮助类。

注册

正如前面提到的,所有的解析器和序列化器都需要被注册到Extension provider中。该Extension provider配置在parse-spi模块的初始配置文件(31-bgp.xml)。

<module>
    <type xmlns:prefix=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:parser:spi">prefix:bgpextensions-
impl</type>
    <name>global-bgp-extensions</name>
    <extension>
        <type xmlns:bgpspi=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:parser:spi">bgpspi:extension</
type>
        <name>base-bgp-parser</name>
    </extension>
    <extension>
        <type xmlns:bgpspi=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:parser:spi">bgpspi:extension</
type>
        <name>bgp-linkstate</name>
    </extension>
</module>


  • base-bgp-parser - 用来注册在bgp-paser-impl模块中实现的解析器和序列化器。

  • bgp-linkstate - 用来注册在bgp-linkstate模块中实现的解析器和序列化器。


bgp-linkstate模块是BGP解析器扩展的一个好例子。

bgp-paser-spi的配置指明了一个Extension Provider的实现,该实现专门用来注册提到过的解析器扩展:SimpleBGPExtensionProviderContext。全部注册处都在bgp-parser-spi这个包中实现。

序列化

BGP元素的序列化和PCEP中采用的方式基本是一致的,唯一的例外就是对路径属性的序列化,正如下面所描述的。路径属性与其他任何BGP元素都不相同,因为路径属性并不是实现了某一个通用的接口,而是用了一个包含对某单独路径属性getter的接口(这样的结构是因为更新消息可以包含每条路径属性的一个特定实例)。这就意味着,对于给定的PathAttributes对象,你可以通过检查某个指定类型的路径属性是否存在而只提取该指定的路径属性。因此,AttributeRegistry中的serialize()方法,不会查找注册的类,而是遍历这些注册并将该对象提供给每一个注册的解析器。通过这种方法该对象还会被送到bgp-paser模块未知的序列化器中,例如LinkstateAttributeParser。RFC4271推荐使路径属性有序化,因此序列化器注册到Activator中时在列表中是有序的。也就是说,这就是唯一一个注册顺序有影响的案例。

PathAttributesSerialization.jpg


图5.2 PathAttributesSerialization

每个Path Attribute解析器中的serialize()方法都包含对其在PathAttribute对象中存在性的检查。如果该属性不存在,就会简单的直接返回。
if (pathAttributes.getAtomicAggregate() == null) {
return;
}
//continue with serialization of Atomic Aggregate


BGP RIB

BGP RIB模块可以分成语义上的两部分:BGP监听者和发言者会话处理;RIB处理。

会话处理

31-bgp.xml仅定义了bgp-dispatcher和它应当使用的解析器(global-bgp-extensions)。
<module>
<type>prefix:bgp-dispatcher-impl</type>
<name>global-bgp-dispatcher</name>
<bgp-extensions>
    <type>bgpspi:extensions</type>
    <name>global-bgp-extensions</name>
</bgp-extensions>
<boss-group>
    <type>netty:netty-threadgroup</type>
    <name>global-boss-group</name>
</boss-group>
<worker-group>
    <type>netty:netty-threadgroup</type>
    <name>global-worker-group</name>
</worker-group>
</module>


对于用户的BGP配置,请参照“使用者指引(User Guide)”。

同步

同步是指一个阶段,该阶段中一个BGP发言者通过连接将全部有关拓扑的可用数据都发送给它的新客户端。当全部拓扑都通告完毕后,同步即结束。对于监听者来说,当RIB收到了End-of-RIB(EOR)消息后即同步结束。对于每个地址族(AFI,Address Family Identifier)来说,都有一个特定的EOR消息。

  • IPv4 EOR是一个空的Update消息。

  • IPv6 EOR是一个将地址族和子地址族(SAFI,Subsequent Address Family Identifier)设为IPv6的且包含空的MP_UNREACH属性的Update消息。

  • Linkstate EOR是一个将地址族和子地址族设为Linkstate的且包含空的MP_UNREACH属性的Update消息。


对于BGP连接来说,当对等体双方都支持平滑重启(Graceful Restart),那么EOR会被BGP发言者发送并重定向到RIB中,这样特定的地址族/子地址族表才会被设为true。如果不支持平滑重启,那么消息就由OpenDaylight自己产生并在第二个keepalive之后发送给每个地址族/子地址族。该步骤在BGPSynchronizaiton中完成。

对等体

BGPPeer有很多种含义。如果你配置的是BGP监听者,BGPPeer就表示BGP监听者自身。如果你配置的是BGP发言者,你需要提供一个允许连接至此发言者的对等体列表,对于未知的对等体,这种情况下,它意味着是允许被拒绝的。BGPPeer在这种情况下表示那些假设会连接到你的发言者的对等体。BGPPeer在BGPPeerRegistry中存储。该注册处控制着会话的数量。我们严格的实现限制了每个对等体只会有一个会话。

ApplicationPeer是一种特别的对等体,它拥有自己的RIB。该RIB通过RESTCONF构成,与默认的BGP RIB同步。进入默认RIB的路由与从网络中的BGP对等体(发言者或监听者)收到的路由被同等处理。

RIB处理

RIB(Route Information Base,路由信息库)是在RFC4271中定义的一个概念。但RFC中并没有定义应该如何去实现它。在我们的实现中,路由都在MD-SAL的data-store中存储。目前共支持4种路由:IPv4Routes、IPv6Routes、LinkstateRoutes和FlowspecRoutes。

每一种类型的路由都需要提供一个RIBSupport.java的实现。RIBSupport告诉RIB如何将binding-aware数据(BGP Update消息)解析成binding-independent数据(数据存储(datastore)中的格式)。

下图描述了送到BGPPeer的BGP消息去往数据存储和不同类型RIB的数据流。

RIB.jpg


图5.3 RIB

AdjRibInWriter - 代表将数据推入数据存储的第一步。每当对等体收到一条Update消息后该写入者都会被通知,该消息会被转换成binding-independent格式并推入数据存储从而进入adj-rib-in中。该RIB与一个对等体相关联。

EffectiveRibInWriter - 每当adj-rib-in更新时,该写入者都会被通知。配置的所有入站策略都会由它应用到路由中,并将它们存储到effective-rib-in中。该RIB也同样与一个对等体相关联。

LocRibWriter - 每当任何一个effective-rib-in更新时(任意对等体的),该写入者都会被通知。它会执行最优路径选择过滤并将路由存储到loc-rib中。它还会决定哪些路由需要被通告并将之填入也是每个对等体一个的adj-rib-out中。

AdjRibOutListener - 监听adj-rib-out的变化,将路由转换为BGPUpdate消息,并将这些消息发送至相关联的对等体。

BGP inet

该模块仅包含一个YANG模型bgp-inet.yang,该模型总结了ipv4和ipv6对RIB路由和BGP消息的扩展。

BGP flowspec

BGP flowspec模块实现了RFC5575。该RFC以定义一个新的子地址族、NLRI和扩展社团的方式扩展了BGP,全部这些都定义在模型bgp-flowspec.yang中。此外,为了生成源代码,该模块还包括对这些新定义元素的解析器和支持flowspec-routes的RIBSupport。对于flowspec路由来说,每条路由的键为一个人类可读的表示flowspec请求字符串。

BGP linkstate

BGP linkstate模块实现了draft-ietf-idr-ls-distribution版本04。该草案以定义一个新的地址族、子地址族、NLRI和路径属性的方式扩展了BGP。全部这些都定义在模型bgp-linkstate.yang中。此外,为了生成源代码,该模块还包括对于linkstate地址族的LinkStateAttributeParser、LinkStateNlriParser、二者的激活器、解析器、RIB以及RIBSupport处理函数。同样每条路由都需要一个键,对于linkstate来说,路由的键定义为一个包含全部nlri序列化成字节形式的二进制字符串。

BGP topology provider

除了RIB之外的BGP数据都存储在network-topology视图中。这些数据以何种格式展现遵循draft-clemm-netmod-yang-network-topo。

API参考文档

当创建mvn:site时会生成Javadocs,它位于每个模块的target/directory目录下。

译者:changhe188,OpenDaylight布道者

转载请联系作者并注明出处

3 个评论

最近在研究BGP,实在是太好了。。。感谢翻译组的付出。
多谢分享。赞一个。
请问31-bgp.xml配置文件的语法是什么啊?type、name这些元素的值与项目工程中的groupId、artifactId是如何对应的?

要回复文章请先登录注册