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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P4: Programming Protocol-Independent Packet Processors

發(fā)布時(shí)間:2025/3/17 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4: Programming Protocol-Independent Packet Processors 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P4: Programming Protocol-Independent Packet Processors

摘要

P4是一門高級(jí)語言,用于編程與協(xié)議無關(guān)的數(shù)據(jù)包處理器。P4與SDN控制協(xié)議相關(guān)聯(lián),類似與OpenFlow。當(dāng)前,OpenFlow明確指定了運(yùn)行的協(xié)議頭。這個(gè)設(shè)置在幾年內(nèi),從12個(gè)字段增長到41個(gè)字段,并且增加了協(xié)議頭的復(fù)雜性,卻沒有提供應(yīng)有的靈活性。本文提出P4作為OpenFlow將來演化發(fā)展的目標(biāo)。我們有三個(gè)目標(biāo):(1)字段可重配性(2)協(xié)議獨(dú)立性(3)目標(biāo)無關(guān)性。

1 引言

SDN使得操作人員可編程化的控制他們的網(wǎng)絡(luò),在SDN中,控制平面與轉(zhuǎn)發(fā)平面分離,控制平面控制多個(gè)轉(zhuǎn)發(fā)設(shè)備,同時(shí),轉(zhuǎn)發(fā)設(shè)備可以通過共有的,開放的,廠商無關(guān)的接口(比如OpenFlow),使得控制平面可以對不同的軟件、硬件服務(wù)商進(jìn)行控制。

OpenFlow接口開始是很簡單的,簡單的表匹配規(guī)則概念可以在多個(gè)頭字段進(jìn)行匹配(比如MAC地址,IP地址,協(xié)議,TCP/UDP端口數(shù)字等)。在過去五年,隨著多個(gè)階段的規(guī)則表和更多的頭字段,配置變得愈加的復(fù)雜(表1所示)。頭字段增加的現(xiàn)象并沒有停止,為了取代這種不斷擴(kuò)展OpenFlow配置的現(xiàn)象,我們認(rèn)為將來的交換機(jī)應(yīng)該提供靈活的機(jī)制,以支持解析數(shù)據(jù)包和匹配頭字段??刂破魍ㄟ^接口,可以利用這些優(yōu)勢。

最近,芯片設(shè)計(jì)證明這樣的靈活性可以通過傳統(tǒng)的ASICs以Tb/s的速度實(shí)現(xiàn)。對這種新一代的交換機(jī)芯片實(shí)現(xiàn)編程并不容易。圖1顯示了P4(告知交換機(jī)如何配置交換機(jī)、處理數(shù)據(jù)包)和現(xiàn)在的APIs(用于在固定功能交換機(jī)上填充轉(zhuǎn)發(fā)表)之間的關(guān)系。P4為可編程網(wǎng)絡(luò)的概念提出抽象的級(jí)別,P4可以作為控制器和交換機(jī)之間的通常的接口。關(guān)鍵的挑戰(zhàn)是找到一個(gè)“最佳位置”,以平衡表現(xiàn)力的需求與各種硬件和軟件交換機(jī)的易于實(shí)施。

P4四個(gè)主要目標(biāo)如下:

  • 1.可重配性,控制器可以定義數(shù)據(jù)解析和處理的字段。
  • 2.協(xié)議獨(dú)立性,交換機(jī)不會(huì)限定于明確的數(shù)據(jù)包格式。相反,控制器可以配置,(1)數(shù)據(jù)包解析器可以以特別的名字和類型提取數(shù)據(jù)包頭字段(ii)有匹配+動(dòng)作表集合可以對這些數(shù)據(jù)包頭進(jìn)行處理。
  • 3.目標(biāo)獨(dú)立性。這就類似C程序的運(yùn)行不必關(guān)心底層的硬件。P4程序?qū)懞玫呐渲貌槐仃P(guān)心底層設(shè)備,但是在將P4程序編寫的配置,對交換機(jī)進(jìn)行配置時(shí),需要對交換機(jī)的能力進(jìn)行考慮。

本文大綱如下。首先介紹交換機(jī)轉(zhuǎn)發(fā)模型的概念,接下來,闡明用于描述協(xié)議獨(dú)立數(shù)據(jù)包處理的新語言需求。然后提出一個(gè)簡單的示例,示例中支持有新的數(shù)據(jù)包頭字段以及在多個(gè)階段對數(shù)據(jù)包進(jìn)行處理。我們用這個(gè)示例探索P4程序如何配置頭,數(shù)據(jù)包解析器,多個(gè)匹配+動(dòng)作表,以及對這些表控制的控制流。最后,討論編譯器如何將P4映射到目標(biāo)交換機(jī)。

2 抽象轉(zhuǎn)發(fā)模型

圖2顯示了我們的抽象模型,交換機(jī)通過可編程解析器轉(zhuǎn)發(fā)數(shù)據(jù)包,然后是多個(gè)匹配+動(dòng)作階段,按串行,并行或兩者的組合排列。首先,OpenFlow假定的是固定的解析器,而我們的模型支持可編程解析器允許定義新的頭字段。第二,OpenFlow假定match+action階段是串行的,而我們的模型則可以并行的或者串行。第三,我們的模型假定,所有的動(dòng)作由交換機(jī)支持的數(shù)據(jù)獨(dú)立協(xié)議原語組成。

我們的概念模型總結(jié)了數(shù)據(jù)包如何通過不同的技術(shù)進(jìn)行處理。這讓我們設(shè)計(jì)了一個(gè)更通用的語言(P4)來體現(xiàn)數(shù)據(jù)包是如何通過抽象模型處理的。因此,程序員可以創(chuàng)建目標(biāo)無關(guān)的程序,通過編譯器映射到不同的轉(zhuǎn)發(fā)設(shè)備。

轉(zhuǎn)發(fā)模型由兩種操作控制:配置和填充。配置操作編程解析器,設(shè)置匹配+動(dòng)作階段的順序,并且配置每個(gè)階段如何處理頭字段。填充操作,在匹配+動(dòng)作表中添加(刪除)流表項(xiàng),這個(gè)表在配置操作進(jìn)行時(shí),就配置好。填充確定在任何給定時(shí)間應(yīng)用到數(shù)據(jù)包的策略。

為了本文的目的,我們假定配置和填充是處于兩個(gè)不同的階段。交換機(jī)在配置階段不需要處理數(shù)據(jù)包,但是,我們?nèi)匀幌M?#xff0c;在重配、升級(jí)的時(shí)間里,仍然可以進(jìn)行數(shù)據(jù)包處理。

首先是解析器對到來的數(shù)據(jù)包進(jìn)行處理。數(shù)據(jù)包數(shù)據(jù)部分假定為分別緩存,并且不能夠進(jìn)行匹配。解析器從頭部識(shí)別、解析出字段,并且因此定義交換機(jī)支持的協(xié)議。模型未對協(xié)議頭的含義進(jìn)行假定,僅僅是解析的表示(解析到的東西)定義了匹配+動(dòng)作的集合。

接下來,解析出來的頭字段通過匹配+動(dòng)作表,匹配+動(dòng)作表被分在進(jìn)入和出去兩部分之間,兩者可能修改數(shù)據(jù)包頭,進(jìn)入的匹配+動(dòng)作決定了出去的端口,以及決定了數(shù)據(jù)包放置的隊(duì)列?;谶M(jìn)入口處理,數(shù)據(jù)包可能被轉(zhuǎn)發(fā)、復(fù)制(組播或者控制平面)、丟棄,或者觸發(fā)流控制。出口匹配+動(dòng)作對每一個(gè)數(shù)據(jù)包頭實(shí)例進(jìn)行修改。動(dòng)作表可以與流關(guān)聯(lián),以追蹤幀到幀的數(shù)據(jù)狀態(tài)。

數(shù)據(jù)包在多個(gè)階段之間可以攜帶額外的信息(數(shù)據(jù)包處理時(shí)產(chǎn)生),我們將這些信息稱之為元數(shù)據(jù),可以類似數(shù)據(jù)包頭字段那樣被識(shí)別。元數(shù)據(jù)例子比如,進(jìn)入端口、傳輸目的、和隊(duì)列,時(shí)間戳可以用于數(shù)據(jù)包調(diào)度,有些數(shù)據(jù)(比如虛擬網(wǎng)標(biāo)識(shí)符)在表與表之間傳輸是不會(huì)改變的。

排隊(duì)原則的處理與現(xiàn)在的OpenFlow協(xié)議一樣:一個(gè)動(dòng)作映射一個(gè)數(shù)據(jù)包到一個(gè)隊(duì)列,這個(gè)隊(duì)列配置為接收特殊服務(wù)規(guī)則。服務(wù)規(guī)則作為交換機(jī)配置的一部分。通過添加動(dòng)作原語可以允許程序員實(shí)現(xiàn)新的或者現(xiàn)存的擁塞控制協(xié)議。

3 可編程語言

我們使用抽象的轉(zhuǎn)發(fā)模型來表達(dá)交換機(jī)是如何配置以及處理數(shù)據(jù)包的。TTL字段必須減小并且測試,隧道頭字段可能需要添加,總和可能需要計(jì)算,這促使P4使用指令控制流編程來表述頭字段的處理(通過聲明的頭類型和原語動(dòng)作集合)。

數(shù)據(jù)包處理語言必須能夠讓開發(fā)者表達(dá)在頭字段之間的(明確的或隱式的)依賴關(guān)系,依賴關(guān)系決定了數(shù)據(jù)包在;哪些表中可以并行運(yùn)行。比如,由于在IP路由表和ARP表之間的依賴關(guān)系,順序執(zhí)行要求一個(gè)IP路由表和一個(gè)ARP表。依賴關(guān)系可以通過分析TDGs(依賴關(guān)系表)進(jìn)行識(shí)別。這些圖表(TDGs)描述了字段的輸入,動(dòng)作,表之間的控制流。圖3顯示了L2/L3層交換機(jī)之間的依賴圖例子。TDG節(jié)點(diǎn)直接映射動(dòng)作表和在管道的依賴分析識(shí)別。不幸的是,TDGs對大多數(shù)程序員來說是不可取的,因?yàn)樗麄冓呄蛴谡J(rèn)為使用命令構(gòu)建而不是圖表表達(dá)數(shù)據(jù)包處理算法。

這促使我們提出兩步編譯處理。在最高級(jí)別層,編程人員使用命令語言表達(dá)數(shù)據(jù)包處理程序來代表控制流(P4),這種情況下,編譯器將P4語言表示部分翻譯到TDG上,進(jìn)行依賴關(guān)系分析,接著匹配TDG到具體的目標(biāo)交換機(jī)。P4的設(shè)計(jì)是為了更方便的將一個(gè)P4程序翻譯到TDG上

4 P4語言舉例

我們通過深度研究一些例子以探索P4。在核心和邊緣的網(wǎng)絡(luò)部署是有區(qū)別的。終端主機(jī)直接與邊緣設(shè)備相連,邊緣設(shè)備再通過高帶寬的核心進(jìn)行互連。所有的協(xié)議都是設(shè)計(jì)以支持這個(gè)結(jié)構(gòu)(比如MPLS,PortLand),目的是簡化核心部分的轉(zhuǎn)發(fā)。

考慮使用top-of-rack(ToR)交換機(jī)通過兩層核心連接部署2級(jí)網(wǎng)絡(luò)。我們假設(shè)終端主機(jī)的數(shù)量不斷增長,L2核心交換機(jī)不斷溢出。MPLS是簡化核心的一個(gè)選項(xiàng),但是使用多個(gè)標(biāo)簽進(jìn)行實(shí)現(xiàn)分發(fā)控制協(xié)議是艱難的任務(wù)。PortLand協(xié)議看起來很有趣,但是需要重寫MAC地址,可能會(huì)破壞現(xiàn)有的網(wǎng)絡(luò)調(diào)試工具,并且需要新的代理來response請求。

P4讓我們能夠使用傳統(tǒng)的解決方法,并且對現(xiàn)在的網(wǎng)絡(luò)架構(gòu)只需做微小的改變。我們將用于學(xué)習(xí)的樣例稱之為mTag(可以認(rèn)為是一種機(jī)制,用來P4進(jìn)行描述):它結(jié)合了攜帶簡單MPLS類似的標(biāo)簽的PortLand多級(jí)路由協(xié)議。通過核心的路由由32bit的標(biāo)簽編碼而成,一個(gè)32bit的標(biāo)簽由四個(gè)單字節(jié)的字段組成。32bit的標(biāo)簽可以攜帶源路由或者目的定位信息(比如PortLand的PseudoMac)。每個(gè)核心交換機(jī)只要檢測標(biāo)簽的一個(gè)bit并且檢驗(yàn)信息。我們的例子中,標(biāo)簽是通過 第一個(gè)ToR交換機(jī)添加的,盡管,這同樣會(huì)在終端機(jī)NIC上進(jìn)行添加。mTag的例子是為了將我們的注意放在P4語言上。在實(shí)踐中,P4程序?qū)τ谡麄€(gè)交換機(jī)來說會(huì)更加復(fù)雜。

4.1 P4概念

P4程序的定義包含以下組件的定義:

  • 1.首部Headers:首部的定義描述了一系列首部區(qū)域的順序和結(jié)構(gòu)。它包含區(qū)域長度的規(guī)范,約束了區(qū)域數(shù)據(jù)的取值。
  • 2.解析器Parsers:解析器的定義描述了如何識(shí)別數(shù)據(jù)包內(nèi)的首部和有效的首部順序。
  • 3.表Tables:“匹配–動(dòng)作”表是執(zhí)行數(shù)據(jù)包處理的機(jī)制。P4程序定義的首部區(qū)域可能會(huì)用于匹配,或者在其上執(zhí)行特定的動(dòng)作。
  • 4.動(dòng)作Actions:P4支持通過更簡單的協(xié)議無關(guān)的原語構(gòu)造復(fù)雜的執(zhí)行動(dòng)作。這些復(fù)雜的動(dòng)作可以在“匹配 – 動(dòng)作”表中使用。
  • 5.控制程序Control Programs:控制程序決定了“匹配 – 動(dòng)作”表處理數(shù)據(jù)包的順序。一個(gè)簡單又必要的程序描述了“匹配 – 動(dòng)作”表之間的控制流。

接下來,我們將展示,在P4中,這些組件是如何幫助的mTag實(shí)現(xiàn)理想的處理器。

4.2 首部格式

從首部格式的規(guī)范開始設(shè)計(jì)。通常,每一個(gè)頭部的配置是通過聲明字段名字和寬度的集合組成。可選的字段聲明允許我們對不同大小的字段約束值的范圍和最大長度。比如,標(biāo)準(zhǔn)以太網(wǎng)和VLAN的頭配置如下所示:

header ethernet {fields {dst_addr: 48; // width in bitssrc_addr: 48;ethertype: 16;} } header vlan {fields {pcp: 3;cfi: 1;vid: 12;ethertype: 16;} }

mTag首部可以不修改現(xiàn)有的聲明而進(jìn)行添加。字段名表名核心層有兩層匯聚。每一個(gè)核心交換機(jī)都被編寫了一些規(guī)則來檢查這些字節(jié)中的某一個(gè)。具體檢查哪一個(gè)字節(jié),是由字節(jié)在交換機(jī)所處層次位置和數(shù)據(jù)流的方向(上或下)決定的。

header mTag {fields {up1: 8;up2: 8;down1: 8;down2: 8;ethertype: 16;} }

4.3 數(shù)據(jù)包解析器

P4假設(shè)底層交換機(jī)可以實(shí)現(xiàn)一個(gè)狀態(tài)機(jī),這個(gè)狀態(tài)機(jī)能夠自頭至尾橫貫數(shù)據(jù)包的各個(gè)首部,隨著狀態(tài)機(jī)的行進(jìn)提取首部區(qū)域的值。提取出來的首部區(qū)域值被送入“匹配–動(dòng)作”表進(jìn)行處理。P4把狀態(tài)機(jī)直接描述成從一個(gè)首部到下一個(gè)首部的過渡轉(zhuǎn)移的集合。每一個(gè)過渡轉(zhuǎn)移可能會(huì)被當(dāng)前首部中的值觸發(fā)。

parser start {ethernet; } parser ethernet {switch (ethertype) {case 0x8100:vlan;case 0x9100:vlan;case 0x800:ipv4;// Other cases} } parser vlan {switch (ethertype) {case 0xaaaa:mTag;case 0x800:ipv4;// Other cases} } parser mTag {switch (ethertype) {case 0x800:ipv4;// Other cases} }

數(shù)據(jù)包的解析從start狀態(tài)開始,一直行進(jìn)直到到達(dá)了明確的stop狀態(tài)或是遭遇到無法處理的情況(這可能被標(biāo)記成錯(cuò)誤)。在到達(dá)了對應(yīng)下一個(gè)首部的狀態(tài)時(shí),狀態(tài)機(jī)根據(jù)首部的規(guī)范描述提取出首部,然后根據(jù)狀態(tài)機(jī)的下一個(gè)過渡轉(zhuǎn)移繼續(xù)向前行進(jìn)。提取出來的首部被送往交換機(jī)流水線后半部分的“匹配+動(dòng)作”的處理過程。

4.4 表的規(guī)范

接下來,開發(fā)者需要描述定義首部區(qū)域(字段)如何在“匹配– 動(dòng)作”階段進(jìn)行匹配(比如它們應(yīng)該被精確匹配,范圍匹配還是通配符匹配),以及當(dāng)成功匹配之后將執(zhí)行什么動(dòng)作。

在我們簡單的mTag例子中,邊緣交換機(jī)匹配二層目的地和VLAN ID,然后選擇一個(gè)mTag添加到首部中。開發(fā)者定義一張表來匹配這些區(qū)域(字段),以及執(zhí)行一個(gè)添加mTag首部的動(dòng)作(見后文)。其中的reads屬性聲明了要匹配哪些首部區(qū)域(字段),同時(shí)限定了匹配類型(精確匹配、三重匹配等)。actions屬性列出了“匹配–動(dòng)作”表可能會(huì)對數(shù)據(jù)包執(zhí)行的動(dòng)作。動(dòng)作將會(huì)在本文后續(xù)部分講解。max_size屬性指明了“匹配–動(dòng)作”表需要能夠支持多少條表項(xiàng)。

表的規(guī)范允許P4編譯器決定存儲(chǔ)表需要多大的存儲(chǔ)空間,以及在什么樣的存儲(chǔ)器(比如TCAM或SRAM)上實(shí)現(xiàn)這個(gè)表。

table mTag_table {reads {ethernet.dst_addr: exact;vlan.vid: exact;}actions {// At runtime, entries are programmed with params// for the mTag action. See below.add_mTag;}max_size: 20000; }

為了展示的完整性和后續(xù)討論的便利,我們在此展示其他表的簡短定義,這些表將在控制程序一節(jié)中引用。

table source_check {// Verify mtag only on ports to the corereads {mtag: valid; // Was mtag parsed? metadata.ingress_port: exact;}actions { // Each table entry specifies *one* action// If inappropriate mTag, send to CPUfault_to_cpu;// If mtag found, strip and record in metadata//剝離和記錄元數(shù)據(jù)strip_mtag;// Otherwise, allow the packet to continuepass;}max_size: 64; // One rule per port } table local_switching {// Reads destination and checks if local// If miss occurs, goto mtag table. } table egress_check {// Verify egress is resolved// Do not retag packets received with tag// Reads egress and whether packet was mTagged }

4.5 動(dòng)作規(guī)范

P4定義了一個(gè)基本動(dòng)作的集合,可以利用它們構(gòu)造復(fù)雜的動(dòng)作。每個(gè)P4程序都聲明了一個(gè)動(dòng)作功能的集合,動(dòng)作功能由動(dòng)作原語編寫而成;這些動(dòng)作功能簡化了表的規(guī)范和下發(fā)。P4假設(shè)一個(gè)動(dòng)作功能中的原語是并行執(zhí)行的。(沒有并行執(zhí)行能力的交換設(shè)備可能會(huì)模擬并行的過程。)

適用于上述的add_mTag動(dòng)作的實(shí)現(xiàn)如下:

action add_mTag(up1, up2, down1, down2, egr_spec) {add_header(mTag);// Copy VLAN ethertype to mTagcopy_field(mTag.ethertype, vlan.ethertype);// Set VLAN’s ethertype to signal mTagset_field(vlan.ethertype, 0xaaaa);set_field(mTag.up1, up1);set_field(mTag.up2, up2);set_field(mTag.down1, down1);set_field(mTag.down2, down2);// Set the destination egress port as wellset_field(metadata.egress_spec, egr_spec); }

如果某個(gè)動(dòng)作需要有輸入?yún)?shù)(例如mTag中的up1值),參數(shù)將會(huì)在運(yùn)行時(shí)由匹配表提供。

在這個(gè)例子中,交換機(jī)將mTag標(biāo)簽插入在VLAN標(biāo)簽之后,復(fù)制VLAN標(biāo)簽的Ethertype字段到mTag中,以指明后續(xù)類型為mTag,然后設(shè)置VLAN標(biāo)簽的Ethertype字段為0xaaaa,表明其后跟隨的是mTag標(biāo)簽。在邊緣交換機(jī)上執(zhí)行的相反動(dòng)作沒有展示出來,這些動(dòng)作將會(huì)從數(shù)據(jù)包中剝?nèi)Tag標(biāo)簽。

P4的基本動(dòng)作包括:

1.Set_field:將首部中的某一特定區(qū)域設(shè)置為特定的值,支持帶掩碼的設(shè)置;

2.Copy_field:將一個(gè)首部區(qū)域的值拷貝到另一首部區(qū)域中;

3.Add_header:添加一個(gè)有效的特定的首部(以及它所有的首部區(qū)域);

4.Remove_header:從數(shù)據(jù)包中刪除(pop取出)一個(gè)首部(以及它所有的首部區(qū)域);

5.Increment:遞增或遞減一個(gè)首部區(qū)域的值;

6.Checksum:計(jì)算首部區(qū)域的一些集合的校驗(yàn)和(比如IPv4校驗(yàn)和)。

我們期望大多數(shù)交換設(shè)備上的實(shí)現(xiàn)將會(huì)約束動(dòng)作的處理,只允許與特定的數(shù)據(jù)包格式相一致的首部進(jìn)行修改操作。

4.6 控制程序

一旦表和動(dòng)作被定義好,接下來僅剩的任務(wù)就是指定從一個(gè)表轉(zhuǎn)移到下一個(gè)表的控制流??刂屏髯鳛橐粋€(gè)程序通過一個(gè)函數(shù)、條件和表的引用組成的集合進(jìn)行指定。

圖4-1為邊緣交換機(jī)上的mTag實(shí)現(xiàn)展示了一個(gè)期望的控制流的圖形化表示。在包解析之后,source_check表確認(rèn)接收到的數(shù)據(jù)包和入端口是否一致。例如,mTag只應(yīng)該存在于連接到核心交換機(jī)的端口上。source_check也會(huì)從數(shù)據(jù)包中剝?nèi)Tag標(biāo)簽,同時(shí)在元數(shù)據(jù)中記錄數(shù)據(jù)包是否擁有mTag標(biāo)簽。流水線中后續(xù)的表可能會(huì)匹配這個(gè)元數(shù)據(jù)以避免再次往數(shù)據(jù)包中添加標(biāo)簽。

local_switching表稍后將會(huì)被運(yùn)行。如果沒有匹配上,就意味著這個(gè)數(shù)據(jù)包的目的地不是連接在同一個(gè)交換機(jī)上的主機(jī)。在這種情況下,mTag_table表(上述定義的)將會(huì)用來匹配這個(gè)數(shù)據(jù)包。本地和送往核心層的轉(zhuǎn)發(fā)控制都可以被egress_check表處理。這個(gè)表將會(huì)在轉(zhuǎn)發(fā)目的地未知的情況下,上送一個(gè)通知到SDN控制層。

這一包處理流水線的必要描述如下:

control main() { // Verify mTag state and port are consistent //驗(yàn)證mTag 是否合法,端口與連接到核心交換機(jī)的端口是否一致。 table(source_check);// If no error from source_check, continue if (!defined(metadata.ingress_error)) { // Attempt to switch to end hosts table(local_switching);if (!defined(metadata.egress_spec)) { // Not a known local host; try mtagging table(mTag_table); }// Check for unknown egress state or // bad retagging with mTag. table(egress_check); } }

5 編譯P4程序

為了讓網(wǎng)絡(luò)能夠?qū)崿F(xiàn)我們的P4程序,我們需要編譯器來把目標(biāo)無關(guān)的描述映射到目標(biāo)交換機(jī)的特定硬件或軟件平臺(tái)上。完成這個(gè)工作涉及分配目標(biāo)的資源并且為設(shè)備生成合適的配置。

5.1 編譯包解析器

對于有可編程包解析器的設(shè)備,編譯器將解析器描述翻譯成解析狀態(tài)機(jī)。對于固定的解析器,編譯器僅僅確認(rèn)解析器描述與目標(biāo)設(shè)備的解析器是一致的。生成一個(gè)狀態(tài)機(jī)的細(xì)節(jié)和有關(guān)狀態(tài)表項(xiàng)的細(xì)節(jié),可以在[16]中找到。

表2展示了上述解析器中vlan和mTag部分的狀態(tài)表項(xiàng)。每一條表項(xiàng)指明了當(dāng)前的狀態(tài)、用于匹配的區(qū)域的值以及即將跳轉(zhuǎn)的下一狀態(tài)。為了展示的簡潔性,其他行被忽略。

5.2 編譯控制程序

§4.6中必要的控制流描述是一種方便的指定交換機(jī)的邏輯轉(zhuǎn)發(fā)行為的方法,但它不能明確地表示出表之間的依賴和并發(fā)執(zhí)行的機(jī)會(huì)。因此我們部署一個(gè)編譯器來分析控制程序,幫助我們識(shí)別依賴以及尋找能夠并發(fā)處理首部區(qū)域的機(jī)會(huì)。最終,編譯器為交換設(shè)備生成目標(biāo)配置。目標(biāo)設(shè)備有很多種可能,例如軟件交換機(jī)[17]、多核軟件交換機(jī)[18]、NPU[19]、固定功能的交換機(jī)[20],或是可重配置的匹配表(RMT)流水線[2]。


轉(zhuǎn)載于:https://www.cnblogs.com/Pan-xi-yi/p/9813402.html

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的P4: Programming Protocol-Independent Packet Processors的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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