|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2002-2015 Mellanox Technologies LTD. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2009 HNR Consulting. All rights reserved.
|
|
Packit Service |
54dbc3 |
* Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* This software is available to you under a choice of one of two
|
|
Packit Service |
54dbc3 |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit Service |
54dbc3 |
* General Public License (GPL) Version 2, available from the file
|
|
Packit Service |
54dbc3 |
* COPYING in the main directory of this source tree, or the
|
|
Packit Service |
54dbc3 |
* OpenIB.org BSD license below:
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* Redistribution and use in source and binary forms, with or
|
|
Packit Service |
54dbc3 |
* without modification, are permitted provided that the following
|
|
Packit Service |
54dbc3 |
* conditions are met:
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* - Redistributions of source code must retain the above
|
|
Packit Service |
54dbc3 |
* copyright notice, this list of conditions and the following
|
|
Packit Service |
54dbc3 |
* disclaimer.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* - Redistributions in binary form must reproduce the above
|
|
Packit Service |
54dbc3 |
* copyright notice, this list of conditions and the following
|
|
Packit Service |
54dbc3 |
* disclaimer in the documentation and/or other materials
|
|
Packit Service |
54dbc3 |
* provided with the distribution.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit Service |
54dbc3 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit Service |
54dbc3 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit Service |
54dbc3 |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit Service |
54dbc3 |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit Service |
54dbc3 |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit Service |
54dbc3 |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit Service |
54dbc3 |
* SOFTWARE.
|
|
Packit Service |
54dbc3 |
*
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* Abstract:
|
|
Packit Service |
54dbc3 |
* Implementation of inform record functions.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#if HAVE_CONFIG_H
|
|
Packit Service |
54dbc3 |
# include <config.h>
|
|
Packit Service |
54dbc3 |
#endif /* HAVE_CONFIG_H */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#include <stdlib.h>
|
|
Packit Service |
54dbc3 |
#include <string.h>
|
|
Packit Service |
54dbc3 |
#include <arpa/inet.h>
|
|
Packit Service |
54dbc3 |
#include <complib/cl_debug.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_file_ids.h>
|
|
Packit Service |
54dbc3 |
#define FILE_ID OSM_FILE_INFORM_C
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_helper.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_inform.h>
|
|
Packit Service |
54dbc3 |
#include <vendor/osm_vendor_api.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_pkey.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_sa.h>
|
|
Packit Service |
54dbc3 |
#include <opensm/osm_opensm.h>
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
typedef struct osm_infr_match_ctxt {
|
|
Packit Service |
54dbc3 |
cl_list_t *p_remove_infr_list;
|
|
Packit Service |
54dbc3 |
ib_mad_notice_attr_t *p_ntc;
|
|
Packit Service |
54dbc3 |
} osm_infr_match_ctxt_t;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
void osm_infr_delete(IN osm_infr_t * p_infr)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
free(p_infr);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_infr_t *osm_infr_new(IN const osm_infr_t * p_infr_rec)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_infr_t *p_infr;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
CL_ASSERT(p_infr_rec);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_infr = (osm_infr_t *) malloc(sizeof(osm_infr_t));
|
|
Packit Service |
54dbc3 |
if (p_infr)
|
|
Packit Service |
54dbc3 |
memcpy(p_infr, p_infr_rec, sizeof(osm_infr_t));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return p_infr;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static void dump_all_informs(IN const osm_subn_t * p_subn, IN osm_log_t * p_log)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_list_item_t *p_list_item;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!OSM_LOG_IS_ACTIVE_V2(p_log, OSM_LOG_DEBUG))
|
|
Packit Service |
54dbc3 |
return;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_list_item = cl_qlist_head(&p_subn->sa_infr_list);
|
|
Packit Service |
54dbc3 |
while (p_list_item != cl_qlist_end(&p_subn->sa_infr_list)) {
|
|
Packit Service |
54dbc3 |
osm_dump_inform_info_v2(p_log,
|
|
Packit Service |
54dbc3 |
&((osm_infr_t *) p_list_item)->
|
|
Packit Service |
54dbc3 |
inform_record.inform_info, FILE_ID, OSM_LOG_DEBUG);
|
|
Packit Service |
54dbc3 |
p_list_item = cl_qlist_next(p_list_item);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* Match an infr by the InformInfo and Address vector
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
static cl_status_t match_inf_rec(IN const cl_list_item_t * p_list_item,
|
|
Packit Service |
54dbc3 |
IN void *context)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_infr_t *p_infr_rec = (osm_infr_t *) context;
|
|
Packit Service |
54dbc3 |
osm_infr_t *p_infr = (osm_infr_t *) p_list_item;
|
|
Packit Service |
54dbc3 |
ib_inform_info_t *p_ii_rec = &p_infr_rec->inform_record.inform_info;
|
|
Packit Service |
54dbc3 |
ib_inform_info_t *p_ii = &p_infr->inform_record.inform_info;
|
|
Packit Service |
54dbc3 |
osm_log_t *p_log = p_infr_rec->sa->p_log;
|
|
Packit Service |
54dbc3 |
cl_status_t status = CL_NOT_FOUND;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_ENTER(p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (memcmp(&p_infr->report_addr, &p_infr_rec->report_addr,
|
|
Packit Service |
54dbc3 |
sizeof(p_infr_rec->report_addr))) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Differ by Address\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* if inform_info.gid is not zero, ignore lid range */
|
|
Packit Service |
54dbc3 |
if (ib_gid_is_notzero(&p_ii_rec->gid)) {
|
|
Packit Service |
54dbc3 |
if (memcmp(&p_ii->gid, &p_ii_rec->gid, sizeof(p_ii->gid))) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.gid\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
if ((p_ii->lid_range_begin != p_ii_rec->lid_range_begin) ||
|
|
Packit Service |
54dbc3 |
(p_ii->lid_range_end != p_ii_rec->lid_range_end)) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.LIDRange\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_ii->trap_type != p_ii_rec->trap_type) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.TrapType\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_ii->is_generic != p_ii_rec->is_generic) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.IsGeneric\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_ii->is_generic) {
|
|
Packit Service |
54dbc3 |
if (p_ii->g_or_v.generic.trap_num !=
|
|
Packit Service |
54dbc3 |
p_ii_rec->g_or_v.generic.trap_num)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.Generic.TrapNumber\n");
|
|
Packit Service |
54dbc3 |
else if (p_ii->g_or_v.generic.qpn_resp_time_val !=
|
|
Packit Service |
54dbc3 |
p_ii_rec->g_or_v.generic.qpn_resp_time_val)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.Generic.QPNRespTimeVal\n");
|
|
Packit Service |
54dbc3 |
else if (p_ii->g_or_v.generic.node_type_msb !=
|
|
Packit Service |
54dbc3 |
p_ii_rec->g_or_v.generic.node_type_msb)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.Generic.NodeTypeMSB\n");
|
|
Packit Service |
54dbc3 |
else if (p_ii->g_or_v.generic.node_type_lsb !=
|
|
Packit Service |
54dbc3 |
p_ii_rec->g_or_v.generic.node_type_lsb)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.Generic.NodeTypeLSB\n");
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
status = CL_SUCCESS;
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
if (p_ii->g_or_v.vend.dev_id != p_ii_rec->g_or_v.vend.dev_id)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.Vendor.DeviceID\n");
|
|
Packit Service |
54dbc3 |
else if (p_ii->g_or_v.vend.qpn_resp_time_val !=
|
|
Packit Service |
54dbc3 |
p_ii_rec->g_or_v.vend.qpn_resp_time_val)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.Vendor.QPNRespTimeVal\n");
|
|
Packit Service |
54dbc3 |
else if (p_ii->g_or_v.vend.vendor_id_msb !=
|
|
Packit Service |
54dbc3 |
p_ii_rec->g_or_v.vend.vendor_id_msb)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.Vendor.VendorIdMSB\n");
|
|
Packit Service |
54dbc3 |
else if (p_ii->g_or_v.vend.vendor_id_lsb !=
|
|
Packit Service |
54dbc3 |
p_ii_rec->g_or_v.vend.vendor_id_lsb)
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Differ by InformInfo.Vendor.VendorIdLSB\n");
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
status = CL_SUCCESS;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
OSM_LOG_EXIT(p_log);
|
|
Packit Service |
54dbc3 |
return status;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_infr_t *osm_infr_get_by_rec(IN osm_subn_t const *p_subn,
|
|
Packit Service |
54dbc3 |
IN osm_log_t * p_log,
|
|
Packit Service |
54dbc3 |
IN osm_infr_t * p_infr_rec)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_list_item_t *p_list_item;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_ENTER(p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
dump_all_informs(p_subn, p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Looking for Inform Record\n");
|
|
Packit Service |
54dbc3 |
osm_dump_inform_info_v2(p_log, &(p_infr_rec->inform_record.inform_info),
|
|
Packit Service |
54dbc3 |
FILE_ID, OSM_LOG_DEBUG);
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "InformInfo list size %d\n",
|
|
Packit Service |
54dbc3 |
cl_qlist_count(&p_subn->sa_infr_list));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_list_item = cl_qlist_find_from_head(&p_subn->sa_infr_list,
|
|
Packit Service |
54dbc3 |
match_inf_rec, p_infr_rec);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (p_list_item == cl_qlist_end(&p_subn->sa_infr_list))
|
|
Packit Service |
54dbc3 |
p_list_item = NULL;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_EXIT(p_log);
|
|
Packit Service |
54dbc3 |
return (osm_infr_t *) p_list_item;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
void osm_infr_insert_to_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log,
|
|
Packit Service |
54dbc3 |
IN osm_infr_t * p_infr)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
OSM_LOG_ENTER(p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Inserting new InformInfo Record into Database\n");
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Dump before insertion (size %d)\n",
|
|
Packit Service |
54dbc3 |
cl_qlist_count(&p_subn->sa_infr_list));
|
|
Packit Service |
54dbc3 |
dump_all_informs(p_subn, p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
#if 0
|
|
Packit Service |
54dbc3 |
osm_dump_inform_info_v2(p_log,
|
|
Packit Service |
54dbc3 |
&(p_infr->inform_record.inform_info),
|
|
Packit Service |
54dbc3 |
FILE_ID, OSM_LOG_DEBUG);
|
|
Packit Service |
54dbc3 |
#endif
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_qlist_insert_head(&p_subn->sa_infr_list, &p_infr->list_item);
|
|
Packit Service |
54dbc3 |
p_subn->p_osm->sa.dirty = TRUE;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Dump after insertion (size %d)\n",
|
|
Packit Service |
54dbc3 |
cl_qlist_count(&p_subn->sa_infr_list));
|
|
Packit Service |
54dbc3 |
dump_all_informs(p_subn, p_log);
|
|
Packit Service |
54dbc3 |
OSM_LOG_EXIT(p_log);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
void osm_infr_remove_from_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log,
|
|
Packit Service |
54dbc3 |
IN osm_infr_t * p_infr)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit Service |
54dbc3 |
OSM_LOG_ENTER(p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Removing InformInfo Subscribing GID:%s"
|
|
Packit Service |
54dbc3 |
" Enum:0x%X from Database\n",
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, p_infr->inform_record.subscriber_gid.raw,
|
|
Packit Service |
54dbc3 |
gid_str, sizeof gid_str),
|
|
Packit Service |
54dbc3 |
p_infr->inform_record.subscriber_enum);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_dump_inform_info_v2(p_log, &(p_infr->inform_record.inform_info),
|
|
Packit Service |
54dbc3 |
FILE_ID, OSM_LOG_DEBUG);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
cl_qlist_remove_item(&p_subn->sa_infr_list, &p_infr->list_item);
|
|
Packit Service |
54dbc3 |
p_subn->p_osm->sa.dirty = TRUE;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
osm_infr_delete(p_infr);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_EXIT(p_log);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
ib_api_status_t osm_infr_remove_subscriptions(IN osm_subn_t * p_subn,
|
|
Packit Service |
54dbc3 |
IN osm_log_t * p_log,
|
|
Packit Service |
54dbc3 |
IN ib_net64_t port_guid)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_list_item_t *p_list_item;
|
|
Packit Service |
54dbc3 |
osm_infr_t *p_infr;
|
|
Packit Service |
54dbc3 |
ib_api_status_t status = CL_NOT_FOUND;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_ENTER(p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* go over all inform info available at the subnet */
|
|
Packit Service |
54dbc3 |
/* match to the given GID and delete subscriptions if match */
|
|
Packit Service |
54dbc3 |
p_list_item = cl_qlist_head(&p_subn->sa_infr_list);
|
|
Packit Service |
54dbc3 |
while (p_list_item != cl_qlist_end(&p_subn->sa_infr_list)) {
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_infr = (osm_infr_t *)p_list_item;
|
|
Packit Service |
54dbc3 |
p_list_item = cl_qlist_next(p_list_item);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (port_guid != p_infr->inform_record.subscriber_gid.unicast.interface_id)
|
|
Packit Service |
54dbc3 |
continue;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Remove this event subscription */
|
|
Packit Service |
54dbc3 |
osm_infr_remove_from_db(p_subn, p_log, p_infr);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
status = CL_SUCCESS;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_EXIT(p_log);
|
|
Packit Service |
54dbc3 |
return (status);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* Send a report:
|
|
Packit Service |
54dbc3 |
* Given a target address to send to and the notice.
|
|
Packit Service |
54dbc3 |
* We need to send SubnAdmReport
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
static ib_api_status_t send_report(IN osm_infr_t * p_infr_rec, /* the informinfo */
|
|
Packit Service |
54dbc3 |
IN ib_mad_notice_attr_t * p_ntc /* notice to send */
|
|
Packit Service |
54dbc3 |
)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_madw_t *p_report_madw;
|
|
Packit Service |
54dbc3 |
ib_mad_notice_attr_t *p_report_ntc;
|
|
Packit Service |
54dbc3 |
ib_mad_t *p_mad;
|
|
Packit Service |
54dbc3 |
ib_sa_mad_t *p_sa_mad;
|
|
Packit Service |
54dbc3 |
static atomic32_t trap_fwd_trans_id = 0x02DAB000;
|
|
Packit Service |
54dbc3 |
ib_api_status_t status = IB_SUCCESS;
|
|
Packit Service |
54dbc3 |
osm_log_t *p_log = p_infr_rec->sa->p_log;
|
|
Packit Service |
54dbc3 |
ib_net64_t tid;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_ENTER(p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* HACK: who switches or uses the src and dest GIDs in the grh_info ?? */
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* it is better to use LIDs since the GIDs might not be there for SMI traps */
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Forwarding Notice Event from LID %u"
|
|
Packit Service |
54dbc3 |
" to InformInfo LID %u GUID 0x%" PRIx64 ", TID 0x%X\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh16(p_ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(p_infr_rec->report_addr.dest_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_infr_rec->inform_record.subscriber_gid.unicast.interface_id),
|
|
Packit Service |
54dbc3 |
trap_fwd_trans_id);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* get the MAD to send */
|
|
Packit Service |
54dbc3 |
p_report_madw = osm_mad_pool_get(p_infr_rec->sa->p_mad_pool,
|
|
Packit Service |
54dbc3 |
p_infr_rec->h_bind, MAD_BLOCK_SIZE,
|
|
Packit Service |
54dbc3 |
&(p_infr_rec->report_addr));
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!p_report_madw) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0203: "
|
|
Packit Service |
54dbc3 |
"Cannot send report to LID %u, osm_mad_pool_get failed\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh16(p_infr_rec->report_addr.dest_lid));
|
|
Packit Service |
54dbc3 |
status = IB_ERROR;
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_report_madw->resp_expected = TRUE;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* advance trap trans id (cant simply ++ on some systems inside ntoh) */
|
|
Packit Service |
54dbc3 |
tid = cl_hton64((uint64_t) cl_atomic_inc(&trap_fwd_trans_id) &
|
|
Packit Service |
54dbc3 |
(uint64_t) (0xFFFFFFFF));
|
|
Packit Service |
54dbc3 |
if (trap_fwd_trans_id == 0)
|
|
Packit Service |
54dbc3 |
tid = cl_hton64((uint64_t) cl_atomic_inc(&trap_fwd_trans_id) &
|
|
Packit Service |
54dbc3 |
(uint64_t) (0xFFFFFFFF));
|
|
Packit Service |
54dbc3 |
p_mad = osm_madw_get_mad_ptr(p_report_madw);
|
|
Packit Service |
54dbc3 |
ib_mad_init_new(p_mad, IB_MCLASS_SUBN_ADM, 2, IB_MAD_METHOD_REPORT,
|
|
Packit Service |
54dbc3 |
tid, IB_MAD_ATTR_NOTICE, 0);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_sa_mad = osm_madw_get_sa_mad_ptr(p_report_madw);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_report_ntc = (ib_mad_notice_attr_t *) & (p_sa_mad->data);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* copy the notice */
|
|
Packit Service |
54dbc3 |
*p_report_ntc = *p_ntc;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* The TRUE is for: response is expected */
|
|
Packit Service |
54dbc3 |
osm_sa_send(p_infr_rec->sa, p_report_madw, TRUE);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
OSM_LOG_EXIT(p_log);
|
|
Packit Service |
54dbc3 |
return status;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
static int is_access_permitted(osm_infr_t *p_infr_rec,
|
|
Packit Service |
54dbc3 |
osm_infr_match_ctxt_t *p_infr_match )
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
cl_list_t *p_infr_to_remove_list = p_infr_match->p_remove_infr_list;
|
|
Packit Service |
54dbc3 |
ib_inform_info_t *p_ii = &(p_infr_rec->inform_record.inform_info);
|
|
Packit Service |
54dbc3 |
ib_mad_notice_attr_t *p_ntc = p_infr_match->p_ntc;
|
|
Packit Service |
54dbc3 |
uint16_t trap_num = cl_ntoh16(p_ntc->g_or_v.generic.trap_num);
|
|
Packit Service |
54dbc3 |
osm_subn_t *p_subn = p_infr_rec->sa->p_subn;
|
|
Packit Service |
54dbc3 |
osm_log_t *p_log = p_infr_rec->sa->p_log;
|
|
Packit Service |
54dbc3 |
osm_mgrp_t *p_mgrp;
|
|
Packit Service |
54dbc3 |
ib_gid_t source_gid;
|
|
Packit Service |
54dbc3 |
osm_port_t *p_src_port;
|
|
Packit Service |
54dbc3 |
osm_port_t *p_dest_port;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* In case of SM_GID_IN_SERVICE_TRAP(64) or SM_GID_OUT_OF_SERVICE_TRAP(65) traps
|
|
Packit Service |
54dbc3 |
the source gid comparison should be done on the trap source (saved
|
|
Packit Service |
54dbc3 |
as the gid in the data details field).
|
|
Packit Service |
54dbc3 |
For traps SM_MGID_CREATED_TRAP(66) or SM_MGID_DESTROYED_TRAP(67)
|
|
Packit Service |
54dbc3 |
the data details gid is the MGID.
|
|
Packit Service |
54dbc3 |
We need to check whether the subscriber has a compatible
|
|
Packit Service |
54dbc3 |
pkey with MC group.
|
|
Packit Service |
54dbc3 |
In all other cases the issuer gid is the trap source.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
if (trap_num >= SM_GID_IN_SERVICE_TRAP &&
|
|
Packit Service |
54dbc3 |
trap_num <= SM_MGID_DESTROYED_TRAP)
|
|
Packit Service |
54dbc3 |
/* The issuer of these traps is the SM so source_gid
|
|
Packit Service |
54dbc3 |
is the gid saved on the data details */
|
|
Packit Service |
54dbc3 |
source_gid = p_ntc->data_details.ntc_64_67.gid;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
source_gid = p_ntc->issuer_gid;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
p_dest_port = osm_get_port_by_lid(p_subn,
|
|
Packit Service |
54dbc3 |
p_infr_rec->report_addr.dest_lid);
|
|
Packit Service |
54dbc3 |
if (!p_dest_port) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_INFO,
|
|
Packit Service |
54dbc3 |
"Cannot find destination port with LID:%u\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh16(p_infr_rec->report_addr.dest_lid));
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Check if there is a pkey match. o13-17.1.1 */
|
|
Packit Service |
54dbc3 |
switch (trap_num) {
|
|
Packit Service |
54dbc3 |
case SM_MGID_CREATED_TRAP:
|
|
Packit Service |
54dbc3 |
case SM_MGID_DESTROYED_TRAP:
|
|
Packit Service |
54dbc3 |
p_mgrp = osm_get_mgrp_by_mgid(p_subn, &source_gid);
|
|
Packit Service |
54dbc3 |
if (!p_mgrp) {
|
|
Packit Service |
54dbc3 |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_INFO,
|
|
Packit Service |
54dbc3 |
"Cannot find MGID %s\n",
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, source_gid.raw, gid_str, sizeof gid_str));
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!osm_physp_has_pkey(p_log,
|
|
Packit Service |
54dbc3 |
p_mgrp->mcmember_rec.pkey,
|
|
Packit Service |
54dbc3 |
p_dest_port->p_physp)) {
|
|
Packit Service |
54dbc3 |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_INFO,
|
|
Packit Service |
54dbc3 |
"MGID %s and port GUID:0x%016" PRIx64 " do not share same pkey\n",
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, source_gid.raw, gid_str, sizeof gid_str),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(p_dest_port->guid));
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
default:
|
|
Packit Service |
54dbc3 |
p_src_port =
|
|
Packit Service |
54dbc3 |
osm_get_port_by_guid(p_subn, source_gid.unicast.interface_id);
|
|
Packit Service |
54dbc3 |
if (!p_src_port) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_INFO,
|
|
Packit Service |
54dbc3 |
"Cannot find source port with GUID:0x%016" PRIx64 "\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh64(source_gid.unicast.interface_id));
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (osm_port_share_pkey(p_log, p_src_port, p_dest_port,
|
|
Packit Service |
54dbc3 |
p_subn->opt.allow_both_pkeys) == FALSE) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Pkey\n");
|
|
Packit Service |
54dbc3 |
/* According to o13-17.1.2 - If this informInfo
|
|
Packit Service |
54dbc3 |
does not have lid_range_begin of 0xFFFF,
|
|
Packit Service |
54dbc3 |
then this informInfo request should be
|
|
Packit Service |
54dbc3 |
removed from database */
|
|
Packit Service |
54dbc3 |
if (p_ii->lid_range_begin != 0xFFFF) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_VERBOSE,
|
|
Packit Service |
54dbc3 |
"Pkey mismatch on lid_range_begin != 0xFFFF. "
|
|
Packit Service |
54dbc3 |
"Need to remove this informInfo from db\n");
|
|
Packit Service |
54dbc3 |
/* add the informInfo record to the remove_infr list */
|
|
Packit Service |
54dbc3 |
cl_list_insert_tail(p_infr_to_remove_list, p_infr_rec);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return 1;
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
return 0;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* This routine compares a given Notice and a ListItem of InformInfo type.
|
|
Packit Service |
54dbc3 |
* PREREQUISITE:
|
|
Packit Service |
54dbc3 |
* The Notice.GID should be pre-filled with the trap generator GID
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
static void match_notice_to_inf_rec(IN cl_list_item_t * p_list_item,
|
|
Packit Service |
54dbc3 |
IN void *context)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_infr_match_ctxt_t *p_infr_match = (osm_infr_match_ctxt_t *) context;
|
|
Packit Service |
54dbc3 |
ib_mad_notice_attr_t *p_ntc = p_infr_match->p_ntc;
|
|
Packit Service |
54dbc3 |
osm_infr_t *p_infr_rec = (osm_infr_t *) p_list_item;
|
|
Packit Service |
54dbc3 |
ib_inform_info_t *p_ii = &(p_infr_rec->inform_record.inform_info);
|
|
Packit Service |
54dbc3 |
osm_log_t *p_log = p_infr_rec->sa->p_log;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_ENTER(p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* matching rules
|
|
Packit Service |
54dbc3 |
* InformInfo Notice
|
|
Packit Service |
54dbc3 |
* GID IssuerGID if non zero must match the trap
|
|
Packit Service |
54dbc3 |
* LIDRange IssuerLID apply only if GID=0
|
|
Packit Service |
54dbc3 |
* IsGeneric IsGeneric is compulsory and must match the trap
|
|
Packit Service |
54dbc3 |
* Type Type if not 0xFFFF must match
|
|
Packit Service |
54dbc3 |
* TrapNumber TrapNumber if not 0xFFFF must match
|
|
Packit Service |
54dbc3 |
* DeviceId DeviceID if not 0xFFFF must match
|
|
Packit Service |
54dbc3 |
* QPN dont care
|
|
Packit Service |
54dbc3 |
* ProducerType ProducerType match or 0xFFFFFF // EZ: actually my interpretation
|
|
Packit Service |
54dbc3 |
* VendorID VendorID match or 0xFFFFFF
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* GID IssuerGID if non zero must match the trap */
|
|
Packit Service |
54dbc3 |
if (p_ii->gid.unicast.prefix != 0
|
|
Packit Service |
54dbc3 |
|| p_ii->gid.unicast.interface_id != 0) {
|
|
Packit Service |
54dbc3 |
/* match by GID */
|
|
Packit Service |
54dbc3 |
if (memcmp(&(p_ii->gid), &(p_ntc->issuer_gid),
|
|
Packit Service |
54dbc3 |
sizeof(ib_gid_t))) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by GID\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
/* LIDRange IssuerLID apply only if GID=0 */
|
|
Packit Service |
54dbc3 |
/* If lid_range_begin of the informInfo is 0xFFFF - then it should be ignored. */
|
|
Packit Service |
54dbc3 |
if (p_ii->lid_range_begin != 0xFFFF) {
|
|
Packit Service |
54dbc3 |
/* a real lid range is given - check it */
|
|
Packit Service |
54dbc3 |
if ((cl_hton16(p_ii->lid_range_begin) >
|
|
Packit Service |
54dbc3 |
cl_hton16(p_ntc->issuer_lid))
|
|
Packit Service |
54dbc3 |
|| (cl_hton16(p_ntc->issuer_lid) >
|
|
Packit Service |
54dbc3 |
cl_hton16(p_ii->lid_range_end))) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Mismatch by LID Range. Needed: %u <= %u <= %u\n",
|
|
Packit Service |
54dbc3 |
cl_hton16(p_ii->lid_range_begin),
|
|
Packit Service |
54dbc3 |
cl_hton16(p_ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
cl_hton16(p_ii->lid_range_end));
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* IsGeneric IsGeneric is compulsory and must match the trap */
|
|
Packit Service |
54dbc3 |
if ((p_ii->is_generic && !ib_notice_is_generic(p_ntc)) ||
|
|
Packit Service |
54dbc3 |
(!p_ii->is_generic && ib_notice_is_generic(p_ntc))) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Generic/Vendor\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Type Type if not 0xFFFF must match */
|
|
Packit Service |
54dbc3 |
if ((p_ii->trap_type != 0xFFFF) &&
|
|
Packit Service |
54dbc3 |
(cl_ntoh16(p_ii->trap_type) != ib_notice_get_type(p_ntc))) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Type\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* based on generic type */
|
|
Packit Service |
54dbc3 |
if (p_ii->is_generic) {
|
|
Packit Service |
54dbc3 |
/* TrapNumber TrapNumber if not 0xFFFF must match */
|
|
Packit Service |
54dbc3 |
if ((p_ii->g_or_v.generic.trap_num != 0xFFFF) &&
|
|
Packit Service |
54dbc3 |
(p_ii->g_or_v.generic.trap_num !=
|
|
Packit Service |
54dbc3 |
p_ntc->g_or_v.generic.trap_num)) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Trap Num\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* ProducerType ProducerType match or 0xFFFFFF */
|
|
Packit Service |
54dbc3 |
if ((cl_ntoh32(ib_inform_info_get_prod_type(p_ii)) != 0xFFFFFF)
|
|
Packit Service |
54dbc3 |
&& (ib_inform_info_get_prod_type(p_ii) !=
|
|
Packit Service |
54dbc3 |
ib_notice_get_prod_type(p_ntc))) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Mismatch by Node Type: II=0x%06X (%s) Trap=0x%06X (%s)\n",
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ib_inform_info_get_prod_type(p_ii)),
|
|
Packit Service |
54dbc3 |
ib_get_producer_type_str
|
|
Packit Service |
54dbc3 |
(ib_inform_info_get_prod_type(p_ii)),
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ib_notice_get_prod_type(p_ntc)),
|
|
Packit Service |
54dbc3 |
ib_get_producer_type_str(ib_notice_get_prod_type
|
|
Packit Service |
54dbc3 |
(p_ntc)));
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else {
|
|
Packit Service |
54dbc3 |
/* DeviceId DeviceID if not 0xFFFF must match */
|
|
Packit Service |
54dbc3 |
if ((p_ii->g_or_v.vend.dev_id != 0xFFFF) &&
|
|
Packit Service |
54dbc3 |
(p_ii->g_or_v.vend.dev_id != p_ntc->g_or_v.vend.dev_id)) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Dev Id\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* VendorID VendorID match or 0xFFFFFF */
|
|
Packit Service |
54dbc3 |
if ((ib_inform_info_get_vend_id(p_ii) != CL_HTON32(0xFFFFFF)) &&
|
|
Packit Service |
54dbc3 |
(ib_inform_info_get_vend_id(p_ii) !=
|
|
Packit Service |
54dbc3 |
ib_notice_get_vend_id(p_ntc))) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Mismatch by Vendor ID\n");
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (!is_access_permitted(p_infr_rec, p_infr_match))
|
|
Packit Service |
54dbc3 |
goto Exit;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* send the report to the address provided in the inform record */
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG, "MATCH! Sending Report...\n");
|
|
Packit Service |
54dbc3 |
send_report(p_infr_rec, p_ntc);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
Exit:
|
|
Packit Service |
54dbc3 |
OSM_LOG_EXIT(p_log);
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/**********************************************************************
|
|
Packit Service |
54dbc3 |
* Once a Trap was received by osm_trap_rcv, or a Trap sourced by
|
|
Packit Service |
54dbc3 |
* the SM was sent (Traps 64-67), this routine is called with a copy of
|
|
Packit Service |
54dbc3 |
* the notice data.
|
|
Packit Service |
54dbc3 |
* Given a notice attribute - compare and see if it matches the InformInfo
|
|
Packit Service |
54dbc3 |
* element and if it does - call the Report(Notice) for the
|
|
Packit Service |
54dbc3 |
* target QP registered by the address stored in the InformInfo element
|
|
Packit Service |
54dbc3 |
**********************************************************************/
|
|
Packit Service |
54dbc3 |
static void log_notice(osm_log_t * log, osm_log_level_t level,
|
|
Packit Service |
54dbc3 |
ib_mad_notice_attr_t * ntc)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
char gid_str[INET6_ADDRSTRLEN], gid_str2[INET6_ADDRSTRLEN];
|
|
Packit Service |
54dbc3 |
ib_gid_t *gid;
|
|
Packit Service |
54dbc3 |
ib_gid_t *gid1, *gid2;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* an official Event information log */
|
|
Packit Service |
54dbc3 |
if (ib_notice_is_generic(ntc)) {
|
|
Packit Service |
54dbc3 |
if ((ntc->g_or_v.generic.trap_num == CL_HTON16(SM_GID_IN_SERVICE_TRAP)) ||
|
|
Packit Service |
54dbc3 |
(ntc->g_or_v.generic.trap_num == CL_HTON16(SM_GID_OUT_OF_SERVICE_TRAP)) ||
|
|
Packit Service |
54dbc3 |
(ntc->g_or_v.generic.trap_num == CL_HTON16(SM_MGID_CREATED_TRAP)) ||
|
|
Packit Service |
54dbc3 |
(ntc->g_or_v.generic.trap_num == CL_HTON16(SM_MGID_DESTROYED_TRAP)))
|
|
Packit Service |
54dbc3 |
gid = &ntc->data_details.ntc_64_67.gid;
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
gid = &ntc->issuer_gid;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
switch (cl_ntoh16(ntc->g_or_v.generic.trap_num)) {
|
|
Packit Service |
54dbc3 |
case SM_GID_IN_SERVICE_TRAP:
|
|
Packit Service |
54dbc3 |
case SM_GID_OUT_OF_SERVICE_TRAP:
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Informational Notice \"%s\", GID:%s\n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, gid->raw, gid_str, sizeof gid_str));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case SM_MGID_CREATED_TRAP:
|
|
Packit Service |
54dbc3 |
case SM_MGID_DESTROYED_TRAP:
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Informational Notice \"%s\", MGID:%s\n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, gid->raw, gid_str, sizeof gid_str));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case SM_UNPATH_TRAP:
|
|
Packit Service |
54dbc3 |
case SM_REPATH_TRAP:
|
|
Packit Service |
54dbc3 |
/* TODO: Fill in details once SM starts to use these traps */
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Informational Notice \"%s\"n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case SM_LINK_STATE_CHANGED_TRAP:
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Urgent Notice \"%s\" from switch LID %u, "
|
|
Packit Service |
54dbc3 |
"GUID 0x%016" PRIx64 "\n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(gid->unicast.interface_id));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case SM_LINK_INTEGRITY_THRESHOLD_TRAP:
|
|
Packit Service |
54dbc3 |
case SM_BUFFER_OVERRUN_THRESHOLD_TRAP:
|
|
Packit Service |
54dbc3 |
case SM_WATCHDOG_TIMER_EXPIRED_TRAP:
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Urgent Notice \"%s\" from LID %u, "
|
|
Packit Service |
54dbc3 |
"GUID 0x%016" PRIx64 ", port %u\n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(gid->unicast.interface_id),
|
|
Packit Service |
54dbc3 |
ntc->data_details.ntc_129_131.port_num);
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case SM_LOCAL_CHANGES_TRAP:
|
|
Packit Service |
54dbc3 |
if (ntc->data_details.ntc_144.local_changes == 1)
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Informational Notice \"%s\" from LID %u, "
|
|
Packit Service |
54dbc3 |
"GUID 0x%016" PRIx64 ", ChangeFlags 0x%04x, "
|
|
Packit Service |
54dbc3 |
"CapabilityMask2 0x%04x\n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(gid->unicast.interface_id),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->data_details.ntc_144.change_flgs),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->data_details.ntc_144.cap_mask2));
|
|
Packit Service |
54dbc3 |
else
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Informational Notice \"%s\" from LID %u, "
|
|
Packit Service |
54dbc3 |
"GUID 0x%016" PRIx64 ", new CapabilityMask 0x%08x\n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(gid->unicast.interface_id),
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ntc->data_details.ntc_144.new_cap_mask));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case SM_SYS_IMG_GUID_CHANGED_TRAP:
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Informational Notice \"%s\" from LID %u, "
|
|
Packit Service |
54dbc3 |
"GUID 0x%016" PRIx64 ", new SysImageGUID 0x%016" PRIx64 "\n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(gid->unicast.interface_id),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(ntc->data_details.ntc_145.new_sys_guid));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case SM_BAD_MKEY_TRAP:
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Security Notice \"%s\" from LID %u, "
|
|
Packit Service |
54dbc3 |
"GUID 0x%016" PRIx64 ", Method 0x%x, Attribute 0x%x, "
|
|
Packit Service |
54dbc3 |
"AttrMod 0x%x, M_Key 0x%016" PRIx64 "\n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(gid->unicast.interface_id),
|
|
Packit Service |
54dbc3 |
ntc->data_details.ntc_256.method,
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->data_details.ntc_256.attr_id),
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ntc->data_details.ntc_256.attr_mod),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(ntc->data_details.ntc_256.mkey));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case SM_BAD_PKEY_TRAP:
|
|
Packit Service |
54dbc3 |
case SM_BAD_QKEY_TRAP:
|
|
Packit Service |
54dbc3 |
gid1 = &ntc->data_details.ntc_257_258.gid1;
|
|
Packit Service |
54dbc3 |
gid2 = &ntc->data_details.ntc_257_258.gid2;
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Security Notice \"%s\" from LID %u, "
|
|
Packit Service |
54dbc3 |
"GUID 0x%016" PRIx64 " : LID1 %u, LID2 %u, %s 0x%x, "
|
|
Packit Service |
54dbc3 |
"SL %d, QP1 0x%x, QP2 0x%x, GID1 %s, GID2 %s\n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(gid->unicast.interface_id),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->data_details.ntc_257_258.lid1),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->data_details.ntc_257_258.lid2),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->g_or_v.generic.trap_num) == SM_BAD_QKEY_TRAP ?
|
|
Packit Service |
54dbc3 |
"Q_Key" : "P_Key",
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ntc->data_details.ntc_257_258.key),
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ntc->data_details.ntc_257_258.qp1) >> 28,
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ntc->data_details.ntc_257_258.qp1) & 0xffffff,
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ntc->data_details.ntc_257_258.qp2) & 0xffffff,
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, gid1->raw, gid_str, sizeof gid_str),
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, gid2->raw, gid_str2, sizeof gid_str2));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
case SM_BAD_SWITCH_PKEY_TRAP:
|
|
Packit Service |
54dbc3 |
gid1 = &ntc->data_details.ntc_259.gid1;
|
|
Packit Service |
54dbc3 |
gid2 = &ntc->data_details.ntc_259.gid2;
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Security Notice \"%s\" from switch LID %u, "
|
|
Packit Service |
54dbc3 |
"GUID 0x%016" PRIx64 " port %d : data_valid 0x%04x, "
|
|
Packit Service |
54dbc3 |
"LID1 %u, LID2 %u, PKey 0x%04x, "
|
|
Packit Service |
54dbc3 |
"SL %d, QP1 0x%x, QP2 0x%x, GID1 %s, GID2 %s\n",
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
cl_ntoh64(gid->unicast.interface_id),
|
|
Packit Service |
54dbc3 |
ntc->data_details.ntc_259.port_no,
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->data_details.ntc_259.data_valid),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->data_details.ntc_259.lid1),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->data_details.ntc_259.lid2),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->data_details.ntc_257_258.key),
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ntc->data_details.ntc_259.sl_qp1) >> 28,
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ntc->data_details.ntc_259.sl_qp1) & 0xffffff,
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ntc->data_details.ntc_259.qp2),
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, gid1->raw, gid_str, sizeof gid_str),
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, gid2->raw, gid_str2, sizeof gid_str2));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
default:
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Generic Notice type:%u num:%u (%s)"
|
|
Packit Service |
54dbc3 |
" from LID:%u GID:%s\n",
|
|
Packit Service |
54dbc3 |
ib_notice_get_type(ntc),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
ib_get_trap_str(ntc->g_or_v.generic.trap_num),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, gid->raw, gid_str, sizeof gid_str));
|
|
Packit Service |
54dbc3 |
break;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
} else
|
|
Packit Service |
54dbc3 |
OSM_LOG(log, level,
|
|
Packit Service |
54dbc3 |
"Reporting Vendor Notice type:%u vend:%u dev:%u"
|
|
Packit Service |
54dbc3 |
" from LID:%u GID:%s\n",
|
|
Packit Service |
54dbc3 |
ib_notice_get_type(ntc),
|
|
Packit Service |
54dbc3 |
cl_ntoh32(ib_notice_get_vend_id(ntc)),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->g_or_v.vend.dev_id),
|
|
Packit Service |
54dbc3 |
cl_ntoh16(ntc->issuer_lid),
|
|
Packit Service |
54dbc3 |
inet_ntop(AF_INET6, ntc->issuer_gid.raw, gid_str,
|
|
Packit Service |
54dbc3 |
sizeof gid_str));
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
ib_api_status_t osm_report_notice(IN osm_log_t * p_log, IN osm_subn_t * p_subn,
|
|
Packit Service |
54dbc3 |
IN ib_mad_notice_attr_t * p_ntc)
|
|
Packit Service |
54dbc3 |
{
|
|
Packit Service |
54dbc3 |
osm_infr_match_ctxt_t context;
|
|
Packit Service |
54dbc3 |
cl_list_t infr_to_remove_list;
|
|
Packit Service |
54dbc3 |
osm_infr_t *p_infr_rec;
|
|
Packit Service |
54dbc3 |
osm_infr_t *p_next_infr_rec;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_ENTER(p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/*
|
|
Packit Service |
54dbc3 |
* we must make sure we are ready for this...
|
|
Packit Service |
54dbc3 |
* note that the trap receivers might be initialized before
|
|
Packit Service |
54dbc3 |
* the osm_infr_init call is performed.
|
|
Packit Service |
54dbc3 |
*/
|
|
Packit Service |
54dbc3 |
if (p_subn->sa_infr_list.state != CL_INITIALIZED) {
|
|
Packit Service |
54dbc3 |
OSM_LOG(p_log, OSM_LOG_DEBUG,
|
|
Packit Service |
54dbc3 |
"Ignoring Notice Reports since Inform List is not initialized yet!\n");
|
|
Packit Service |
54dbc3 |
return IB_ERROR;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
if (OSM_LOG_IS_ACTIVE_V2(p_log, OSM_LOG_INFO))
|
|
Packit Service |
54dbc3 |
log_notice(p_log, OSM_LOG_INFO, p_ntc);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* Create a list that will hold all the infr records that should
|
|
Packit Service |
54dbc3 |
be removed due to violation. o13-17.1.2 */
|
|
Packit Service |
54dbc3 |
cl_list_construct(&infr_to_remove_list);
|
|
Packit Service |
54dbc3 |
cl_list_init(&infr_to_remove_list, 5);
|
|
Packit Service |
54dbc3 |
context.p_remove_infr_list = &infr_to_remove_list;
|
|
Packit Service |
54dbc3 |
context.p_ntc = p_ntc;
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* go over all inform info available at the subnet */
|
|
Packit Service |
54dbc3 |
/* try match to the given notice and send if match */
|
|
Packit Service |
54dbc3 |
cl_qlist_apply_func(&p_subn->sa_infr_list, match_notice_to_inf_rec,
|
|
Packit Service |
54dbc3 |
&context);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* If we inserted items into the infr_to_remove_list - we need to
|
|
Packit Service |
54dbc3 |
remove them */
|
|
Packit Service |
54dbc3 |
p_infr_rec = (osm_infr_t *) cl_list_remove_head(&infr_to_remove_list);
|
|
Packit Service |
54dbc3 |
while (p_infr_rec != NULL) {
|
|
Packit Service |
54dbc3 |
p_next_infr_rec =
|
|
Packit Service |
54dbc3 |
(osm_infr_t *) cl_list_remove_head(&infr_to_remove_list);
|
|
Packit Service |
54dbc3 |
osm_infr_remove_from_db(p_subn, p_log, p_infr_rec);
|
|
Packit Service |
54dbc3 |
p_infr_rec = p_next_infr_rec;
|
|
Packit Service |
54dbc3 |
}
|
|
Packit Service |
54dbc3 |
cl_list_destroy(&infr_to_remove_list);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
/* report IB traps to plugin */
|
|
Packit Service |
54dbc3 |
osm_opensm_report_event(p_subn->p_osm, OSM_EVENT_ID_TRAP, p_ntc);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
OSM_LOG_EXIT(p_log);
|
|
Packit Service |
54dbc3 |
|
|
Packit Service |
54dbc3 |
return IB_SUCCESS;
|
|
Packit Service |
54dbc3 |
}
|