Blame opensm/osm_inform.c

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
}