diff options
-rwxr-xr-x | examples/docker/Dockerfile | 2 | ||||
-rw-r--r-- | examples/docker/SRv6_5-node/asciidoc/Readme.adoc | 87 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/asciidoc/resources/SRv6-5node.svg | 2 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/clean_demo.sh | 25 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/hc_configurations/hc_vpp_a_rest_config.sh | 208 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/hc_configurations/hc_vpp_b_rest_config.sh | 59 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/hc_configurations/hc_vpp_c_rest_config.sh | 59 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/hc_configurations/hc_vpp_d_rest_config.sh | 59 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/hc_configurations/hc_vpp_e_rest_config.sh | 207 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/pcap_vpp.sh | 23 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/restart_demo.sh | 27 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/show_configuration.sh | 20 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/start_demo.sh | 222 | ||||
-rwxr-xr-x | examples/docker/SRv6_5-node/watch_int_vpp.sh | 13 | ||||
-rwxr-xr-x | examples/docker/create_image.sh | 3 | ||||
-rwxr-xr-x | examples/docker/utils.sh | 88 |
16 files changed, 1089 insertions, 15 deletions
diff --git a/examples/docker/Dockerfile b/examples/docker/Dockerfile index 2decc50c2..d443fd37a 100755 --- a/examples/docker/Dockerfile +++ b/examples/docker/Dockerfile @@ -6,7 +6,7 @@ ADD . /hc2vpp RUN apt-get update && apt-get install -y \ # Utils - iproute2 iputils-ping net-tools vim-tiny jshon telnet \ + iproute2 iputils-ping net-tools vim-tiny jshon telnet curl \ # VPP package dependencies libnuma1 libssl1.0.0 libmbedcrypto0 libmbedtls10 libmbedx509-0 \ # Honeycomb package dependencies diff --git a/examples/docker/SRv6_5-node/asciidoc/Readme.adoc b/examples/docker/SRv6_5-node/asciidoc/Readme.adoc new file mode 100644 index 000000000..275159632 --- /dev/null +++ b/examples/docker/SRv6_5-node/asciidoc/Readme.adoc @@ -0,0 +1,87 @@ += SRv6-5 node Demo + +Requirements:: + +- docker +- deb packages for honeycomb (hc2vpp) and vpp + +Usage:: + +. download or build vpp and honeycomb deb packages and place them inside _"../packages"_ folder: +- honeycomb-*.deb (hc2vpp is required, use _"hc2vpp/packaging/deb/xenial/debuild.sh"_ to build deb package locally) +- vpp-*.deb +- vpp-lib*.deb +- vpp-plugins*.deb +- you can download vpp packages from +https://nexus.fd.io/content/repositories/fd.io.master.ubuntu.xenial.main/io/fd/[Nexus Fd.io] + +. Run the script _"./create_image.sh"_ in parent directory to create docker image with HC and VPP pre-installed. +It should be added to docker automatically (a tar file of the image can be created as backup, see content of +create_image.sh). +. Start the demo using _"start_demo.sh <demo_type>"_ script where _<demo_type>_ is _"vpp"_ for vpp only setup or _"hc"_ +for setup with honeycomb +. Clean everything with "clean_demo.sh" script +. if you need to restart the whole demo use _"restart_demo.sh <demo_type>"_. You don't have to use the same demo type as +in start_demo script. Current setup will be cleaned and started as a fresh demo. + +Topology:: + +- 5VPP nodes (*vppA* = A::, *vppB* = B::, *vppC* = C::, *vppD* = D::, *vppE* = E::) +- each node was preassigned with IPv6 addresses on host-veth interfaces (marked red) +- green dashed line represents how traffic should flow from source to the destination +- blue dashed line represents return traffic from destination back to source + +image::resources/SRv6-5node.svg[SRv6 5node topology] + +Testing/debuging:: + +. to list configuration for all nodes use `./show_configuration.sh` script +. to test ping for IPv6 use: +- *hostA:* + +_sudo ip netns exec VNET_A ping6 E::1_ + +_sudo ip netns exec VNET_A ping6 E::1 -c 1000 -s 1024 -i 0.0001_ (for bigger flow) +- *hostE:* + +_sudo ip netns exec VNET_E ping6 A::1_ + +_sudo ip netns exec VNET_E ping6 A::1 -c 1000 -s 1024 -i 0.0001_ (for bigger flow) + + + +. to run packet trace simply use _"pcap_vpp.sh"_ script + +e.g. ./pcap_vpp.sh <nodeName> <packetCount> + +_"./pcap_vpp.sh vppA 3"_ + + + +. to observe packet flow use _"watch_int_vpp.sh"_ script + +e.g. ./watch_int_vpp.sh <nodeName> + +_"./watch_int_vpp.sh vppA"_ + +. to check the packet flow on hostE use tcpdump: + +`sudo ip netns exec VNET_E tcpdump -i vethE -vv -c 4` + +Sample packet capture on hostE:: +.... +sudo ip netns exec VNET_E tcpdump -i vethE -vv -c 4 + +tcpdump: listening on vethE, link-type EN10MB (Ethernet), capture size 262144 bytes +12:21:00.210165 IP6 (flowlabel 0x3d90e, hlim 62, next-header ICMPv6 (58) payload length: 64) a::1 > e::1: [icmp6 sum ok] ICMP6, echo request, seq 285 +12:21:00.210250 IP6 (flowlabel 0x8fd85, hlim 64, next-header ICMPv6 (58) payload length: 64) e::1 > a::1: [icmp6 sum ok] ICMP6, echo reply, seq 285 +12:21:01.213350 IP6 (flowlabel 0x3d90e, hlim 62, next-header ICMPv6 (58) payload length: 64) a::1 > e::1: [icmp6 sum ok] ICMP6, echo request, seq 286 +12:21:01.213435 IP6 (flowlabel 0x8fd85, hlim 64, next-header ICMPv6 (58) payload length: 64) e::1 > a::1: [icmp6 sum ok] ICMP6, echo reply, seq 286 +4 packets captured +4 packets received by filter +0 packets dropped by kernel +.... + +Usefull VPP commands:: + +Note: to use vpp commands for this demo use syntax like this: + +`"sudo docker exec vppC vppctl sh hardware"` + +- vppctl show hardware (show interfaces with L2 addresses) +- vppctl show int (show interfaces with counters) +- vppctl show int address (show interfaces with L3 addresses) +- vppctl show sr localsids (shows local sid table) +- vppctl show sr policies (list of configured SR policies) +- vppctl show sr steering-policies (list of configured steering SR policies) +- vppctl show ip6 fib (shows routing table) +- vppctl show ip6 fib <dst_ip_mask> (shows routing table and filter matches by destination IP) diff --git a/examples/docker/SRv6_5-node/asciidoc/resources/SRv6-5node.svg b/examples/docker/SRv6_5-node/asciidoc/resources/SRv6-5node.svg new file mode 100755 index 000000000..c98687ca5 --- /dev/null +++ b/examples/docker/SRv6_5-node/asciidoc/resources/SRv6-5node.svg @@ -0,0 +1,2 @@ +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="741px" height="571px" version="1.1" content="<mxfile userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36" version="8.7.8" editor="www.draw.io" type="google"><diagram id="6e814df7-4c32-5c57-ff26-ff71587e7534" name="Page-1">7Zxbc6s2EIB/jWfah3QQ4uZH39I+tDOd5qHJIwHFpsXIxdhx+usrjMRlkWzsYLA7nMnMgUWAtPqkXS0rj/Bsffg5djer36hPwpGu+YcRno90HWmGzv5LJV+ZxNTHmWAZBz4vVAhegn+JuJNLd4FPtpWCCaVhEmyqQo9GEfGSisyNY/pZLfZBw+pbN+6S1AQvnhvWpX8GfrLKpI6pFfJfSLBciTcjjV9Zu6IwF2xXrk8/SyK8GOFZTGmSHa0PMxKmyhN6ye57VlzNKxaTKGl0AzIc3cPI1rx3ZI3JEzKzR+zdcMdby2uafInms0cwTbOTKav+JhV6Id2xJ04/V0FCXjaulwo/Wecz2SpZh+wMsUP+aBIn5KCsMMrVwPghdE2S+IsV4TdgrrjPQu+2wGJV0rlpc6HL+3qZP6pQBzvgGmmqHYlyrJC9cvrODpbpwWSEj39czl6RXzqhyDOKc7ebjOOP4ED8djSJBK58EOpaXbWmTLO3UKx+XrHTR1EsHt+RYvF5xc4eRbGQWKNPxRrnFTt/FMVCYntVrMwAAcUuhGS7caNcpVDZlYt33weWVu0D3GcfWA2cgMifpK4UO4toRKoKYm2Ov17ZiSZO3tKTn8z09BAkr6IcOy6uZO8gfs35Ajpk9aC72COKyguP0I2XJFGU0eV90VDXMQndJNhXqynrAP6G32nAGpB3de7HCgMB+zBrHr+r7L3BB1kKSyMelOmg9qAjD3mzr0PE/i4iSgxOwdMSIrgBIkaviEBTZ1yJCIbTyrg7RJzziJSA+IskyRdf67m7hDIRjZMVXdLIDX+ldAPAKWaTtzIrr1WO3vIZCbLIJM9B2pjjvS2BZdz73ANNPb527smJhPaqA7DGrZknCShKvDqcexSuQjeIIKslRKCd6xIR8erHtE9NphGzT0ZMHdgn60pG8jiNeBDqkBFZOOdhGNHvnREDxkGg69GYEeAMYTTujhFZAEXNiBe6223gNVoNKY0NatHYNFkM9WttgJFA11obBHDr0NFFsmDQpZBI5pJTvkqLHonZgBHcq9dqAZfEwFdCYkO71aW5qUdVXv7YM6Hm07UbRDVkEnJIqpBsk5j+TWY0pHFhkD7YKgaI3DBYRilpjAPC5NM0NBV4bjjhF9aB74eqSFdMd5GfxrWOkH3QKHnhlULiPFumsRa1EvuCcQwxdEtwIVtCl66pQbr+G48sspFFD9OmV7rI+mdHxYWn7VEpE1YAaZtDcVHEG1d0mzztSbKazPKIZpx/NuJR+HIAM3udIlh5P3CIx490/PyssX8tRfstq+o+GGaNCkcCBTZvAYUsltEZFLMBihwKp+oK2naPUMjiEK1CMZvXoZjNBygAFPDzlY77g0KXBR46g2I+QCECndDT6xUKdeJIS1DMF3UomGyAogJFvm7I3f8efQqxSLwdFFMJFFMOxXSAQgGFLF+nOyjUCTsdQLEYoBAxR6PqaOr2uEco1MlGHZiPAQoVFPmXsV6gUCdKtbUkndahmEyHOAVYfTgggC2JXnUHhSxzqzMoBp+iWH3YdwSFOqLpB3spE2kHPXFdp1DExyrWqKjmYX7fNSmvVBTpm8caV6XfI/smquBu1bw+Lpo3axhEcIeCYdUGkeyzwG0GkTrYNwyiLgbRdc0aBhFMnrDrlqizQYTPxsG8XAsFG1jTLAtjNS7v5UHAHvID34TF3vZsGT+WWHj/X/Axm7W4pgHeq2SDncxRucmnV3w2ItYOHosBj8bbUuC3FQP1yMfN4yCaZHGTL3gZLA/NRaurXvB5BVk9RtLxzUMhEi6K6NjARWm+EGNUuBt6n1w02Mfm7eL9UTFgl4g0SQ/mPqkmXnVeZymdT6/l85W7nT3ON4njGzVGjhYvfVV+RfwIgZ564O52lbcna+35BMG+8vqAcUEGSOxtnNaHoJVqltbHOtv9KhXbpAW26voiDGN945P1QiC7HWPtdHlFWr1yh4VzWXm4accwT5evpfkbp8tbcMfHmfrAvE7sVMqzg6yHWsvBxA22LV40I1SGW300Np4wimnBvmBLEpwwXOJ8ePIJI50yLpgRzuWVc7WdzhnudW4xweRiXrtFxQKDxmyYM3zp5GLBlfq5welcNtgMOJhNdLq84ru4cqspnM2dM5MXdCHH3xr87LT43ZysePHrQ3jxHw==</diagram></mxfile>"><defs/><g transform="translate(0.5,0.5)"><path d="M 177.5 142.5 C 35.5 142.5 0 285 113.6 313.5 C 0 376.2 127.8 513 220.1 456 C 284 570 497 570 568 456 C 710 456 710 342 621.25 285 C 710 171 568 57 443.75 114 C 355 28.5 213 28.5 177.5 142.5 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><ellipse cx="145" cy="225" rx="25" ry="25" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(136.5,218.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="17" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 18px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><b>A::</b></div></div></foreignObject><text x="9" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><ellipse cx="385" cy="225" rx="25" ry="25" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(376.5,218.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="17" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 18px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><b>B::</b></div></div></foreignObject><text x="9" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><ellipse cx="145" cy="425" rx="25" ry="25" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(136.5,418.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="17" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 18px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><b>C::</b></div></div></foreignObject><text x="9" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><ellipse cx="385" cy="425" rx="25" ry="25" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(376.5,418.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="17" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 18px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><b>D::</b></div></div></foreignObject><text x="9" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><ellipse cx="595" cy="325" rx="25" ry="25" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(586.5,318.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="16" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 17px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><b>E<span>::</span></b></div></div></foreignObject><text x="8" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 170 225 L 360 225" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 170 425 L 360 425" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 385 400 L 385 250" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 145 400 L 145 250" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 410 425 L 570 325" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 410 225 L 570 325" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 60 150 L 122.15 202.87" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 126.15 206.28 L 118.55 204.41 L 122.15 202.87 L 123.08 199.07 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 613 343 L 695.77 436.24" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 699.26 440.16 L 691.99 437.25 L 695.77 436.24 L 697.23 432.61 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(263.5,91.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="102" height="17" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 16px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 103px; white-space: nowrap; word-wrap: normal; font-weight: bold; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">SRv6 domain</div></div></foreignObject><text x="51" y="17" fill="#000000" text-anchor="middle" font-size="16px" font-family="Helvetica" font-weight="bold">SRv6 domain</text></switch></g><g transform="translate(148.5,248.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 56px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-vethAC<br />AC::A</font></div></div></foreignObject><text x="27" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(150.5,380.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 56px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-vethAC<br />AC::C</font></div></div></foreignObject><text x="27" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(172.5,426.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="55" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 57px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-vethCD<br />CD::C</font></div></div></foreignObject><text x="28" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(302.5,426.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="55" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 57px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-vethCD<br />CD::D</font></div></div></foreignObject><text x="28" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(412.5,418.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 56px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-vethDE<br />DE::D</font></div></div></foreignObject><text x="27" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(412.5,203.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 55px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-vethBE<br />BE::B</font></div></div></foreignObject><text x="27" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(530.5,282.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 55px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-vethBE<br />BE::E</font></div></div></foreignObject><text x="27" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(530.5,353.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 56px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-vethDE<br />DE::E</font></div></div></foreignObject><text x="27" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(162.5,193.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 55px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-vethAB<br />AB::A</font></div></div></foreignObject><text x="27" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(309.5,193.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 55px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-vethAB<br />AB::B</font></div></div></foreignObject><text x="27" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(327.5,251.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 56px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><div style="text-align: right"><span style="font-size: 10px">host-vethBD</span></div><font style="font-size: 10px"><div style="text-align: right"><span>BD::B</span></div></font></div></div></foreignObject><text x="27" y="18" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(327.5,375.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 56px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><div style="text-align: right"><span style="font-size: 10px">host-vethBD</span></div><font style="font-size: 10px"><div style="text-align: right"><span>BD::D</span></div></font></div></div></foreignObject><text x="27" y="18" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(21.5,133.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="77" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(204, 0, 0); line-height: 1.2; vertical-align: top; width: 78px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font color="#006633"><b>host (A::1/64)</b></font></div></div></foreignObject><text x="39" y="12" fill="#CC0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(661.5,444.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="76" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(204, 0, 0); line-height: 1.2; vertical-align: top; width: 77px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font color="#006633"><b>host (E::1/64)</b></font></div></div></foreignObject><text x="38" y="12" fill="#CC0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(106.5,168.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="47" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 47px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-veth0<br />A::A/64</font></div></div></foreignObject><text x="24" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><g transform="translate(620.5,328.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="47" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(255, 0, 0); line-height: 1.2; vertical-align: top; width: 47px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 10px">host-veth0<br />E::E/64</font></div></div></foreignObject><text x="24" y="20" fill="#FF0000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 60 149 Q 100 199 120 264.5 Q 140 330 115 395 Q 90 460 170 460 Q 250 460 330 455 Q 410 450 450 445 Q 490 440 535 400 Q 580 360 605 370 Q 630 380 674.73 433.67" fill="none" stroke="#00cc00" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="none"/><path d="M 678.57 438.28 L 670.37 434.7 L 674.73 433.67 L 676.52 429.58 Z" fill="#00cc00" stroke="#00cc00" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><path d="M 700 441 Q 620 350 585 355 Q 550 360 470 405.5 Q 390 451 395 325.5 Q 400 200 380 190 Q 360 180 275 185 Q 190 190 87.74 152.81" fill="none" stroke="#0000cc" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="none"/><path d="M 82.1 150.76 L 90.99 149.74 L 87.74 152.81 L 88.25 157.26 Z" fill="#0000cc" stroke="#0000cc" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/></g></svg>
\ No newline at end of file diff --git a/examples/docker/SRv6_5-node/clean_demo.sh b/examples/docker/SRv6_5-node/clean_demo.sh new file mode 100755 index 000000000..2e4a8675b --- /dev/null +++ b/examples/docker/SRv6_5-node/clean_demo.sh @@ -0,0 +1,25 @@ +#! /bin/bash + +if [[ $UID != 0 ]]; then + echo "Please run this script with sudo:" + echo "sudo $0 $*" + exit 1 +fi + +echo "Stopping docker containers:" +sudo docker stop vppA +sudo docker stop vppB +sudo docker stop vppC +sudo docker stop vppD +sudo docker stop vppE +echo "Deleting docker containers:" +sudo docker rm vppA +sudo docker rm vppB +sudo docker rm vppC +sudo docker rm vppD +sudo docker rm vppE + +echo "Cleaning namespaces." +sudo ip -all netns delete + +echo "Cleanup finished." diff --git a/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_a_rest_config.sh b/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_a_rest_config.sh new file mode 100755 index 000000000..35b274116 --- /dev/null +++ b/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_a_rest_config.sh @@ -0,0 +1,208 @@ +#!/usr/bin/env bash +echo "VPPA - configuring routing table for SIDs and policy via HC" +curl --insecure --request PUT \ + --url https://172.17.0.2:8445/restconf/config/vpp-fib-table-management:fib-table-management/vpp-fib-table-management:fib-tables/table/0/vpp-fib-table-management:ipv6 \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "vpp-fib-table-management:table": [ + { + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6", + "name": "ipv6-VRF:0" + } + ] +}' +sleep 1 + +echo "VPPA - configuring local sid A::201 via HC" +curl --insecure --request PUT \ + --url https://172.17.0.2:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/locators/locator/a::/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-base:locator": [ + { + "name": "a::", + "is-default": false, + "prefix": { + "address": "a::", + "length": 64 + }, + "enable": true, + "vpp-ietf-srv6-base:fib-table" : { + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6" + } + } + ] +}' +sleep 1 + +curl --insecure --request PUT \ + --url https://172.17.0.2:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/locators/locator/a::/static/local-sids/sid/513/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-static:sid": [ + { + "opcode": 513, + "end-behavior-type": "ietf-srv6-types:End.DX6", + "end-dx6": { + "paths": { + "path": [ + { + "path-index": 1, + "interface": "host-veth0", + "next-hop": "a::1", + "weight": 1, + "role": "PRIMARY" + } + ] + } + } + } + ] +}' +sleep 1 + +echo "VPPA - configuring encapsulation source via HC" +curl --insecure --request PUT \ + --url https://172.17.0.2:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/hc2vpp-ietf-srv6-base:encapsulation/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-base:encapsulation": { + "ip-ttl-propagation": false, + "source-address": "a::1" + } +}' +sleep 1 + +echo "VPPA - configuring SRv6 policy via HC" +curl --insecure --request PUT \ + --url https://172.17.0.2:8445/restconf/config/hc2vpp-oc-srte-policy:segment-routing \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-oc-srte-policy:segment-routing": { + "traffic-engineering": { + "named-segment-lists": { + "named-segment-list": [{ + "name": "a::e-1", + "config": { + "name": "a::e-1" + }, + "segments": { + "segment": [{ + "index": 1, + "config": { + "index": 1, + "type": "type-2", + "sid-value": "c::100" + } + }, + { + "index": 2, + "config": { + "index": 2, + "type": "type-2", + "sid-value": "d::100" + } + }, + { + "index": 3, + "config": { + "index": 3, + "type": "type-2", + "sid-value": "e::201" + } + }] + } + }] + }, + "policies": { + "policy": [{ + "name": "a::e", + "config": { + "name": "a::e", + "color": 1, + "endpoint": "e::1", + "admin-state": "UP" + }, + "color": 1, + "endpoint": "e::1", + "candidate-paths": { + "candidate-path": [{ + "name": "candidatePath1", + "provisioning-method": "provisioning-method-config", + "preference": 100, + "distinguisher": 0, + "config": { + "name": "candidatePath1", + "provisioning-method": "provisioning-method-config", + "computation-method": "path-explicitly-defined", + "preference": 100, + "distinguisher": 0 + }, + "binding-sid": { + "config": { + "alloc-mode": "explicit", + "type": "srv6", + "value": "a::e" + } + }, + "segment-lists": { + "segment-list": [{ + "name": "a::e-1", + "config": { + "name": "a::e-1", + "weight": 1 + } + }] + } + }] + }, + "autoroute-include": { + "config": { + "metric-type": "constant", + "metric-constant": 0 + }, + "prefixes": { + "config": { + "prefixes-all": false + }, + "prefix": [{ + "ip-prefix": "e::/64", + "config": { + "ip-prefix": "e::/64" + } + }] + } + }, + "binding-sid": { + "config": { + "alloc-mode": "explicit", + "type": "srv6", + "value": "a::e" + } + }, + "vpp-oc-srte-policy:vpp-sr-policy": { + "config": { + "policy-type": "Default", + "policy-behavior": "Encapsulation", + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6" + } + } + }] + } + } + } +}' +sleep 1 diff --git a/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_b_rest_config.sh b/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_b_rest_config.sh new file mode 100755 index 000000000..4ce7dc42b --- /dev/null +++ b/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_b_rest_config.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +echo "VPPB - configuring routing table for SIDs and policy via HC" +curl --insecure --request PUT \ + --url https://172.17.0.3:8445/restconf/config/vpp-fib-table-management:fib-table-management/vpp-fib-table-management:fib-tables/table/0/vpp-fib-table-management:ipv6 \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "vpp-fib-table-management:table": [ + { + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6", + "name": "ipv6-VRF:0" + } + ] +}' +sleep 1 + +echo "VPPB - configuring local sid B::100 via HC" +curl --insecure --request PUT \ + --url https://172.17.0.3:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/locators/locator/b::/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-base:locator": [ + { + "name": "b::", + "is-default": false, + "prefix": { + "address": "b::", + "length": 64 + }, + "enable": true, + "vpp-ietf-srv6-base:fib-table" : { + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6" + } + } + ] +}' +sleep 1 + +curl --insecure --request PUT \ + --url https://172.17.0.3:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/locators/locator/b::/static/local-sids/sid/256/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-static:sid": [ + { + "opcode": 256, + "end-behavior-type": "ietf-srv6-types:End", + "end": { + } + } + ] +}' +sleep 1 diff --git a/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_c_rest_config.sh b/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_c_rest_config.sh new file mode 100755 index 000000000..10ee9d38d --- /dev/null +++ b/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_c_rest_config.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +echo "VPPC - configuring routing table for SIDs and policy via HC" +curl --insecure --request PUT \ + --url https://172.17.0.4:8445/restconf/config/vpp-fib-table-management:fib-table-management/vpp-fib-table-management:fib-tables/table/0/vpp-fib-table-management:ipv6 \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "vpp-fib-table-management:table": [ + { + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6", + "name": "ipv6-VRF:0" + } + ] +}' +sleep 1 + +echo "VPPC - configuring local sid C::100 via HC" +curl --insecure --request PUT \ + --url https://172.17.0.4:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/locators/locator/c::/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-base:locator": [ + { + "name": "c::", + "is-default": false, + "prefix": { + "address": "c::", + "length": 64 + }, + "enable": true, + "vpp-ietf-srv6-base:fib-table" : { + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6" + } + } + ] +}' +sleep 1 + +curl --insecure --request PUT \ + --url https://172.17.0.4:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/locators/locator/c::/static/local-sids/sid/256/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-static:sid": [ + { + "opcode": 256, + "end-behavior-type": "ietf-srv6-types:End", + "end": { + } + } + ] +}' +sleep 1 diff --git a/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_d_rest_config.sh b/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_d_rest_config.sh new file mode 100755 index 000000000..e15ddd393 --- /dev/null +++ b/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_d_rest_config.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +echo "VPPD - configuring routing table for SIDs and policy via HC" +curl --insecure --request PUT \ + --url https://172.17.0.5:8445/restconf/config/vpp-fib-table-management:fib-table-management/vpp-fib-table-management:fib-tables/table/0/vpp-fib-table-management:ipv6 \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "vpp-fib-table-management:table": [ + { + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6", + "name": "ipv6-VRF:0" + } + ] +}' +sleep 1 + +echo "VPPD - configuring local sid D::100 via HC" +curl --insecure --request PUT \ + --url https://172.17.0.5:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/locators/locator/d::/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-base:locator": [ + { + "name": "d::", + "is-default": false, + "prefix": { + "address": "d::", + "length": 64 + }, + "enable": true, + "vpp-ietf-srv6-base:fib-table" : { + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6" + } + } + ] +}' +sleep 1 + +curl --insecure --request PUT \ + --url https://172.17.0.5:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/locators/locator/d::/static/local-sids/sid/256/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-static:sid": [ + { + "opcode": 256, + "end-behavior-type": "ietf-srv6-types:End", + "end": { + } + } + ] +}' +sleep 1 diff --git a/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_e_rest_config.sh b/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_e_rest_config.sh new file mode 100755 index 000000000..01408a159 --- /dev/null +++ b/examples/docker/SRv6_5-node/hc_configurations/hc_vpp_e_rest_config.sh @@ -0,0 +1,207 @@ +#!/usr/bin/env bash +echo "VPPE - configuring routing table for SIDs and policy via HC" +curl --insecure --request PUT \ + --url https://172.17.0.6:8445/restconf/config/vpp-fib-table-management:fib-table-management/vpp-fib-table-management:fib-tables/table/0/vpp-fib-table-management:ipv6 \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "vpp-fib-table-management:table": [ + { + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6", + "name": "ipv6-VRF:0" + } + ] +}' +sleep 1 + +echo "VPPE - configuring local sid E::201 via HC" +curl --insecure --request PUT \ + --url https://172.17.0.6:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/locators/locator/e::/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-base:locator": [ + { + "name": "e::", + "is-default": false, + "prefix": { + "address": "e::", + "length": 64 + }, + "enable": true, + "vpp-ietf-srv6-base:fib-table" : { + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6" + } + } + ] +}' +sleep 1 + +curl --insecure --request PUT \ + --url https://172.17.0.6:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/locators/locator/e::/static/local-sids/sid/513/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-static:sid": [ + { + "opcode": 513, + "end-behavior-type": "ietf-srv6-types:End.DX6", + "end-dx6": { + "paths": { + "path": [ + { + "path-index": 1, + "interface": "host-veth0", + "next-hop": "e::1", + "weight": 1, + "role": "PRIMARY" + } + ] + } + } + } + ] +}' + +echo "VPPE - configuring encapsulation source via HC" +curl --insecure --request PUT \ + --url https://172.17.0.6:8445/restconf/config/hc2vpp-ietf-routing:routing/hc2vpp-ietf-srv6-base:srv6/hc2vpp-ietf-srv6-base:encapsulation/ \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-ietf-srv6-base:encapsulation": { + "ip-ttl-propagation": false, + "source-address": "e::1" + } +}' +sleep 1 + +echo "VPPE - configuring SRv6 policy via HC" +curl --insecure --request PUT \ + --url https://172.17.0.6:8445/restconf/config/hc2vpp-oc-srte-policy:segment-routing \ + --header 'accept: application/json' \ + --header 'authorization: Basic YWRtaW46YWRtaW4=' \ + --header 'content-type: application/json' \ + --data '{ + "hc2vpp-oc-srte-policy:segment-routing": { + "traffic-engineering": { + "named-segment-lists": { + "named-segment-list": [{ + "name": "e::a-1", + "config": { + "name": "e::a-1" + }, + "segments": { + "segment": [{ + "index": 1, + "config": { + "index": 1, + "type": "type-2", + "sid-value": "d::100" + } + }, + { + "index": 2, + "config": { + "index": 2, + "type": "type-2", + "sid-value": "b::100" + } + }, + { + "index": 3, + "config": { + "index": 3, + "type": "type-2", + "sid-value": "a::201" + } + }] + } + }] + }, + "policies": { + "policy": [{ + "name": "e::a", + "config": { + "name": "e::a", + "color": 1, + "endpoint": "a::1", + "admin-state": "UP" + }, + "color": 1, + "endpoint": "a::1", + "candidate-paths": { + "candidate-path": [{ + "name": "candidatePath1", + "provisioning-method": "provisioning-method-config", + "preference": 100, + "distinguisher": 0, + "config": { + "name": "candidatePath1", + "provisioning-method": "provisioning-method-config", + "computation-method": "path-explicitly-defined", + "preference": 100, + "distinguisher": 0 + }, + "binding-sid": { + "config": { + "alloc-mode": "explicit", + "type": "srv6", + "value": "e::a" + } + }, + "segment-lists": { + "segment-list": [{ + "name": "e::a-1", + "config": { + "name": "e::a-1", + "weight": 1 + } + }] + } + }] + }, + "autoroute-include": { + "config": { + "metric-type": "constant", + "metric-constant": 0 + }, + "prefixes": { + "config": { + "prefixes-all": false + }, + "prefix": [{ + "ip-prefix": "a::/64", + "config": { + "ip-prefix": "a::/64" + } + }] + } + }, + "binding-sid": { + "config": { + "alloc-mode": "explicit", + "type": "srv6", + "value": "e::a" + } + }, + "vpp-oc-srte-policy:vpp-sr-policy": { + "config": { + "policy-type": "Default", + "policy-behavior": "Encapsulation", + "table-id": 0, + "address-family": "vpp-fib-table-management:ipv6" + } + } + }] + } + } + } +}' +sleep 1 diff --git a/examples/docker/SRv6_5-node/pcap_vpp.sh b/examples/docker/SRv6_5-node/pcap_vpp.sh new file mode 100755 index 000000000..167d11f9f --- /dev/null +++ b/examples/docker/SRv6_5-node/pcap_vpp.sh @@ -0,0 +1,23 @@ +#! /bin/bash + +vpp_node=$1 +packet_count=$2 + +if [ -z "$1" ]; then + echo "VPP node argument missing!" + echo "Usage:" + echo -e "\n'$0 <vpp_node> <packet_count>' to run this command!\n" + exit 1 +fi + +if [ -z "$2" ]; then + echo "Packet count argument missing!" + echo "Usage:" + echo -e "\n'$0 <vpp_node> <packet_count>' to run this command!\n" + exit 1 +fi + +sudo docker exec ${vpp_node} vppctl clear trace +sudo docker exec ${vpp_node} vppctl trace add af-packet-input ${packet_count} +sleep ${packet_count} +sudo docker exec ${vpp_node} vppctl show trace diff --git a/examples/docker/SRv6_5-node/restart_demo.sh b/examples/docker/SRv6_5-node/restart_demo.sh new file mode 100755 index 000000000..81fdd76e8 --- /dev/null +++ b/examples/docker/SRv6_5-node/restart_demo.sh @@ -0,0 +1,27 @@ +#! /bin/bash + +if [[ $UID != 0 ]]; then + echo "Please run this script with sudo:" + echo "sudo $0 $*" + exit 1 +fi + +if [ -z "$1" ]; then + echo "Demo type argument missing!" + echo "Usage:" + echo -e "\n'$0 <demo_type>' to run this command!\n" + echo "<demo_type> - vpp or hc" + exit 2 +fi + +demo_type=$1 + +if [[ "$demo_type" != "vpp" && "$demo_type" != "hc" ]]; then + echo "Demo type argument is wrong!" + echo "<demo_type> - vpp or hc" + exit 3 +fi + +./clean_demo.sh +sleep 5 +./start_demo.sh ${demo_type} diff --git a/examples/docker/SRv6_5-node/show_configuration.sh b/examples/docker/SRv6_5-node/show_configuration.sh new file mode 100755 index 000000000..9e440f11a --- /dev/null +++ b/examples/docker/SRv6_5-node/show_configuration.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +echo -e "\n\033[1mvppA Configuration:" +echo -e "----------------------------------------------------------------------------------------\033[m" +sudo docker exec vppA vppctl sh sr localsids +sudo docker exec vppA vppctl sh sr policies +sudo docker exec vppA vppctl sh sr steering +echo -e "\n\033[1mvppB Configuration:" +echo -e "----------------------------------------------------------------------------------------\033[m" +sudo docker exec vppB vppctl sh sr localsids +echo -e "\n\033[1mvppC Configuration:" +echo -e "----------------------------------------------------------------------------------------\033[m" +sudo docker exec vppC vppctl sh sr localsids +echo -e "\n\033[1mvppD Configuration:" +echo -e "----------------------------------------------------------------------------------------\033[m" +sudo docker exec vppD vppctl sh sr localsids +echo -e "\n\033[1mvppE Configuration:" +echo -e "----------------------------------------------------------------------------------------\033[m" +sudo docker exec vppE vppctl sh sr localsids +sudo docker exec vppE vppctl sh sr policies +sudo docker exec vppE vppctl sh sr steering diff --git a/examples/docker/SRv6_5-node/start_demo.sh b/examples/docker/SRv6_5-node/start_demo.sh new file mode 100755 index 000000000..83bb66bc7 --- /dev/null +++ b/examples/docker/SRv6_5-node/start_demo.sh @@ -0,0 +1,222 @@ +#! /bin/bash + +source ../utils.sh + +if [[ $UID != 0 ]]; then + echo "Please run this script with sudo:" + echo "sudo $0 $*" + exit 1 +fi + +if [ -z "$1" ]; then + echo "Demo type argument missing!" + echo "Usage:" + echo -e "\n'$0 <demo_type>' to run this command!\n" + echo "<demo_type> - vpp or hc" + exit 2 +fi + +demo_type=$1 + +if [[ "$demo_type" != "vpp" && "$demo_type" != "hc" ]]; then + echo "Demo type argument is wrong!" + echo "<demo_type> - vpp or hc" + exit 3 +fi + +echo "Creating docker containers..." +create_container vppA hc2vpp:latest 0.75 +create_container vppB hc2vpp:latest 0.75 +create_container vppC hc2vpp:latest 0.75 +create_container vppD hc2vpp:latest 0.75 +create_container vppE hc2vpp:latest 0.75 + +echo "Starting docker containers..." +start_container vppA & +start_container vppB & +start_container vppC & +start_container vppD & +start_container vppE & +wait + +# Connect containers using veth interfaces +echo "Creating SRv6 5 node demo topology." +create_link vppA vethAB vethBA vppB +create_link vppA vethAC vethCA vppC +create_link vppB vethBD vethDB vppD +create_link vppB vethBE vethEB vppE +create_link vppC vethCD vethDC vppD +create_link vppD vethDE vethED vppE + +echo "Creating hostA and hostE namespaces." +sudo ip netns add VNET_A +sudo ip netns add VNET_E +create_link VNET_A vethA veth0 vppA +create_link VNET_E vethE veth0 vppE + +sudo ip netns exec VNET_A ip addr add A::1/64 dev vethA +sudo ip netns exec VNET_A ip route add E::/64 via A::A +sudo ip netns exec VNET_E ip addr add E::1/64 dev vethE +sudo ip netns exec VNET_E ip route add A::/64 via E::E + +echo "Starting VPPs in containers:" +start_vpp_in_container vppA & +start_vpp_in_container vppB & +start_vpp_in_container vppC & +start_vpp_in_container vppD & +start_vpp_in_container vppE & +wait + +echo "Configuring VPP interfaces and SRv6 routing:" +echo "vppA:" +#interface setup for A:: +sudo docker exec vppA vppctl create host-interface name veth0 +sudo docker exec vppA vppctl set interface state host-veth0 up +sudo docker exec vppA vppctl set interface ip address host-veth0 A::A/64 +sudo docker exec vppA vppctl create host-interface name vethAB hw-addr 00:00:00:00:ab:0a +sudo docker exec vppA vppctl set interface state host-vethAB up +sudo docker exec vppA vppctl set interface ip address host-vethAB AB::A/64 +sudo docker exec vppA vppctl create host-interface name vethAC hw-addr 00:00:00:00:ac:0a +sudo docker exec vppA vppctl set interface state host-vethAC up +sudo docker exec vppA vppctl set interface ip address host-vethAC AC::A/64 +#setup neighbors +sudo docker exec vppA vppctl set ip6 neighbor host-vethAC C::100 00:00:00:00:ac:0c +sudo docker exec vppA vppctl set ip6 neighbor host-vethAB B::100 00:00:00:00:ab:0b +sudo docker exec vppA vppctl ip route add C::100/128 via host-vethAC +sudo docker exec vppA vppctl ip route add B::100/128 via host-vethAB +#SR setup for A:: +if [[ "$demo_type" = "vpp" ]]; then + echo "VPPA - Configuring SRv6 via VPP:" + sudo docker exec vppA vppctl sr localsid address A::201 behavior end.dx6 host-veth0 A::1 + sudo docker exec vppA vppctl set sr encaps source addr A::1 + sudo docker exec vppA vppctl sr policy add bsid A::E next C::100 next D::100 next E::201 encap + sudo docker exec vppA vppctl sr steer l3 E::/64 via bsid A::E +fi + +echo "vppB:" +#interface setup for B:: +sudo docker exec vppB vppctl create host-interface name vethBA hw-addr 00:00:00:00:ab:0b +sudo docker exec vppB vppctl set interface state host-vethBA up +sudo docker exec vppB vppctl set interface ip address host-vethBA AB::B/64 +sudo docker exec vppB vppctl create host-interface name vethBD hw-addr 00:00:00:00:bd:0b +sudo docker exec vppB vppctl set interface state host-vethBD up +sudo docker exec vppB vppctl set interface ip address host-vethBD BD::B/64 +sudo docker exec vppB vppctl create host-interface name vethBE hw-addr 00:00:00:00:be:0b +sudo docker exec vppB vppctl set interface state host-vethBE up +sudo docker exec vppB vppctl set interface ip address host-vethBE BE::E/64 +#setup neighbors +sudo docker exec vppB vppctl set ip6 neighbor host-vethBA A::201 00:00:00:00:ab:0a +sudo docker exec vppB vppctl set ip6 neighbor host-vethBD D::100 00:00:00:00:bd:0d +sudo docker exec vppB vppctl ip route add A::201/128 via host-vethBA +sudo docker exec vppB vppctl ip route add D::100/128 via host-vethBD +#SR setup for B:: +if [[ "$demo_type" = "vpp" ]]; then + echo "VPPB - Configuring SRv6 via VPP:" + sudo docker exec vppB vppctl sr localsid address B::100 behavior end +fi + +echo "vppC:" +#interface setup for C:: +sudo docker exec vppC vppctl create host-interface name vethCA hw-addr 00:00:00:00:ac:0c +sudo docker exec vppC vppctl set interface state host-vethCA up +sudo docker exec vppC vppctl set interface ip address host-vethCA AC::C/64 +sudo docker exec vppC vppctl create host-interface name vethCD hw-addr 00:00:00:00:cd:0c +sudo docker exec vppC vppctl set interface state host-vethCD up +sudo docker exec vppC vppctl set interface ip address host-vethCD CD::C/64 +#setup neighbors +sudo docker exec vppC vppctl set ip6 neighbor host-vethCD D::100 00:00:00:00:cd:0d +sudo docker exec vppC vppctl set ip6 neighbor host-vethCA A::201 00:00:00:00:ac:0a +sudo docker exec vppC vppctl ip route add D::100/128 via host-vethCD +sudo docker exec vppC vppctl ip route add A::201/128 via host-vethCA +#SR setup for C:: +if [[ "$demo_type" = "vpp" ]]; then + echo "VPPC - Configuring SRv6 via VPP:" + sudo docker exec vppC vppctl sr localsid address C::100 behavior end +fi + +echo "vppD:" +#interface setup for D:: +sudo docker exec vppD vppctl create host-interface name vethDB hw-addr 00:00:00:00:bd:0d +sudo docker exec vppD vppctl set interface state host-vethDB up +sudo docker exec vppD vppctl set interface ip address host-vethDB BD::D/64 +sudo docker exec vppD vppctl create host-interface name vethDC hw-addr 00:00:00:00:cd:0d +sudo docker exec vppD vppctl set interface state host-vethDC up +sudo docker exec vppD vppctl set interface ip address host-vethDC CD::D/64 +sudo docker exec vppD vppctl create host-interface name vethDE hw-addr 00:00:00:00:de:0d +sudo docker exec vppD vppctl set interface state host-vethDE up +sudo docker exec vppD vppctl set interface ip address host-vethDE DE::D/64 +#setup neighbors +sudo docker exec vppD vppctl set ip6 neighbor host-vethDE E::201 00:00:00:00:de:0e +sudo docker exec vppD vppctl set ip6 neighbor host-vethDB B::100 00:00:00:00:bd:0b +sudo docker exec vppD vppctl set ip6 neighbor host-vethDC C::100 00:00:00:00:cd:0c +sudo docker exec vppD vppctl ip route add E::201/128 via host-vethDE +sudo docker exec vppD vppctl ip route add B::100/128 via host-vethDB +sudo docker exec vppD vppctl ip route add C::100/128 via host-vethDC +#SR setup for D:: +if [[ "$demo_type" = "vpp" ]]; then + echo "VPPD - Configuring SRv6 via VPP:" + sudo docker exec vppD vppctl sr localsid address D::100 behavior end +fi + +echo "vppE:" +#interface setup for E:: +sudo docker exec vppE vppctl create host-interface name veth0 +sudo docker exec vppE vppctl set interface state host-veth0 up +sudo docker exec vppE vppctl set interface ip address host-veth0 E::E/64 +sudo docker exec vppE vppctl create host-interface name vethEB hw-addr 00:00:00:00:be:0e +sudo docker exec vppE vppctl set interface state host-vethEB up +sudo docker exec vppE vppctl set interface ip address host-vethEB BE::E/64 +sudo docker exec vppE vppctl create host-interface name vethED hw-addr 00:00:00:00:de:0e +sudo docker exec vppE vppctl set interface state host-vethED up +sudo docker exec vppE vppctl set interface ip address host-vethED DE::E/64 +#setup neighbors +sudo docker exec vppE vppctl set ip6 neighbor host-vethEB B::100 00:00:00:00:be:0b +sudo docker exec vppE vppctl set ip6 neighbor host-vethED D::100 00:00:00:00:de:0d +sudo docker exec vppE vppctl ip route add D::100/128 via host-vethED +sudo docker exec vppE vppctl ip route add B::100/128 via host-vethEB +#SR setup for E:: +if [[ "$demo_type" = "vpp" ]]; then + echo "VPPE - Configuring SRv6 via VPP:" + sudo docker exec vppE vppctl sr localsid address E::201 behavior end.dx6 host-veth0 E::1 + sudo docker exec vppE vppctl set sr encaps source addr E::1 + sudo docker exec vppE vppctl sr policy add bsid E::A next D::100 next B::100 next A::201 encap + sudo docker exec vppE vppctl sr steer l3 A::/64 via bsid E::A +fi + +if [[ "$demo_type" = "hc" ]]; then + hc_plugins=`sudo docker exec vppA dpkg -L honeycomb |grep "io/fd/hc2vpp/srv6"`; + + if [ -z "$hc_plugins" ]; then + echo "NO SRv6 plugins detected for Honeycomb in docker containers!!!" + echo "Ensure that you provided valid honeycomb version" + echo "Then recreate the docker image and restart demo." + exit 4 + fi + + echo "Configuring SRv6 via HC:" + echo "Starting Honeycomb in containers:" + start_hc_in_container vppA & + start_hc_in_container vppB & + start_hc_in_container vppC & + start_hc_in_container vppD & + start_hc_in_container vppE & + wait + + echo "Configuring Honeycomb in containers:" + hc_configurations/hc_vpp_a_rest_config.sh & + hc_configurations/hc_vpp_b_rest_config.sh & + hc_configurations/hc_vpp_c_rest_config.sh & + hc_configurations/hc_vpp_d_rest_config.sh & + hc_configurations/hc_vpp_e_rest_config.sh & + wait +fi + +echo "Demo started." + +echo "Ping hostA -> hostE, desired path: (A::201)->(C::100)->(D::100)->(E::201)" +echo "ip netns exec VNET_A ping6 e::1 -c 10 -i 0.25" +sudo ip netns exec VNET_A ping6 e::1 -c 10 -i 0.25 + +echo "Ping hostE -> hostA, desired path: (E::201)->(D::100)->(B::100)->(A::201)" +echo "ip netns exec VNET_E ping6 a::1 -c 10 -i 0.25" +sudo ip netns exec VNET_E ping6 a::1 -c 10 -i 0.25 diff --git a/examples/docker/SRv6_5-node/watch_int_vpp.sh b/examples/docker/SRv6_5-node/watch_int_vpp.sh new file mode 100755 index 000000000..ef11c5197 --- /dev/null +++ b/examples/docker/SRv6_5-node/watch_int_vpp.sh @@ -0,0 +1,13 @@ +#! /bin/bash + +vpp_node=$1 +packet_count=$2 + +if [ -z "$1" ]; then + echo "VPP node argument missing!" + echo "Usage:" + echo -e "\n'$0 <vpp_node>' to run this command!\n" + exit 1 +fi + +watch -d -n 1 sudo docker exec ${vpp_node} vppctl sh int diff --git a/examples/docker/create_image.sh b/examples/docker/create_image.sh index e00a48cd6..72bc0b1b7 100755 --- a/examples/docker/create_image.sh +++ b/examples/docker/create_image.sh @@ -2,3 +2,6 @@ # Build docker image with vpp and hc2vpp installed docker build -t hc2vpp -f Dockerfile . + +# make backup copy of image (uncomment next line if desired) +# docker save -o hc2vpp-latest.tar hc2vpp:latest diff --git a/examples/docker/utils.sh b/examples/docker/utils.sh index 91e18a6b6..6c90e88c4 100755 --- a/examples/docker/utils.sh +++ b/examples/docker/utils.sh @@ -4,12 +4,19 @@ # # $1 - container name # $2 - image name +# $3 - cpu allocation (default = 1.0) # function create_container { container_name=$1 image_name=$2 - echo "Creating $container_name from $image_name" - docker run -dt --privileged --name=$container_name $image_name + if [ -z "$3" ] + then + cpu="1.0" + else + cpu=$3 + fi + echo "Creating $container_name from $image_name, cpu allocation: $cpu" + docker run -dt --cpus=${cpu} --privileged --name=${container_name} ${image_name} /bin/bash } # Starts container @@ -26,15 +33,67 @@ function start_container { echo "Starting container $container_name" # Remove namespace if it was present - ip netns del $container_name + ip netns del ${container_name} 2> /dev/null # Start container - docker start $container_name + docker start ${container_name} # Make container's network namespaces accessible using ip netns - pid=$(docker inspect -f '{{.State.Pid}}' $container_name) - ln -s /proc/$pid/ns/net /var/run/netns/$container_name - echo "Container $container_name started sucessfully (pid=$pid)" + pid=$(docker inspect -f '{{.State.Pid}}' ${container_name}) + sudo mkdir -p /var/run/netns + sudo ln -sf /proc/${pid}/ns/net /var/run/netns/${container_name} + echo "Container $container_name started successfully (pid=$pid)" +} + +# Starts vpp in container +# +# $1 - container name +# +function start_vpp_in_container { + container=$1 + echo "Starting vpp in $container" + + # Start VPP in container + sudo docker exec -d ${container} ./vpp/start.sh + result="stopped" + echo -e "Waiting for vpp in ${container} to start\n" + while [ "$result" != "started" ] + do + found=`sudo docker exec ${container} vppctl sh int 2> /dev/null |grep "local0"` + if [[ ${found} = *"local0"* ]]; then + result="started" + fi + echo -ne "." + sleep 1 + done + + echo -e "\nVPP in $container started successfully" +} + +# Starts vpp in container +# +# $1 - container name +# +function start_hc_in_container { + container=$1 + echo "Starting hc in $container" + + # Start HC in container + sudo docker exec -d ${container} ./honeycomb/start.sh + match="Honeycomb started successfully!" + result="stopped" + echo "Waiting for hc in ${container} to start" + while [ "$result" != "started" ] + do + found=`sudo docker exec ${container} tail /var/log/honeycomb/honeycomb.log 2> /dev/null | grep "${match}"` + + if [[ ${found} = *"${match}"* ]]; then + result="started" + fi + echo -ne "." + sleep 1 + done + echo -e "\nHC in $container started successfully" } # Links two containers using a veth pair. @@ -49,19 +108,20 @@ function create_link { if1=$2 if2=$3 container2=$4 - echo "Creating link from $container1($if1) to $container2($if2)" - ip link add $if1 type veth peer name $if2 + echo -ne "Creating link from $container1($if1) to $container2($if2)" + ip link add ${if1} type veth peer name ${if2} # Move veth endpoints to corresponding namespaces - ip link set $if1 netns $container1 - ip link set $if2 netns $container2 + ip link set ${if1} netns ${container1} + ip link set ${if2} netns ${container2} # Bring interfaces up - ip netns exec $container1 ip link set $if1 up - ip netns exec $container2 ip link set $if2 up + ip netns exec ${container1} ip link set ${if1} up + ip netns exec ${container2} ip link set ${if2} up # Set interfaces mtu to 9000 to match default VPP mtu values ip netns exec ${container1} ifconfig ${if1} mtu 9000 ip netns exec ${container2} ifconfig ${if2} mtu 9000 - echo "Link created successfully" + + echo " -> done." } |