This patch mostly just updates the TM implementation to match the latest changes to the header file. In addition a few bugs were fixed in the marking implementations.
Signed-off-by: Barry Spinney <[email protected]> --- platform/linux-generic/odp_traffic_mngr.c | 97 ++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 29 deletions(-) diff --git a/platform/linux-generic/odp_traffic_mngr.c b/platform/linux-generic/odp_traffic_mngr.c index 27530ff..d61aaae 100644 --- a/platform/linux-generic/odp_traffic_mngr.c +++ b/platform/linux-generic/odp_traffic_mngr.c @@ -1989,7 +1989,8 @@ static void egress_ipv6_tc_marking(tm_tos_marking_t *tos_marking, } old_ver_tc_flow = odp_be_to_cpu_32(ipv6_hdr_ptr->ver_tc_flow); - old_tc = old_ver_tc_flow >> ODPH_IPV6HDR_TC_SHIFT; + old_tc = (old_ver_tc_flow & ODPH_IPV6HDR_TC_MASK) + >> ODPH_IPV6HDR_TC_SHIFT; new_tc = old_tc; if (tos_marking->dscp_enabled) @@ -2006,7 +2007,7 @@ static void egress_ipv6_tc_marking(tm_tos_marking_t *tos_marking, if (new_tc == old_tc) return; - new_ver_tc_flow = (old_ver_tc_flow & ODPH_IPV6HDR_TC_MASK) | + new_ver_tc_flow = (old_ver_tc_flow & ~ODPH_IPV6HDR_TC_MASK) | (new_tc << ODPH_IPV6HDR_TC_SHIFT); ipv6_hdr_ptr->ver_tc_flow = odp_cpu_to_be_32(new_ver_tc_flow); @@ -2345,6 +2346,7 @@ int odp_tm_capabilities(odp_tm_capabilities_t capabilities[] ODP_UNUSED, { odp_tm_level_capabilities_t *per_level_cap; odp_tm_capabilities_t *cap_ptr; + odp_packet_color_t color; uint32_t level_idx; if (capabilities_size == 0) @@ -2360,7 +2362,11 @@ int odp_tm_capabilities(odp_tm_capabilities_t capabilities[] ODP_UNUSED, cap_ptr->tm_queue_wred_supported = true; cap_ptr->tm_queue_dual_slope_supported = true; cap_ptr->vlan_marking_supported = true; - cap_ptr->ip_tos_marking_supported = true; + cap_ptr->ip_ecn_marking_supported = true; + cap_ptr->ip_dscp_marking_supported = true; + + for (color = 0; color < ODP_NUM_PACKET_COLORS; color++) + cap_ptr->marking_colors_supported[color] = true; for (level_idx = 0; level_idx < cap_ptr->max_levels; level_idx++) { per_level_cap = &cap_ptr->per_level[level_idx]; @@ -2378,7 +2384,7 @@ int odp_tm_capabilities(odp_tm_capabilities_t capabilities[] ODP_UNUSED, per_level_cap->weights_supported = true; } - return 0; + return 1; } static void tm_system_capabilities_set(odp_tm_capabilities_t *cap_ptr, @@ -2386,6 +2392,7 @@ static void tm_system_capabilities_set(odp_tm_capabilities_t *cap_ptr, { odp_tm_level_requirements_t *per_level_req; odp_tm_level_capabilities_t *per_level_cap; + odp_packet_color_t color; odp_bool_t shaper_supported, wred_supported; odp_bool_t dual_slope; uint32_t num_levels, level_idx, max_nodes; @@ -2407,7 +2414,12 @@ static void tm_system_capabilities_set(odp_tm_capabilities_t *cap_ptr, cap_ptr->tm_queue_wred_supported = wred_supported; cap_ptr->tm_queue_dual_slope_supported = dual_slope; cap_ptr->vlan_marking_supported = req_ptr->vlan_marking_needed; - cap_ptr->ip_tos_marking_supported = req_ptr->ip_tos_marking_needed; + cap_ptr->ip_ecn_marking_supported = req_ptr->ip_ecn_marking_needed; + cap_ptr->ip_dscp_marking_supported = req_ptr->ip_dscp_marking_needed; + + for (color = 0; color < ODP_NUM_PACKET_COLORS; color++) + cap_ptr->marking_colors_supported[color] = + req_ptr->marking_colors_needed[color]; for (level_idx = 0; level_idx < num_levels; level_idx++) { per_level_cap = &cap_ptr->per_level[level_idx]; @@ -2646,37 +2658,64 @@ int odp_tm_vlan_marking(odp_tm_t odp_tm, return 0; } -static void tm_tos_marking(tm_tos_marking_t *tos_marking, - odp_bool_t dscp_enabled, - uint8_t new_dscp, - odp_bool_t ecn_ce_enabled) - +int odp_tm_ip_ecn_marking(odp_tm_t odp_tm, + odp_packet_color_t color, + odp_bool_t ecn_ce_enabled) { - tos_marking->marking_enabled = dscp_enabled | ecn_ce_enabled; - tos_marking->dscp_enabled = dscp_enabled; - tos_marking->shifted_dscp = (new_dscp & ~ODPH_IP_TOS_DSCP_MASK) - << ODPH_IP_TOS_DSCP_SHIFT; - tos_marking->inverted_dscp_mask = (uint8_t)~ODPH_IP_TOS_DSCP_MASK; + tm_tos_marking_t *tos_marking; + tm_system_t *tm_system; + + tm_system = GET_TM_SYSTEM(odp_tm); + if ((tm_system == NULL) || (ODP_NUM_PACKET_COLORS <= color)) + return -1; + + tos_marking = &tm_system->marking.ip_tos_marking[color]; + tos_marking->marking_enabled = tos_marking->dscp_enabled | + ecn_ce_enabled; tos_marking->ecn_ce_enabled = ecn_ce_enabled; + + if (ecn_ce_enabled) + tm_system->marking_enabled = true; + else + tm_system->marking_enabled = tm_marking_enabled(tm_system); + + return 0; } -int odp_tm_ip_tos_marking(odp_tm_t odp_tm, - odp_packet_color_t color, - odp_bool_t dscp_enabled, - uint8_t new_dscp, - odp_bool_t ecn_ce_enabled) +int odp_tm_ip_dscp_marking(odp_tm_t odp_tm, + odp_packet_color_t color, + odp_bool_t dscp_enabled, + uint8_t new_dscp, + uint8_t dscp_mask) { - tm_tos_marking_t *ip_marking; + tm_tos_marking_t *tos_marking; tm_system_t *tm_system; + uint8_t inverted_mask, tos_mask, shifted_dscp; tm_system = GET_TM_SYSTEM(odp_tm); if ((tm_system == NULL) || (ODP_NUM_PACKET_COLORS <= color) || - (ODPH_IP_TOS_MAX_DSCP < new_dscp)) + (ODPH_IP_TOS_MAX_DSCP < new_dscp) || + (ODPH_IP_TOS_MAX_DSCP < dscp_mask)) return -1; - ip_marking = &tm_system->marking.ip_tos_marking[color]; - tm_tos_marking(ip_marking, dscp_enabled, new_dscp, ecn_ce_enabled); - if (dscp_enabled | ecn_ce_enabled) + if (dscp_enabled) { + new_dscp = new_dscp & dscp_mask; + inverted_mask = (uint8_t)~dscp_mask; + tos_mask = (inverted_mask << ODPH_IP_TOS_DSCP_SHIFT) | + ODPH_IP_TOS_ECN_MASK; + shifted_dscp = new_dscp << ODPH_IP_TOS_DSCP_SHIFT; + } else { + tos_mask = 0xFF; + shifted_dscp = 0; + } + + tos_marking = &tm_system->marking.ip_tos_marking[color]; + tos_marking->marking_enabled = dscp_enabled | + tos_marking->ecn_ce_enabled; + tos_marking->dscp_enabled = dscp_enabled; + tos_marking->shifted_dscp = shifted_dscp; + tos_marking->inverted_dscp_mask = tos_mask; + if (dscp_enabled) tm_system->marking_enabled = true; else tm_system->marking_enabled = tm_marking_enabled(tm_system); @@ -4012,18 +4051,18 @@ int odp_tm_node_fanin_info(odp_tm_node_t tm_node, return -5; info->is_last = next_shaper_obj->fanin_list_next == NULL; - if (shaper_obj->in_tm_node_obj) { - fanin_tm_node_obj = shaper_obj->enclosing_entity; + if (next_shaper_obj->in_tm_node_obj) { + fanin_tm_node_obj = next_shaper_obj->enclosing_entity; info->tm_node = MAKE_ODP_TM_NODE(fanin_tm_node_obj); info->tm_queue = ODP_TM_INVALID; } else { - fanin_tm_queue_obj = shaper_obj->enclosing_entity; + fanin_tm_queue_obj = next_shaper_obj->enclosing_entity; info->tm_queue = MAKE_ODP_TM_QUEUE(fanin_tm_queue_obj); info->tm_node = ODP_TM_INVALID; } info->sched_profile = ODP_TM_INVALID; - sched_params = shaper_obj->sched_params; + sched_params = next_shaper_obj->sched_params; if (sched_params != NULL) info->sched_profile = sched_params->sched_profile; -- 2.7.2 _______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
