vpp flowprobe
介紹
flowprobe plugin是vpp源碼自帶的插件,主要功能是flow信息上報(bào),與vpp中的ipfix。
簡(jiǎn)單的配置
set ipfix exporter collector 10.87.45.7 src 10.248.161.144 template-interval 50 port 4739 path-mtu 1450
配置flow_report_process(PROCESS類型的node),設(shè)置上報(bào)消息的目的地址,源地址,端口號(hào),mtu等
flowprobe params record l3 active 5 passive 120
flowprobe params record <[l2] [l3] [l4]> [active <timer> passive <timer>]
配置flowprobe節(jié)點(diǎn)參數(shù)
flowprobe feature add-del eth0 ip4
在接口上使能這個(gè)feature
測(cè)試抓包結(jié)果:
模板上報(bào)
flow信息上報(bào)
每個(gè)flow中的信息和模板中的一致
遇到的問(wèn)題以及關(guān)鍵點(diǎn)分析
1、數(shù)據(jù)包起始位和預(yù)期不一致
背景:
該plugin注冊(cè)在ip4-output或者interface-output arc中(取決于是l2探測(cè)還是l3 l4探測(cè)),只是上報(bào)tx方向的流量,想rx和tx的流量都上報(bào)
方法:
將該上報(bào)flow node注冊(cè)在ip4-unicast arc中
預(yù)期結(jié)果:
rx和tx方向的流量都會(huì)上報(bào)
現(xiàn)象:
仍然是只有tx方向的流量
問(wèn)題原因
add_to_flow_record_state 這個(gè)函數(shù)。無(wú)論是設(shè)置l2、l3還是l4級(jí)別的探測(cè),都會(huì)調(diào)用這個(gè)函數(shù),這個(gè)函數(shù)有一處代碼
ethernet_header_t *eth = vlib_buffer_get_current (b);
因?yàn)檫@個(gè)node本來(lái)是放在tx方向的,所以當(dāng)數(shù)據(jù)包到達(dá)這個(gè)node的時(shí)候,vlib_buffer_get_current(b)獲取到的是以太頭部。如果把這個(gè)node放在ip4-input之后,vlib_buffer_get_current(b)獲取到的是ip頭部,這樣就會(huì)導(dǎo)致內(nèi)容獲取失敗,因此rx方向的流量無(wú)法上報(bào)。
解決方法
1、如果放在device-input中呢?
也有問(wèn)題,這個(gè)flowprobe node的下一跳是ip4-lookup,如果放在了device-input,就會(huì)走不到ip4-input節(jié)點(diǎn)中去,也就會(huì)造成數(shù)據(jù)包到不了我們的業(yè)務(wù)處理節(jié)點(diǎn)
2、對(duì)node的處理邏輯做一些改動(dòng)
如何判斷vlib_buffer_get_current(b)得到的是以太頭還是ip頭?
是判斷上一個(gè)節(jié)點(diǎn)還是判斷 vlib_buffer_get_current獲取到的內(nèi)容?
node如果獲取上一個(gè)節(jié)點(diǎn)的name信息?
3、新注冊(cè)一個(gè)節(jié)點(diǎn),放在ip4-input或者ip4-local之后,原來(lái)的節(jié)點(diǎn)保持不變
好處:可以針對(duì)當(dāng)前的業(yè)務(wù),對(duì)模板做一些裁剪和增加
壞處:代碼量有點(diǎn)大,rx和tx方向的模板不一致,對(duì)控制層解析也會(huì)造成困擾
4、新寫(xiě)節(jié)點(diǎn)+修改原有節(jié)點(diǎn)
對(duì)原有節(jié)點(diǎn)的模板進(jìn)行適應(yīng)業(yè)務(wù)的修改,但是代碼改動(dòng)量有點(diǎn)大
2、上報(bào)時(shí)間不固定的問(wèn)題
現(xiàn)象:
設(shè)置了active time,抓包發(fā)現(xiàn)并不是以active time為頻率進(jìn)行上報(bào)
問(wèn)題原因:
走讀代碼發(fā)現(xiàn)active只是其中一個(gè)判斷條件,根據(jù)這些flow信息組裝成的包,總長(zhǎng)度不超過(guò)預(yù)設(shè)的1450,仍然不會(huì)上報(bào)。如果是真是網(wǎng)絡(luò)環(huán)境,應(yīng)該還是會(huì)接近active time的頻率上報(bào)。源代碼這么設(shè)計(jì)的好處就是可以減少上報(bào)的數(shù)據(jù)量,減輕控制層的壓力,但是缺點(diǎn)就是如果長(zhǎng)時(shí)間flow信息單一,會(huì)造成上報(bào)不及時(shí)。目前的處理機(jī)制是提供一個(gè)possive timer,如果這個(gè)定時(shí)器觸發(fā),會(huì)強(qiáng)制發(fā)送flow上報(bào)信息。
3、ipfix-exporter起到什么作用?
在源碼/src/vnet/ipfix-export中,定義了一個(gè)PROCESS類型的節(jié)點(diǎn)
VLIB_REGISTER_NODE (flow_report_process_node) = { .function = flow_report_process, .type = VLIB_NODE_TYPE_PROCESS, .name = "flow-report-process", };
這個(gè)節(jié)點(diǎn)有什么作用?
目前來(lái)看,這個(gè)節(jié)點(diǎn)的作用在于模板的上報(bào)。可以配置多個(gè)模板信息,模板由flowprobe提供。
當(dāng)設(shè)置的上報(bào)模板定時(shí)器觸發(fā),就會(huì)發(fā)送一個(gè)模板信息,與此同時(shí),也會(huì)調(diào)用flowprobe的回調(diào)安徽省農(nóng)戶,刷新flowprobe節(jié)點(diǎn)的數(shù)據(jù)緩存,上報(bào)flow信息。
4、node分析
flowprobe一共有5個(gè)node
flowprobe-ip4
flowprobe-ip6
flowprobe-l2
flowprobe-walker
flowprobe-timer-process
前三個(gè)都是internal類型的節(jié)點(diǎn),這三個(gè)節(jié)點(diǎn)的入口函數(shù)是一樣的,對(duì)報(bào)文頭進(jìn)行解封裝,然后查找/創(chuàng)建flowprobe entry,判斷是否應(yīng)該上報(bào)flow信息
flowprobe-walker是input-interrupt類型的節(jié)點(diǎn),負(fù)責(zé)possive timer超時(shí)處理。
flow-timer-process是process類型的節(jié)點(diǎn),但是這個(gè)節(jié)點(diǎn)有些疑問(wèn)。在其入口函數(shù)中的while(1)死循環(huán)中,沒(méi)有喚醒函數(shù),而是通過(guò)vlib_process_suspend暫時(shí)掛起一段時(shí)間,所以這個(gè)節(jié)點(diǎn)只需要接收一次事件觸發(fā)就可以。這個(gè)事件是在配置tx interface able/disable的時(shí)候觸發(fā)的。這個(gè)節(jié)點(diǎn)的作用就是在每次掛起之前,向每個(gè)worker線程的flowprobe-walker發(fā)送interrupt信號(hào)
flowprobe-walker節(jié)點(diǎn)會(huì)遍歷當(dāng)前線程超時(shí)的定時(shí)器(在創(chuàng)建每個(gè)flowprobe entry的時(shí)候,entry的索引值就是在fm->pool_per_worker[my_cpu_number]這個(gè)數(shù)組中的位置,由定時(shí)器模塊在定時(shí)器超時(shí)調(diào)用回調(diào)函數(shù)時(shí)會(huì)把這個(gè)索引填入fm->expired_passive_per_worker數(shù)組中)。根據(jù)這些信息,flowprobe-walker節(jié)點(diǎn)就會(huì)把所有超時(shí)的entry轉(zhuǎn)換為flow信息進(jìn)行上報(bào)
5、ipfix
RFC7011
6、api文件定義的值和代碼中用到的值不一致
在api文件中,設(shè)置flowprobe feature add-del infname l2 | ip4 | ip6 命令中,l2的宏定義值是2,ip4宏定義值是1,ip6宏定義值是。在代碼中
flowprobe_tx_interface_add_del_feature
這個(gè)函數(shù)l2的宏定義值是2,ip4宏定義值是0,ip6宏定義值是1.
7、l2_ip4 / l2_ip6是什么作用
在配置中,是沒(méi)有這兩個(gè)配置參數(shù)的,如果
flowprobe params record l3 active 5 passive 120
flowprobe feature add-del eth0 l2
如果flowprobe params record設(shè)置l3,flowprobe feature設(shè)置l2,這種情況下,就會(huì)上報(bào)兩個(gè)template,既會(huì)上報(bào)l2+ip4的流信息,也會(huì)上報(bào)l2+ip6的流信息。
8、設(shè)置參數(shù)組合
record l2,l3,l4,l2&l3,l2&l4,l3&l4,l2&l3&l4
probe l2,ip4,ip6
record可以混合設(shè)置,probe不可以混合設(shè)置
which L2 L2 L2 IP4 IP4 L2 L2 L2 L2
record L2 L3 L4 L2 L3 L2L3 L2L3L4 L3L4 L2L4
T L2 L2L3 L2L4 L2 L3 L2 + L2L3 L2+L2L3L4 L2L3L4 L2+L2L4
which IP4 IP4 IP4 IP4 IP4
record L2L3 L2L3L4 L3L4 L2L4 L4
T L2L3 L2L3L4 L3L4 L2L3L4 L4
9、active timer和passive timer是什么作用?
active timer:
如果設(shè)置為0,每收到一個(gè)包,就會(huì)用fm->stateless_entry[my_cpu_number]作為新建的flowprobe entry,然后把這個(gè)entry填入flow信息上報(bào)報(bào)文,flow信息上報(bào)報(bào)文中的flow信息,packets的數(shù)量始終為1.這里會(huì)有一個(gè)問(wèn)題,那就是報(bào)文duration字段,start為1970,end為當(dāng)前時(shí)間,所以這個(gè)字段是不可信的。flowprobe-timer-process節(jié)點(diǎn)將不會(huì)觸發(fā),flowprobe-walker也不會(huì)觸發(fā)。
如果設(shè)置為n,那么在某個(gè)flow的第一個(gè)報(bào)文到來(lái)時(shí),會(huì)用flowprobe_create創(chuàng)建一個(gè)entry(也就是在fm->pool_per_worker[my_cup_number]數(shù)組里分配一個(gè)entry)。在0到n這個(gè)時(shí)間段內(nèi),如果有相同的flow到來(lái),則更新entry即可。超過(guò)n,再把entry填入flow信息上報(bào)報(bào)文。這里會(huì)有一個(gè)問(wèn)題,如果在n時(shí)間段之前來(lái)了一些報(bào)文,在n超時(shí)很長(zhǎng)一段時(shí)間都沒(méi)有這個(gè)flow的報(bào)文到來(lái),這就會(huì)造成上報(bào)不及時(shí)。這個(gè)問(wèn)題會(huì)由possive timer來(lái)解決。但是如果在active timer到possive timer之間該flow的報(bào)文到來(lái),就會(huì)導(dǎo)致上報(bào)不及時(shí)。
暫時(shí)無(wú)法在飛書(shū)文檔外展示此內(nèi)容
passive timer:
如果設(shè)置為0,那么flowprobe entry就不會(huì)設(shè)置過(guò)期時(shí)間。
如果設(shè)置為n,那么active timer必須要小于n。每個(gè)flowprobe entry的過(guò)期時(shí)間為n,到了過(guò)期時(shí)間,將會(huì)由flowprobe-walker節(jié)點(diǎn)進(jìn)行處理。
| active timer | 0 | n | n |
| passive timer | any | 0 | m |
| 無(wú)需考慮passive timer的值。上報(bào)即時(shí),但是上報(bào)報(bào)文太多。 | entry無(wú)過(guò)期時(shí)間,會(huì)造成entry長(zhǎng)時(shí)間無(wú)法更新,不建議這種配置 | 推薦這種配置,不會(huì)造成太多上報(bào)報(bào)文,在最長(zhǎng)m時(shí)間內(nèi),entry一定會(huì)填入報(bào)文中 |
方案設(shè)計(jì)
1、vpp:
a、新增一個(gè)節(jié)點(diǎn),
負(fù)責(zé)處理ip4-input/ip4-local節(jié)點(diǎn)之后的數(shù)據(jù)。模板信息參照f(shuō)lowprobe的l3探測(cè)。flowprobe節(jié)點(diǎn)保持不變。數(shù)據(jù)上報(bào)采用網(wǎng)絡(luò)包上報(bào)。
好處:對(duì)原有flowprobe插件不做任何改動(dòng)(測(cè)試時(shí)發(fā)現(xiàn)原有插件的api文件定義的宏值和代碼中的宏值不一致,這個(gè)需要修改,cli方式?jīng)]有這個(gè)問(wèn)題),新增節(jié)點(diǎn)代碼可以放在srou plugin中,隔離性較好。
壞處:新增節(jié)點(diǎn)的函數(shù)基本和flowprobe plugin的節(jié)點(diǎn)處理函數(shù)一致,代碼重復(fù)不夠精簡(jiǎn)。
b、不新增節(jié)點(diǎn)
修改原有節(jié)點(diǎn)代碼,將原有節(jié)點(diǎn)在ip4-unicast arc中注冊(cè)一次,根據(jù)vlib_buffer_t的輔助信息判斷當(dāng)前節(jié)點(diǎn)是在ip4-input之后還是在output之后。
壞處:要修改flowprobe plugin的代碼,不同節(jié)點(diǎn)走相同的處理函數(shù),代碼可讀性差
好處:代碼修改量小
2、edge-controller如何對(duì)ipfix功能進(jìn)行配置
采用api方式,edge-controller通過(guò)ipfix以及flowprobe提供的api接口對(duì)功能進(jìn)行配置。
3、如何上報(bào)給edge-controller
a、api機(jī)制
現(xiàn)有代碼并沒(méi)有實(shí)現(xiàn)這個(gè)機(jī)制,需要開(kāi)發(fā)。
b、網(wǎng)絡(luò)包方式
這個(gè)是vpp現(xiàn)有代碼實(shí)現(xiàn)的方式,通過(guò)配置遠(yuǎn)端ip,通過(guò)發(fā)送網(wǎng)絡(luò)包進(jìn)行上報(bào)。
vpp的地址和edge-controller的地址是一樣的,所以如果上報(bào)flow的報(bào)文src ip和dst ip一樣,ip4-local節(jié)點(diǎn)會(huì)校驗(yàn)失敗。如果dst ip不是本機(jī)地址,那么報(bào)文就不會(huì)punt。src ip設(shè)置成127.0.0.1可以解決這個(gè)問(wèn)題。
flowprobe創(chuàng)建flow entry的同時(shí),會(huì)創(chuàng)建這個(gè)entry的定時(shí)器,時(shí)長(zhǎng)為passive的值。定時(shí)器超時(shí)后會(huì)將entry index傳給定時(shí)器系統(tǒng)。
在定時(shí)器系統(tǒng)的回調(diào)函數(shù)會(huì)遍歷超時(shí)的定時(shí)器傳進(jìn)來(lái)的index,然后放入fm->expired_passive_per_worker[thread_index]
這個(gè)定時(shí)器是不會(huì)停止的,即便是已經(jīng)將entry填入message中,只會(huì)將entry的packet count置位0,不會(huì)停止這個(gè)定時(shí)器。在flowprobe-walker節(jié)點(diǎn)(此節(jié)點(diǎn)運(yùn)行在worker線程中)中會(huì)不停的遍歷超時(shí)entry,如果packet count大于0,則把這個(gè)entry填入message中。
在disable flowprobe feature中,如何處置未填入message中的entry以及如何處置message len小于path mtu而未發(fā)送出去的message中呢?
處理disable消息的函數(shù)運(yùn)行在main線程中。
目前來(lái)看,vpp只支持一個(gè)domain id,值為1。src port和dst port都是4739
flow_report stream設(shè)計(jì)的很奇怪
添加stream是找到domain id為-1的值,如果沒(méi)找到,就重新申請(qǐng)一塊內(nèi)存。
查找的入?yún)⑹莇omain id和src port,找到domain id和src port都匹配的stream。
刪除stream,實(shí)際上不是刪除這塊內(nèi)存,而是將這個(gè)stream的domain id設(shè)置為-1.
在發(fā)送message的過(guò)程中,需要用到stream,但是,查找是檢索第一個(gè)domain id為1的stream。所以即便是添加了多個(gè)stream,也只會(huì)用到一個(gè)。
不僅如此,也沒(méi)有考慮到線程沖突。stream的增刪改查都是在main線程中進(jìn)行,使用是在worker線程中。
總結(jié)
以上是生活随笔為你收集整理的vpp flowprobe的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 杜比音效卡刷包android 7.0,杜
- 下一篇: 可调电阻封装图_干货!17种元器件PCB