p4 运行虚拟交换机(simple_switch)

p4运行simple_switch

编译p4程序

p4c -b bmv2 mine.p4 -o mine.bmv2

搭建网络拓扑

# First pair: veth0-veth1
sudo ip link add name veth0 type veth peer name veth1
sudo ip link set dev veth0 up
sudo ip link set dev veth1 up
sudo ip link set veth0 mtu 9500
sudo ip link set veth1 mtu 9500
sudo sysctl net.ipv6.conf.veth0.disable_ipv6=1
sudo sysctl net.ipv6.conf.veth1.disable_ipv6=1

# Second pair: veth2-veth3
sudo ip link add name veth2 type veth peer name veth3
sudo ip link set dev veth2 up
sudo ip link set dev veth3 up
sudo ip link set veth2 mtu 9500
sudo ip link set veth3 mtu 9500
sudo sysctl net.ipv6.conf.veth2.disable_ipv6=1
sudo sysctl net.ipv6.conf.veth3.disable_ipv6=1

# Second pair: veth4-veth5
sudo ip link add name veth4 type veth peer name veth5
sudo ip link set dev veth4 up
sudo ip link set dev veth5 up
sudo ip link set veth4 mtu 9500
sudo ip link set veth5 mtu 9500
sudo sysctl net.ipv6.conf.veth4.disable_ipv6=1
sudo sysctl net.ipv6.conf.veth5.disable_ipv6=1

BMv2 运行p4程序

普通运行
sudo simple_switch -i 0@veth0 -i 1@veth2 -i 2@veth4 mine.bmv2/mine.json &
运行时切换p4程序
  1. 在运行simple_switch时加入--enable-swap参数

    sudo simple_switch -i 0@veth0 -i 1@vetn2 -i 2@veth4 mine.bmv2/mine.json -- --enable-swap &
    

  1. 启动运行时CLI

    simple_switch_CLI --thrift-port 9090 # 9090 为thrift默认端口(或者 simple_switch_CLI)
    

simple_switch_CLI 充当控制器

查看全部表格
show_tables

查看表格信息
table_info ipv4_lpm # table_info <table-name>

添加转发规则
table_add <table-name> <action-name> <match-data> => <parameter>

比如:

table_add ipv4_lpm ipv4_forward 10.10.0.0/16 => 0
table_add ipv4_lpm ipv4_forward 20.20.0.0/16 => 1
table_add ipv4_lpm ipv4_forward 30.30.0.0/16 => 2

查看转发流表
table_dump ipv4_lpm # table_dump <table-name>

监听端口

tcpdump
sudo tcpdump -n -i veth3 # sudo tcpdump -n -i <dev-name>

wireshark

可视化界面直接抓包即可

注入数据包

scapy
  1. 启动程序

    sudo scapy
    

  1. 生成数据包

    p = Ether()/IP(dst="12.12.1.1")/UDP()
    

  1. 从 veth1 端口注入

    sendp(p, iface="veth1")
    

端口监听结果:收到包和转发了该包

切换p4程序

此处修改了代码逻辑(添加了Egress处理)

  • 加载新的配置文件

    1. load_new_config_file: 将新的json配置推送至目标交换机,此时数据平面尚未改变,换句话说,目标交换机仍然按照先前的配置(或P4程序)对来访的数据报进行处理;然而,控制平面需要按照新的配置和P4程序下发控制规则,但这些控制规则目前不会影响数据平面的处理;

      load_new_config_file <json-path>
      

  1. swap_configs: 在数据平面启用新的json配置

    swap_configs
    

  • 后续操作与以上操作类似

ERROR

无法绑定同一个thrift端口

posted @ 2021-06-03 19:58  10249421  阅读(923)  评论(1编辑  收藏  举报