summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2018-09-07 01:48:54 -0700
committerDamjan Marion <dmarion@me.com>2018-09-07 11:16:14 +0000
commit3b93be5d76cbcb5dc3d3aee5c72a797014a346f9 (patch)
tree6c8706c9b518ee09ccdee790296e1759c5f78c76
parentc84cbad785fa11c1dba92b8e87ad234d779d1cbd (diff)
IP route update fix when multipath and drop set
Change-Id: I9cec7486cb6e3c5261d74d2b15a4d19469285a30 Signed-off-by: Neale Ranns <nranns@cisco.com>
-rw-r--r--src/vnet/ip/ip_api.c34
-rw-r--r--src/vpp/api/custom_dump.c20
-rw-r--r--test/test_ip4.py28
-rw-r--r--test/vpp_ip_route.py10
4 files changed, 65 insertions, 27 deletions
diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c
index 7217f9d101a..31b7e40a880 100644
--- a/src/vnet/ip/ip_api.c
+++ b/src/vnet/ip/ip_api.c
@@ -839,26 +839,6 @@ add_del_route_t_handler (u8 is_multipath,
path.frp_flags = path_flags;
- if (is_multipath)
- {
- stats_dslock_with_hint (1 /* release hint */ , 10 /* tag */ );
-
-
- vec_add1 (paths, path);
-
- if (is_add)
- fib_table_entry_path_add2 (fib_index,
- prefix,
- FIB_SOURCE_API, entry_flags, paths);
- else
- fib_table_entry_path_remove2 (fib_index,
- prefix, FIB_SOURCE_API, paths);
-
- vec_free (paths);
- stats_dsunlock ();
- return 0;
- }
-
stats_dslock_with_hint (1 /* release hint */ , 2 /* tag */ );
if (is_drop || is_local || is_classify || is_unreach || is_prohibit)
@@ -914,6 +894,20 @@ add_del_route_t_handler (u8 is_multipath,
fib_table_entry_special_remove (fib_index, prefix, FIB_SOURCE_API);
}
}
+ else if (is_multipath)
+ {
+ vec_add1 (paths, path);
+
+ if (is_add)
+ fib_table_entry_path_add2 (fib_index,
+ prefix,
+ FIB_SOURCE_API, entry_flags, paths);
+ else
+ fib_table_entry_path_remove2 (fib_index,
+ prefix, FIB_SOURCE_API, paths);
+
+ vec_free (paths);
+ }
else
{
if (is_add)
diff --git a/src/vpp/api/custom_dump.c b/src/vpp/api/custom_dump.c
index 2a8cd78b0fc..57268a9692c 100644
--- a/src/vpp/api/custom_dump.c
+++ b/src/vpp/api/custom_dump.c
@@ -758,15 +758,28 @@ static void *vl_api_ip_add_del_route_t_print
if (mp->is_multipath)
s = format (s, "multipath ");
- if (mp->is_multipath)
- s = format (s, "multipath ");
-
if (mp->next_hop_table_id)
s = format (s, "lookup-in-vrf %d ", ntohl (mp->next_hop_table_id));
FINISH;
}
+static void *vl_api_ip_table_add_del_t_print
+ (vl_api_ip_table_add_del_t * mp, void *handle)
+{
+ u8 *s;
+
+ s = format (0, "SCRIPT: ip_table_add_del ");
+ if (!mp->is_add)
+ s = format (s, "del ");
+ if (mp->is_ipv6)
+ s = format (s, "ip6 ");
+ if (mp->table_id != 0)
+ s = format (s, "vrf %d ", ntohl (mp->table_id));
+
+ FINISH;
+}
+
static void *vl_api_proxy_arp_add_del_t_print
(vl_api_proxy_arp_add_del_t * mp, void *handle)
{
@@ -3560,6 +3573,7 @@ _(TAP_CREATE_V2, tap_create_v2) \
_(TAP_DELETE_V2, tap_delete_v2) \
_(SW_INTERFACE_TAP_V2_DUMP, sw_interface_tap_v2_dump) \
_(IP_ADD_DEL_ROUTE, ip_add_del_route) \
+_(IP_TABLE_ADD_DEL, ip_table_add_del) \
_(PROXY_ARP_ADD_DEL, proxy_arp_add_del) \
_(PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable) \
_(MPLS_TUNNEL_ADD_DEL, mpls_tunnel_add_del) \
diff --git a/test/test_ip4.py b/test/test_ip4.py
index d15453d4f33..02a31be830a 100644
--- a/test/test_ip4.py
+++ b/test/test_ip4.py
@@ -552,7 +552,7 @@ class TestIPNull(VppTestCase):
super(TestIPNull, self).setUp()
# create 2 pg interfaces
- self.create_pg_interfaces(range(1))
+ self.create_pg_interfaces(range(2))
for i in self.pg_interfaces:
i.admin_up()
@@ -624,6 +624,32 @@ class TestIPNull(VppTestCase):
self.assertEqual(icmp.src, self.pg0.remote_ip4)
self.assertEqual(icmp.dst, "10.0.0.2")
+ def test_ip_drop(self):
+ """ IP Drop Routes """
+
+ p = (Ether(src=self.pg0.remote_mac,
+ dst=self.pg0.local_mac) /
+ IP(src=self.pg0.remote_ip4, dst="1.1.1.1") /
+ UDP(sport=1234, dport=1234) /
+ Raw('\xa5' * 100))
+
+ r1 = VppIpRoute(self, "1.1.1.0", 24,
+ [VppRoutePath(self.pg1.remote_ip4,
+ self.pg1.sw_if_index)])
+ r1.add_vpp_config()
+
+ rx = self.send_and_expect(self.pg0, p * 65, self.pg1)
+
+ #
+ # insert a more specific as a drop
+ #
+ r2 = VppIpRoute(self, "1.1.1.1", 32, [], is_drop=1)
+ r2.add_vpp_config()
+
+ self.send_and_assert_no_replies(self.pg0, p * 65, "Drop Route")
+ r2.remove_vpp_config()
+ rx = self.send_and_expect(self.pg0, p * 65, self.pg1)
+
class TestIPDisabled(VppTestCase):
""" IPv4 disabled """
diff --git a/test/vpp_ip_route.py b/test/vpp_ip_route.py
index 9e5c53184e3..216f5c7b2c1 100644
--- a/test/vpp_ip_route.py
+++ b/test/vpp_ip_route.py
@@ -223,7 +223,7 @@ class VppIpRoute(VppObject):
def __init__(self, test, dest_addr,
dest_addr_len, paths, table_id=0, is_ip6=0, is_local=0,
- is_unreach=0, is_prohibit=0):
+ is_unreach=0, is_prohibit=0, is_drop=0):
self._test = test
self.paths = paths
self.dest_addr_len = dest_addr_len
@@ -232,6 +232,7 @@ class VppIpRoute(VppObject):
self.is_local = is_local
self.is_unreach = is_unreach
self.is_prohibit = is_prohibit
+ self.is_drop = is_drop
self.dest_addr_p = dest_addr
if is_ip6:
self.dest_addr = inet_pton(AF_INET6, dest_addr)
@@ -246,7 +247,8 @@ class VppIpRoute(VppObject):
self.is_prohibit = is_prohibit
def add_vpp_config(self):
- if self.is_local or self.is_unreach or self.is_prohibit:
+ if self.is_local or self.is_unreach or \
+ self.is_prohibit or self.is_drop:
self._test.vapi.ip_add_del_route(
self.dest_addr,
self.dest_addr_len,
@@ -255,6 +257,7 @@ class VppIpRoute(VppObject):
is_local=self.is_local,
is_unreach=self.is_unreach,
is_prohibit=self.is_prohibit,
+ is_drop=self.is_drop,
table_id=self.table_id,
is_ipv6=self.is_ip6)
else:
@@ -282,7 +285,8 @@ class VppIpRoute(VppObject):
self._test.registry.register(self, self._test.logger)
def remove_vpp_config(self):
- if self.is_local or self.is_unreach or self.is_prohibit:
+ if self.is_local or self.is_unreach or \
+ self.is_prohibit or self.is_drop:
self._test.vapi.ip_add_del_route(
self.dest_addr,
self.dest_addr_len,