IBA 1.2.1 states (Vol.1, 15.2.5.16, p.918) that DGID shell be explicitly specified when path destination of SA PathRecord query is multicast group.
Signed-off-by: Sasha Khapyorsky <sas...@voltaire.com> --- opensm/opensm/osm_sa_path_record.c | 45 ++++++++++++------------------------ 1 files changed, 15 insertions(+), 30 deletions(-) diff --git a/opensm/opensm/osm_sa_path_record.c b/opensm/opensm/osm_sa_path_record.c index f68be20..37f32ac 100644 --- a/opensm/opensm/osm_sa_path_record.c +++ b/opensm/opensm/osm_sa_path_record.c @@ -1437,45 +1437,27 @@ static osm_mgrp_t *pr_get_mgrp(IN osm_sa_t * sa, IN const osm_madw_t * p_madw) { ib_path_rec_t *p_pr; const ib_sa_mad_t *p_sa_mad; - ib_net64_t comp_mask; - osm_mgrp_t *mgrp = NULL; + osm_mgrp_t *mgrp; p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_pr = (ib_path_rec_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); + p_pr = ib_sa_mad_get_payload_ptr(p_sa_mad); - comp_mask = p_sa_mad->comp_mask; + if (!(p_sa_mad->comp_mask & IB_PR_COMPMASK_DGID)) { + OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, + "discard multicast target SA PR with wildcarded MGID"); + return NULL; + } - if ((comp_mask & IB_PR_COMPMASK_DGID) && - !(mgrp = osm_get_mgrp_by_mgid(sa, &p_pr->dgid))) { + mgrp = osm_get_mgrp_by_mgid(sa, &p_pr->dgid); + if (!mgrp) { char gid_str[INET6_ADDRSTRLEN]; OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F09: " "No MC group found for PathRecord destination GID %s\n", inet_ntop(AF_INET6, p_pr->dgid.raw, gid_str, sizeof gid_str)); - goto Exit; - } - - if (comp_mask & IB_PR_COMPMASK_DLID) { - if (mgrp) { - /* check that the MLID in the MC group is */ - /* the same as the DLID in the PathRecord */ - if (mgrp->mlid != p_pr->dlid) { - /* Note: perhaps this might be better indicated as an invalid request */ - OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F10: " - "MC group MLID 0x%x does not match " - "PathRecord destination LID 0x%x\n", - mgrp->mlid, p_pr->dlid); - mgrp = NULL; - goto Exit; - } - } else - if (!(mgrp = osm_get_mgrp_by_mlid(sa->p_subn, p_pr->dlid))) - OSM_LOG(sa->p_log, OSM_LOG_ERROR, - "ERR 1F11: " "No MC group found for PathRecord " - "destination LID 0x%x\n", p_pr->dlid); + return NULL; } -Exit: return mgrp; } @@ -1497,10 +1479,14 @@ static ib_api_status_t pr_match_mgrp_attributes(IN osm_sa_t * sa, OSM_LOG_ENTER(sa->p_log); p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw); - p_pr = (ib_path_rec_t *) ib_sa_mad_get_payload_ptr(p_sa_mad); + p_pr = ib_sa_mad_get_payload_ptr(p_sa_mad); comp_mask = p_sa_mad->comp_mask; + /* check that MLID of the MC group matchs the PathRecord DLID */ + if ((comp_mask & IB_PR_COMPMASK_DLID) && p_mgrp->mlid != p_pr->dlid) + goto Exit; + /* If SGID and/or SLID specified, should validate as member of MC group */ if (comp_mask & IB_PR_COMPMASK_SGID) { port = osm_get_port_by_guid(sa->p_subn, @@ -1713,7 +1699,6 @@ McastDest: /* First, get the MC info */ p_mgrp = pr_get_mgrp(sa, p_madw); - if (!p_mgrp) goto Unlock; -- 1.6.5.rc1 _______________________________________________ general mailing list general@lists.openfabrics.org http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general