P4語法(2) Parser

這裏參考學習了:html

P4語言規範學習

P4臺灣社羣spa


Parser

關於parser

在P4程序中,有着大量的首部(header)和首部實例,但每次只有部分首部實例會對數據包進行操做,而parser會用於生成描述數據包進行哪些匹配動做操做的中間表示(Intermediate Representation),這些解析後表示規定了對數據包生效的實例,能夠認爲是一組對數據包生效的實例的集合。code

p416中的parser

不一樣於p414,不須要定義多個parser,並在多個parser間切換,只須要定義一個parser,並在parser中寫不一樣的狀態(state),經過accept(接受)和reject(拒絕)決定parser是否成功解析一個包。htm

類型聲明

參數中至少有一個參數packet_in,表示處理的接受數據包。輸出內容能夠是struct或者通常的封包參照。blog

1 parser parsername(packet_in pkt,out ...)

其起始方式依然以start開始: ip

 1 parser parsername(packet_in pkt,out ...){
 2 
 3     state start{
 4         ...
 5     }
 6     
 7     state state_name{
 8         ...
 9     }
10 }

 

對於其中經常使用的關鍵字語法:get

  • extract:將目前的packet以特定的header取出來,取出來的各部分長度以header定義的爲主。
  • select:相似於c中的switch case語法,取決於參數經過transition關鍵字決定接下來的跳轉方向,另外一個parser state 或 control function。
  • transition:在不一樣的state之間切換。

這裏給出一個以太網ipv4的parser例子:it

 1 parser parser_ipv4(packet_in pkt,out eth,out ipv4){
 2     
 3     state start{
 4         transition eth;//先轉至以太網部分處理。
 5     }
 6     
 7     state eth{
 8         pkt.extract(eth);
 9         //根據以太網首部類型判斷,除了ipv4之外的都拋出。
10         transition select(eth.ethType){
11             0x0800:i4;
12             _:reject;//其他狀況拒絕拋出。
13         }
14     }
15     
16     state i4{
17         pkt.extract(ipv4);
18         transition accept;//接受
19     }
20 }

對於ipv6也是一個相似的邏輯:io

 1 parser parser_ipv6(packet_in pkt,out eth,out ipv4){
 2     
 3     state start{
 4         transition eth;
 5     }
 6     
 7     state eth{
 8         pkt.extract(eth);
 9         transition select(eth.ethType){
10             0x86DD:i6;
11             _:reject;//其他狀況拒絕拋出。
12         }
13     }
14     
15     state i6{
16         pkt.extract(ipv6);
17         transition accept;//接受
18     }
19 }
相關文章
相關標籤/搜索