eddd8e3588
- Generate copyright year and version instead of using hard-coded data Type: refactor Signed-off-by: Dave Wallace <dwallacelf@gmail.com> Change-Id: I6058f5025323b3aa483f5df4a2c4371e27b5914e
175 lines
5.3 KiB
Python
175 lines
5.3 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import unittest
|
|
|
|
from scapy.layers.inet import IP, UDP
|
|
from scapy.layers.inet6 import IPv6, Raw
|
|
from scapy.layers.l2 import Ether, ARP, Dot1Q
|
|
|
|
from vpp_object import VppObject
|
|
from framework import VppTestCase, VppTestRunner
|
|
|
|
|
|
class VppLcpPair(VppObject):
|
|
def __init__(self, test, phy, host):
|
|
self._test = test
|
|
self.phy = phy
|
|
self.host = host
|
|
|
|
def add_vpp_config(self):
|
|
self._test.vapi.cli("test lcp add phy %s host %s" %
|
|
(self.phy, self.host))
|
|
self._test.registry.register(self, self._test.logger)
|
|
return self
|
|
|
|
def remove_vpp_config(self):
|
|
self._test.vapi.cli("test lcp del phy %s host %s" %
|
|
(self.phy, self.host))
|
|
|
|
def object_id(self):
|
|
return "lcp:%d:%d" % (self.phy.sw_if_index,
|
|
self.host.sw_if_index)
|
|
|
|
def query_vpp_config(self):
|
|
pairs = list(self._test.vapi.vpp.details_iter(
|
|
self._test.vapi.lcp_itf_pair_get))
|
|
|
|
for p in pairs:
|
|
if p.phy_sw_if_index == self.phy.sw_if_index and \
|
|
p.host_sw_if_index == self.host.sw_if_index:
|
|
return True
|
|
return False
|
|
|
|
|
|
class TestLinuxCP(VppTestCase):
|
|
""" Linux Control Plane """
|
|
|
|
extra_vpp_plugin_config = ["plugin",
|
|
"linux_cp_plugin.so",
|
|
"{", "enable", "}",
|
|
"plugin",
|
|
"linux_cp_unittest_plugin.so",
|
|
"{", "enable", "}"]
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestLinuxCP, cls).setUpClass()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(TestLinuxCP, cls).tearDownClass()
|
|
|
|
def setUp(self):
|
|
super(TestLinuxCP, self).setUp()
|
|
|
|
# create 4 pg interfaces so there are a few addresses
|
|
# in the FIB
|
|
self.create_pg_interfaces(range(4))
|
|
|
|
for i in self.pg_interfaces:
|
|
i.admin_up()
|
|
|
|
def tearDown(self):
|
|
for i in self.pg_interfaces:
|
|
i.admin_down()
|
|
super(TestLinuxCP, self).tearDown()
|
|
|
|
def test_linux_cp_tap(self):
|
|
""" Linux CP TAP """
|
|
|
|
#
|
|
# Setup
|
|
#
|
|
|
|
arp_opts = {"who-has": 1, "is-at": 2}
|
|
|
|
# create two pairs, wihch a bunch of hots on the phys
|
|
hosts = [self.pg0, self.pg1]
|
|
phys = [self.pg2, self.pg3]
|
|
N_HOSTS = 4
|
|
|
|
for phy in phys:
|
|
phy.config_ip4()
|
|
phy.generate_remote_hosts(4)
|
|
phy.configure_ipv4_neighbors()
|
|
|
|
pair1 = VppLcpPair(self, phys[0], hosts[0]).add_vpp_config()
|
|
pair2 = VppLcpPair(self, phys[1], hosts[1]).add_vpp_config()
|
|
|
|
self.logger.info(self.vapi.cli("sh lcp adj verbose"))
|
|
self.logger.info(self.vapi.cli("sh lcp"))
|
|
|
|
#
|
|
# Traffic Tests
|
|
#
|
|
|
|
# hosts to phys
|
|
for phy, host in zip(phys, hosts):
|
|
for j in range(N_HOSTS):
|
|
p = (Ether(src=phy.local_mac,
|
|
dst=phy.remote_hosts[j].mac) /
|
|
IP(src=phy.local_ip4,
|
|
dst=phy.remote_hosts[j].ip4) /
|
|
UDP(sport=1234, dport=1234) /
|
|
Raw())
|
|
|
|
rxs = self.send_and_expect(host, [p], phy)
|
|
|
|
# verify packet is unchanged
|
|
for rx in rxs:
|
|
self.assertEqual(p.show2(True), rx.show2(True))
|
|
|
|
# ARPs x-connect to phy
|
|
p = (Ether(dst="ff:ff:ff:ff:ff:ff",
|
|
src=phy.remote_hosts[j].mac) /
|
|
ARP(op="who-has",
|
|
hwdst=phy.remote_hosts[j].mac,
|
|
hwsrc=phy.local_mac,
|
|
psrc=phy.local_ip4,
|
|
pdst=phy.remote_hosts[j].ip4))
|
|
|
|
rxs = self.send_and_expect(host, [p], phy)
|
|
|
|
# verify packet is unchanged
|
|
for rx in rxs:
|
|
self.assertEqual(p.show2(True), rx.show2(True))
|
|
|
|
# phy to host
|
|
for phy, host in zip(phys, hosts):
|
|
for j in range(N_HOSTS):
|
|
p = (Ether(dst=phy.local_mac,
|
|
src=phy.remote_hosts[j].mac) /
|
|
IP(dst=phy.local_ip4,
|
|
src=phy.remote_hosts[j].ip4) /
|
|
UDP(sport=1234, dport=1234) /
|
|
Raw())
|
|
|
|
rxs = self.send_and_expect(phy, [p], host)
|
|
|
|
# verify packet is unchanged
|
|
for rx in rxs:
|
|
self.assertEqual(p.show2(True), rx.show2(True))
|
|
|
|
# ARPs rx'd on the phy are sent to the host
|
|
p = (Ether(dst="ff:ff:ff:ff:ff:ff",
|
|
src=phy.remote_hosts[j].mac) /
|
|
ARP(op="is-at",
|
|
hwsrc=phy.remote_hosts[j].mac,
|
|
hwdst=phy.local_mac,
|
|
pdst=phy.local_ip4,
|
|
psrc=phy.remote_hosts[j].ip4))
|
|
|
|
rxs = self.send_and_expect(phy, [p], host)
|
|
|
|
# verify packet is unchanged
|
|
for rx in rxs:
|
|
self.assertEqual(p.show2(True), rx.show2(True))
|
|
|
|
# cleanup
|
|
for phy in phys:
|
|
phy.unconfig_ip4()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main(testRunner=VppTestRunner)
|