quagga原始碼學習 BGP協議建立對等體

2022-08-03 07:51:13 字數 2692 閱讀 6125

現有的路由協議都是通過分布式協議逐個配置協商執行的,協議協議,乙個就不需要協議咯,至少2個才能夠協議著做事情嘛,不過呢,這樣就出現網元過多配置困難的問題,對網管軟體要求也越來越高,

sdn或許可能改變這個局面,但不管軟體如何定義,報文還是在乙個乙個網路節點傳輸的,所以我們看到quagga這樣多的傳統網路配置命令不要覺得繁瑣,不配置的話,協議不會工作哦。

嗯,這章的主題是建立對等體,就是通過配置命令來完成的。

「neighbor peer remote-as asn」

router bgp

1neighbor

10.0.0.1 remote-as 2

neighbor peer remote-as 命令就是配置乙個對等體,peer是指對等體的位址(ipv4,ipv6位址)。

接下來我們看**是如何建立對等體的,入口函式:

1

defun(neighbor_remote_as,

2neighbor_remote_as_cmd,

3 neighbor_cmd2 "

remote-as

"cmd_as_range,

4neighbor_str

5neighbor_addr_str26"

specify a bgp neighbor\n"7

as_str)

可以看到,bgp對等體之間是單播通訊。

1

/*if peer does not exist, create new one. if peer already exists,

2set as number to the peer. */3

int4 peer_remote_as(struct bgp *bgp, union sockunion *su, as_t *as

,5 afi_t afi, safi_t safi)

peer_remote_as函式來完成建立新對等體或者為對等體設定新的as號。

為避免一些書籍的作者或者網路作者的一貫的懶惰做法(只授人以魚),我得補充一下,為什麼要建立對等體。

對於路由協議,不管是基於3層的還是2層的,都需要建立自己的尋路資料庫,也就是通過鄰居找到下一跳,你要走的遠,你就得認識更多鄰居,以及鄰居的鄰居,好比一句老話,在家靠父母,出門靠朋友,朋友多路好走,就這麼乙個道理。

那麼話又說回來了,建立對等體呢,就是給自己找鄰居,找朋友,不過呢,bgp這個人呢,更像乙個幹中介的,比如賣房的中介,他自己不建房子,只把建好的**介紹給要買房的人,同時還維護這個**資訊庫,及時更新已經賣掉的房子。

話有點多,我們還是接著看**吧:

1

/*"router bgp" commands. */2

defun(router_bgp,

3router_bgp_cmd,4"

router bgp

"cmd_as_range,

5router_str

6bgp_str

7as_str)

router bgp 1   

這條命令就是去查詢乙個as為1的bgp物件(struct bgp),如果沒有找到就建立了乙個struct bgp的指標,並儲存在vty->index裡,vty是每個defun巨集函式宣告裡都帶的乙個引數,在command裡是極其重要的角色。

如果傳給peer的值不是乙個合法的位址,那麼會被當做是乙個peer group名稱來處理

1

/*if peer is peer group, call proper function.

*/2 ret = str2sockunion(peer_str, &su);

3if (ret < 0) 9

return

cmd_success;

10 }

然後呢,是國際慣例,查詢一下是不是已經為這個peer位址建立了peer,如果peer位址相同,as值不一樣,就修改一下peer的as值。

嗯,如果這個peer已經是某個group的成員,那麼就不能成功建立對等體關係了。

如果上面的事情都沒有發生,那麼就可以建立乙個新的對等體了。

1

static

struct peer*

2 peer_new(struct bgp *bgp)

1

/*get service port number.

*/2 sp = getservbyname("

bgp", "

tcp"

);3 peer->port = (sp == null) ? bgp_port_default : ntohs(sp->s_port);

peer_new函式裡設定預設的埠號 bgp_port_default = 179,並將peer->status = idle.

接下來會指定是ibgp peer還是ebgp peer。

最後,將這個peer加入到定時器任務中:

1

/*set up peer's events and timers. */2

if (!active && peer_active(peer)) bgp_timer_set(peer);

然後我們就要進入對等體的狀態機模式了,嗨,下一章,設計模式了喔!

quagga原始碼學習 BGP協議建立對等體

現有的路由協議都是通過分布式協議逐個配置協商執行的,協議協議,乙個就不需要協議咯,至少2個才能夠協議著做事情嘛,不過呢,這樣就出現網元過多配置困難的問題,對網管軟體要求也越來越高,sdn或許可能改變這個局面,但不管軟體如何定義,報文還是在乙個乙個網路節點傳輸的,所以我們看到quagga這樣多的傳統網...

原始碼學習 ArrayList的擴容原始碼分析

原始碼如下 下面是arraylist的擴容機制 arraylist的擴容機制提高了效能,如果每次只擴充乙個,那麼頻繁的插入會導致頻繁的拷貝,降低效能,而arraylist的擴容機制避免了這種情況。如有必要,增加此arraylist例項的容量,以確保它至少能容納元素的數量 param mincapac...

PicoContainer原始碼學習

介紹下自己,我叫stef wu,是個菜鳥,現在在easyjf團隊學習,得到了大峽等人的熱情幫助。本序列文章是以前在學習研究picocontainer時所記錄下來的,希望借本文,能和正在學習pico新手或者研究pico的高手一起交流學習。由於我水平不好,而且是真實的從頭到尾的記錄,所以其中,特別是前面...