1d6b92ffaSHans Petter Selasky /*
2d6b92ffaSHans Petter Selasky  * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
3d6b92ffaSHans Petter Selasky  * Copyright (c) 2002-2015 Mellanox Technologies LTD. All rights reserved.
4d6b92ffaSHans Petter Selasky  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5d6b92ffaSHans Petter Selasky  * Copyright (c) 2009 HNR Consulting. All rights reserved.
6d6b92ffaSHans Petter Selasky  * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
7d6b92ffaSHans Petter Selasky  *
8d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
9d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
10d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
11d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
12d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
13d6b92ffaSHans Petter Selasky  *
14d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
15d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
16d6b92ffaSHans Petter Selasky  *     conditions are met:
17d6b92ffaSHans Petter Selasky  *
18d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
19d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
20d6b92ffaSHans Petter Selasky  *        disclaimer.
21d6b92ffaSHans Petter Selasky  *
22d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
23d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
24d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
25d6b92ffaSHans Petter Selasky  *        provided with the distribution.
26d6b92ffaSHans Petter Selasky  *
27d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
31d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
32d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34d6b92ffaSHans Petter Selasky  * SOFTWARE.
35d6b92ffaSHans Petter Selasky  *
36d6b92ffaSHans Petter Selasky  */
37d6b92ffaSHans Petter Selasky 
38d6b92ffaSHans Petter Selasky /*
39d6b92ffaSHans Petter Selasky  * Abstract:
40d6b92ffaSHans Petter Selasky  *    Implementation of inform record functions.
41d6b92ffaSHans Petter Selasky  */
42d6b92ffaSHans Petter Selasky 
43d6b92ffaSHans Petter Selasky #if HAVE_CONFIG_H
44d6b92ffaSHans Petter Selasky #  include <config.h>
45d6b92ffaSHans Petter Selasky #endif				/* HAVE_CONFIG_H */
46d6b92ffaSHans Petter Selasky 
47d6b92ffaSHans Petter Selasky #include <stdlib.h>
48d6b92ffaSHans Petter Selasky #include <string.h>
49d6b92ffaSHans Petter Selasky #include <arpa/inet.h>
50d6b92ffaSHans Petter Selasky #include <sys/socket.h>
51d6b92ffaSHans Petter Selasky #include <complib/cl_debug.h>
52d6b92ffaSHans Petter Selasky #include <opensm/osm_file_ids.h>
53d6b92ffaSHans Petter Selasky #define FILE_ID OSM_FILE_INFORM_C
54d6b92ffaSHans Petter Selasky #include <opensm/osm_helper.h>
55d6b92ffaSHans Petter Selasky #include <opensm/osm_inform.h>
56d6b92ffaSHans Petter Selasky #include <vendor/osm_vendor_api.h>
57d6b92ffaSHans Petter Selasky #include <opensm/osm_pkey.h>
58d6b92ffaSHans Petter Selasky #include <opensm/osm_sa.h>
59d6b92ffaSHans Petter Selasky #include <opensm/osm_opensm.h>
60d6b92ffaSHans Petter Selasky 
61d6b92ffaSHans Petter Selasky typedef struct osm_infr_match_ctxt {
62d6b92ffaSHans Petter Selasky 	cl_list_t *p_remove_infr_list;
63d6b92ffaSHans Petter Selasky 	ib_mad_notice_attr_t *p_ntc;
64d6b92ffaSHans Petter Selasky } osm_infr_match_ctxt_t;
65d6b92ffaSHans Petter Selasky 
osm_infr_delete(IN osm_infr_t * p_infr)66d6b92ffaSHans Petter Selasky void osm_infr_delete(IN osm_infr_t * p_infr)
67d6b92ffaSHans Petter Selasky {
68d6b92ffaSHans Petter Selasky 	free(p_infr);
69d6b92ffaSHans Petter Selasky }
70d6b92ffaSHans Petter Selasky 
osm_infr_new(IN const osm_infr_t * p_infr_rec)71d6b92ffaSHans Petter Selasky osm_infr_t *osm_infr_new(IN const osm_infr_t * p_infr_rec)
72d6b92ffaSHans Petter Selasky {
73d6b92ffaSHans Petter Selasky 	osm_infr_t *p_infr;
74d6b92ffaSHans Petter Selasky 
75d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_infr_rec);
76d6b92ffaSHans Petter Selasky 
77d6b92ffaSHans Petter Selasky 	p_infr = (osm_infr_t *) malloc(sizeof(osm_infr_t));
78d6b92ffaSHans Petter Selasky 	if (p_infr)
79d6b92ffaSHans Petter Selasky 		memcpy(p_infr, p_infr_rec, sizeof(osm_infr_t));
80d6b92ffaSHans Petter Selasky 
81d6b92ffaSHans Petter Selasky 	return p_infr;
82d6b92ffaSHans Petter Selasky }
83d6b92ffaSHans Petter Selasky 
dump_all_informs(IN const osm_subn_t * p_subn,IN osm_log_t * p_log)84d6b92ffaSHans Petter Selasky static void dump_all_informs(IN const osm_subn_t * p_subn, IN osm_log_t * p_log)
85d6b92ffaSHans Petter Selasky {
86d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_list_item;
87d6b92ffaSHans Petter Selasky 
88d6b92ffaSHans Petter Selasky 	if (!OSM_LOG_IS_ACTIVE_V2(p_log, OSM_LOG_DEBUG))
89d6b92ffaSHans Petter Selasky 		return;
90d6b92ffaSHans Petter Selasky 
91d6b92ffaSHans Petter Selasky 	p_list_item = cl_qlist_head(&p_subn->sa_infr_list);
92d6b92ffaSHans Petter Selasky 	while (p_list_item != cl_qlist_end(&p_subn->sa_infr_list)) {
93d6b92ffaSHans Petter Selasky 		osm_dump_inform_info_v2(p_log,
94d6b92ffaSHans Petter Selasky 				        &((osm_infr_t *) p_list_item)->
95d6b92ffaSHans Petter Selasky 				        inform_record.inform_info, FILE_ID, OSM_LOG_DEBUG);
96d6b92ffaSHans Petter Selasky 		p_list_item = cl_qlist_next(p_list_item);
97d6b92ffaSHans Petter Selasky 	}
98d6b92ffaSHans Petter Selasky }
99d6b92ffaSHans Petter Selasky 
100d6b92ffaSHans Petter Selasky /**********************************************************************
101d6b92ffaSHans Petter Selasky  * Match an infr by the InformInfo and Address vector
102d6b92ffaSHans Petter Selasky  **********************************************************************/
match_inf_rec(IN const cl_list_item_t * p_list_item,IN void * context)103d6b92ffaSHans Petter Selasky static cl_status_t match_inf_rec(IN const cl_list_item_t * p_list_item,
104d6b92ffaSHans Petter Selasky 				 IN void *context)
105d6b92ffaSHans Petter Selasky {
106d6b92ffaSHans Petter Selasky 	osm_infr_t *p_infr_rec = (osm_infr_t *) context;
107d6b92ffaSHans Petter Selasky 	osm_infr_t *p_infr = (osm_infr_t *) p_list_item;
108d6b92ffaSHans Petter Selasky 	ib_inform_info_t *p_ii_rec = &p_infr_rec->inform_record.inform_info;
109d6b92ffaSHans Petter Selasky 	ib_inform_info_t *p_ii = &p_infr->inform_record.inform_info;
110d6b92ffaSHans Petter Selasky 	osm_log_t *p_log = p_infr_rec->sa->p_log;
111d6b92ffaSHans Petter Selasky 	cl_status_t status = CL_NOT_FOUND;
112d6b92ffaSHans Petter Selasky 
113d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
114d6b92ffaSHans Petter Selasky 
115d6b92ffaSHans Petter Selasky 	if (memcmp(&p_infr->report_addr, &p_infr_rec->report_addr,
116d6b92ffaSHans Petter Selasky 		   sizeof(p_infr_rec->report_addr))) {
117d6b92ffaSHans Petter Selasky 		OSM_LOG(p_log, OSM_LOG_DEBUG, "Differ by Address\n");
118d6b92ffaSHans Petter Selasky 		goto Exit;
119d6b92ffaSHans Petter Selasky 	}
120d6b92ffaSHans Petter Selasky 
121d6b92ffaSHans Petter Selasky 	/* if inform_info.gid is not zero, ignore lid range */
122d6b92ffaSHans Petter Selasky 	if (ib_gid_is_notzero(&p_ii_rec->gid)) {
123d6b92ffaSHans Petter Selasky 		if (memcmp(&p_ii->gid, &p_ii_rec->gid, sizeof(p_ii->gid))) {
124d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
125d6b92ffaSHans Petter Selasky 				"Differ by InformInfo.gid\n");
126d6b92ffaSHans Petter Selasky 			goto Exit;
127d6b92ffaSHans Petter Selasky 		}
128d6b92ffaSHans Petter Selasky 	} else {
129d6b92ffaSHans Petter Selasky 		if ((p_ii->lid_range_begin != p_ii_rec->lid_range_begin) ||
130d6b92ffaSHans Petter Selasky 		    (p_ii->lid_range_end != p_ii_rec->lid_range_end)) {
131d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
132d6b92ffaSHans Petter Selasky 				"Differ by InformInfo.LIDRange\n");
133d6b92ffaSHans Petter Selasky 			goto Exit;
134d6b92ffaSHans Petter Selasky 		}
135d6b92ffaSHans Petter Selasky 	}
136d6b92ffaSHans Petter Selasky 
137d6b92ffaSHans Petter Selasky 	if (p_ii->trap_type != p_ii_rec->trap_type) {
138d6b92ffaSHans Petter Selasky 		OSM_LOG(p_log, OSM_LOG_DEBUG,
139d6b92ffaSHans Petter Selasky 			"Differ by InformInfo.TrapType\n");
140d6b92ffaSHans Petter Selasky 		goto Exit;
141d6b92ffaSHans Petter Selasky 	}
142d6b92ffaSHans Petter Selasky 
143d6b92ffaSHans Petter Selasky 	if (p_ii->is_generic != p_ii_rec->is_generic) {
144d6b92ffaSHans Petter Selasky 		OSM_LOG(p_log, OSM_LOG_DEBUG,
145d6b92ffaSHans Petter Selasky 			"Differ by InformInfo.IsGeneric\n");
146d6b92ffaSHans Petter Selasky 		goto Exit;
147d6b92ffaSHans Petter Selasky 	}
148d6b92ffaSHans Petter Selasky 
149d6b92ffaSHans Petter Selasky 	if (p_ii->is_generic) {
150d6b92ffaSHans Petter Selasky 		if (p_ii->g_or_v.generic.trap_num !=
151d6b92ffaSHans Petter Selasky 		    p_ii_rec->g_or_v.generic.trap_num)
152d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
153d6b92ffaSHans Petter Selasky 				"Differ by InformInfo.Generic.TrapNumber\n");
154d6b92ffaSHans Petter Selasky 		else if (p_ii->g_or_v.generic.qpn_resp_time_val !=
155d6b92ffaSHans Petter Selasky 			 p_ii_rec->g_or_v.generic.qpn_resp_time_val)
156d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
157d6b92ffaSHans Petter Selasky 				"Differ by InformInfo.Generic.QPNRespTimeVal\n");
158d6b92ffaSHans Petter Selasky 		else if (p_ii->g_or_v.generic.node_type_msb !=
159d6b92ffaSHans Petter Selasky 			 p_ii_rec->g_or_v.generic.node_type_msb)
160d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
161d6b92ffaSHans Petter Selasky 				"Differ by InformInfo.Generic.NodeTypeMSB\n");
162d6b92ffaSHans Petter Selasky 		else if (p_ii->g_or_v.generic.node_type_lsb !=
163d6b92ffaSHans Petter Selasky 			 p_ii_rec->g_or_v.generic.node_type_lsb)
164d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
165d6b92ffaSHans Petter Selasky 				"Differ by InformInfo.Generic.NodeTypeLSB\n");
166d6b92ffaSHans Petter Selasky 		else
167d6b92ffaSHans Petter Selasky 			status = CL_SUCCESS;
168d6b92ffaSHans Petter Selasky 	} else {
169d6b92ffaSHans Petter Selasky 		if (p_ii->g_or_v.vend.dev_id != p_ii_rec->g_or_v.vend.dev_id)
170d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
171d6b92ffaSHans Petter Selasky 				"Differ by InformInfo.Vendor.DeviceID\n");
172d6b92ffaSHans Petter Selasky 		else if (p_ii->g_or_v.vend.qpn_resp_time_val !=
173d6b92ffaSHans Petter Selasky 			 p_ii_rec->g_or_v.vend.qpn_resp_time_val)
174d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
175d6b92ffaSHans Petter Selasky 				"Differ by InformInfo.Vendor.QPNRespTimeVal\n");
176d6b92ffaSHans Petter Selasky 		else if (p_ii->g_or_v.vend.vendor_id_msb !=
177d6b92ffaSHans Petter Selasky 			 p_ii_rec->g_or_v.vend.vendor_id_msb)
178d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
179d6b92ffaSHans Petter Selasky 				"Differ by InformInfo.Vendor.VendorIdMSB\n");
180d6b92ffaSHans Petter Selasky 		else if (p_ii->g_or_v.vend.vendor_id_lsb !=
181d6b92ffaSHans Petter Selasky 			 p_ii_rec->g_or_v.vend.vendor_id_lsb)
182d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
183d6b92ffaSHans Petter Selasky 				"Differ by InformInfo.Vendor.VendorIdLSB\n");
184d6b92ffaSHans Petter Selasky 		else
185d6b92ffaSHans Petter Selasky 			status = CL_SUCCESS;
186d6b92ffaSHans Petter Selasky 	}
187d6b92ffaSHans Petter Selasky 
188d6b92ffaSHans Petter Selasky Exit:
189d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
190d6b92ffaSHans Petter Selasky 	return status;
191d6b92ffaSHans Petter Selasky }
192d6b92ffaSHans Petter Selasky 
osm_infr_get_by_rec(IN osm_subn_t const * p_subn,IN osm_log_t * p_log,IN osm_infr_t * p_infr_rec)193d6b92ffaSHans Petter Selasky osm_infr_t *osm_infr_get_by_rec(IN osm_subn_t const *p_subn,
194d6b92ffaSHans Petter Selasky 				IN osm_log_t * p_log,
195d6b92ffaSHans Petter Selasky 				IN osm_infr_t * p_infr_rec)
196d6b92ffaSHans Petter Selasky {
197d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_list_item;
198d6b92ffaSHans Petter Selasky 
199d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
200d6b92ffaSHans Petter Selasky 
201d6b92ffaSHans Petter Selasky 	dump_all_informs(p_subn, p_log);
202d6b92ffaSHans Petter Selasky 
203d6b92ffaSHans Petter Selasky 	OSM_LOG(p_log, OSM_LOG_DEBUG, "Looking for Inform Record\n");
204d6b92ffaSHans Petter Selasky 	osm_dump_inform_info_v2(p_log, &(p_infr_rec->inform_record.inform_info),
205d6b92ffaSHans Petter Selasky 			        FILE_ID, OSM_LOG_DEBUG);
206d6b92ffaSHans Petter Selasky 	OSM_LOG(p_log, OSM_LOG_DEBUG, "InformInfo list size %d\n",
207d6b92ffaSHans Petter Selasky 		cl_qlist_count(&p_subn->sa_infr_list));
208d6b92ffaSHans Petter Selasky 
209d6b92ffaSHans Petter Selasky 	p_list_item = cl_qlist_find_from_head(&p_subn->sa_infr_list,
210d6b92ffaSHans Petter Selasky 					      match_inf_rec, p_infr_rec);
211d6b92ffaSHans Petter Selasky 
212d6b92ffaSHans Petter Selasky 	if (p_list_item == cl_qlist_end(&p_subn->sa_infr_list))
213d6b92ffaSHans Petter Selasky 		p_list_item = NULL;
214d6b92ffaSHans Petter Selasky 
215d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
216d6b92ffaSHans Petter Selasky 	return (osm_infr_t *) p_list_item;
217d6b92ffaSHans Petter Selasky }
218d6b92ffaSHans Petter Selasky 
osm_infr_insert_to_db(IN osm_subn_t * p_subn,IN osm_log_t * p_log,IN osm_infr_t * p_infr)219d6b92ffaSHans Petter Selasky void osm_infr_insert_to_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log,
220d6b92ffaSHans Petter Selasky 			   IN osm_infr_t * p_infr)
221d6b92ffaSHans Petter Selasky {
222d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
223d6b92ffaSHans Petter Selasky 
224d6b92ffaSHans Petter Selasky 	OSM_LOG(p_log, OSM_LOG_DEBUG,
225d6b92ffaSHans Petter Selasky 		"Inserting new InformInfo Record into Database\n");
226d6b92ffaSHans Petter Selasky 	OSM_LOG(p_log, OSM_LOG_DEBUG, "Dump before insertion (size %d)\n",
227d6b92ffaSHans Petter Selasky 		cl_qlist_count(&p_subn->sa_infr_list));
228d6b92ffaSHans Petter Selasky 	dump_all_informs(p_subn, p_log);
229d6b92ffaSHans Petter Selasky 
230d6b92ffaSHans Petter Selasky #if 0
231d6b92ffaSHans Petter Selasky 	osm_dump_inform_info_v2(p_log,
232d6b92ffaSHans Petter Selasky 			        &(p_infr->inform_record.inform_info),
233d6b92ffaSHans Petter Selasky 			        FILE_ID, OSM_LOG_DEBUG);
234d6b92ffaSHans Petter Selasky #endif
235d6b92ffaSHans Petter Selasky 
236d6b92ffaSHans Petter Selasky 	cl_qlist_insert_head(&p_subn->sa_infr_list, &p_infr->list_item);
237d6b92ffaSHans Petter Selasky 	p_subn->p_osm->sa.dirty = TRUE;
238d6b92ffaSHans Petter Selasky 
239d6b92ffaSHans Petter Selasky 	OSM_LOG(p_log, OSM_LOG_DEBUG, "Dump after insertion (size %d)\n",
240d6b92ffaSHans Petter Selasky 		cl_qlist_count(&p_subn->sa_infr_list));
241d6b92ffaSHans Petter Selasky 	dump_all_informs(p_subn, p_log);
242d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
243d6b92ffaSHans Petter Selasky }
244d6b92ffaSHans Petter Selasky 
osm_infr_remove_from_db(IN osm_subn_t * p_subn,IN osm_log_t * p_log,IN osm_infr_t * p_infr)245d6b92ffaSHans Petter Selasky void osm_infr_remove_from_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log,
246d6b92ffaSHans Petter Selasky 			     IN osm_infr_t * p_infr)
247d6b92ffaSHans Petter Selasky {
248d6b92ffaSHans Petter Selasky 	char gid_str[INET6_ADDRSTRLEN];
249d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
250d6b92ffaSHans Petter Selasky 
251d6b92ffaSHans Petter Selasky 	OSM_LOG(p_log, OSM_LOG_DEBUG, "Removing InformInfo Subscribing GID:%s"
252d6b92ffaSHans Petter Selasky 		" Enum:0x%X from Database\n",
253d6b92ffaSHans Petter Selasky 		inet_ntop(AF_INET6, p_infr->inform_record.subscriber_gid.raw,
254d6b92ffaSHans Petter Selasky 			  gid_str, sizeof gid_str),
255d6b92ffaSHans Petter Selasky 		p_infr->inform_record.subscriber_enum);
256d6b92ffaSHans Petter Selasky 
257d6b92ffaSHans Petter Selasky 	osm_dump_inform_info_v2(p_log, &(p_infr->inform_record.inform_info),
258d6b92ffaSHans Petter Selasky 			        FILE_ID, OSM_LOG_DEBUG);
259d6b92ffaSHans Petter Selasky 
260d6b92ffaSHans Petter Selasky 	cl_qlist_remove_item(&p_subn->sa_infr_list, &p_infr->list_item);
261d6b92ffaSHans Petter Selasky 	p_subn->p_osm->sa.dirty = TRUE;
262d6b92ffaSHans Petter Selasky 
263d6b92ffaSHans Petter Selasky 	osm_infr_delete(p_infr);
264d6b92ffaSHans Petter Selasky 
265d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
266d6b92ffaSHans Petter Selasky }
267d6b92ffaSHans Petter Selasky 
osm_infr_remove_subscriptions(IN osm_subn_t * p_subn,IN osm_log_t * p_log,IN ib_net64_t port_guid)268d6b92ffaSHans Petter Selasky ib_api_status_t osm_infr_remove_subscriptions(IN osm_subn_t * p_subn,
269d6b92ffaSHans Petter Selasky 					      IN osm_log_t * p_log,
270d6b92ffaSHans Petter Selasky 					      IN ib_net64_t port_guid)
271d6b92ffaSHans Petter Selasky {
272d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_list_item;
273d6b92ffaSHans Petter Selasky 	osm_infr_t *p_infr;
274d6b92ffaSHans Petter Selasky 	ib_api_status_t status = CL_NOT_FOUND;
275d6b92ffaSHans Petter Selasky 
276d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
277d6b92ffaSHans Petter Selasky 
278d6b92ffaSHans Petter Selasky 	/* go over all inform info available at the subnet */
279d6b92ffaSHans Petter Selasky 	/* match to the given GID and delete subscriptions if match */
280d6b92ffaSHans Petter Selasky 	p_list_item = cl_qlist_head(&p_subn->sa_infr_list);
281d6b92ffaSHans Petter Selasky 	while (p_list_item != cl_qlist_end(&p_subn->sa_infr_list)) {
282d6b92ffaSHans Petter Selasky 
283d6b92ffaSHans Petter Selasky 		p_infr = (osm_infr_t *)p_list_item;
284d6b92ffaSHans Petter Selasky 		p_list_item = cl_qlist_next(p_list_item);
285d6b92ffaSHans Petter Selasky 
286d6b92ffaSHans Petter Selasky 		if (port_guid != p_infr->inform_record.subscriber_gid.unicast.interface_id)
287d6b92ffaSHans Petter Selasky 			continue;
288d6b92ffaSHans Petter Selasky 
289d6b92ffaSHans Petter Selasky 		/* Remove this event subscription */
290d6b92ffaSHans Petter Selasky 		osm_infr_remove_from_db(p_subn, p_log, p_infr);
291d6b92ffaSHans Petter Selasky 
292d6b92ffaSHans Petter Selasky 		status = CL_SUCCESS;
293d6b92ffaSHans Petter Selasky 	}
294d6b92ffaSHans Petter Selasky 
295d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
296d6b92ffaSHans Petter Selasky 	return (status);
297d6b92ffaSHans Petter Selasky }
298d6b92ffaSHans Petter Selasky 
299d6b92ffaSHans Petter Selasky /**********************************************************************
300d6b92ffaSHans Petter Selasky  * Send a report:
301d6b92ffaSHans Petter Selasky  * Given a target address to send to and the notice.
302d6b92ffaSHans Petter Selasky  * We need to send SubnAdmReport
303d6b92ffaSHans Petter Selasky  **********************************************************************/
send_report(IN osm_infr_t * p_infr_rec,IN ib_mad_notice_attr_t * p_ntc)304d6b92ffaSHans Petter Selasky static ib_api_status_t send_report(IN osm_infr_t * p_infr_rec,	/* the informinfo */
305d6b92ffaSHans Petter Selasky 				   IN ib_mad_notice_attr_t * p_ntc	/* notice to send */
306d6b92ffaSHans Petter Selasky     )
307d6b92ffaSHans Petter Selasky {
308d6b92ffaSHans Petter Selasky 	osm_madw_t *p_report_madw;
309d6b92ffaSHans Petter Selasky 	ib_mad_notice_attr_t *p_report_ntc;
310d6b92ffaSHans Petter Selasky 	ib_mad_t *p_mad;
311d6b92ffaSHans Petter Selasky 	ib_sa_mad_t *p_sa_mad;
312d6b92ffaSHans Petter Selasky 	static atomic32_t trap_fwd_trans_id = 0x02DAB000;
313d6b92ffaSHans Petter Selasky 	ib_api_status_t status = IB_SUCCESS;
314d6b92ffaSHans Petter Selasky 	osm_log_t *p_log = p_infr_rec->sa->p_log;
315d6b92ffaSHans Petter Selasky 	ib_net64_t tid;
316d6b92ffaSHans Petter Selasky 
317d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
318d6b92ffaSHans Petter Selasky 
319d6b92ffaSHans Petter Selasky 	/* HACK: who switches or uses the src and dest GIDs in the grh_info ?? */
320d6b92ffaSHans Petter Selasky 
321d6b92ffaSHans Petter Selasky 	/* it is better to use LIDs since the GIDs might not be there for SMI traps */
322d6b92ffaSHans Petter Selasky 	OSM_LOG(p_log, OSM_LOG_DEBUG, "Forwarding Notice Event from LID %u"
323d6b92ffaSHans Petter Selasky 		" to InformInfo LID %u GUID 0x%" PRIx64 ", TID 0x%X\n",
324d6b92ffaSHans Petter Selasky 		cl_ntoh16(p_ntc->issuer_lid),
325d6b92ffaSHans Petter Selasky 		cl_ntoh16(p_infr_rec->report_addr.dest_lid),
326d6b92ffaSHans Petter Selasky 		cl_ntoh64(p_infr_rec->inform_record.subscriber_gid.unicast.interface_id),
327d6b92ffaSHans Petter Selasky 		trap_fwd_trans_id);
328d6b92ffaSHans Petter Selasky 
329d6b92ffaSHans Petter Selasky 	/* get the MAD to send */
330d6b92ffaSHans Petter Selasky 	p_report_madw = osm_mad_pool_get(p_infr_rec->sa->p_mad_pool,
331d6b92ffaSHans Petter Selasky 					 p_infr_rec->h_bind, MAD_BLOCK_SIZE,
332d6b92ffaSHans Petter Selasky 					 &(p_infr_rec->report_addr));
333d6b92ffaSHans Petter Selasky 
334d6b92ffaSHans Petter Selasky 	if (!p_report_madw) {
335d6b92ffaSHans Petter Selasky 		OSM_LOG(p_log, OSM_LOG_ERROR, "ERR 0203: "
336d6b92ffaSHans Petter Selasky 			"Cannot send report to LID %u, osm_mad_pool_get failed\n",
337d6b92ffaSHans Petter Selasky 			cl_ntoh16(p_infr_rec->report_addr.dest_lid));
338d6b92ffaSHans Petter Selasky 		status = IB_ERROR;
339d6b92ffaSHans Petter Selasky 		goto Exit;
340d6b92ffaSHans Petter Selasky 	}
341d6b92ffaSHans Petter Selasky 
342d6b92ffaSHans Petter Selasky 	p_report_madw->resp_expected = TRUE;
343d6b92ffaSHans Petter Selasky 
344d6b92ffaSHans Petter Selasky 	/* advance trap trans id (cant simply ++ on some systems inside ntoh) */
345d6b92ffaSHans Petter Selasky 	tid = cl_hton64((uint64_t) cl_atomic_inc(&trap_fwd_trans_id) &
346d6b92ffaSHans Petter Selasky 			(uint64_t) (0xFFFFFFFF));
347d6b92ffaSHans Petter Selasky 	if (trap_fwd_trans_id == 0)
348d6b92ffaSHans Petter Selasky 		tid = cl_hton64((uint64_t) cl_atomic_inc(&trap_fwd_trans_id) &
349d6b92ffaSHans Petter Selasky 				(uint64_t) (0xFFFFFFFF));
350d6b92ffaSHans Petter Selasky 	p_mad = osm_madw_get_mad_ptr(p_report_madw);
351d6b92ffaSHans Petter Selasky 	ib_mad_init_new(p_mad, IB_MCLASS_SUBN_ADM, 2, IB_MAD_METHOD_REPORT,
352d6b92ffaSHans Petter Selasky 			tid, IB_MAD_ATTR_NOTICE, 0);
353d6b92ffaSHans Petter Selasky 
354d6b92ffaSHans Petter Selasky 	p_sa_mad = osm_madw_get_sa_mad_ptr(p_report_madw);
355d6b92ffaSHans Petter Selasky 
356d6b92ffaSHans Petter Selasky 	p_report_ntc = (ib_mad_notice_attr_t *) & (p_sa_mad->data);
357d6b92ffaSHans Petter Selasky 
358d6b92ffaSHans Petter Selasky 	/* copy the notice */
359d6b92ffaSHans Petter Selasky 	*p_report_ntc = *p_ntc;
360d6b92ffaSHans Petter Selasky 
361d6b92ffaSHans Petter Selasky 	/* The TRUE is for: response is expected */
362d6b92ffaSHans Petter Selasky 	osm_sa_send(p_infr_rec->sa, p_report_madw, TRUE);
363d6b92ffaSHans Petter Selasky 
364d6b92ffaSHans Petter Selasky Exit:
365d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
366d6b92ffaSHans Petter Selasky 	return status;
367d6b92ffaSHans Petter Selasky }
368d6b92ffaSHans Petter Selasky 
is_access_permitted(osm_infr_t * p_infr_rec,osm_infr_match_ctxt_t * p_infr_match)369d6b92ffaSHans Petter Selasky static int is_access_permitted(osm_infr_t *p_infr_rec,
370d6b92ffaSHans Petter Selasky 			       osm_infr_match_ctxt_t *p_infr_match )
371d6b92ffaSHans Petter Selasky {
372d6b92ffaSHans Petter Selasky 	cl_list_t *p_infr_to_remove_list = p_infr_match->p_remove_infr_list;
373d6b92ffaSHans Petter Selasky 	ib_inform_info_t *p_ii = &(p_infr_rec->inform_record.inform_info);
374d6b92ffaSHans Petter Selasky 	ib_mad_notice_attr_t *p_ntc = p_infr_match->p_ntc;
375d6b92ffaSHans Petter Selasky 	uint16_t trap_num = cl_ntoh16(p_ntc->g_or_v.generic.trap_num);
376d6b92ffaSHans Petter Selasky 	osm_subn_t *p_subn = p_infr_rec->sa->p_subn;
377d6b92ffaSHans Petter Selasky 	osm_log_t *p_log = p_infr_rec->sa->p_log;
378d6b92ffaSHans Petter Selasky 	osm_mgrp_t *p_mgrp;
379d6b92ffaSHans Petter Selasky 	ib_gid_t source_gid;
380d6b92ffaSHans Petter Selasky 	osm_port_t *p_src_port;
381d6b92ffaSHans Petter Selasky 	osm_port_t *p_dest_port;
382d6b92ffaSHans Petter Selasky 
383d6b92ffaSHans Petter Selasky 	/* In case of SM_GID_IN_SERVICE_TRAP(64) or SM_GID_OUT_OF_SERVICE_TRAP(65) traps
384d6b92ffaSHans Petter Selasky 	   the source gid comparison should be done on the trap source (saved
385d6b92ffaSHans Petter Selasky 	   as the gid in the data details field).
386d6b92ffaSHans Petter Selasky 	   For traps SM_MGID_CREATED_TRAP(66) or SM_MGID_DESTROYED_TRAP(67)
387d6b92ffaSHans Petter Selasky 	   the data details gid is the MGID.
388d6b92ffaSHans Petter Selasky 	   We need to check whether the subscriber has a compatible
389d6b92ffaSHans Petter Selasky 	   pkey with MC group.
390d6b92ffaSHans Petter Selasky 	   In all other cases the issuer gid is the trap source.
391d6b92ffaSHans Petter Selasky 	*/
392d6b92ffaSHans Petter Selasky 	if (trap_num >= SM_GID_IN_SERVICE_TRAP &&
393d6b92ffaSHans Petter Selasky 	    trap_num <= SM_MGID_DESTROYED_TRAP)
394d6b92ffaSHans Petter Selasky 		/* The issuer of these traps is the SM so source_gid
395d6b92ffaSHans Petter Selasky 		   is the gid saved on the data details */
396d6b92ffaSHans Petter Selasky 		source_gid = p_ntc->data_details.ntc_64_67.gid;
397d6b92ffaSHans Petter Selasky 	else
398d6b92ffaSHans Petter Selasky 		source_gid = p_ntc->issuer_gid;
399d6b92ffaSHans Petter Selasky 
400d6b92ffaSHans Petter Selasky 	p_dest_port = osm_get_port_by_lid(p_subn,
401d6b92ffaSHans Petter Selasky 					  p_infr_rec->report_addr.dest_lid);
402d6b92ffaSHans Petter Selasky 	if (!p_dest_port) {
403d6b92ffaSHans Petter Selasky 		OSM_LOG(p_log, OSM_LOG_INFO,
404d6b92ffaSHans Petter Selasky 			"Cannot find destination port with LID:%u\n",
405d6b92ffaSHans Petter Selasky 			cl_ntoh16(p_infr_rec->report_addr.dest_lid));
406d6b92ffaSHans Petter Selasky 		goto Exit;
407d6b92ffaSHans Petter Selasky 	}
408d6b92ffaSHans Petter Selasky 
409d6b92ffaSHans Petter Selasky 	/* Check if there is a pkey match. o13-17.1.1 */
410d6b92ffaSHans Petter Selasky 	switch (trap_num) {
411d6b92ffaSHans Petter Selasky 		case SM_MGID_CREATED_TRAP:
412d6b92ffaSHans Petter Selasky 		case SM_MGID_DESTROYED_TRAP:
413d6b92ffaSHans Petter Selasky 			p_mgrp = osm_get_mgrp_by_mgid(p_subn, &source_gid);
414d6b92ffaSHans Petter Selasky 			if (!p_mgrp) {
415d6b92ffaSHans Petter Selasky 				char gid_str[INET6_ADDRSTRLEN];
416d6b92ffaSHans Petter Selasky 				OSM_LOG(p_log, OSM_LOG_INFO,
417d6b92ffaSHans Petter Selasky 					"Cannot find MGID %s\n",
418d6b92ffaSHans Petter Selasky 					inet_ntop(AF_INET6, source_gid.raw, gid_str, sizeof gid_str));
419d6b92ffaSHans Petter Selasky 				goto Exit;
420d6b92ffaSHans Petter Selasky 			}
421d6b92ffaSHans Petter Selasky 
422d6b92ffaSHans Petter Selasky 			if (!osm_physp_has_pkey(p_log,
423d6b92ffaSHans Petter Selasky 						p_mgrp->mcmember_rec.pkey,
424d6b92ffaSHans Petter Selasky 						p_dest_port->p_physp)) {
425d6b92ffaSHans Petter Selasky 				char gid_str[INET6_ADDRSTRLEN];
426d6b92ffaSHans Petter Selasky 				OSM_LOG(p_log, OSM_LOG_INFO,
427d6b92ffaSHans Petter Selasky 					"MGID %s and port GUID:0x%016" PRIx64 " do not share same pkey\n",
428d6b92ffaSHans Petter Selasky 					inet_ntop(AF_INET6, source_gid.raw, gid_str, sizeof gid_str),
429d6b92ffaSHans Petter Selasky 					cl_ntoh64(p_dest_port->guid));
430d6b92ffaSHans Petter Selasky 				goto Exit;
431d6b92ffaSHans Petter Selasky 			}
432d6b92ffaSHans Petter Selasky 			break;
433d6b92ffaSHans Petter Selasky 
434d6b92ffaSHans Petter Selasky 		default:
435d6b92ffaSHans Petter Selasky 			p_src_port =
436d6b92ffaSHans Petter Selasky 			    osm_get_port_by_guid(p_subn, source_gid.unicast.interface_id);
437d6b92ffaSHans Petter Selasky 			if (!p_src_port) {
438d6b92ffaSHans Petter Selasky 				OSM_LOG(p_log, OSM_LOG_INFO,
439d6b92ffaSHans Petter Selasky 					"Cannot find source port with GUID:0x%016" PRIx64 "\n",
440d6b92ffaSHans Petter Selasky 					cl_ntoh64(source_gid.unicast.interface_id));
441d6b92ffaSHans Petter Selasky 				goto Exit;
442d6b92ffaSHans Petter Selasky 			}
443d6b92ffaSHans Petter Selasky 
444d6b92ffaSHans Petter Selasky 
445d6b92ffaSHans Petter Selasky 			if (osm_port_share_pkey(p_log, p_src_port, p_dest_port,
446d6b92ffaSHans Petter Selasky 						p_subn->opt.allow_both_pkeys) == FALSE) {
447d6b92ffaSHans Petter Selasky 				OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Pkey\n");
448d6b92ffaSHans Petter Selasky 				/* According to o13-17.1.2 - If this informInfo
449d6b92ffaSHans Petter Selasky 				   does not have lid_range_begin of 0xFFFF,
450d6b92ffaSHans Petter Selasky 				   then this informInfo request should be
451d6b92ffaSHans Petter Selasky 				   removed from database */
452d6b92ffaSHans Petter Selasky 				if (p_ii->lid_range_begin != 0xFFFF) {
453d6b92ffaSHans Petter Selasky 					OSM_LOG(p_log, OSM_LOG_VERBOSE,
454d6b92ffaSHans Petter Selasky 						"Pkey mismatch on lid_range_begin != 0xFFFF. "
455d6b92ffaSHans Petter Selasky 						"Need to remove this informInfo from db\n");
456d6b92ffaSHans Petter Selasky 					/* add the informInfo record to the remove_infr list */
457d6b92ffaSHans Petter Selasky 					cl_list_insert_tail(p_infr_to_remove_list, p_infr_rec);
458d6b92ffaSHans Petter Selasky 				}
459d6b92ffaSHans Petter Selasky 				goto Exit;
460d6b92ffaSHans Petter Selasky 			}
461d6b92ffaSHans Petter Selasky 			break;
462d6b92ffaSHans Petter Selasky 	}
463d6b92ffaSHans Petter Selasky 
464d6b92ffaSHans Petter Selasky 	return 1;
465d6b92ffaSHans Petter Selasky Exit:
466d6b92ffaSHans Petter Selasky 	return 0;
467d6b92ffaSHans Petter Selasky }
468d6b92ffaSHans Petter Selasky 
469d6b92ffaSHans Petter Selasky 
470d6b92ffaSHans Petter Selasky /**********************************************************************
471d6b92ffaSHans Petter Selasky  * This routine compares a given Notice and a ListItem of InformInfo type.
472d6b92ffaSHans Petter Selasky  * PREREQUISITE:
473d6b92ffaSHans Petter Selasky  * The Notice.GID should be pre-filled with the trap generator GID
474d6b92ffaSHans Petter Selasky  **********************************************************************/
match_notice_to_inf_rec(IN cl_list_item_t * p_list_item,IN void * context)475d6b92ffaSHans Petter Selasky static void match_notice_to_inf_rec(IN cl_list_item_t * p_list_item,
476d6b92ffaSHans Petter Selasky 				    IN void *context)
477d6b92ffaSHans Petter Selasky {
478d6b92ffaSHans Petter Selasky 	osm_infr_match_ctxt_t *p_infr_match = (osm_infr_match_ctxt_t *) context;
479d6b92ffaSHans Petter Selasky 	ib_mad_notice_attr_t *p_ntc = p_infr_match->p_ntc;
480d6b92ffaSHans Petter Selasky 	osm_infr_t *p_infr_rec = (osm_infr_t *) p_list_item;
481d6b92ffaSHans Petter Selasky 	ib_inform_info_t *p_ii = &(p_infr_rec->inform_record.inform_info);
482d6b92ffaSHans Petter Selasky 	osm_log_t *p_log = p_infr_rec->sa->p_log;
483d6b92ffaSHans Petter Selasky 
484d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
485d6b92ffaSHans Petter Selasky 
486d6b92ffaSHans Petter Selasky 	/* matching rules
487d6b92ffaSHans Petter Selasky 	 * InformInfo   Notice
488d6b92ffaSHans Petter Selasky 	 * GID          IssuerGID    if non zero must match the trap
489d6b92ffaSHans Petter Selasky 	 * LIDRange     IssuerLID    apply only if GID=0
490d6b92ffaSHans Petter Selasky 	 * IsGeneric    IsGeneric    is compulsory and must match the trap
491d6b92ffaSHans Petter Selasky 	 * Type         Type         if not 0xFFFF must match
492d6b92ffaSHans Petter Selasky 	 * TrapNumber   TrapNumber   if not 0xFFFF must match
493d6b92ffaSHans Petter Selasky 	 * DeviceId     DeviceID     if not 0xFFFF must match
494d6b92ffaSHans Petter Selasky 	 * QPN dont care
495d6b92ffaSHans Petter Selasky 	 * ProducerType ProducerType match or 0xFFFFFF // EZ: actually my interpretation
496d6b92ffaSHans Petter Selasky 	 * VendorID     VendorID     match or 0xFFFFFF
497d6b92ffaSHans Petter Selasky 	 */
498d6b92ffaSHans Petter Selasky 
499d6b92ffaSHans Petter Selasky 	/* GID          IssuerGID    if non zero must match the trap  */
500d6b92ffaSHans Petter Selasky 	if (p_ii->gid.unicast.prefix != 0
501d6b92ffaSHans Petter Selasky 	    || p_ii->gid.unicast.interface_id != 0) {
502d6b92ffaSHans Petter Selasky 		/* match by GID */
503d6b92ffaSHans Petter Selasky 		if (memcmp(&(p_ii->gid), &(p_ntc->issuer_gid),
504d6b92ffaSHans Petter Selasky 			   sizeof(ib_gid_t))) {
505d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by GID\n");
506d6b92ffaSHans Petter Selasky 			goto Exit;
507d6b92ffaSHans Petter Selasky 		}
508d6b92ffaSHans Petter Selasky 	} else {
509d6b92ffaSHans Petter Selasky 		/* LIDRange     IssuerLID    apply only if GID=0 */
510d6b92ffaSHans Petter Selasky 		/* If lid_range_begin of the informInfo is 0xFFFF - then it should be ignored. */
511d6b92ffaSHans Petter Selasky 		if (p_ii->lid_range_begin != 0xFFFF) {
512d6b92ffaSHans Petter Selasky 			/* a real lid range is given - check it */
513d6b92ffaSHans Petter Selasky 			if ((cl_hton16(p_ii->lid_range_begin) >
514d6b92ffaSHans Petter Selasky 			     cl_hton16(p_ntc->issuer_lid))
515d6b92ffaSHans Petter Selasky 			    || (cl_hton16(p_ntc->issuer_lid) >
516d6b92ffaSHans Petter Selasky 				cl_hton16(p_ii->lid_range_end))) {
517d6b92ffaSHans Petter Selasky 				OSM_LOG(p_log, OSM_LOG_DEBUG,
518d6b92ffaSHans Petter Selasky 					"Mismatch by LID Range. Needed: %u <= %u <= %u\n",
519d6b92ffaSHans Petter Selasky 					cl_hton16(p_ii->lid_range_begin),
520d6b92ffaSHans Petter Selasky 					cl_hton16(p_ntc->issuer_lid),
521d6b92ffaSHans Petter Selasky 					cl_hton16(p_ii->lid_range_end));
522d6b92ffaSHans Petter Selasky 				goto Exit;
523d6b92ffaSHans Petter Selasky 			}
524d6b92ffaSHans Petter Selasky 		}
525d6b92ffaSHans Petter Selasky 	}
526d6b92ffaSHans Petter Selasky 
527d6b92ffaSHans Petter Selasky 	/* IsGeneric    IsGeneric    is compulsory and must match the trap  */
528d6b92ffaSHans Petter Selasky 	if ((p_ii->is_generic && !ib_notice_is_generic(p_ntc)) ||
529d6b92ffaSHans Petter Selasky 	    (!p_ii->is_generic && ib_notice_is_generic(p_ntc))) {
530d6b92ffaSHans Petter Selasky 		OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Generic/Vendor\n");
531d6b92ffaSHans Petter Selasky 		goto Exit;
532d6b92ffaSHans Petter Selasky 	}
533d6b92ffaSHans Petter Selasky 
534d6b92ffaSHans Petter Selasky 	/* Type         Type         if not 0xFFFF must match */
535d6b92ffaSHans Petter Selasky 	if ((p_ii->trap_type != 0xFFFF) &&
536d6b92ffaSHans Petter Selasky 	    (cl_ntoh16(p_ii->trap_type) != ib_notice_get_type(p_ntc))) {
537d6b92ffaSHans Petter Selasky 		OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Type\n");
538d6b92ffaSHans Petter Selasky 		goto Exit;
539d6b92ffaSHans Petter Selasky 	}
540d6b92ffaSHans Petter Selasky 
541d6b92ffaSHans Petter Selasky 	/* based on generic type */
542d6b92ffaSHans Petter Selasky 	if (p_ii->is_generic) {
543d6b92ffaSHans Petter Selasky 		/* TrapNumber   TrapNumber   if not 0xFFFF must match */
544d6b92ffaSHans Petter Selasky 		if ((p_ii->g_or_v.generic.trap_num != 0xFFFF) &&
545d6b92ffaSHans Petter Selasky 		    (p_ii->g_or_v.generic.trap_num !=
546d6b92ffaSHans Petter Selasky 		     p_ntc->g_or_v.generic.trap_num)) {
547d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Trap Num\n");
548d6b92ffaSHans Petter Selasky 			goto Exit;
549d6b92ffaSHans Petter Selasky 		}
550d6b92ffaSHans Petter Selasky 
551d6b92ffaSHans Petter Selasky 		/* ProducerType ProducerType match or 0xFFFFFF  */
552d6b92ffaSHans Petter Selasky 		if ((cl_ntoh32(ib_inform_info_get_prod_type(p_ii)) != 0xFFFFFF)
553d6b92ffaSHans Petter Selasky 		    && (ib_inform_info_get_prod_type(p_ii) !=
554d6b92ffaSHans Petter Selasky 			ib_notice_get_prod_type(p_ntc))) {
555d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
556d6b92ffaSHans Petter Selasky 				"Mismatch by Node Type: II=0x%06X (%s) Trap=0x%06X (%s)\n",
557d6b92ffaSHans Petter Selasky 				cl_ntoh32(ib_inform_info_get_prod_type(p_ii)),
558d6b92ffaSHans Petter Selasky 				ib_get_producer_type_str
559d6b92ffaSHans Petter Selasky 				(ib_inform_info_get_prod_type(p_ii)),
560d6b92ffaSHans Petter Selasky 				cl_ntoh32(ib_notice_get_prod_type(p_ntc)),
561d6b92ffaSHans Petter Selasky 				ib_get_producer_type_str(ib_notice_get_prod_type
562d6b92ffaSHans Petter Selasky 							 (p_ntc)));
563d6b92ffaSHans Petter Selasky 			goto Exit;
564d6b92ffaSHans Petter Selasky 		}
565d6b92ffaSHans Petter Selasky 	} else {
566d6b92ffaSHans Petter Selasky 		/* DeviceId     DeviceID     if not 0xFFFF must match */
567d6b92ffaSHans Petter Selasky 		if ((p_ii->g_or_v.vend.dev_id != 0xFFFF) &&
568d6b92ffaSHans Petter Selasky 		    (p_ii->g_or_v.vend.dev_id != p_ntc->g_or_v.vend.dev_id)) {
569d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Dev Id\n");
570d6b92ffaSHans Petter Selasky 			goto Exit;
571d6b92ffaSHans Petter Selasky 		}
572d6b92ffaSHans Petter Selasky 
573d6b92ffaSHans Petter Selasky 		/* VendorID     VendorID     match or 0xFFFFFF  */
574d6b92ffaSHans Petter Selasky 		if ((ib_inform_info_get_vend_id(p_ii) != CL_HTON32(0xFFFFFF)) &&
575d6b92ffaSHans Petter Selasky 		    (ib_inform_info_get_vend_id(p_ii) !=
576d6b92ffaSHans Petter Selasky 		     ib_notice_get_vend_id(p_ntc))) {
577d6b92ffaSHans Petter Selasky 			OSM_LOG(p_log, OSM_LOG_DEBUG,
578d6b92ffaSHans Petter Selasky 				"Mismatch by Vendor ID\n");
579d6b92ffaSHans Petter Selasky 			goto Exit;
580d6b92ffaSHans Petter Selasky 		}
581d6b92ffaSHans Petter Selasky 	}
582d6b92ffaSHans Petter Selasky 
583d6b92ffaSHans Petter Selasky 	if (!is_access_permitted(p_infr_rec, p_infr_match))
584d6b92ffaSHans Petter Selasky 		goto Exit;
585d6b92ffaSHans Petter Selasky 
586d6b92ffaSHans Petter Selasky 	/* send the report to the address provided in the inform record */
587d6b92ffaSHans Petter Selasky 	OSM_LOG(p_log, OSM_LOG_DEBUG, "MATCH! Sending Report...\n");
588d6b92ffaSHans Petter Selasky 	send_report(p_infr_rec, p_ntc);
589d6b92ffaSHans Petter Selasky 
590d6b92ffaSHans Petter Selasky Exit:
591d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
592d6b92ffaSHans Petter Selasky }
593d6b92ffaSHans Petter Selasky 
594d6b92ffaSHans Petter Selasky /**********************************************************************
595d6b92ffaSHans Petter Selasky  * Once a Trap was received by osm_trap_rcv, or a Trap sourced by
596d6b92ffaSHans Petter Selasky  * the SM was sent (Traps 64-67), this routine is called with a copy of
597d6b92ffaSHans Petter Selasky  * the notice data.
598d6b92ffaSHans Petter Selasky  * Given a notice attribute - compare and see if it matches the InformInfo
599d6b92ffaSHans Petter Selasky  * element and if it does - call the Report(Notice) for the
600d6b92ffaSHans Petter Selasky  * target QP registered by the address stored in the InformInfo element
601d6b92ffaSHans Petter Selasky  **********************************************************************/
log_notice(osm_log_t * log,osm_log_level_t level,ib_mad_notice_attr_t * ntc)602d6b92ffaSHans Petter Selasky static void log_notice(osm_log_t * log, osm_log_level_t level,
603d6b92ffaSHans Petter Selasky 		       ib_mad_notice_attr_t * ntc)
604d6b92ffaSHans Petter Selasky {
605d6b92ffaSHans Petter Selasky 	char gid_str[INET6_ADDRSTRLEN], gid_str2[INET6_ADDRSTRLEN];
606d6b92ffaSHans Petter Selasky 	ib_gid_t *gid;
607d6b92ffaSHans Petter Selasky 	ib_gid_t *gid1, *gid2;
608d6b92ffaSHans Petter Selasky 
609d6b92ffaSHans Petter Selasky 	/* an official Event information log */
610d6b92ffaSHans Petter Selasky 	if (ib_notice_is_generic(ntc)) {
611d6b92ffaSHans Petter Selasky 		if ((ntc->g_or_v.generic.trap_num == CL_HTON16(SM_GID_IN_SERVICE_TRAP)) ||
612d6b92ffaSHans Petter Selasky 		    (ntc->g_or_v.generic.trap_num == CL_HTON16(SM_GID_OUT_OF_SERVICE_TRAP)) ||
613d6b92ffaSHans Petter Selasky 		    (ntc->g_or_v.generic.trap_num == CL_HTON16(SM_MGID_CREATED_TRAP)) ||
614d6b92ffaSHans Petter Selasky 		    (ntc->g_or_v.generic.trap_num == CL_HTON16(SM_MGID_DESTROYED_TRAP)))
615d6b92ffaSHans Petter Selasky 			gid = &ntc->data_details.ntc_64_67.gid;
616d6b92ffaSHans Petter Selasky 		else
617d6b92ffaSHans Petter Selasky 			gid = &ntc->issuer_gid;
618d6b92ffaSHans Petter Selasky 
619d6b92ffaSHans Petter Selasky 		switch (cl_ntoh16(ntc->g_or_v.generic.trap_num)) {
620d6b92ffaSHans Petter Selasky 		case SM_GID_IN_SERVICE_TRAP:
621d6b92ffaSHans Petter Selasky 		case SM_GID_OUT_OF_SERVICE_TRAP:
622d6b92ffaSHans Petter Selasky 			OSM_LOG(log, level,
623d6b92ffaSHans Petter Selasky 				"Reporting Informational Notice \"%s\", GID:%s\n",
624d6b92ffaSHans Petter Selasky 				ib_get_trap_str(ntc->g_or_v.generic.trap_num),
625d6b92ffaSHans Petter Selasky 				inet_ntop(AF_INET6, gid->raw, gid_str, sizeof gid_str));
626d6b92ffaSHans Petter Selasky 			break;
627d6b92ffaSHans Petter Selasky 		case SM_MGID_CREATED_TRAP:
628d6b92ffaSHans Petter Selasky 		case SM_MGID_DESTROYED_TRAP:
629d6b92ffaSHans Petter Selasky 			OSM_LOG(log, level,
630d6b92ffaSHans Petter Selasky 				"Reporting Informational Notice \"%s\", MGID:%s\n",
631d6b92ffaSHans Petter Selasky 				ib_get_trap_str(ntc->g_or_v.generic.trap_num),
632d6b92ffaSHans Petter Selasky 				inet_ntop(AF_INET6, gid->raw, gid_str, sizeof gid_str));
633d6b92ffaSHans Petter Selasky 			break;
634d6b92ffaSHans Petter Selasky 		case SM_UNPATH_TRAP:
635d6b92ffaSHans Petter Selasky 		case SM_REPATH_TRAP:
636d6b92ffaSHans Petter Selasky 			/* TODO: Fill in details once SM starts to use these traps */
637d6b92ffaSHans Petter Selasky 			OSM_LOG(log, level,
638d6b92ffaSHans Petter Selasky 				"Reporting Informational Notice \"%s\"n",
639d6b92ffaSHans Petter Selasky 				ib_get_trap_str(ntc->g_or_v.generic.trap_num));
640d6b92ffaSHans Petter Selasky 			break;
641d6b92ffaSHans Petter Selasky 		case SM_LINK_STATE_CHANGED_TRAP:
642d6b92ffaSHans Petter Selasky 			OSM_LOG(log, level,
643d6b92ffaSHans Petter Selasky 				"Reporting Urgent Notice \"%s\" from switch LID %u, "
644d6b92ffaSHans Petter Selasky 				"GUID 0x%016" PRIx64 "\n",
645d6b92ffaSHans Petter Selasky 				ib_get_trap_str(ntc->g_or_v.generic.trap_num),
646d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->issuer_lid),
647d6b92ffaSHans Petter Selasky 				cl_ntoh64(gid->unicast.interface_id));
648d6b92ffaSHans Petter Selasky 			break;
649d6b92ffaSHans Petter Selasky 		case SM_LINK_INTEGRITY_THRESHOLD_TRAP:
650d6b92ffaSHans Petter Selasky 		case SM_BUFFER_OVERRUN_THRESHOLD_TRAP:
651d6b92ffaSHans Petter Selasky 		case SM_WATCHDOG_TIMER_EXPIRED_TRAP:
652d6b92ffaSHans Petter Selasky 			OSM_LOG(log, level,
653d6b92ffaSHans Petter Selasky 				"Reporting Urgent Notice \"%s\" from LID %u, "
654d6b92ffaSHans Petter Selasky 				"GUID 0x%016" PRIx64 ", port %u\n",
655d6b92ffaSHans Petter Selasky 				ib_get_trap_str(ntc->g_or_v.generic.trap_num),
656d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->issuer_lid),
657d6b92ffaSHans Petter Selasky 				cl_ntoh64(gid->unicast.interface_id),
658d6b92ffaSHans Petter Selasky 				ntc->data_details.ntc_129_131.port_num);
659d6b92ffaSHans Petter Selasky 			break;
660d6b92ffaSHans Petter Selasky 		case SM_LOCAL_CHANGES_TRAP:
661d6b92ffaSHans Petter Selasky 			if (ntc->data_details.ntc_144.local_changes == 1)
662d6b92ffaSHans Petter Selasky 				OSM_LOG(log, level,
663d6b92ffaSHans Petter Selasky 					"Reporting Informational Notice \"%s\" from LID %u, "
664d6b92ffaSHans Petter Selasky 					"GUID 0x%016" PRIx64 ", ChangeFlags 0x%04x, "
665d6b92ffaSHans Petter Selasky 					"CapabilityMask2 0x%04x\n",
666d6b92ffaSHans Petter Selasky 					ib_get_trap_str(ntc->g_or_v.generic.trap_num),
667d6b92ffaSHans Petter Selasky 					cl_ntoh16(ntc->issuer_lid),
668d6b92ffaSHans Petter Selasky 					cl_ntoh64(gid->unicast.interface_id),
669d6b92ffaSHans Petter Selasky 					cl_ntoh16(ntc->data_details.ntc_144.change_flgs),
670d6b92ffaSHans Petter Selasky 					cl_ntoh16(ntc->data_details.ntc_144.cap_mask2));
671d6b92ffaSHans Petter Selasky 			else
672d6b92ffaSHans Petter Selasky 				OSM_LOG(log, level,
673d6b92ffaSHans Petter Selasky 					"Reporting Informational Notice \"%s\" from LID %u, "
674d6b92ffaSHans Petter Selasky 					"GUID 0x%016" PRIx64 ", new CapabilityMask 0x%08x\n",
675d6b92ffaSHans Petter Selasky 					ib_get_trap_str(ntc->g_or_v.generic.trap_num),
676d6b92ffaSHans Petter Selasky 					cl_ntoh16(ntc->issuer_lid),
677d6b92ffaSHans Petter Selasky 					cl_ntoh64(gid->unicast.interface_id),
678d6b92ffaSHans Petter Selasky 					cl_ntoh32(ntc->data_details.ntc_144.new_cap_mask));
679d6b92ffaSHans Petter Selasky 			break;
680d6b92ffaSHans Petter Selasky 		case SM_SYS_IMG_GUID_CHANGED_TRAP:
681d6b92ffaSHans Petter Selasky 			OSM_LOG(log, level,
682d6b92ffaSHans Petter Selasky 				"Reporting Informational Notice \"%s\" from LID %u, "
683d6b92ffaSHans Petter Selasky 				"GUID 0x%016" PRIx64 ", new SysImageGUID 0x%016" PRIx64 "\n",
684d6b92ffaSHans Petter Selasky 				ib_get_trap_str(ntc->g_or_v.generic.trap_num),
685d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->issuer_lid),
686d6b92ffaSHans Petter Selasky 				cl_ntoh64(gid->unicast.interface_id),
687d6b92ffaSHans Petter Selasky 				cl_ntoh64(ntc->data_details.ntc_145.new_sys_guid));
688d6b92ffaSHans Petter Selasky 			break;
689d6b92ffaSHans Petter Selasky 		case SM_BAD_MKEY_TRAP:
690d6b92ffaSHans Petter Selasky 			OSM_LOG(log, level,
691d6b92ffaSHans Petter Selasky 				"Reporting Security Notice \"%s\" from LID %u, "
692d6b92ffaSHans Petter Selasky 				"GUID 0x%016" PRIx64 ", Method 0x%x, Attribute 0x%x, "
693d6b92ffaSHans Petter Selasky 				"AttrMod 0x%x, M_Key 0x%016" PRIx64 "\n",
694d6b92ffaSHans Petter Selasky 				ib_get_trap_str(ntc->g_or_v.generic.trap_num),
695d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->issuer_lid),
696d6b92ffaSHans Petter Selasky 				cl_ntoh64(gid->unicast.interface_id),
697d6b92ffaSHans Petter Selasky 				ntc->data_details.ntc_256.method,
698d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->data_details.ntc_256.attr_id),
699d6b92ffaSHans Petter Selasky 				cl_ntoh32(ntc->data_details.ntc_256.attr_mod),
700d6b92ffaSHans Petter Selasky 				cl_ntoh64(ntc->data_details.ntc_256.mkey));
701d6b92ffaSHans Petter Selasky 			break;
702d6b92ffaSHans Petter Selasky 		case SM_BAD_PKEY_TRAP:
703d6b92ffaSHans Petter Selasky 		case SM_BAD_QKEY_TRAP:
704d6b92ffaSHans Petter Selasky 			gid1 = &ntc->data_details.ntc_257_258.gid1;
705d6b92ffaSHans Petter Selasky 			gid2 = &ntc->data_details.ntc_257_258.gid2;
706d6b92ffaSHans Petter Selasky 			OSM_LOG(log, level,
707d6b92ffaSHans Petter Selasky 				"Reporting Security Notice \"%s\" from LID %u, "
708d6b92ffaSHans Petter Selasky 				"GUID 0x%016" PRIx64 " : LID1 %u, LID2 %u, %s 0x%x, "
709d6b92ffaSHans Petter Selasky 				"SL %d, QP1 0x%x, QP2 0x%x, GID1 %s, GID2 %s\n",
710d6b92ffaSHans Petter Selasky 				ib_get_trap_str(ntc->g_or_v.generic.trap_num),
711d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->issuer_lid),
712d6b92ffaSHans Petter Selasky 				cl_ntoh64(gid->unicast.interface_id),
713d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->data_details.ntc_257_258.lid1),
714d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->data_details.ntc_257_258.lid2),
715d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->g_or_v.generic.trap_num) == SM_BAD_QKEY_TRAP ?
716d6b92ffaSHans Petter Selasky 					"Q_Key" : "P_Key",
717d6b92ffaSHans Petter Selasky 				cl_ntoh32(ntc->data_details.ntc_257_258.key),
718d6b92ffaSHans Petter Selasky 				cl_ntoh32(ntc->data_details.ntc_257_258.qp1) >> 28,
719d6b92ffaSHans Petter Selasky 				cl_ntoh32(ntc->data_details.ntc_257_258.qp1) & 0xffffff,
720d6b92ffaSHans Petter Selasky 				cl_ntoh32(ntc->data_details.ntc_257_258.qp2) & 0xffffff,
721d6b92ffaSHans Petter Selasky 				inet_ntop(AF_INET6, gid1->raw, gid_str, sizeof gid_str),
722d6b92ffaSHans Petter Selasky 				inet_ntop(AF_INET6, gid2->raw, gid_str2, sizeof gid_str2));
723d6b92ffaSHans Petter Selasky 			break;
724d6b92ffaSHans Petter Selasky 		case SM_BAD_SWITCH_PKEY_TRAP:
725d6b92ffaSHans Petter Selasky 			gid1 = &ntc->data_details.ntc_259.gid1;
726d6b92ffaSHans Petter Selasky 			gid2 = &ntc->data_details.ntc_259.gid2;
727d6b92ffaSHans Petter Selasky 			OSM_LOG(log, level,
728d6b92ffaSHans Petter Selasky 				"Reporting Security Notice \"%s\" from switch LID %u, "
729d6b92ffaSHans Petter Selasky 				"GUID 0x%016" PRIx64 " port %d : data_valid 0x%04x, "
730d6b92ffaSHans Petter Selasky 				"LID1 %u, LID2 %u, PKey 0x%04x, "
731d6b92ffaSHans Petter Selasky 				"SL %d, QP1 0x%x, QP2 0x%x, GID1 %s, GID2 %s\n",
732d6b92ffaSHans Petter Selasky 				ib_get_trap_str(ntc->g_or_v.generic.trap_num),
733d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->issuer_lid),
734d6b92ffaSHans Petter Selasky 				cl_ntoh64(gid->unicast.interface_id),
735d6b92ffaSHans Petter Selasky 				ntc->data_details.ntc_259.port_no,
736d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->data_details.ntc_259.data_valid),
737d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->data_details.ntc_259.lid1),
738d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->data_details.ntc_259.lid2),
739d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->data_details.ntc_257_258.key),
740d6b92ffaSHans Petter Selasky 				cl_ntoh32(ntc->data_details.ntc_259.sl_qp1) >> 28,
741d6b92ffaSHans Petter Selasky 				cl_ntoh32(ntc->data_details.ntc_259.sl_qp1) & 0xffffff,
742d6b92ffaSHans Petter Selasky 				cl_ntoh32(ntc->data_details.ntc_259.qp2),
743d6b92ffaSHans Petter Selasky 				inet_ntop(AF_INET6, gid1->raw, gid_str, sizeof gid_str),
744d6b92ffaSHans Petter Selasky 				inet_ntop(AF_INET6, gid2->raw, gid_str2, sizeof gid_str2));
745d6b92ffaSHans Petter Selasky 			break;
746d6b92ffaSHans Petter Selasky 		default:
747d6b92ffaSHans Petter Selasky 			OSM_LOG(log, level,
748d6b92ffaSHans Petter Selasky 				"Reporting Generic Notice type:%u num:%u (%s)"
749d6b92ffaSHans Petter Selasky 				" from LID:%u GID:%s\n",
750d6b92ffaSHans Petter Selasky 				ib_notice_get_type(ntc),
751d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->g_or_v.generic.trap_num),
752d6b92ffaSHans Petter Selasky 				ib_get_trap_str(ntc->g_or_v.generic.trap_num),
753d6b92ffaSHans Petter Selasky 				cl_ntoh16(ntc->issuer_lid),
754d6b92ffaSHans Petter Selasky 				inet_ntop(AF_INET6, gid->raw, gid_str, sizeof gid_str));
755d6b92ffaSHans Petter Selasky 			break;
756d6b92ffaSHans Petter Selasky 		}
757d6b92ffaSHans Petter Selasky 	} else
758d6b92ffaSHans Petter Selasky 		OSM_LOG(log, level,
759d6b92ffaSHans Petter Selasky 			"Reporting Vendor Notice type:%u vend:%u dev:%u"
760d6b92ffaSHans Petter Selasky 			" from LID:%u GID:%s\n",
761d6b92ffaSHans Petter Selasky 			ib_notice_get_type(ntc),
762d6b92ffaSHans Petter Selasky 			cl_ntoh32(ib_notice_get_vend_id(ntc)),
763d6b92ffaSHans Petter Selasky 			cl_ntoh16(ntc->g_or_v.vend.dev_id),
764d6b92ffaSHans Petter Selasky 			cl_ntoh16(ntc->issuer_lid),
765d6b92ffaSHans Petter Selasky 			inet_ntop(AF_INET6, ntc->issuer_gid.raw, gid_str,
766d6b92ffaSHans Petter Selasky 				  sizeof gid_str));
767d6b92ffaSHans Petter Selasky }
768d6b92ffaSHans Petter Selasky 
osm_report_notice(IN osm_log_t * p_log,IN osm_subn_t * p_subn,IN ib_mad_notice_attr_t * p_ntc)769d6b92ffaSHans Petter Selasky ib_api_status_t osm_report_notice(IN osm_log_t * p_log, IN osm_subn_t * p_subn,
770d6b92ffaSHans Petter Selasky 				  IN ib_mad_notice_attr_t * p_ntc)
771d6b92ffaSHans Petter Selasky {
772d6b92ffaSHans Petter Selasky 	osm_infr_match_ctxt_t context;
773d6b92ffaSHans Petter Selasky 	cl_list_t infr_to_remove_list;
774d6b92ffaSHans Petter Selasky 	osm_infr_t *p_infr_rec;
775d6b92ffaSHans Petter Selasky 	osm_infr_t *p_next_infr_rec;
776d6b92ffaSHans Petter Selasky 
777d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
778d6b92ffaSHans Petter Selasky 
779d6b92ffaSHans Petter Selasky 	/*
780d6b92ffaSHans Petter Selasky 	 * we must make sure we are ready for this...
781d6b92ffaSHans Petter Selasky 	 * note that the trap receivers might be initialized before
782d6b92ffaSHans Petter Selasky 	 * the osm_infr_init call is performed.
783d6b92ffaSHans Petter Selasky 	 */
784d6b92ffaSHans Petter Selasky 	if (p_subn->sa_infr_list.state != CL_INITIALIZED) {
785d6b92ffaSHans Petter Selasky 		OSM_LOG(p_log, OSM_LOG_DEBUG,
786d6b92ffaSHans Petter Selasky 			"Ignoring Notice Reports since Inform List is not initialized yet!\n");
787d6b92ffaSHans Petter Selasky 		return IB_ERROR;
788d6b92ffaSHans Petter Selasky 	}
789d6b92ffaSHans Petter Selasky 
790d6b92ffaSHans Petter Selasky 	if (OSM_LOG_IS_ACTIVE_V2(p_log, OSM_LOG_INFO))
791d6b92ffaSHans Petter Selasky 		log_notice(p_log, OSM_LOG_INFO, p_ntc);
792d6b92ffaSHans Petter Selasky 
793d6b92ffaSHans Petter Selasky 	/* Create a list that will hold all the infr records that should
794d6b92ffaSHans Petter Selasky 	   be removed due to violation. o13-17.1.2 */
795d6b92ffaSHans Petter Selasky 	cl_list_construct(&infr_to_remove_list);
796d6b92ffaSHans Petter Selasky 	cl_list_init(&infr_to_remove_list, 5);
797d6b92ffaSHans Petter Selasky 	context.p_remove_infr_list = &infr_to_remove_list;
798d6b92ffaSHans Petter Selasky 	context.p_ntc = p_ntc;
799d6b92ffaSHans Petter Selasky 
800d6b92ffaSHans Petter Selasky 	/* go over all inform info available at the subnet */
801d6b92ffaSHans Petter Selasky 	/* try match to the given notice and send if match */
802d6b92ffaSHans Petter Selasky 	cl_qlist_apply_func(&p_subn->sa_infr_list, match_notice_to_inf_rec,
803d6b92ffaSHans Petter Selasky 			    &context);
804d6b92ffaSHans Petter Selasky 
805d6b92ffaSHans Petter Selasky 	/* If we inserted items into the infr_to_remove_list - we need to
806d6b92ffaSHans Petter Selasky 	   remove them */
807d6b92ffaSHans Petter Selasky 	p_infr_rec = (osm_infr_t *) cl_list_remove_head(&infr_to_remove_list);
808d6b92ffaSHans Petter Selasky 	while (p_infr_rec != NULL) {
809d6b92ffaSHans Petter Selasky 		p_next_infr_rec =
810d6b92ffaSHans Petter Selasky 		    (osm_infr_t *) cl_list_remove_head(&infr_to_remove_list);
811d6b92ffaSHans Petter Selasky 		osm_infr_remove_from_db(p_subn, p_log, p_infr_rec);
812d6b92ffaSHans Petter Selasky 		p_infr_rec = p_next_infr_rec;
813d6b92ffaSHans Petter Selasky 	}
814d6b92ffaSHans Petter Selasky 	cl_list_destroy(&infr_to_remove_list);
815d6b92ffaSHans Petter Selasky 
816d6b92ffaSHans Petter Selasky 	/* report IB traps to plugin */
817d6b92ffaSHans Petter Selasky 	osm_opensm_report_event(p_subn->p_osm, OSM_EVENT_ID_TRAP, p_ntc);
818d6b92ffaSHans Petter Selasky 
819d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
820d6b92ffaSHans Petter Selasky 
821d6b92ffaSHans Petter Selasky 	return IB_SUCCESS;
822d6b92ffaSHans Petter Selasky }
823