@@ -1401,34 +1401,6 @@ static void pr_rcv_process_pair(IN osm_sa_t * sa, IN const osm_madw_t * p_madw,
OSM_LOG_EXIT(sa->p_log);
}
-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;
- osm_mgrp_t *mgrp;
-
- p_sa_mad = osm_madw_get_sa_mad_ptr(p_madw);
- p_pr = ib_sa_mad_get_payload_ptr(p_sa_mad);
-
- 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;
- }
-
- mgrp = osm_get_mgrp_by_mgid(sa->p_subn, &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));
- return NULL;
- }
-
- return mgrp;
-}
-
static ib_api_status_t pr_match_mgrp_attributes(IN osm_sa_t * sa,
IN const osm_madw_t * p_madw,
IN const osm_mgrp_t * p_mgrp)
@@ -1510,47 +1482,11 @@ Exit:
return status;
}
-static int pr_rcv_check_mcast_dest(osm_sa_t * sa, IN const osm_madw_t * p_madw)
-{
- const ib_path_rec_t *p_pr;
- const ib_sa_mad_t *p_sa_mad;
- ib_net64_t comp_mask;
- int is_multicast = 0;
-
- 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);
-
- comp_mask = p_sa_mad->comp_mask;
-
- if (comp_mask & IB_PR_COMPMASK_DGID) {
- is_multicast = ib_gid_is_multicast(&p_pr->dgid);
- if (!is_multicast)
- goto Exit;
- }
-
- if (comp_mask & IB_PR_COMPMASK_DLID) {
- if (cl_ntoh16(p_pr->dlid) >= IB_LID_MCAST_START_HO &&
- cl_ntoh16(p_pr->dlid) <= IB_LID_MCAST_END_HO)
- is_multicast = 1;
- else if (is_multicast) {
- OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F12: "
- "PathRecord request indicates MGID but not MLID\n");
- is_multicast = -1;
- }
- }
-
-Exit:
- OSM_LOG_EXIT(sa->p_log);
- return is_multicast;
-}
-
void osm_pr_rcv_process(IN void *context, IN void *data)
{
osm_sa_t *sa = context;
osm_madw_t *p_madw = data;
- const ib_path_rec_t *p_pr;
+ ib_path_rec_t *p_pr;
const ib_sa_mad_t *p_sa_mad;
const osm_port_t *p_src_port;
const osm_port_t *p_dest_port;
@@ -1558,7 +1494,6 @@ void osm_pr_rcv_process(IN void *context, IN void *data)
ib_gid_t dgid;
ib_net16_t sa_status;
osm_port_t *requester_port;
- int ret;
OSM_LOG_ENTER(sa->p_log);
@@ -1601,21 +1536,14 @@ void osm_pr_rcv_process(IN void *context, IN void *data)
cl_plock_acquire(sa->p_lock);
/* Handle multicast destinations separately */
- if ((ret = pr_rcv_check_mcast_dest(sa, p_madw)) < 0) {
- /* Multicast DGID with unicast DLID */
- cl_plock_release(sa->p_lock);
- osm_sa_send_error(sa, p_madw, IB_MAD_STATUS_INVALID_FIELD);
- goto Exit;
- }
-
- if (ret > 0)
+ if ((p_sa_mad->comp_mask & IB_PR_COMPMASK_DGID) &&
+ ib_gid_is_multicast(&p_pr->dgid));
goto McastDest;
OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Unicast destination requested\n");
sa_status = pr_rcv_get_end_points(sa, p_madw, &p_src_port, &p_dest_port,
&dgid);
-
if (sa_status == IB_SA_MAD_STATUS_SUCCESS) {
/*
What happens next depends on the type of endpoint information
@@ -1660,9 +1588,15 @@ McastDest:
uint8_t hop_limit;
/* First, get the MC info */
- p_mgrp = pr_get_mgrp(sa, p_madw);
- if (!p_mgrp)
+ p_mgrp = osm_get_mgrp_by_mgid(sa->p_subn, &p_pr->dgid);
+ if (!p_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 Unlock;
+ }
/* Make sure the rest of the PathRecord matches the MC group attributes */
status = pr_match_mgrp_attributes(sa, p_madw, p_mgrp);