p4思考心得

一个完整的P4环境包括:

  1. P4程序,定义table和table之间的处理逻辑;
  2. 拓扑文件,定义网络拓扑;
  3. 流表文件,定义转发路径;

basic.p4:定义了match-action table的表头

control MyIngress(inout headers hdr,
                  inout metadata meta,
                  inout standard_metadata_t standard_metadata) {
    action drop() {
        mark_to_drop();
    }
    
    action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) {
        standard_metadata.egress_spec = port;
        hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
        hdr.ethernet.dstAddr = dstAddr;
        hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
    }
    
    table ipv4_lpm {
        key = {
            hdr.ipv4.dstAddr: lpm;
        }
        actions = {
            ipv4_forward;
            drop;
            NoAction;
        }
        size = 1024;//match-action表的大小
        default_action = drop();
    }
    
    apply {/上面只是一些定义,真正的数据包处理逻辑在这里。
        //不用管这里if中具体的条件
        //先主要了解 apply 里面时让我们根据一些逻辑条件,定义数据包再流表之间的处理过程。
        if (hdr.ipv4.isValid()) {
            ipv4_lpm.apply();
        }
    }
}

s1-runtime.json:表中的项,比如该程序表示控制平面要往交换机s1中注入四条数据;

{
  "target": "bmv2",
  "p4info": "build/basic.p4info",
  "bmv2_json": "build/basic.json",
  "table_entries": [
    {
      "table": "MyIngress.ipv4_lpm",
      "default_action": true,
      "action_name": "MyIngress.drop",
      "action_params": { }
    },
    {
      "table": "MyIngress.ipv4_lpm",
      "match": {
        "hdr.ipv4.dstAddr": ["10.0.1.1", 32]
      },
      "action_name": "MyIngress.ipv4_forward",
      "action_params": {
        "dstAddr": "00:00:00:00:01:01",
        "port": 1
      }
    },
    {
      "table": "MyIngress.ipv4_lpm",
      "match": {
        "hdr.ipv4.dstAddr": ["10.0.2.2", 32]
      },
      "action_name": "MyIngress.ipv4_forward",
      "action_params": {
        "dstAddr": "00:00:00:02:02:00",
        "port": 2
      }
    },
    {
      "table": "MyIngress.ipv4_lpm",
      "match": {
        "hdr.ipv4.dstAddr": ["10.0.3.3", 32]
      },
      "action_name": "MyIngress.ipv4_forward",
      "action_params": {
        "dstAddr": "00:00:00:03:03:00",
        "port": 3
      }
    }
  ]
}

match-action table:

hdr.ipv4.dstAddr: lpm actions(ipv4_forward(action_params);drop(action_params);NoAction(action_params);)
"10.0.1.1", 32 ipv4_forward("action_params": {"dstAddr": "00:00:00:00:01:01","port": 1})
"10.0.2.2", 32 ipv4_forward("action_params": {"dstAddr": "00:00:00:00:02:02","port": 2})
"10.0.3.3", 32 ipv4_forward("action_params": {"dstAddr": "00:00:00:00:03:03","port": 3})
defult drop()
posted @ 2021-03-25 18:50  没有任何出路  阅读(99)  评论(0)    收藏  举报