FW: [openib-general] [PATCH] osm_sa_mcmember_record : MCMemberGet/GetTable Trusted mode

Hal Rosenstock halr at voltaire.com
Thu Mar 23 08:38:37 PST 2006


Hi Ofer,

On Thu, 2006-03-23 at 11:04, Ofer Gigi wrote:
> Hi Hal,
> 
> The fix below fixes the retrieve of the mcmember records according to
> the 
> Errata MGTWG3280.
> 
> Quoting from MGTWG3280:
> 
> SA can be queried for multicast groups by sending a SubnAdmGet() or a
>  SubnAdmGetTable() request to it using the SA query mechanism (see
> 15.4.4 Administration Query Subsystem on page 923).
> 
> What SA returns in response to a query of multicast groups depends
> strongly on whether the request is or is not a trusted request; the
> degree of trust affects both the data returned in each attribute and
> the set of attributes that are returned. See <ref to C15-0.2.2:>.
> 
> o15-0.2.5 is made obsolete.
> 
> So we need to implement the following descriptive text:
> 
> SA can be queried for multicast groups by sending a SubnAdmGet() or a
> SubnAdmGetTable() request to it using the SA query mechanism (see
> 15.4.4 Administration Query Subsystem on page 923). SA will return one
> MCMemberRecord per multicast group matching the query, except in
> cases where trust is specified as indicated in 15.4.1.2 Access
> Restrictions
> For Other Attributes on page 922; in that case all the MCMemberRecords
> associated with the multicast group are returned. The MCMemberRecord
> will be returned with the PortGID, ProxyJoin, and the JoinState
> components
> set to 0, except where trust is specified as indicated above, in that
> case the actual contents for the above components will be provided.
> Thanks

Is this is same or different from the one which was sent earlier ?

-- Hal

> 
> Ofer G.
> 
> Signed-off-by:  Ofer Gigi <oferg at mellanox.co.il>
> Index: osm_sa_mcmember_record.c
> ===================================================================
> --- osm_sa_mcmember_record.c	(revision 5919)
> +++ osm_sa_mcmember_record.c	(working copy)
> @@ -91,6 +91,7 @@ typedef  struct   osm_sa_mcmr_search_ctx
>    cl_qlist_t      *p_list; /*  hold results */
>    ib_net64_t      comp_mask;
>    const osm_physp_t*    p_req_physp;
> +  boolean_t       trusted_req;
>  } osm_sa_mcmr_search_ctxt_t;
>  
>  /**********************************************************************
> @@ -1918,6 +1919,9 @@ __osm_sa_mcm_by_comp_mask_cb(
>    /* will be used for group or port info */
>    uint8_t scope_state; 
>    uint8_t scope_state_mask = 0;
> +  cl_map_item_t *p_item;
> +  ib_gid_t	port_gid;
> +  boolean_t proxy_join;
>  
>    OSM_LOG_ENTER( p_rcv->p_log, __osm_sa_mcm_by_comp_mask_cb );
>  
> @@ -1938,39 +1942,28 @@ __osm_sa_mcm_by_comp_mask_cb(
>  
>    /* first try to eliminate the group by MGID, MLID, or P_Key */
>    if ((IB_MCR_COMPMASK_MGID & comp_mask) &&
> -      cl_memcmp(&p_rcvd_rec->mgid, &p_mgrp->mcmember_rec.mgid,
> sizeof(ib_gid_t))) {
> +      cl_memcmp(&p_rcvd_rec->mgid, 
> +                &p_mgrp->mcmember_rec.mgid, 
> +                sizeof(ib_gid_t)))
> +  {
>      goto Exit;
>    }
>  
>    if ((IB_MCR_COMPMASK_MLID & comp_mask) &&
> -      cl_memcmp(&p_rcvd_rec->mlid, &p_mgrp->mcmember_rec.mlid,
> sizeof(uint16_t))) {
> +      cl_memcmp(&p_rcvd_rec->mlid, 
> +      &p_mgrp->mcmember_rec.mlid, 
> +      sizeof(uint16_t))) 
> +  {
>      goto Exit;
>    }
>  
> -  /* if the requester physical port doesn't have the pkey that is
> defined for the
> -     group - exit. */
> -  if (! osm_physp_has_pkey( p_rcv->p_log, p_mgrp->mcmember_rec.pkey,
> p_req_physp ))
> +  /* if the requester physical port doesn't have the pkey that is
> defined for
> +     the group - exit. */
> +  if (! osm_physp_has_pkey( p_rcv->p_log, 
> +                            p_mgrp->mcmember_rec.pkey, 
> +                            p_req_physp ))
>      goto Exit;
>  
> -  /* so did we get the PortGUID mask */
> -  if (IB_MCR_COMPMASK_PORT_GID & comp_mask)
> -  {
> -    /* try to find this port */
> -    if (osm_mgrp_is_port_present(p_mgrp, portguid, &p_mcm_port))
> -    {
> -      scope_state = p_mcm_port->scope_state;
> -    }
> -    else
> -    {
> -      /* port not in group */
> -      goto Exit;
> -    }
> -  }
> -  else
> -  {
> -    /* point to the group information */
> -    scope_state = p_mgrp->mcmember_rec.scope_state;
> -  }
>  
>    /* now do the rest of the match */
>    if ((IB_MCR_COMPMASK_QKEY & comp_mask) &&
> @@ -2004,17 +1997,15 @@ __osm_sa_mcm_by_comp_mask_cb(
>        if (query_hop != mgrp_hop) goto Exit;
>    }
>  
> +  if ((IB_MCR_COMPMASK_PROXY & comp_mask) &&
> +      (p_rcvd_rec->proxy_join != p_mgrp->mcmember_rec.proxy_join)) goto
> Exit;
> +
>    if (IB_MCR_COMPMASK_SCOPE & comp_mask)
>      scope_state_mask = 0xF0;
>  
>    if (IB_MCR_COMPMASK_JOIN_STATE & comp_mask)
>      scope_state_mask = scope_state_mask | 0x0F;
>  
> -  if ((scope_state_mask & p_rcvd_rec->scope_state) !=
> -      (scope_state_mask & scope_state)) goto Exit;
> -
> -  if ((IB_MCR_COMPMASK_PROXY & comp_mask) &&
> -      (p_rcvd_rec->proxy_join != p_mgrp->mcmember_rec.proxy_join)) goto
> Exit;
>  
>    /* need to validate mtu, rate, and pkt_lifetime fields. */
>    if (__validate_more_comp_fields( p_rcv->p_log,
> @@ -2022,11 +2013,84 @@ __osm_sa_mcm_by_comp_mask_cb(
>                                     p_rcvd_rec,
>                                     comp_mask ) == FALSE) goto Exit;
>  
> +
> +  /* Port specific fields */
> +  /* so did we got the PortGUID mask */
> +  if (IB_MCR_COMPMASK_PORT_GID & comp_mask)
> +  {
> +     /* try to find this port */
> +     if (osm_mgrp_is_port_present(p_mgrp, portguid, &p_mcm_port))
> +     {
> +       scope_state = p_mcm_port->scope_state;
> +	   cl_memcpy(&port_gid, &(p_mcm_port->port_gid),
> sizeof(ib_gid_t));
> +	   proxy_join=p_mcm_port->proxy_join;
> +     }
> +     else
> +     {
> +       /* port not in group */
> +       goto Exit;
> +     }
> +  }
> +  else
> +  {
> +     /* point to the group information */
> +     scope_state = p_mgrp->mcmember_rec.scope_state;
> +  }
> +
> +
> +  /* Many MC record returned */
> +  if ( (p_ctxt->trusted_req==TRUE) && !(IB_MCR_COMPMASK_PORT_GID &
> comp_mask) )
> +  {
> +     osm_log(p_rcv->p_log, OSM_LOG_DEBUG,
> +			  "__osm_sa_mcm_by_comp_mask_cb: "
> +			  "trusted req is TRUE and no specific port
> defined\n");
> +
> +	  /* return all the ports the match in this MC group */
> +     p_item = cl_qmap_head(&(p_mgrp->mcm_port_tbl));
> +     while( p_item != cl_qmap_end(&(p_mgrp->mcm_port_tbl)) )
> +     {
> +        p_mcm_port=(osm_mcm_port_t *)p_item;
> +
> +        if ((scope_state_mask & p_rcvd_rec->scope_state) ==
> +            (scope_state_mask & p_mcm_port->scope_state)) 
> +		  {
> +           /* add to the list */
> +           match_rec = p_mgrp->mcmember_rec;
> +           match_rec.scope_state = p_mcm_port->scope_state;
> +			  cl_memcpy( &(match_rec.port_gid), 
> +                      &(p_mcm_port->port_gid), 
> +                      sizeof(ib_gid_t));
> +			  osm_log(p_rcv->p_log, OSM_LOG_DEBUG,
> +					 "__osm_sa_mcm_by_comp_mask_cb:
> "
> +					 "record of port_gid: 0x%016"
> PRIx64 "0x%016" PRIx64 
> +					 " in multicast_lid: 0x%X is
> returned\n",
> +
> cl_ntoh64(match_rec.port_gid.unicast.prefix),
> +
> cl_ntoh64(match_rec.port_gid.unicast.interface_id),	
> +					 cl_ntoh16(p_mgrp->mlid)
> +					 );
> +
> +			   match_rec.proxy_join =
> (uint8_t)(p_mcm_port->proxy_join);
> +
> +			   __osm_mcmr_rcv_new_mcmr(p_rcv, &match_rec,
> p_ctxt->p_list);
> +		   }
> +         p_item = cl_qmap_next(p_item);
> +      }
> +  }
> +  /* One MC record returned */
> +  else
> +  {
> +     if ((scope_state_mask & p_rcvd_rec->scope_state) !=
> +         (scope_state_mask & scope_state)) goto Exit;
> +
>    /* add to the list */
>    match_rec = p_mgrp->mcmember_rec;
>    match_rec.scope_state = scope_state;
> +      cl_memcpy(&(match_rec.port_gid), &port_gid, sizeof(ib_gid_t));
> +      match_rec.proxy_join = (uint8_t)proxy_join;
>  
>    __osm_mcmr_rcv_new_mcmr(p_rcv, &match_rec, p_ctxt->p_list);
> +  }
> +
>   Exit:
>    OSM_LOG_EXIT( p_rcv->p_log );
>  }
> @@ -2053,7 +2117,7 @@ osm_mcmr_query_mgrp(IN osm_mcmr_recv_t* 
>    ib_api_status_t       status;
>    ib_net64_t               comp_mask;
>    osm_physp_t*             p_req_physp;
> -  boolean_t                trusted_req = TRUE;
> +  boolean_t                trusted_req;
>  
>    CL_ASSERT( p_rcv );
>  
> @@ -2067,6 +2131,12 @@ osm_mcmr_query_mgrp(IN osm_mcmr_recv_t* 
>  
>    CL_ASSERT( p_rcvd_mad->attr_id == IB_MAD_ATTR_MCMEMBER_RECORD );
>  
> +  /* 
> +	if sm_key is not zero and does not match we never get here 
> +    see main SA receiver
> +   */  
> +  trusted_req = (p_rcvd_mad->sm_key != 0);
> +  
>    /* update the requester physical port. */
>    p_req_physp = osm_get_physp_by_mad_addr(p_rcv->p_log,
>                                            p_rcv->p_subn,
> @@ -2086,6 +2156,7 @@ osm_mcmr_query_mgrp(IN osm_mcmr_recv_t* 
>    context.comp_mask = p_rcvd_mad->comp_mask;
>    context.p_rcv = p_rcv;
>    context.p_req_physp = p_req_physp;
> +  context.trusted_req = trusted_req;
>  
>    CL_PLOCK_ACQUIRE( p_rcv->p_lock );
>  
> @@ -2212,8 +2283,7 @@ osm_mcmr_query_mgrp(IN osm_mcmr_recv_t* 
>      the mad is valid. Meaning - is either zero or equal to the local
>      sm_key.
>    */
> -  if (p_rcvd_mad->sm_key == 0)
> -    trusted_req = FALSE;
> +
>  
>    for ( i = 0; i < pre_trim_num_rec; i++ )
>    {
> 




More information about the general mailing list