aboutsummaryrefslogtreecommitdiffstats
path: root/test/test_dhcp.py
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2017-02-14 07:28:41 -0800
committerDamjan Marion <dmarion.lists@gmail.com>2017-02-21 22:25:48 +0000
commit20a175a18414c67e38b5ce0709b33fb1df8069c9 (patch)
tree3c06d6c83f62ca84e78d28cefbd8e18c3e37005e /test/test_dhcp.py
parent2e3677bb2085d4992f74156bdff8fe050ac9de24 (diff)
dhcp: multiple additions
DHCP additions: 1) DHCPv4 will only relay a message back to the client, if the Option82 information is present. So make this the default. 2) It is no longer possible to select via the API to "insert circuit ID" - since this is now default 3) Remove the version 2 API since it's now the same as version 1. 4) Adding the VSS option is now conditional only on the presence of VSS config (not the 'insert' option in the set API) 5) DHCP proxy dump via API Change-Id: Ia7271ba8c1d4dbf34a02c401d268ccfbb1b74f17 Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'test/test_dhcp.py')
-rw-r--r--test/test_dhcp.py166
1 files changed, 84 insertions, 82 deletions
diff --git a/test/test_dhcp.py b/test/test_dhcp.py
index 04ab2e11..fbfb8a0c 100644
--- a/test/test_dhcp.py
+++ b/test/test_dhcp.py
@@ -65,7 +65,7 @@ class TestDHCP(VppTestCase):
for i in self.pg_interfaces:
i.assert_nothing_captured(remark=remark)
- def validate_option_82(self, pkt, intf, ip_addr):
+ def validate_relay_options(self, pkt, intf, ip_addr, fib_id, oui):
dhcp = pkt[DHCP]
found = 0
data = []
@@ -77,7 +77,10 @@ class TestDHCP(VppTestCase):
# There are two sb-options present - each of length 6.
#
data = i[1]
- self.assertEqual(len(data), 12)
+ if oui != 0:
+ self.assertEqual(len(data), 24)
+ else:
+ self.assertEqual(len(data), 12)
#
# First sub-option is ID 1, len 4, then encoded
@@ -107,12 +110,30 @@ class TestDHCP(VppTestCase):
self.assertEqual(data[10], claddr[2])
self.assertEqual(data[11], claddr[3])
+ if oui != 0:
+ # sub-option 151 encodes the 3 byte oui
+ # and the 4 byte fib_id
+ self.assertEqual(ord(data[12]), 151)
+ self.assertEqual(ord(data[13]), 8)
+ self.assertEqual(ord(data[14]), 1)
+ self.assertEqual(ord(data[15]), 0)
+ self.assertEqual(ord(data[16]), 0)
+ self.assertEqual(ord(data[17]), oui)
+ self.assertEqual(ord(data[18]), 0)
+ self.assertEqual(ord(data[19]), 0)
+ self.assertEqual(ord(data[20]), 0)
+ self.assertEqual(ord(data[21]), fib_id)
+
+ # VSS control sub-option
+ self.assertEqual(ord(data[22]), 152)
+ self.assertEqual(ord(data[23]), 0)
+
found = 1
self.assertTrue(found)
return data
- def verify_dhcp_offer(self, pkt, intf, check_option_82=True):
+ def verify_dhcp_offer(self, pkt, intf):
ether = pkt[Ether]
self.assertEqual(ether.dst, "ff:ff:ff:ff:ff:ff")
self.assertEqual(ether.src, intf.local_mac)
@@ -134,11 +155,9 @@ class TestDHCP(VppTestCase):
is_offer = True
self.assertTrue(is_offer)
- if check_option_82:
- data = self.validate_option_82(pkt, intf, intf.local_ip4)
+ data = self.validate_relay_options(pkt, intf, intf.local_ip4, 0, 0)
- def verify_dhcp_discover(self, pkt, intf, src_intf=None,
- option_82_present=True):
+ def verify_dhcp_discover(self, pkt, intf, src_intf=None, fib_id=0, oui=0):
ether = pkt[Ether]
self.assertEqual(ether.dst, intf.remote_mac)
self.assertEqual(ether.src, intf.local_mac)
@@ -161,13 +180,10 @@ class TestDHCP(VppTestCase):
is_discover = True
self.assertTrue(is_discover)
- if option_82_present:
- data = self.validate_option_82(pkt, src_intf, src_intf.local_ip4)
- return data
- else:
- for i in dhcp.options:
- if type(i) is tuple:
- self.assertNotEqual(i[0], "relay_agent_Information")
+ data = self.validate_relay_options(pkt, src_intf,
+ src_intf.local_ip4,
+ fib_id, oui)
+ return data
def verify_dhcp6_solicit(self, pkt, intf,
peer_ip, peer_mac,
@@ -193,18 +209,19 @@ class TestDHCP(VppTestCase):
self.assertEqual(cll.lltype, 1)
self.assertEqual(cll.clladdr, peer_mac)
- vss = pkt[DHCP6OptVSS]
- self.assertEqual(vss.optlen, 8)
- self.assertEqual(vss.type, 1)
- # the OUI and FIB-id are really 3 and 4 bytes resp.
- # but the tested range is small
- self.assertEqual(ord(vss.data[0]), 0)
- self.assertEqual(ord(vss.data[1]), 0)
- self.assertEqual(ord(vss.data[2]), oui)
- self.assertEqual(ord(vss.data[3]), 0)
- self.assertEqual(ord(vss.data[4]), 0)
- self.assertEqual(ord(vss.data[5]), 0)
- self.assertEqual(ord(vss.data[6]), fib_id)
+ if fib_id != 0:
+ vss = pkt[DHCP6OptVSS]
+ self.assertEqual(vss.optlen, 8)
+ self.assertEqual(vss.type, 1)
+ # the OUI and FIB-id are really 3 and 4 bytes resp.
+ # but the tested range is small
+ self.assertEqual(ord(vss.data[0]), 0)
+ self.assertEqual(ord(vss.data[1]), 0)
+ self.assertEqual(ord(vss.data[2]), oui)
+ self.assertEqual(ord(vss.data[3]), 0)
+ self.assertEqual(ord(vss.data[4]), 0)
+ self.assertEqual(ord(vss.data[5]), 0)
+ self.assertEqual(ord(vss.data[6]), fib_id)
# the relay message should be an encoded Solicit
msg = pkt[DHCP6OptRelayMsg]
@@ -267,29 +284,16 @@ class TestDHCP(VppTestCase):
rx_table_id=0)
#
- # Now a DHCP request on pg2, which is in the same VRF
- # as the DHCP config, will result in a relayed DHCP
- # message to the [fake] server
- #
- self.pg2.add_stream(pkts_disc_vrf0)
- self.pg_enable_capture(self.pg_interfaces)
- self.pg_start()
-
- rx = self.pg0.get_capture(1)
- rx = rx[0]
-
- #
- # Rx'd packet should be to the server address and from the configured
- # source address
- # UDP source ports are unchanged
- # we've no option 82 config so that should be absent
+ # Discover packets from the client are dropped because there is no
+ # IP address configured on the client facing interface
#
- self.verify_dhcp_discover(rx, self.pg0, option_82_present=False)
+ self.send_and_assert_no_replies(self.pg2, pkts_disc_vrf0,
+ "Discover DHCP no relay address")
#
# Inject a response from the server
- # VPP will only relay the offer if option 82 is present.
- # so this one is dropped
+ # dropped, because there is no IP addrees on the
+ # clinet interfce to fill in the option.
#
p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4) /
@@ -298,24 +302,8 @@ class TestDHCP(VppTestCase):
DHCP(options=[('message-type', 'offer'), ('end')]))
pkts = [p]
- self.send_and_assert_no_replies(self.pg0, pkts,
- "DHCP offer no option 82")
-
- #
- # Configure sending option 82 in relayed messages
- #
- self.vapi.dhcp_proxy_config(server_addr,
- src_addr,
- rx_table_id=0,
- insert_circuit_id=1)
-
- #
- # Send a request:
- # again dropped, but ths time because there is no IP addrees on the
- # clinet interfce to fill in the option.
- #
- self.send_and_assert_no_replies(self.pg2, pkts_disc_vrf0,
- "DHCP no relay address")
+ self.send_and_assert_no_replies(self.pg2, pkts,
+ "Offer DHCP no relay address")
#
# configure an IP address on the client facing interface
@@ -376,15 +364,8 @@ class TestDHCP(VppTestCase):
('relay_agent_Information', bad_ip),
('end')]))
pkts = [p]
-
- self.pg0.add_stream(pkts)
- self.pg_enable_capture(self.pg_interfaces)
- self.pg_start()
- rx = self.pg2.get_capture(1)
- rx = rx[0]
-
- self.verify_dhcp_offer(rx, self.pg2, check_option_82=False)
- self.pg0.assert_nothing_captured(remark="")
+ self.send_and_assert_no_replies(self.pg0, pkts,
+ "DHCP offer option 82 bad address")
# 2. Not a sw_if_index VPP knows
bad_if_index = option_82[0:2] + chr(33) + option_82[3:]
@@ -413,8 +394,7 @@ class TestDHCP(VppTestCase):
self.vapi.dhcp_proxy_config(server_addr,
src_addr,
rx_table_id=0,
- is_add=0,
- insert_circuit_id=1)
+ is_add=0)
self.send_and_assert_no_replies(self.pg2, pkts_disc_vrf0,
"DHCP config removed VRF 0")
@@ -429,8 +409,7 @@ class TestDHCP(VppTestCase):
self.vapi.dhcp_proxy_config(server_addr,
src_addr,
rx_table_id=1,
- server_table_id=1,
- insert_circuit_id=1)
+ server_table_id=1)
#
# Confim DHCP requests ok in VRF 1.
@@ -453,13 +432,40 @@ class TestDHCP(VppTestCase):
self.verify_dhcp_discover(rx, self.pg1, src_intf=self.pg3)
#
+ # Add VSS config
+ # table=1, fib=id=1, oui=4
+ self.vapi.dhcp_proxy_set_vss(1, 1, 4)
+
+ self.pg3.add_stream(pkts_disc_vrf1)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+
+ rx = self.pg1.get_capture(1)
+ rx = rx[0]
+ self.verify_dhcp_discover(rx, self.pg1, src_intf=self.pg3,
+ fib_id=1, oui=4)
+
+ #
+ # Remove the VSS config
+ # relayed DHCP has default vlaues in the option.
+ #
+ self.vapi.dhcp_proxy_set_vss(1, 1, 4, is_add=0)
+
+ self.pg3.add_stream(pkts_disc_vrf1)
+ self.pg_enable_capture(self.pg_interfaces)
+ self.pg_start()
+
+ rx = self.pg1.get_capture(1)
+ rx = rx[0]
+ self.verify_dhcp_discover(rx, self.pg1, src_intf=self.pg3)
+
+ #
# remove DHCP config to cleanup
#
self.vapi.dhcp_proxy_config(server_addr,
src_addr,
rx_table_id=1,
- server_table_id=1,
- insert_circuit_id=1,
+ server_table_id=11,
is_add=0)
self.send_and_assert_no_replies(self.pg2, pkts_disc_vrf0,
@@ -510,7 +516,6 @@ class TestDHCP(VppTestCase):
src_addr_vrf0,
rx_table_id=0,
server_table_id=0,
- insert_circuit_id=1,
is_ipv6=1)
self.send_and_assert_no_replies(self.pg2, pkts_solicit_vrf0,
@@ -630,7 +635,6 @@ class TestDHCP(VppTestCase):
src_addr_vrf1,
rx_table_id=1,
server_table_id=1,
- insert_circuit_id=1,
is_ipv6=1)
self.pg3.config_ip6()
@@ -708,14 +712,12 @@ class TestDHCP(VppTestCase):
src_addr_vrf1,
rx_table_id=1,
server_table_id=1,
- insert_circuit_id=1,
is_ipv6=1,
is_add=0)
self.vapi.dhcp_proxy_config(server_addr_vrf1,
src_addr_vrf1,
rx_table_id=0,
server_table_id=0,
- insert_circuit_id=1,
is_ipv6=1,
is_add=0)