On Sun, Feb 7, 2010 at 4:47 AM, Eli Dorfman (Voltaire) <dorfman....@gmail.com> wrote: > Hal Rosenstock wrote: >> On Fri, Feb 5, 2010 at 9:18 AM, Eli Dorfman <dorfman....@gmail.com> wrote: >>> On Thu, Feb 4, 2010 at 10:52 PM, Hal Rosenstock >>> <hal.rosenst...@gmail.com> wrote: >>>> On Thu, Feb 4, 2010 at 12:43 PM, Eli Dorfman (Voltaire) >>>> <dorfman....@gmail.com> wrote: >>>>> Subject: [PATCH] Wrong handling of MC create and delete traps >>>>> >>>>> For these traps the GID in the data details is the MGID and >>>>> not the source port gid. >>>>> So the SM should check that subscriber port has the pkey of the MC group. >>>>> There was also an error in comparing the subnet prefix and guid due to >>>>> host/network order mismatch. >>>>> >>>>> Signed-off-by: Eli Dorfman <e...@voltaire.com> >>>>> --- >>>>> opensm/opensm/osm_inform.c | 151 >>>>> ++++++++++++++++++++++++++++--------------- >>>>> 1 files changed, 98 insertions(+), 53 deletions(-) >>>>> >>>>> diff --git a/opensm/opensm/osm_inform.c b/opensm/opensm/osm_inform.c >>>>> index 8108213..ae4fe71 100644 >>>>> --- a/opensm/opensm/osm_inform.c >>>>> +++ b/opensm/opensm/osm_inform.c >>>>> @@ -341,6 +341,103 @@ Exit: >>>>> return status; >>>>> } >>>>> >>>>> +static int is_access_permitted( osm_infr_t *p_infr_rec, >>>>> + osm_infr_match_ctxt_t *p_infr_match ) >>>>> +{ >>>>> + cl_list_t *p_infr_to_remove_list = >>>>> p_infr_match->p_remove_infr_list; >>>>> + ib_inform_info_t *p_ii = &(p_infr_rec->inform_record.inform_info); >>>>> + ib_mad_notice_attr_t *p_ntc = p_infr_match->p_ntc; >>>>> + uint16_t trap_num = cl_ntoh16(p_ntc->g_or_v.generic.trap_num); >>>>> + osm_subn_t *p_subn = p_infr_rec->sa->p_subn; >>>>> + osm_log_t *p_log = p_infr_rec->sa->p_log; >>>>> + char gid_str[INET6_ADDRSTRLEN]; >>>>> + osm_mgrp_t *p_mgrp; >>>>> + ib_gid_t source_gid; >>>>> + osm_port_t *p_src_port; >>>>> + osm_port_t *p_dest_port; >>>>> + >>>>> + /* In case of GID_IN(64) or GID_OUT(65) traps the source gid >>>>> + comparison should be done on the trap source (saved as the gid >>>>> in the >>>>> + data details field). >>>>> + For traps MC_CREATE(66) or MC_DELETE(67) the data details gid >>>>> is >>>>> + the MGID. We need to check whether subscriber has the pky of >>>> >>>> typo ^^^^ >>>> >>>> pkey >>>> >>>> >>>>> + the MC group. >>>> Shouldn't this be the subscriber has a compatible pkey with MC group ? >>>> The MC group has a full member PKey and the members can be full or >>>> limited. >>> I accept the correction. >> >> Doesn't this require a code change for handling trap cases 66-67 ? > > I think that you referred to the comment since the code is handling this > properly (in my opinion).
I was referring to both the comment and the code since a port with a compatible limited pkey should be able to receive the reports for MC groups. > >> >>> Sasha, can you please change this in the commit (only if there are not >>> other remarks). >> >> Is that what you are asking Sasha to do (beyond the typos) ? > > I asked Sasha to fix only the typo in commit. > >> >>> BTW, there is no explicit reference in the IB spec for MC group >>> create/delete trap (at least I didn't find it). >> >> Not sure what you mean by this. What didn't you find ? > > in the spec see o13-17.1.2 Yes, there appear to be some holes in the spec in terms of this and maybe more in this area (event forwarding) but the intent seems clear. -- Hal > Thanks, > Eli >> >> -- Hal >> >>>>> + In all other cases the issuer gis is the trap source. >>>> typo ^^^ >>>> gid >>>> >>> and this typo of course. >>> >>> Thanks, >>> Eli >>>> -- Hal >>>> >>>>> + */ >>>>> + if (trap_num >= 64 && trap_num <= 67 ) >>>>> + /* The issuer of these traps is the SM so source_gid >>>>> + is the gid saved on the data details */ >>>>> + source_gid = p_ntc->data_details.ntc_64_67.gid; >>>>> + else >>>>> + source_gid = p_ntc->issuer_gid; >>>>> + >>>>> + p_dest_port = >>>>> + cl_ptr_vector_get(&p_subn->port_lid_tbl, >>>>> + >>>>> cl_ntoh16(p_infr_rec->report_addr.dest_lid)); >>>>> + if (!p_dest_port) { >>>>> + OSM_LOG(p_log, OSM_LOG_INFO, >>>>> + "Cannot find destination port with LID:%u\n", >>>>> + cl_ntoh16(p_infr_rec->report_addr.dest_lid)); >>>>> + goto Exit; >>>>> + } >>>>> + >>>>> + switch (trap_num) { >>>>> + case 66: >>>>> + case 67: >>>>> + p_mgrp = osm_get_mgrp_by_mgid(p_subn, >>>>> &source_gid); >>>>> + if (!p_mgrp) { >>>>> + OSM_LOG(p_log, OSM_LOG_INFO, >>>>> + "Cannot find MGID %s\n", >>>>> + inet_ntop(AF_INET6, >>>>> source_gid.raw, gid_str, sizeof gid_str)); >>>>> + goto Exit; >>>>> + } >>>>> + >>>>> + if (!osm_physp_has_pkey(p_log, >>>>> + p_mgrp->mcmember_rec.pkey, >>>>> + p_dest_port->p_physp)) { >>>>> + OSM_LOG(p_log, OSM_LOG_INFO, >>>>> + "MGID %s and port GUID:0x%016" >>>>> PRIx64 " do not share same pkey\n", >>>>> + inet_ntop(AF_INET6, >>>>> source_gid.raw, gid_str, sizeof gid_str), >>>>> + cl_ntoh64(p_dest_port->guid)); >>>>> + goto Exit; >>>>> + } >>>>> + break; >>>>> + >>>>> + default: >>>>> + p_src_port = >>>>> + osm_get_port_by_guid(p_subn, >>>>> source_gid.unicast.interface_id); >>>>> + if (!p_src_port) { >>>>> + OSM_LOG(p_log, OSM_LOG_INFO, >>>>> + "Cannot find source port with >>>>> GUID:0x%016" PRIx64 "\n", >>>>> + >>>>> cl_ntoh64(source_gid.unicast.interface_id)); >>>>> + goto Exit; >>>>> + } >>>>> + >>>>> + >>>>> + /* Check if there is a pkey match. o13-17.1.1 */ >>>>> + if (osm_port_share_pkey(p_log, p_src_port, >>>>> p_dest_port) == FALSE) { >>>>> + OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch >>>>> by Pkey\n"); >>>>> + /* According to o13-17.1.2 - If this >>>>> informInfo does not have >>>>> + lid_range_begin of 0xFFFF, then this >>>>> informInfo request >>>>> + should be removed from database */ >>>>> + if (p_ii->lid_range_begin != 0xFFFF) { >>>>> + OSM_LOG(p_log, OSM_LOG_VERBOSE, >>>>> + "Pkey mismatch on >>>>> lid_range_begin != 0xFFFF. " >>>>> + "Need to remove this >>>>> informInfo from db\n"); >>>>> + /* add the informInfo record to >>>>> the remove_infr list */ >>>>> + >>>>> cl_list_insert_tail(p_infr_to_remove_list, p_infr_rec); >>>>> + } >>>>> + goto Exit; >>>>> + } >>>>> + break; >>>>> + } >>>>> + >>>>> + return 1; >>>>> +Exit: >>>>> + return 0; >>>>> +} >>>>> + >>>>> + >>>>> /********************************************************************** >>>>> * This routine compares a given Notice and a ListItem of InformInfo type. >>>>> * PREREQUISITE: >>>>> @@ -351,15 +448,10 @@ static void match_notice_to_inf_rec(IN >>>>> cl_list_item_t * p_list_item, >>>>> { >>>>> osm_infr_match_ctxt_t *p_infr_match = (osm_infr_match_ctxt_t *) >>>>> context; >>>>> ib_mad_notice_attr_t *p_ntc = p_infr_match->p_ntc; >>>>> - cl_list_t *p_infr_to_remove_list = >>>>> p_infr_match->p_remove_infr_list; >>>>> osm_infr_t *p_infr_rec = (osm_infr_t *) p_list_item; >>>>> ib_inform_info_t *p_ii = &(p_infr_rec->inform_record.inform_info); >>>>> cl_status_t status = CL_NOT_FOUND; >>>>> osm_log_t *p_log = p_infr_rec->sa->p_log; >>>>> - osm_subn_t *p_subn = p_infr_rec->sa->p_subn; >>>>> - ib_gid_t source_gid; >>>>> - osm_port_t *p_src_port; >>>>> - osm_port_t *p_dest_port; >>>>> >>>>> OSM_LOG_ENTER(p_log); >>>>> >>>>> @@ -460,55 +552,8 @@ static void match_notice_to_inf_rec(IN >>>>> cl_list_item_t * p_list_item, >>>>> } >>>>> } >>>>> >>>>> - /* Check if there is a pkey match. o13-17.1.1 */ >>>>> - /* Check if the issuer of the trap is the SM. If it is, then the >>>>> gid >>>>> - comparison should be done on the trap source (saved as the gid >>>>> in the >>>>> - data details field). >>>>> - If the issuer gid is not the SM - then it is the guid of the >>>>> trap >>>>> - source */ >>>>> - if ((cl_ntoh64(p_ntc->issuer_gid.unicast.prefix) == >>>>> - p_subn->opt.subnet_prefix) >>>>> - && (cl_ntoh64(p_ntc->issuer_gid.unicast.interface_id) == >>>>> - p_subn->sm_port_guid)) >>>>> - /* The issuer is the SM then this is trap 64-67 - compare >>>>> the gid >>>>> - with the gid saved on the data details */ >>>>> - source_gid = p_ntc->data_details.ntc_64_67.gid; >>>>> - else >>>>> - source_gid = p_ntc->issuer_gid; >>>>> - >>>>> - p_src_port = >>>>> - osm_get_port_by_guid(p_subn, source_gid.unicast.interface_id); >>>>> - if (!p_src_port) { >>>>> - OSM_LOG(p_log, OSM_LOG_INFO, >>>>> - "Cannot find source port with GUID:0x%016" PRIx64 >>>>> "\n", >>>>> - cl_ntoh64(source_gid.unicast.interface_id)); >>>>> + if (!is_access_permitted(p_infr_rec, p_infr_match)) >>>>> goto Exit; >>>>> - } >>>>> - >>>>> - p_dest_port = >>>>> - cl_ptr_vector_get(&p_subn->port_lid_tbl, >>>>> - >>>>> cl_ntoh16(p_infr_rec->report_addr.dest_lid)); >>>>> - if (!p_dest_port) { >>>>> - OSM_LOG(p_log, OSM_LOG_INFO, >>>>> - "Cannot find destination port with LID:%u\n", >>>>> - cl_ntoh16(p_infr_rec->report_addr.dest_lid)); >>>>> - goto Exit; >>>>> - } >>>>> - >>>>> - if (osm_port_share_pkey(p_log, p_src_port, p_dest_port) == FALSE) >>>>> { >>>>> - OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Pkey\n"); >>>>> - /* According to o13-17.1.2 - If this informInfo does not >>>>> have >>>>> - lid_range_begin of 0xFFFF, then this informInfo request >>>>> - should be removed from database */ >>>>> - if (p_ii->lid_range_begin != 0xFFFF) { >>>>> - OSM_LOG(p_log, OSM_LOG_VERBOSE, >>>>> - "Pkey mismatch on lid_range_begin != >>>>> 0xFFFF. " >>>>> - "Need to remove this informInfo from >>>>> db\n"); >>>>> - /* add the informInfo record to the remove_infr >>>>> list */ >>>>> - cl_list_insert_tail(p_infr_to_remove_list, >>>>> p_infr_rec); >>>>> - } >>>>> - goto Exit; >>>>> - } >>>>> >>>>> /* send the report to the address provided in the inform record */ >>>>> OSM_LOG(p_log, OSM_LOG_DEBUG, "MATCH! Sending Report...\n"); >>>>> -- >>>>> 1.5.5 >>>>> >>>>> There is still a problem with GID OUT trap that is not sent since source >>>>> port >>>>> was already removed. >>>>> Patch will follow. >>>>> >>>>> -- >>>>> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in >>>>> the body of a message to majord...@vger.kernel.org >>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>>>> > >