P4语言编程快速开始 实践二
參考:P4語言編程快速開始
上一篇系列博客:P4語言編程快速開始 實踐二
Demo 2
本Demo所做的修改及實現的功能:
為simple_router添加一個計數器(counter),該計數器附加(attach)到send_frame表上,每當有數據包通過send_frame表匹配成功并發送數據包時,就會觸發計數器計數。同時,將發往1口(s1-eth1)的所有數據包的data字段前32位數值改為下發流表時指定的數值。
相關修改
1.header.p4
header_type ipv4_t {fields {version : 4;ihl : 4;diffserv : 8;totalLen : 16;identification : 16;flags : 3;fragOffset : 13;ttl : 8;protocol : 8;hdrChecksum : 16;srcAddr : 32;dstAddr: 32;data: 32;//data段遠不止32位,這里僅取前32位以作實驗} }2.添加Indrect counter
counter ingress_addr_count {type : packets;instance_count: 16384; }說明:計數類型為packets,每匹配一個packet進行一次計數。
3.添加action
action set_addr_count(idx,smac,data) {count(ingress_addr_count, idx);//調用計數器計數modify_field(ethernet.srcAddr, smac);//修改包頭源macmodify_field(ipv4.data,data);//修改data段數據 }說明:
新添加的set_addr_count 操作需要傳入3個操作數:idx,smac,data。
idx是counter計數索引,也可通過此索引調用;
smac是源mac地址,因為這里使用set_adrd_count操作替換來原來的rewrite操作,所以需要重新實現rewrite操作;
data是寫入data段的數據。
4.修改流表 => 修改 run_add_demo_entries.bash
python ../../cli/pd_cli.py -p simple_router -i p4_pd_rpc.simple_router -s $PWD/tests/pd_thrift:$PWD/../../testutils -m "add_entry send_frame 1 set_addr_count 1 00:aa:bb:00:00:00 0xffffffff" -c localhost:22222說明:因為修改了send_frame表的actions,所以對應的流表也要根據action進行修改,set_addr_count操作后面加上對應的3個傳入參數。這里筆者設置了counter的idx為1,寫入data段的數據設置為0xffffffff。
驗證:
登錄mininet的CLI,使用h1 ping h2。在添加流表前,h1無法ping h2,然后運行 run_add_demo_entries.bash腳本,并進行對s1-eth1口進行抓包。此時h1能夠ping通h2,分析抓取到的數據包,也可以看到原先IPv4包頭的data段數據的前32位已被改寫成ffffffff。
但是,筆者在實驗的時候,實際情況是無法ping通,猜測其原因是因為tcp字段是非法的,被執行了丟包。
圖一:實驗環境
圖二:wireshark抓包驗證
2017/1/16
轉載于:https://www.cnblogs.com/qq952693358/p/6289673.html
總結
以上是生活随笔為你收集整理的P4语言编程快速开始 实践二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 换样式
- 下一篇: 【原创】Team Foundation