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);//修改包头源mac
     modify_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字段是非法的,被执行了丢包。

885822-20170116145643442-1406896441.jpg
图一:实验环境

885822-20170116145711708-869379623.jpg
图二:wireshark抓包验证

2017/1/16

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值