[openib-general] [PATCH] OpenSM/SA: Properly handle non base LID requests to someSA records

Eitan Zahavi eitan at mellanox.co.il
Tue Jun 13 11:21:11 PDT 2006


Sure. Looks good to me

Eitan Zahavi
Senior Engineering Director, Software Architect
Mellanox Technologies LTD
Tel:+972-4-9097208
Fax:+972-4-9593245
P.O. Box 586 Yokneam 20692 ISRAEL


> -----Original Message-----
> From: Hal Rosenstock [mailto:halr at voltaire.com]
> Sent: Tuesday, June 13, 2006 7:42 PM
> To: openib-general at openib.org
> Cc: Eitan Zahavi
> Subject: [PATCH] OpenSM/SA: Properly handle non base LID requests to
someSA
> records
> 
> OpenSM/SA: Properly handle non base LID requests to some SA records
> 
> In osm_sa_node_record.c and osm_sa_portinfo_record.c, properly handle
> non base LID requests per C15-0.1.11: Query responses shall contain a
> port's base LID in  any LID component of a RID. So when LMC is non 0,
> the only records that appear are those with the base LID and not with
> any masked LIDs. Furthermore, if a query comes in on a non base LID,
the
> LID in the RID returned is only with the base LID.
> 
> Also, fixed some endian issues in osm_log messages.
> 
> Note: Similar patch for other affected SA records will follow.
> 
> Signed-off-by: Hal Rosenstock <halr at voltaire.com>
> 
> Index: opensm/osm_sa_node_record.c
> ===================================================================
> --- opensm/osm_sa_node_record.c	(revision 7961)
> +++ opensm/osm_sa_node_record.c	(working copy)
> @@ -200,12 +200,11 @@ __osm_nr_rcv_create_nr(
>    uint8_t                  port_num;
>    uint8_t                  num_ports;
>    uint16_t                 match_lid_ho;
> -  uint16_t                 lid_ho;
> +  ib_net16_t               base_lid;
>    ib_net16_t               base_lid_ho;
>    ib_net16_t               max_lid_ho;
>    uint8_t                  lmc;
>    ib_net64_t               port_guid;
> -  ib_api_status_t          status;
> 
>    OSM_LOG_ENTER( p_rcv->p_log, __osm_nr_rcv_create_nr );
> 
> @@ -245,7 +244,8 @@ __osm_nr_rcv_create_nr(
>      if( match_port_guid && ( port_guid != match_port_guid ) )
>        continue;
> 
> -    base_lid_ho = cl_ntoh16( osm_physp_get_base_lid( p_physp ) );
> +    base_lid = osm_physp_get_base_lid( p_physp );
> +    base_lid_ho = cl_ntoh16( base_lid );
>      lmc = osm_physp_get_lmc( p_physp );
>      max_lid_ho = (uint16_t)( base_lid_ho + (1 << lmc) - 1 );
>      match_lid_ho = cl_ntoh16( match_lid );
> @@ -260,29 +260,18 @@ __osm_nr_rcv_create_nr(
>          osm_log( p_rcv->p_log, OSM_LOG_DEBUG,
>                   "__osm_nr_rcv_create_nr: "
>                   "Comparing LID: 0x%X <= 0x%X <= 0x%X\n",
> -                 cl_ntoh16( base_lid_ho ),
> -                 cl_ntoh16( match_lid_ho ),
> -                 cl_ntoh16( max_lid_ho )
> +                 base_lid_ho, match_lid_ho, max_lid_ho
>                   );
>        }
> 
>        if( (match_lid_ho <= max_lid_ho) && (match_lid_ho >=
base_lid_ho) )
>        {
> -        __osm_nr_rcv_new_nr( p_rcv, p_node, p_list, port_guid,
match_lid );
> +        __osm_nr_rcv_new_nr( p_rcv, p_node, p_list, port_guid,
base_lid );
>        }
>      }
>      else
>      {
> -      /*
> -        For every lid value create a Node Record.
> -      */
> -      for( lid_ho = base_lid_ho; lid_ho <= max_lid_ho; lid_ho++ )
> -      {
> -        status = __osm_nr_rcv_new_nr( p_rcv, p_node, p_list,
> -                                      port_guid, cl_hton16( lid_ho )
);
> -        if( status != IB_SUCCESS )
> -          break;
> -      }
> +      __osm_nr_rcv_new_nr( p_rcv, p_node, p_list, port_guid, base_lid
);
>      }
>    }
> 
> Index: opensm/osm_sa_portinfo_record.c
> ===================================================================
> --- opensm/osm_sa_portinfo_record.c	(revision 7961)
> +++ opensm/osm_sa_portinfo_record.c	(working copy)
> @@ -194,9 +194,9 @@ __osm_sa_pir_create(
>    IN osm_pir_search_ctxt_t*   const p_ctxt )
>  {
>    uint8_t               lmc;
> -  uint16_t              lid_ho;
>    uint16_t              max_lid_ho;
>    uint16_t              base_lid_ho;
> +  uint16_t              match_lid_ho;
> 
>    OSM_LOG_ENTER( p_rcv->p_log, __osm_sa_pir_create );
> 
> @@ -218,17 +218,28 @@ __osm_sa_pir_create(
> 
>    if( p_ctxt->comp_mask & IB_PIR_COMPMASK_LID )
>    {
> -    __osm_pir_rcv_new_pir( p_rcv, p_physp, p_ctxt->p_list,
> -                           p_ctxt->p_rcvd_rec->lid );
> -  }
> -  else
> -  {
> -    for( lid_ho = base_lid_ho; lid_ho <= max_lid_ho; lid_ho++ )
> +    match_lid_ho = cl_ntoh16( p_ctxt->p_rcvd_rec->lid );
> +
> +    /*
> +      We validate that the lid belongs to this node.
> +    */
> +    if( osm_log_is_active( p_rcv->p_log, OSM_LOG_DEBUG ) )
>      {
> -      __osm_pir_rcv_new_pir( p_rcv, p_physp, p_ctxt->p_list,
> -                             cl_hton16( lid_ho ) );
> +      osm_log( p_rcv->p_log, OSM_LOG_DEBUG,
> +               "__osm_sa_pir_create: "
> +               "Comparing LID: 0x%X <= 0x%X <= 0x%X\n",
> +               base_lid_ho, match_lid_ho, max_lid_ho
> +               );
>      }
> +
> +    if ( match_lid_ho < base_lid_ho || match_lid_ho > max_lid_ho )
> +      goto Exit;
>    }
> +
> +  __osm_pir_rcv_new_pir( p_rcv, p_physp, p_ctxt->p_list,
> +                         cl_hton16( base_lid_ho ) );
> +
> + Exit:
>    OSM_LOG_EXIT( p_rcv->p_log );
>  }
> 
> 





More information about the general mailing list