def test_mpls(self): """ MPLS over ip{6,4} test """ tbl = VppMplsTable(self, 0) tbl.add_vpp_config() self.p_ether = Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) self.p_payload = UDP(sport=1234, dport=1234) / Raw(b'X' * 100) f = FibPathProto # IPv4 transport tun4 = VppIpIpTunInterface(self, self.pg1, self.pg1.local_ip4, self.pg1.remote_ip4).add_vpp_config() tun4.admin_up() tun4.config_ip4() tun4.enable_mpls() # IPv6 transport tun6 = VppIpIpTunInterface(self, self.pg1, self.pg1.local_ip6, self.pg1.remote_ip6).add_vpp_config() tun6.admin_up() tun6.config_ip6() tun6.enable_mpls() # ip routes into the tunnels with output labels r4 = VppIpRoute(self, "1.1.1.1", 32, [ VppRoutePath( tun4.remote_ip4, tun4.sw_if_index, labels=[VppMplsLabel(44)]) ]).add_vpp_config() r6 = VppIpRoute(self, "1::1", 128, [ VppRoutePath( tun6.remote_ip6, tun6.sw_if_index, labels=[VppMplsLabel(66)]) ]).add_vpp_config() # deag MPLS routes from the tunnel r4 = VppMplsRoute( self, 44, 1, [VppRoutePath(self.pg0.remote_ip4, self.pg0.sw_if_index) ]).add_vpp_config() r6 = VppMplsRoute( self, 66, 1, [VppRoutePath(self.pg0.remote_ip6, self.pg0.sw_if_index)], eos_proto=f.FIB_PATH_NH_PROTO_IP6).add_vpp_config() # # Tunnel Encap # p4 = (self.p_ether / IP(src="2.2.2.2", dst="1.1.1.1") / self.p_payload) rxs = self.send_and_expect(self.pg0, p4 * N_PACKETS, self.pg1) for rx in rxs: self.assertEqual(rx[IP].src, self.pg1.local_ip4) self.assertEqual(rx[IP].dst, self.pg1.remote_ip4) self.assertEqual(rx[MPLS].label, 44) inner = rx[MPLS].payload self.assertEqual(inner.src, "2.2.2.2") self.assertEqual(inner.dst, "1.1.1.1") p6 = (self.p_ether / IPv6(src="2::2", dst="1::1") / self.p_payload) rxs = self.send_and_expect(self.pg0, p6 * N_PACKETS, self.pg1) for rx in rxs: self.assertEqual(rx[IPv6].src, self.pg1.local_ip6) self.assertEqual(rx[IPv6].dst, self.pg1.remote_ip6) self.assertEqual(rx[MPLS].label, 66) inner = rx[MPLS].payload self.assertEqual(inner.src, "2::2") self.assertEqual(inner.dst, "1::1") # # Tunnel Decap # p4 = (self.p_ether / IP(src=self.pg1.remote_ip4, dst=self.pg1.local_ip4) / MPLS(label=44, ttl=4) / IP(src="1.1.1.1", dst="2.2.2.2") / self.p_payload) rxs = self.send_and_expect(self.pg1, p4 * N_PACKETS, self.pg0) for rx in rxs: self.assertEqual(rx[IP].src, "1.1.1.1") self.assertEqual(rx[IP].dst, "2.2.2.2") p6 = (self.p_ether / IPv6(src=self.pg1.remote_ip6, dst=self.pg1.local_ip6) / MPLS(label=66, ttl=4) / IPv6(src="1::1", dst="2::2") / self.p_payload) rxs = self.send_and_expect(self.pg1, p6 * N_PACKETS, self.pg0) for rx in rxs: self.assertEqual(rx[IPv6].src, "1::1") self.assertEqual(rx[IPv6].dst, "2::2") tun4.disable_mpls() tun6.disable_mpls()
def test_linux_cp_tun(self): """ Linux CP TUN """ # # Setup # N_PKTS = 31 # create two pairs, wihch a bunch of hots on the phys hosts = [self.pg4, self.pg5] phy = self.pg2 phy.config_ip4() phy.config_ip6() phy.resolve_arp() phy.resolve_ndp() tun4 = VppIpIpTunInterface( self, phy, phy.local_ip4, phy.remote_ip4).add_vpp_config() tun6 = VppIpIpTunInterface( self, phy, phy.local_ip6, phy.remote_ip6).add_vpp_config() tuns = [tun4, tun6] tun4.admin_up() tun4.config_ip4() tun6.admin_up() tun6.config_ip6() pair1 = VppLcpPair(self, tuns[0], hosts[0]).add_vpp_config() pair2 = VppLcpPair(self, tuns[1], hosts[1]).add_vpp_config() self.logger.info(self.vapi.cli("sh lcp adj verbose")) self.logger.info(self.vapi.cli("sh lcp")) self.logger.info(self.vapi.cli("sh ip punt redirect")) # # Traffic Tests # # host to phy for v4 p = (IP(src=tun4.local_ip4, dst="2.2.2.2") / UDP(sport=1234, dport=1234) / Raw()) rxs = self.send_and_expect(self.pg4, p * N_PKTS, phy) # verify inner packet is unchanged and has the tunnel encap for rx in rxs: self.assertEqual(rx[Ether].dst, phy.remote_mac) self.assertEqual(rx[IP].dst, phy.remote_ip4) self.assertEqual(rx[IP].src, phy.local_ip4) inner = IP(rx[IP].payload) self.assertEqual(inner.src, tun4.local_ip4) self.assertEqual(inner.dst, "2.2.2.2") # host to phy for v6 p = (IPv6(src=tun6.local_ip6, dst="2::2") / UDP(sport=1234, dport=1234) / Raw()) rxs = self.send_and_expect(self.pg5, p * N_PKTS, phy) # verify inner packet is unchanged and has the tunnel encap for rx in rxs: self.assertEqual(rx[IPv6].dst, phy.remote_ip6) self.assertEqual(rx[IPv6].src, phy.local_ip6) inner = IPv6(rx[IPv6].payload) self.assertEqual(inner.src, tun6.local_ip6) self.assertEqual(inner.dst, "2::2") # phy to host v4 p = (Ether(dst=phy.local_mac, src=phy.remote_mac) / IP(dst=phy.local_ip4, src=phy.remote_ip4) / IP(dst=tun4.local_ip4, src=tun4.remote_ip4) / UDP(sport=1234, dport=1234) / Raw()) rxs = self.send_and_expect(phy, p * N_PKTS, self.pg4) for rx in rxs: rx = IP(rx) self.assertEqual(rx[IP].dst, tun4.local_ip4) self.assertEqual(rx[IP].src, tun4.remote_ip4) # phy to host v6 p = (Ether(dst=phy.local_mac, src=phy.remote_mac) / IPv6(dst=phy.local_ip6, src=phy.remote_ip6) / IPv6(dst=tun6.local_ip6, src=tun6.remote_ip6) / UDP(sport=1234, dport=1234) / Raw()) rxs = self.send_and_expect(phy, p * N_PKTS, self.pg5) for rx in rxs: rx = IPv6(rx) self.assertEqual(rx[IPv6].dst, tun6.local_ip6) self.assertEqual(rx[IPv6].src, tun6.remote_ip6) # cleanup phy.unconfig_ip4() phy.unconfig_ip6() tun4.unconfig_ip4() tun6.unconfig_ip6()