[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