---
# System prepended metadata

title: 網路模擬-多台Switch設定
tags: [P4, Mininet]

---

# 網路模擬-多台Switch設定

###### tags: `P4`、`Mininet`
----------------------------------------
Question
===
- In this environment, we need to h1、h2 can ping successfully, 2 hosts between 2 swtiches (s1、s2), what should we do that h1 can ping h2?

Environment
===
![](https://i.imgur.com/eNTv8Rz.png)

Codes
===
this is a simply physical forwarding codes, including basic.p4、cmd.txt and  p4app.json :

> basic.p4 ↓
```
/* -*- P4_16 -*- */
#include <core.p4>
#include <v1model.p4>

/*************************************************************************
*********************** H E A D E R S  ***********************************
*************************************************************************/
 
struct metadata {
    /* empty */
}

 

struct headers {
}

 

/*************************************************************************
*********************** P A R S E R  ***********************************
*************************************************************************/

parser MyParser(packet_in packet,
                out headers hdr,
                inout metadata meta,
                inout standard_metadata_t standard_metadata) {

    state start {
        transition accept;
    }

}

 

/*************************************************************************

************   C H E C K S U M    V E R I F I C A T I O N   *************

*************************************************************************/

 

control MyVerifyChecksum(inout headers hdr, inout metadata meta) {  
    apply {  }
}

/*************************************************************************
**************  I N G R E S S   P R O C E S S I N G   *******************
*************************************************************************/
control MyIngress(inout headers hdr,
                  inout metadata meta,
                  inout standard_metadata_t standard_metadata) {
    action drop() {
        mark_to_drop(standard_metadata);
    }

    action forward(bit<9> port) {
        standard_metadata.egress_spec = port;
    }

    table phy_forward {
        key = {
            standard_metadata.ingress_port: exact;
        }

        actions = {
            forward;
            drop;
        }
        size = 1024;
        default_action = drop();
    }

    apply {
        phy_forward.apply();
    }
}

/*************************************************************************
****************  E G R E S S   P R O C E S S I N G   *******************
*************************************************************************/

control MyEgress(inout headers hdr,
                 inout metadata meta,
                 inout standard_metadata_t standard_metadata) {
    apply {  }
}

/*************************************************************************
*************   C H E C K S U M    C O M P U T A T I O N   **************
*************************************************************************/

control MyComputeChecksum(inout headers  hdr, inout metadata meta) {
     apply {
    }
}

/*************************************************************************
***********************  D E P A R S E R  *******************************
*************************************************************************/

control MyDeparser(packet_out packet, in headers hdr) {
    apply {
    }
}

/*************************************************************************
***********************  S W I T C H  *******************************
*************************************************************************/

V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()

) main;

```

> cmd.txt ↓
```
table_add phy_forward forward 1 => 2

table_add phy_forward forward 2 => 1

```

> p4app.json ↓
```
{

  "program": "basic.p4",

  "switch": "simple_switch",

  "compiler": "p4c",

  "options": "--target bmv2 --arch v1model --std p4-16",

  "switch_cli": "simple_switch_CLI",

  "cli": true,

  "pcap_dump": true,

  "enable_log": true,

  "topo_module": {

    "file_path": "",

    "module_name": "p4utils.mininetlib.apptopo",

    "object_name": "AppTopoStrategies"

  },

  "controller_module": null,

  "topodb_module": {

    "file_path": "",

    "module_name": "p4utils.utils.topology",

    "object_name": "Topology"

  },

  "mininet_module": {

    "file_path": "",

    "module_name": "p4utils.mininetlib.p4net",

    "object_name": "P4Mininet"

  },

  "topology": {

    "links": [["h1", "s1"], ["h2", "s1"]],

    "hosts": {

      "h1": {

      },

      "h2": {

      }

    },

    "switches": {

      "s1": {

        "cli_input": "cmd.txt",

        "program": "basic.p4"

      }

    }

  }

}
```

this code is use simple physical forward to connect , and this environment is only have h1、h2、s1 , so we need to add some code , like p4app.json. now this is a new version code by p4app.json. this version code is modify to 2 hosts and 2 switches.
> p4app.json (new version) ↓

```
{

  "program": "basic.p4",

  "switch": "simple_switch",

  "compiler": "p4c",

  "options": "--target bmv2 --arch v1model --std p4-16",

  "switch_cli": "simple_switch_CLI",

  "cli": true,

  "pcap_dump": true,

  "enable_log": true,

  "topo_module": {

    "file_path": "",

    "module_name": "p4utils.mininetlib.apptopo",

    "object_name": "AppTopoStrategies"

  },

  "controller_module": null,

  "topodb_module": {

    "file_path": "",

    "module_name": "p4utils.utils.topology",

    "object_name": "Topology"

  },

  "mininet_module": {

    "file_path": "",

    "module_name": "p4utils.mininetlib.p4net",

    "object_name": "P4Mininet"

  },

  "topology": {
    "assignment_strategy": "l2", 

    "links": [["h1", "s1"], ["h2", "s2"], ["s1", "s2"]],

    "hosts": {

      "h1": {

      },

      "h2": {

      }

    },

    "switches": {

      "s1": {

        "program": "basic.p4"

      },
      "s2": {

        "program": "basic.p4"

      }  

    }

  }

}
```

> As we can see, the code change one rule by "topology", and add 1 switch by "links" and "switches".

> "l2"(layer 2) means when we do ping test, it would setting same LAN in this environment.

Test
===
> use "p4run" to connect the p4 program, and ping h1、h2 first, we can see 2 hosts not working.
![](https://i.imgur.com/H48yqnM.jpg)
>
>![](https://i.imgur.com/qQ4Kv22.jpg)


> we open 2 terminal one by s1, and use "simple_switch_CLI --thrift-port 9090" to connect s1 port.
![](https://i.imgur.com/e6P7MQl.jpg)

> another is for s2, is the same way to connect,but s2 port number is 9091
![](https://i.imgur.com/7EydaNZ.jpg)

> we can check this information to know s1、s2 port number.
![](https://i.imgur.com/Lqkops0.jpg)

> in s1、s2, if we don't know the command, use "help" to check information.
![](https://i.imgur.com/tOqrfD6.jpg)

> use "table_add phy_forward forward 1 => 2" and "table_add phy_forward forward 2 => 1", this command is add rule to s1、s2.
>
> if you don't understand why this command can ping work, use "help [table name], like help table_add", it would show detail information for you.
![](https://i.imgur.com/07gQV1G.jpg)

> now you can do this command "h1 ping h2" on p4 and check hosts can work.
![](https://i.imgur.com/IZo8l9I.jpg)

we also can write a shell to do this test.

![](https://i.imgur.com/p1lJ2Tf.jpg)

![](https://i.imgur.com/5IvXnMu.jpg)

is work!

Reference
===
[p4-basic](http://csie.nqu.edu.tw/smallko/sdn/p4utils-basic.htm)

---
###### 2020-05-25
###### written by **yi-hao tu**