From 18668840e9ef885a34b5d428543b03f31f68aaaf Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Thu, 15 Nov 2018 07:46:12 +0000 Subject: [PATCH] QoS: fix always recoding as IP Change-Id: I7a54cdfa26652c04971999ad1f8144566e13c7bf Signed-off-by: Neale Ranns --- src/vnet/qos/qos_record.c | 40 +++++++++++++++++++++++++--------------- test/test_qos.py | 36 +++++++++++++++++++++++------------- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/src/vnet/qos/qos_record.c b/src/vnet/qos/qos_record.c index 03956345c27..ef9e587a8a6 100644 --- a/src/vnet/qos/qos_record.c +++ b/src/vnet/qos/qos_record.c @@ -135,7 +135,8 @@ typedef struct qos_record_trace_t_ static inline uword qos_record_inline (vlib_main_t * vm, vlib_node_runtime_t * node, - vlib_frame_t * frame, dpo_proto_t dproto, int is_l2) + vlib_frame_t * frame, + qos_source_t qos_src, dpo_proto_t dproto, int is_l2) { u32 n_left_from, *from, *to_next, next_index; @@ -217,7 +218,7 @@ qos_record_inline (vlib_main_t * vm, } vnet_buffer2 (b0)->qos.bits = qos0; - vnet_buffer2 (b0)->qos.source = QOS_SOURCE_IP; + vnet_buffer2 (b0)->qos.source = qos_src; b0->flags |= VNET_BUFFER_F_QOS_DATA_VALID; if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE) && @@ -233,7 +234,7 @@ qos_record_inline (vlib_main_t * vm, { vlib_buffer_advance (b0, -l2_len); next0 = vnet_l2_feature_next (b0, - l2_qos_input_next[QOS_SOURCE_IP], + l2_qos_input_next[qos_src], L2INPUT_FEAT_L2_IP_QOS_RECORD); } else @@ -268,49 +269,55 @@ static inline uword ip4_qos_record (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { - return (qos_record_inline (vm, node, frame, DPO_PROTO_IP4, 0)); + return (qos_record_inline (vm, node, frame, QOS_SOURCE_IP, + DPO_PROTO_IP4, 0)); } static inline uword ip6_qos_record (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { - return (qos_record_inline (vm, node, frame, DPO_PROTO_IP6, 0)); + return (qos_record_inline (vm, node, frame, QOS_SOURCE_IP, + DPO_PROTO_IP6, 0)); } static inline uword mpls_qos_record (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { - return (qos_record_inline (vm, node, frame, DPO_PROTO_MPLS, 0)); + return (qos_record_inline (vm, node, frame, QOS_SOURCE_MPLS, + DPO_PROTO_MPLS, 0)); } static inline uword vlan_ip4_qos_record (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { - return (qos_record_inline (vm, node, frame, DPO_PROTO_ETHERNET, 0)); + return (qos_record_inline (vm, node, frame, QOS_SOURCE_VLAN, + DPO_PROTO_ETHERNET, 0)); } static inline uword vlan_ip6_qos_record (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { - return (qos_record_inline (vm, node, frame, DPO_PROTO_ETHERNET, 0)); + return (qos_record_inline (vm, node, frame, QOS_SOURCE_VLAN, + DPO_PROTO_ETHERNET, 0)); } static inline uword vlan_mpls_qos_record (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { - return (qos_record_inline (vm, node, frame, DPO_PROTO_ETHERNET, 0)); + return (qos_record_inline (vm, node, frame, QOS_SOURCE_VLAN, + DPO_PROTO_ETHERNET, 0)); } static inline uword l2_ip_qos_record (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { - return (qos_record_inline (vm, node, frame, 0, 1)); + return (qos_record_inline (vm, node, frame, QOS_SOURCE_VLAN, 0, 1)); } /* *INDENT-OFF* */ @@ -490,12 +497,15 @@ VLIB_NODE_FUNCTION_MULTIARCH (l2_ip_qos_record_node, l2_ip_qos_record); clib_error_t * l2_ip_qos_init (vlib_main_t * vm) { + qos_source_t qs; + /* Initialize the feature next-node indexes */ - feat_bitmap_init_next_nodes (vm, - l2_ip_qos_record_node.index, - L2INPUT_N_FEAT, - l2input_get_feat_names (), - l2_qos_input_next[QOS_SOURCE_IP]); + FOR_EACH_QOS_SOURCE (qs) + feat_bitmap_init_next_nodes (vm, + l2_ip_qos_record_node.index, + L2INPUT_N_FEAT, + l2input_get_feat_names (), + l2_qos_input_next[qs]); return 0; } diff --git a/test/test_qos.py b/test/test_qos.py index 49165502bd7..90ce4063348 100644 --- a/test/test_qos.py +++ b/test/test_qos.py @@ -278,12 +278,22 @@ class TestQOS(VppTestCase): # # 255 QoS for all input values # - output = [chr(255)] * 256 - os = ''.join(output) - rows = [{'outputs': os}, - {'outputs': os}, - {'outputs': os}, - {'outputs': os}] + from_ext = 7 + from_ip = 6 + from_mpls = 5 + from_vlan = 4 + output = [chr(from_ext)] * 256 + os1 = ''.join(output) + output = [chr(from_vlan)] * 256 + os2 = ''.join(output) + output = [chr(from_mpls)] * 256 + os3 = ''.join(output) + output = [chr(from_ip)] * 256 + os4 = ''.join(output) + rows = [{'outputs': os1}, + {'outputs': os2}, + {'outputs': os3}, + {'outputs': os4}] self.vapi.qos_egress_map_update(1, rows) @@ -336,20 +346,20 @@ class TestQOS(VppTestCase): # and the label and EOS bit have not been corrupted # for p in rx: - self.assertEqual(p[MPLS].cos, 7) + self.assertEqual(p[MPLS].cos, from_ip) self.assertEqual(p[MPLS].label, 32) self.assertEqual(p[MPLS].s, 1) rx = self.send_and_expect(self.pg0, p_3 * 65, self.pg1) for p in rx: - self.assertEqual(p[MPLS].cos, 7) + self.assertEqual(p[MPLS].cos, from_ip) self.assertEqual(p[MPLS].label, 63) self.assertEqual(p[MPLS].s, 0) h = p[MPLS].payload - self.assertEqual(h[MPLS].cos, 7) + self.assertEqual(h[MPLS].cos, from_ip) self.assertEqual(h[MPLS].label, 33) self.assertEqual(h[MPLS].s, 0) h = h[MPLS].payload - self.assertEqual(h[MPLS].cos, 7) + self.assertEqual(h[MPLS].cos, from_ip) self.assertEqual(h[MPLS].label, 34) self.assertEqual(h[MPLS].s, 1) @@ -366,7 +376,7 @@ class TestQOS(VppTestCase): 1) # - # MPLS x-connect - COS is preserved + # MPLS x-connect - COS according to pg1 map # route_32_eos = VppMplsRoute(self, 32, 1, [VppRoutePath(self.pg1.remote_ip4, @@ -382,7 +392,7 @@ class TestQOS(VppTestCase): rx = self.send_and_expect(self.pg0, p_m1 * 65, self.pg1) for p in rx: - self.assertEqual(p[MPLS].cos, 7) + self.assertEqual(p[MPLS].cos, from_mpls) self.assertEqual(p[MPLS].label, 33) self.assertEqual(p[MPLS].s, 1) @@ -409,7 +419,7 @@ class TestQOS(VppTestCase): rx = self.send_and_expect(self.pg0, p_m2 * 65, self.pg1) for p in rx: - self.assertEqual(p[IP].tos, 255) + self.assertEqual(p[IP].tos, from_mpls) # # cleanup -- 2.16.6