日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vpp之feature机制介绍

發(fā)布時(shí)間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vpp之feature机制介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)上看了別人寫的feature機(jī)制介紹,感覺一頭霧水,果然要想理解還是要自己通過代碼

下面談?wù)勎覍eature機(jī)制的理解,主要還是介紹我使用feature的經(jīng)驗(yàn)

在了解feature之前,需要先明白vpp的node是如何工作的

創(chuàng)建一個(gè)plugins 名字為testdual

通過node.c文件可以看到,該插件注冊了一個(gè)node

.n_next_nodes的值表示當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)有多少個(gè)

.next_nodes表示下一個(gè)節(jié)點(diǎn)的候選項(xiàng)

接著分析數(shù)據(jù)包在node.c里面是如何轉(zhuǎn)發(fā)數(shù)據(jù)包的

vpp里面通過這種賦值的方式設(shè)置數(shù)據(jù)包轉(zhuǎn)發(fā)的下一個(gè)節(jié)點(diǎn),這里在VPPnode節(jié)點(diǎn)分析里寫的很清楚,建議看明白

上面這種屬于vpp在初始化的時(shí)候會根據(jù)注冊節(jié)點(diǎn)的說明給節(jié)點(diǎn)之間的關(guān)系建立連接,屬于靜態(tài)的

既然是靜態(tài)的,就表示node之間的連接是固定,不夠靈活,為了解決node節(jié)點(diǎn)的靈活穿插,引入了feature機(jī)制

當(dāng)然從思想上也很好理解,數(shù)據(jù)包是在內(nèi)存池里的,node使用的只是指向數(shù)據(jù)包的指針,數(shù)據(jù)包在不同node之間轉(zhuǎn)發(fā)本質(zhì)上也是把數(shù)據(jù)包的指針存放到不同node的frame里,無論是feature還是直接在注冊node時(shí)指定下一個(gè)node本質(zhì)上都是記錄下當(dāng)前node的下一個(gè)node有哪些候選項(xiàng)

下面來看看feature機(jī)制如何實(shí)現(xiàn)的

1.首先提出一個(gè)問題,上面注冊的node只表明了下一個(gè)node是什么,那么它的上一個(gè)node是誰呢?

在生成的代碼 testdual.c 中

?這里是注冊了一個(gè)feature

.arc_name表示該feature屬于哪個(gè)arc,arc的概念相當(dāng)于一個(gè)group,里面有多個(gè)feature

.node_name表示該feature控制的node

.runs_before表示testdual這個(gè)node的優(yōu)先級比ethernet-input高

另外還有個(gè).runs_after 表示比某個(gè)node優(yōu)先級低,為什么要有優(yōu)先級后面講

這里來看一下testdual節(jié)點(diǎn)未enable時(shí)device-input節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)有哪些

device-input表示數(shù)據(jù)包收到后起始node

可以看到圖中沒有testdual節(jié)點(diǎn)

接著enable testdual節(jié)點(diǎn)

可以的看到testdual被加入到了device-input節(jié)點(diǎn)后面

2.vpp是怎么實(shí)現(xiàn)把testdual加入到device-input節(jié)點(diǎn)后面的?

前面已經(jīng)提到注冊了feature

我們來看看 testdual enable-disable local0這個(gè)命令做了什么

調(diào)用了testdual_enable_disable_command_fn函數(shù)

可以看出通過vnet_feature_enable_disable函數(shù)把上面注冊的feature使能,testdual節(jié)點(diǎn)才會掛載到device-input節(jié)點(diǎn)后面去

3.vnet_feature_enable_disable函數(shù)做了什么?

函數(shù)第一個(gè)參數(shù)是arc的name,第二個(gè)參數(shù)是node的name,第三個(gè)參數(shù)是網(wǎng)卡的index,第四個(gè)參數(shù)是enable or disable

通過這個(gè)函數(shù)控制feature是否生效

這里為什么要有sw_if_index呢?

feature機(jī)制有些特殊,假如有兩個(gè)網(wǎng)卡A和B,如果feature只enable了網(wǎng)卡A,那么B網(wǎng)卡收的包不會根據(jù)feature機(jī)制進(jìn)行

device-input明明是node的name這里為什么是arc的name?

通過vpp源碼src/vnet/devices/devices.c

arc也是需要?jiǎng)?chuàng)建的,同時(shí)需要指明起始node和終止node

4.feature為什么要指明順序?

feature注冊里面為什么會有.runs_before和.runs_after

我們再創(chuàng)建一個(gè)插件testqs,同時(shí)把它也enable

可以看到testdual和testqs節(jié)點(diǎn)都在device-input?

問題來了,如果數(shù)據(jù)包到達(dá)device-input節(jié)點(diǎn),那么它是轉(zhuǎn)發(fā)給testdual節(jié)點(diǎn)呢還是testqs節(jié)點(diǎn)呢

這里就牽涉到同一個(gè)arc中feature的優(yōu)先級了

我們可以通過命令 show features verbose看看

可以看出 在arc device-input中,testqs的優(yōu)先級比testdual優(yōu)先級高

如果我想testdual在testqs前面怎么辦呢

修改代碼,在testdual feature的注冊中修改為

?可以看到

?當(dāng)然也可以在testqs節(jié)點(diǎn)注冊feature的地方改

關(guān)于feature的排序問題,通過before和after把同一個(gè)arc內(nèi)的feature按照自己想要的順序依次排列,再通過show features verbose查看是否跟預(yù)期一致

5.如何把testdual節(jié)點(diǎn)變成feature節(jié)點(diǎn)

這里會有疑惑,這個(gè)問題是什么意思

上面雖然注冊了feature,也通過命令把testdual節(jié)點(diǎn)添加到了device-input節(jié)點(diǎn)后面,但是如果添加一個(gè)節(jié)點(diǎn)testqs通過feature把testqs排在testdual節(jié)點(diǎn)后面,經(jīng)過測試會發(fā)現(xiàn)數(shù)據(jù)包走到testdual節(jié)點(diǎn)后仍然送到了interface-output節(jié)點(diǎn),而不是testqs節(jié)點(diǎn)

這里涉及到了feature機(jī)制的本質(zhì),feature本質(zhì)上是在原來靜態(tài)連接node的關(guān)系下,把feature注冊的那個(gè)節(jié)點(diǎn)根據(jù)排序添加到某個(gè)節(jié)點(diǎn)的后面,但是代碼中轉(zhuǎn)發(fā)數(shù)據(jù)包的邏輯并沒有改變

查看testdual/node.c文件

代碼中的邏輯仍然是把數(shù)據(jù)包送到interface_output節(jié)點(diǎn)

那么如何把testdual變成feature節(jié)點(diǎn)呢

只需要修改代碼為(這里用testqs代碼舉例說明,testdual生成的代碼改起來不好解釋)

原來的代碼是

只需要把代碼改造為

vnet_feature_next_u16函數(shù)的意思是獲取數(shù)據(jù)包下一個(gè)feature node的index

這樣數(shù)據(jù)包就可以靈活的根據(jù)feature轉(zhuǎn)發(fā)到指定的節(jié)點(diǎn)

下面介紹一下feature到底改變了什么

原本testdual節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)只有interface-output節(jié)點(diǎn)

testqs feature enable以后等價(jià)于

雖然沒有直接寫出testdual后面跟testqs節(jié)點(diǎn),但是作用確實(shí)如此,vnet_feature_next_u16函數(shù)獲取的next_index就是TESTDUAL_NEXT_TESTQS的值

相比較于原來靜態(tài)的node連接方式,feature disable以后testdual節(jié)點(diǎn)后面就沒有testqs節(jié)點(diǎn)了

額外補(bǔ)充一點(diǎn)

vpp提供了函數(shù)也可以實(shí)現(xiàn)feature這種靈活控制的節(jié)點(diǎn)

模板就是這樣的,通過vlib_node_add_next函數(shù)可以把某個(gè)node添加到另一個(gè)node的后面

總結(jié)

以上是生活随笔為你收集整理的vpp之feature机制介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。