這裏參考學習了:html
P4語言規範學習
P4臺灣社羣spa
在P4程序中,有着大量的首部(header)和首部實例,但每次只有部分首部實例會對數據包進行操做,而parser會用於生成描述數據包進行哪些匹配動做操做的中間表示(Intermediate Representation),這些解析後表示規定了對數據包生效的實例,能夠認爲是一組對數據包生效的實例的集合。code
不一樣於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
這裏給出一個以太網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 }