When allow_both_pkeys, osm_physp_share_this_pkey should find full pkey (16 bits) rather than pkey base (15 bits).
Signed-off-by: Hal Rosenstock <[email protected]> --- include/opensm/osm_pkey.h | 6 +++++- include/opensm/osm_qos_policy.h | 5 +++-- opensm/osm_pkey.c | 18 +++++++++++++----- opensm/osm_qos_policy.c | 8 +++++--- opensm/osm_sa_multipath_record.c | 6 ++++-- opensm/osm_sa_path_record.c | 6 ++++-- 6 files changed, 34 insertions(+), 15 deletions(-) diff --git a/include/opensm/osm_pkey.h b/include/opensm/osm_pkey.h index d70f5d9..ef09431 100644 --- a/include/opensm/osm_pkey.h +++ b/include/opensm/osm_pkey.h @@ -506,7 +506,8 @@ osm_pkey_tbl_set(IN osm_pkey_tbl_t * p_pkey_tbl, */ boolean_t osm_physp_share_this_pkey(IN const struct osm_physp * p_physp1, IN const struct osm_physp * p_physp2, - IN ib_net16_t pkey); + IN ib_net16_t pkey, + IN boolean_t allow_both_pkeys); /* * PARAMETERS * @@ -519,6 +520,9 @@ boolean_t osm_physp_share_this_pkey(IN const struct osm_physp * p_physp1, * pkey * [in] value of P_Key to check. * +* allow_both_pkeys +* [in] whether both pkeys allowed policy is being used. +* * RETURN VALUES * Returns TRUE if the two ports are matching. * FALSE otherwise. diff --git a/include/opensm/osm_qos_policy.h b/include/opensm/osm_qos_policy.h index 03ee891..73a1e98 100644 --- a/include/opensm/osm_qos_policy.h +++ b/include/opensm/osm_qos_policy.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved. + * Copyright (c) 2002-2010 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. * * This software is available to you under a choice of one of two @@ -172,7 +172,8 @@ boolean_t osm_qos_level_has_pkey(IN const osm_qos_level_t * p_qos_level, ib_net16_t osm_qos_level_get_shared_pkey(IN const osm_qos_level_t * p_qos_level, IN const osm_physp_t * p_src_physp, - IN const osm_physp_t * p_dest_physp); + IN const osm_physp_t * p_dest_physp, + IN const boolean_t allow_both_pkeys); osm_qos_match_rule_t * osm_qos_policy_match_rule_create(); void osm_qos_policy_match_rule_destroy(osm_qos_match_rule_t * p_match_rule); diff --git a/opensm/osm_pkey.c b/opensm/osm_pkey.c index c7c89fd..93e393c 100644 --- a/opensm/osm_pkey.c +++ b/opensm/osm_pkey.c @@ -330,14 +330,22 @@ static boolean_t match_pkey(IN const ib_net16_t * pkey1, boolean_t osm_physp_share_this_pkey(IN const osm_physp_t * p_physp1, IN const osm_physp_t * p_physp2, - IN ib_net16_t pkey) + IN ib_net16_t pkey, + IN boolean_t allow_both_pkeys) { ib_net16_t *pkey1, *pkey2; - pkey1 = cl_map_get(&(osm_physp_get_pkey_tbl(p_physp1))->keys, - ib_pkey_get_base(pkey)); - pkey2 = cl_map_get(&(osm_physp_get_pkey_tbl(p_physp2))->keys, - ib_pkey_get_base(pkey)); + if (allow_both_pkeys) { + pkey1 = cl_map_get(&(osm_physp_get_pkey_tbl(p_physp1))->keys, + pkey); + pkey2 = cl_map_get(&(osm_physp_get_pkey_tbl(p_physp2))->keys, + pkey); + } else { + pkey1 = cl_map_get(&(osm_physp_get_pkey_tbl(p_physp1))->keys, + ib_pkey_get_base(pkey)); + pkey2 = cl_map_get(&(osm_physp_get_pkey_tbl(p_physp2))->keys, + ib_pkey_get_base(pkey)); + } return (pkey1 && pkey2 && match_pkey(pkey1, pkey2)); } diff --git a/opensm/osm_qos_policy.c b/opensm/osm_qos_policy.c index 3780968..b6b1f80 100644 --- a/opensm/osm_qos_policy.c +++ b/opensm/osm_qos_policy.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. - * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. + * Copyright (c) 2002-2010 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved. * Copyright (c) 2009 HNR Consulting. All rights reserved. @@ -312,7 +312,8 @@ boolean_t osm_qos_level_has_pkey(IN const osm_qos_level_t * p_qos_level, ib_net16_t osm_qos_level_get_shared_pkey(IN const osm_qos_level_t * p_qos_level, IN const osm_physp_t * p_src_physp, - IN const osm_physp_t * p_dest_physp) + IN const osm_physp_t * p_dest_physp, + IN const boolean_t allow_both_pkeys) { unsigned i; uint16_t pkey_ho = 0; @@ -330,7 +331,8 @@ ib_net16_t osm_qos_level_get_shared_pkey(IN const osm_qos_level_t * p_qos_level, for (pkey_ho = p_qos_level->pkey_range_arr[i][0]; pkey_ho <= p_qos_level->pkey_range_arr[i][1]; pkey_ho++) { if (osm_physp_share_this_pkey - (p_src_physp, p_dest_physp, cl_hton16(pkey_ho))) + (p_src_physp, p_dest_physp, cl_hton16(pkey_ho), + allow_both_pkeys)) return cl_hton16(pkey_ho); } } diff --git a/opensm/osm_sa_multipath_record.c b/opensm/osm_sa_multipath_record.c index 208dc31..e0cfaa1 100644 --- a/opensm/osm_sa_multipath_record.c +++ b/opensm/osm_sa_multipath_record.c @@ -615,7 +615,8 @@ static ib_api_status_t mpr_rcv_get_path_parms(IN osm_sa_t * sa, */ required_pkey = p_mpr->pkey; if (!osm_physp_share_this_pkey - (p_src_physp, p_dest_physp, required_pkey)) { + (p_src_physp, p_dest_physp, required_pkey, + sa->p_subn->opt.allow_both_pkeys)) { OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4518: " "Ports src 0x%016"PRIx64" (%s port %d) " "and dst 0x%016"PRIx64" (%s port %d) " @@ -658,7 +659,8 @@ static ib_api_status_t mpr_rcv_get_path_parms(IN osm_sa_t * sa, */ required_pkey = osm_qos_level_get_shared_pkey(p_qos_level, p_src_physp, - p_dest_physp); + p_dest_physp, + sa->p_subn->opt.allow_both_pkeys); if (!required_pkey) { OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 451D: " "Ports src 0x%016"PRIx64" (%s port %d) " diff --git a/opensm/osm_sa_path_record.c b/opensm/osm_sa_path_record.c index 04ddf96..b820267 100644 --- a/opensm/osm_sa_path_record.c +++ b/opensm/osm_sa_path_record.c @@ -625,7 +625,8 @@ static ib_api_status_t pr_rcv_get_path_parms(IN osm_sa_t * sa, * PR returned pkey is the requested pkey. */ pkey = p_pr->pkey; - if (!osm_physp_share_this_pkey(p_src_physp, p_dest_physp, pkey)) { + if (!osm_physp_share_this_pkey(p_src_physp, p_dest_physp, pkey, + sa->p_subn->opt.allow_both_pkeys)) { OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F1A: " "Ports 0x%016" PRIx64 " (%s port %d) and " "0x%016" PRIx64 " (%s port %d) " @@ -666,7 +667,8 @@ static ib_api_status_t pr_rcv_get_path_parms(IN osm_sa_t * sa, * has pkeys - get shared pkey from QoS level pkeys */ pkey = osm_qos_level_get_shared_pkey(p_qos_level, - p_src_physp, p_dest_physp); + p_src_physp, p_dest_physp, + sa->p_subn->opt.allow_both_pkeys); if (!pkey) { OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F1E: " "Ports 0x%016" PRIx64 " (%s) and " -- 1.7.6.1 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
