1 /*
2 * Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved.
3 * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5 *
6 * This software is available to you under a choice of one of two
7 * licenses. You may choose to be licensed under the terms of the GNU
8 * General Public License (GPL) Version 2, available from the file
9 * COPYING in the main directory of this source tree, or the
10 * OpenIB.org BSD license below:
11 *
12 * Redistribution and use in source and binary forms, with or
13 * without modification, are permitted provided that the following
14 * conditions are met:
15 *
16 * - Redistributions of source code must retain the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer.
19 *
20 * - Redistributions in binary form must reproduce the above
21 * copyright notice, this list of conditions and the following
22 * disclaimer in the documentation and/or other materials
23 * provided with the distribution.
24 *
25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32 * SOFTWARE.
33 *
34 */
35
36 /*
37 * Abstract:
38 * Implementation of Multicast Member testing flow..
39 *
40 */
41
42 #ifndef __WIN__
43 #include <unistd.h>
44 #endif
45 #include <sys/socket.h>
46 #include <stdio.h>
47 #include <stdlib.h>
48 #include <string.h>
49 #include <arpa/inet.h>
50 #include <complib/cl_debug.h>
51 #include <complib/cl_map.h>
52 #include <complib/cl_list.h>
53 #include "osmtest.h"
54
55 /**********************************************************************
56 **********************************************************************/
57
__osmt_print_all_multicast_records(IN osmtest_t * const p_osmt)58 static void __osmt_print_all_multicast_records(IN osmtest_t * const p_osmt)
59 {
60 uint32_t i;
61 ib_api_status_t status;
62 osmv_query_req_t req;
63 osmv_user_query_t user;
64 osmtest_req_context_t context;
65 ib_member_rec_t *mcast_record;
66
67 memset(&context, 0, sizeof(context));
68 memset(&req, 0, sizeof(req));
69 memset(&user, 0, sizeof(user));
70
71 user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;
72 user.attr_offset = ib_get_attr_offset(sizeof(*mcast_record));
73
74 req.query_type = OSMV_QUERY_USER_DEFINED;
75 req.timeout_ms = p_osmt->opt.transaction_timeout;
76 req.retry_cnt = 1;
77 req.flags = OSM_SA_FLAGS_SYNC;
78 context.p_osmt = p_osmt;
79 req.query_context = &context;
80 req.pfn_query_cb = osmtest_query_res_cb;
81 req.p_query_input = &user;
82
83 /* UnTrusted (SMKey of 0) - get the multicast groups */
84 status = osmv_query_sa(p_osmt->h_bind, &req);
85
86 if (status != IB_SUCCESS || context.result.status != IB_SUCCESS) {
87 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B5: "
88 "Failed getting the multicast groups records - %s/%s\n",
89 ib_get_err_str(status),
90 ib_get_err_str(context.result.status));
91 return;
92 }
93
94 osm_log(&p_osmt->log, OSM_LOG_INFO,
95 "\n |------------------------------------------|"
96 "\n | Remaining Multicast Groups |"
97 "\n |------------------------------------------|\n");
98
99 for (i = 0; i < context.result.result_cnt; i++) {
100 mcast_record =
101 osmv_get_query_mc_rec(context.result.p_result_madw, i);
102 osm_dump_mc_record(&p_osmt->log, mcast_record, OSM_LOG_INFO);
103 }
104
105 /* Trusted - now get the multicast group members */
106 req.sm_key = OSM_DEFAULT_SM_KEY;
107 status = osmv_query_sa(p_osmt->h_bind, &req);
108
109 if (status != IB_SUCCESS || context.result.status != IB_SUCCESS) {
110 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B6: "
111 "Failed getting the multicast group members records - %s/%s\n",
112 ib_get_err_str(status),
113 ib_get_err_str(context.result.status));
114 return;
115 }
116
117 osm_log(&p_osmt->log, OSM_LOG_INFO,
118 "\n |--------------------------------------------------|"
119 "\n | Remaining Multicast Group Members |"
120 "\n |--------------------------------------------------|\n");
121
122 for (i = 0; i < context.result.result_cnt; i++) {
123 mcast_record =
124 osmv_get_query_mc_rec(context.result.p_result_madw, i);
125 osm_dump_mc_record(&p_osmt->log, mcast_record, OSM_LOG_INFO);
126 }
127
128 }
129
130 /**********************************************************************
131 **********************************************************************/
132
133 static cl_status_t
__match_mgids(IN const void * const p_object,IN void * context)134 __match_mgids(IN const void *const p_object, IN void *context)
135 {
136 ib_gid_t *p_mgid_context = (ib_gid_t *) context;
137 ib_gid_t *p_mgid_list_item = (ib_gid_t *) p_object;
138 int32_t count;
139
140 count = memcmp(p_mgid_context, p_mgid_list_item, sizeof(ib_gid_t));
141 if (count == 0)
142 return CL_SUCCESS;
143 else
144 return CL_NOT_FOUND;
145 }
146
147 /**********************************************************************
148 **********************************************************************/
149
osmt_query_mcast(IN osmtest_t * const p_osmt)150 ib_api_status_t osmt_query_mcast(IN osmtest_t * const p_osmt)
151 {
152 ib_api_status_t status = IB_SUCCESS;
153 osmv_user_query_t user;
154 osmv_query_req_t req;
155 osmtest_req_context_t context;
156 ib_member_rec_t *p_rec;
157 uint32_t i, num_recs = 0;
158 cl_list_t mgids_list;
159 cl_list_t *p_mgids_list;
160 cl_list_iterator_t p_mgids_res;
161 cl_status_t cl_status;
162 cl_map_item_t *p_item, *p_next_item;
163 osmtest_mgrp_t *p_mgrp;
164
165 OSM_LOG_ENTER(&p_osmt->log);
166
167 /*
168 * Do a blocking query for all Multicast Records in the subnet.
169 * The result is returned in the result field of the caller's
170 * context structure.
171 *
172 * The query structures are locals.
173 */
174
175 memset(&req, 0, sizeof(req));
176 memset(&user, 0, sizeof(user));
177
178 context.p_osmt = p_osmt;
179 user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;
180 user.attr_offset = ib_get_attr_offset(sizeof(ib_member_rec_t));
181
182 req.query_type = OSMV_QUERY_USER_DEFINED;
183 req.timeout_ms = p_osmt->opt.transaction_timeout;
184 req.retry_cnt = p_osmt->opt.retry_count;
185 req.flags = OSM_SA_FLAGS_SYNC;
186 req.query_context = &context;
187 req.pfn_query_cb = osmtest_query_res_cb;
188 req.p_query_input = &user;
189
190 status = osmv_query_sa(p_osmt->h_bind, &req);
191
192 if (status != IB_SUCCESS) {
193 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0203: "
194 "ib_query failed (%s)\n", ib_get_err_str(status));
195 goto Exit;
196 }
197
198 status = context.result.status;
199
200 if (status != IB_SUCCESS) {
201 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0264: "
202 "ib_query failed (%s)\n", ib_get_err_str(status));
203 if (status == IB_REMOTE_ERROR) {
204 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
205 "Remote error = %s.\n",
206 ib_get_mad_status_str(osm_madw_get_mad_ptr
207 (context.result.
208 p_result_madw)));
209 }
210 goto Exit;
211 }
212
213 /* ok we have got something */
214 /* First Delete the old MGID Table */
215 p_next_item = cl_qmap_head(&p_osmt->exp_subn.mgrp_mlid_tbl);
216 while (p_next_item != cl_qmap_end(&p_osmt->exp_subn.mgrp_mlid_tbl)) {
217 p_item = p_next_item;
218 p_next_item = cl_qmap_next(p_item);
219 cl_qmap_remove_item(&p_osmt->exp_subn.mgrp_mlid_tbl, p_item);
220 free(p_item);
221
222 }
223
224 cl_list_construct(&mgids_list);
225 cl_list_init(&mgids_list, num_recs);
226 p_mgids_list = &mgids_list;
227 num_recs = context.result.result_cnt;
228 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n",
229 num_recs);
230
231 for (i = 0; i < num_recs; i++) {
232 p_rec = osmv_get_query_result(context.result.p_result_madw, i);
233 p_mgids_res =
234 cl_list_find_from_head(p_mgids_list, __match_mgids,
235 &(p_rec->mgid));
236 /* If returns iterator other than end of list, same mgid exists already */
237 if (p_mgids_res != cl_list_end(p_mgids_list)) {
238 char gid_str[INET6_ADDRSTRLEN];
239 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0265: "
240 "MCG MGIDs are the same - invalid MGID : %s\n",
241 inet_ntop(AF_INET6, p_rec->mgid.raw, gid_str,
242 sizeof gid_str));
243 status = IB_ERROR;
244 goto Exit;
245
246 }
247 osm_dump_mc_record(&p_osmt->log, p_rec, OSM_LOG_VERBOSE);
248 cl_status = cl_list_insert_head(p_mgids_list, &(p_rec->mgid));
249 if (cl_status) {
250 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0205: "
251 "Could not add MGID to cl_list\n");
252 status = IB_ERROR;
253 goto Exit;
254 }
255 p_mgrp = (osmtest_mgrp_t *) malloc(sizeof(*p_mgrp));
256 if (!p_mgrp) {
257 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0204: "
258 "Could not allocate new MCG\n");
259 status = IB_ERROR;
260 goto Exit;
261 }
262 memcpy(&p_mgrp->mcmember_rec, p_rec,
263 sizeof(p_mgrp->mcmember_rec));
264 cl_qmap_insert(&p_osmt->exp_subn.mgrp_mlid_tbl,
265 cl_ntoh16(p_rec->mlid), &p_mgrp->map_item);
266 }
267
268 Exit:
269 if (context.result.p_result_madw != NULL) {
270 osm_mad_pool_put(&p_osmt->mad_pool,
271 context.result.p_result_madw);
272 context.result.p_result_madw = NULL;
273 }
274
275 OSM_LOG_EXIT(&p_osmt->log);
276 return (status);
277 }
278
279 /**********************************************************************
280 **********************************************************************/
281
282 /* given a multicast request send and wait for response. */
283 ib_api_status_t
osmt_send_mcast_request(IN osmtest_t * const p_osmt,IN uint8_t is_set,IN ib_member_rec_t * p_mc_req,IN uint64_t comp_mask,OUT ib_sa_mad_t * p_res)284 osmt_send_mcast_request(IN osmtest_t * const p_osmt,
285 IN uint8_t is_set,
286 IN ib_member_rec_t * p_mc_req,
287 IN uint64_t comp_mask, OUT ib_sa_mad_t * p_res)
288 {
289 osmtest_req_context_t context;
290 ib_api_status_t status = IB_SUCCESS;
291 osmv_user_query_t user;
292 osmv_query_req_t req;
293
294 OSM_LOG_ENTER(&p_osmt->log);
295
296 /*
297 * Do a blocking query for this record in the subnet.
298 *
299 * The query structures are locals.
300 */
301 memset(&req, 0, sizeof(req));
302 memset(&user, 0, sizeof(user));
303 memset(&context, 0, sizeof(context));
304 memset(p_res, 0, sizeof(ib_sa_mad_t));
305
306 context.p_osmt = p_osmt;
307
308 user.p_attr = p_mc_req;
309 user.comp_mask = comp_mask;
310
311 if (is_set == 1) {
312 req.query_type = OSMV_QUERY_UD_MULTICAST_SET;
313 } else if (is_set == 0) {
314 req.query_type = OSMV_QUERY_UD_MULTICAST_DELETE;
315 } else if (is_set == 0xee) {
316 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
317 "Set USER DEFINED QUERY\n");
318 req.query_type = OSMV_QUERY_USER_DEFINED;
319 user.method = IB_MAD_METHOD_GET;
320 user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;
321 user.attr_offset = ib_get_attr_offset(sizeof(ib_member_rec_t));
322 } else if (is_set == 0xff) {
323 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
324 "Set USER DEFINED QUERY\n");
325 req.query_type = OSMV_QUERY_USER_DEFINED;
326 user.method = IB_MAD_METHOD_SET;
327 user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;
328 user.attr_offset = ib_get_attr_offset(sizeof(ib_member_rec_t));
329 }
330
331 /* TODO : Check the validity of all user fields in order to use
332 OSMV_QUERY_USER_DEFINED
333 p_user_query = ( osmv_user_query_t * ) p_query_req->p_query_input;
334 if (p_user_query->method) sa_mad_data.method = p_user_query->method;
335 sa_mad_data.attr_offset = p_user_query->attr_offset;
336 sa_mad_data.attr_id = p_user_query->attr_id;
337 sa_mad_data.comp_mask = p_user_query->comp_mask;
338 sa_mad_data.p_attr = p_user_query->p_attr;
339 */
340
341 req.timeout_ms = p_osmt->opt.transaction_timeout;
342 req.retry_cnt = p_osmt->opt.retry_count;
343 req.flags = OSM_SA_FLAGS_SYNC;
344 req.query_context = &context;
345 req.pfn_query_cb = osmtest_query_res_cb;
346 req.p_query_input = &user;
347
348 status = osmv_query_sa(p_osmt->h_bind, &req);
349
350 if (status != IB_SUCCESS) {
351 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0206: "
352 "ib_query failed (%s)\n", ib_get_err_str(status));
353 goto Exit;
354 }
355
356 /* ok it worked */
357 memcpy(p_res,
358 osm_madw_get_mad_ptr(context.result.p_result_madw),
359 sizeof(ib_sa_mad_t));
360
361 status = context.result.status;
362
363 if (status != IB_SUCCESS) {
364 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0224: "
365 "ib_query failed (%s)\n", ib_get_err_str(status));
366 if (status == IB_REMOTE_ERROR) {
367 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
368 "Remote error = %s\n",
369 ib_get_mad_status_str(osm_madw_get_mad_ptr
370 (context.result.
371 p_result_madw)));
372 }
373 }
374
375 Exit:
376 /*
377 * Return the IB query MAD to the pool as necessary.
378 */
379 if (context.result.p_result_madw != NULL) {
380 osm_mad_pool_put(&p_osmt->mad_pool,
381 context.result.p_result_madw);
382 context.result.p_result_madw = NULL;
383 }
384
385 OSM_LOG_EXIT(&p_osmt->log);
386 return (status);
387 }
388
389 /**********************************************************************
390 **********************************************************************/
391
392 void
osmt_init_mc_query_rec(IN osmtest_t * const p_osmt,IN OUT ib_member_rec_t * p_mc_req)393 osmt_init_mc_query_rec(IN osmtest_t * const p_osmt,
394 IN OUT ib_member_rec_t * p_mc_req)
395 {
396 /* use default values so we can change only what we want later */
397 memset(p_mc_req, 0, sizeof(ib_member_rec_t));
398
399 /* we leave the MGID to the user */
400 memcpy(&p_mc_req->port_gid.unicast.interface_id,
401 &p_osmt->local_port.port_guid,
402 sizeof(p_osmt->local_port.port_guid)
403 );
404
405 /* use our own subnet prefix: */
406 p_mc_req->port_gid.unicast.prefix = CL_HTON64(0xFE80000000000000ULL);
407
408 /* ib_net32_t qkey; */
409 /* ib_net16_t mlid; - we keep it zero for upper level to decide. */
410 /* uint8_t mtu; - keep it zero means - anything you have please. */
411 /* uint8_t tclass; can leave as zero for now (between subnets) */
412 /* ib_net16_t pkey; leave as zero */
413 p_mc_req->rate = IB_LINK_WIDTH_ACTIVE_4X;
414 /* uint8_t pkt_life; zero means greater than zero ... */
415 /* ib_net32_t sl_flow_hop; keep it all zeros */
416 /* we want to use a link local scope: 0x02 */
417 p_mc_req->scope_state = ib_member_set_scope_state(0x02, 0);
418 }
419
420 /***********************************************************************
421 * UD Multicast testing flow:
422 * o15.0.1.3:
423 * - Request new MCG with not enough components in comp_mask :
424 * ERR_INSUFFICIENT_COMPONENTS
425 * o15.0.1.8:
426 * - Request a join with irrelevant RATE and get a ERR_INVALID_REQ
427 * o15.0.1.4:
428 * - Create an MGID by asking for a join with MGID = 0
429 * providing P_Key, Q_Key, SL, FlowLabel, Tclass.
430 * o15.0.1.5:
431 * - Check the returned MGID is valid. (p 804)
432 * o15.0.1.6:
433 * - Create a new MCG with valid requested MGID.
434 * - Try to create a new MCG with invalid MGID : get back ERR_REQ_INVALID
435 * - Try again with MGID prefix = 0xA01B (maybe 0x1BA0 little or big ?)
436 * - Try to create again the already created group: ERR_REQ_INVALID
437 * o15.0.1.7 - implicitlly checked during the prev steps.
438 * o15.0.1.9
439 * - Create MCG with Invalid JoinState.FullMember != 1 : get ERR_REQ_INVALID
440 * o15.0.1.10 - can't check on a single client .
441 * o15.0.1.11:
442 * - Try to join into a MGID that exists with JoinState=SendOnlyMember -
443 * see that it updates JoinState. What is the routing change?
444 * - We can not check simple join since we have only one tester (for now)
445 * o15.0.1.12:
446 * - The last join should have a special treatment in the SA (sender only)
447 * but what is it ?
448 * o15.0.1.13:
449 * - Try joining with wrong rate - ERR_REQ_INVALID
450 * o15.0.1.14:
451 * - Try partial delete - actually updating the join state. check it.
452 * - Register by InformInfo flow to receive trap 67 on MCG delete.
453 * - Try full delete (JoinState and should be 0)
454 * - Wait for trap 67.
455 * - Try joining (not full mem) again to see the group was deleted.
456 * (should fail - o15.0.1.13)
457 * o15.0.1.15:
458 * - Try deletion of the IPoIB MCG and get: ERR_REQ_INVALID
459 * o15.0.1.16:
460 * - Try GetTable with PortGUID wildcarded and get back some groups.
461 ***********************************************************************/
462
463 /* The following macro can be used only within the osmt_run_mcast_flow() function */
464 #define IS_IPOIB_MGID(p_mgid) \
465 ( !memcmp(&osm_ipoib_good_mgid, (p_mgid), sizeof(osm_ipoib_good_mgid)) || \
466 !memcmp(&osm_ts_ipoib_good_mgid, (p_mgid), sizeof(osm_ts_ipoib_good_mgid)) )
467
osmt_run_mcast_flow(IN osmtest_t * const p_osmt)468 ib_api_status_t osmt_run_mcast_flow(IN osmtest_t * const p_osmt)
469 {
470 char gid_str[INET6_ADDRSTRLEN];
471 char gid_str2[INET6_ADDRSTRLEN];
472 ib_api_status_t status;
473 ib_member_rec_t mc_req_rec;
474 ib_member_rec_t *p_mc_res;
475 ib_sa_mad_t res_sa_mad;
476 uint64_t comp_mask = 0;
477 ib_net64_t remote_port_guid = 0x0;
478 cl_qmap_t *p_mgrp_mlid_tbl;
479 osmtest_mgrp_t *p_mgrp;
480 ib_gid_t special_mgid, tmp_mgid, proxy_mgid;
481 ib_net16_t invalid_mlid = 0x0;
482 ib_net16_t max_mlid = cl_hton16(0xFFFE), tmp_mlid;
483 boolean_t ReachedMlidLimit = FALSE;
484 int start_cnt = 0, cnt, middle_cnt = 0, end_cnt = 0;
485 int start_ipoib_cnt = 0, end_ipoib_cnt = 0;
486 int mcg_outside_test_cnt = 0, fail_to_delete_mcg = 0;
487 osmtest_req_context_t context;
488 ib_node_record_t *p_rec;
489 uint32_t num_recs = 0, i;
490 uint8_t mtu_phys = 0, rate_phys = 0;
491 cl_map_t test_created_mlids; /* List of all mlids created in this test */
492 ib_member_rec_t *p_recvd_rec;
493 boolean_t got_error = FALSE;
494
495 static ib_gid_t good_mgid = {
496 {
497 0xFF, 0x12, 0xA0, 0x1C,
498 0xFE, 0x80, 0x00, 0x00,
499 0x00, 0x00, 0x00, 0x00,
500 0x12, 0x34, 0x56, 0x78}
501 };
502 static ib_gid_t osm_ipoib_mgid = {
503 {
504 0xff, /* multicast field */
505 0x12, /* scope */
506 0x40, 0x1b, /* IPv4 signature */
507 0xff, 0xff, /* 16 bits of P_Key (to be filled in) */
508 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */
509 0xff, 0xff, 0xff, 0xee, /* 32 bit IPv4 broadcast address */
510 },
511 };
512 static ib_gid_t osm_ts_ipoib_good_mgid = {
513 {
514 0xff, /* multicast field */
515 0x12, /* non-permanent bit,scope */
516 0x40, 0x1b, /* IPv4 signature */
517 0xff, 0xff, /* 16 bits of P_Key (to be filled in) */
518 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */
519 0x00, 0x00, 0x00, 0x01, /* 32 bit IPv4 broadcast address */
520 },
521 };
522 static ib_gid_t osm_ipoib_good_mgid = {
523 {
524 0xff, /* multicast field */
525 0x12, /* non-permanent bit,scope */
526 0x40, 0x1b, /* IPv4 signature */
527 0xff, 0xff, /* 16 bits of P_Key (to be filled in) */
528 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */
529 0xff, 0xff, 0xff, 0xff, /* 32 bit IPv4 broadcast address */
530 },
531 };
532 static ib_gid_t osm_link_local_mgid = {
533 {
534 0xFF, 0x02, 0x00, 0x00,
535 0x00, 0x00, 0x00, 0x00,
536 0x00, 0x00, 0x00, 0x00,
537 0x00, 0x00, 0x00, 0x01},
538 };
539
540 OSM_LOG_ENTER(&p_osmt->log);
541
542 OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "GetTable of all current MCGs...\n");
543 status = osmt_query_mcast(p_osmt);
544 if (status != IB_SUCCESS) {
545 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 2FF "
546 "GetTable of all records has failed!\n");
547 goto Exit;
548 }
549
550 /* Initialize the test_created_mgrps map */
551 cl_map_construct(&test_created_mlids);
552 cl_map_init(&test_created_mlids, 1000);
553
554 p_mgrp_mlid_tbl = &p_osmt->exp_subn.mgrp_mlid_tbl;
555 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
556
557 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
558
559 /* Only when we are on single mode check flow - do the count comparison, otherwise skip */
560 if (p_osmt->opt.mmode == 1 || p_osmt->opt.mmode == 3) {
561 start_cnt = cl_qmap_count(p_mgrp_mlid_tbl);
562 OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(start): "
563 "Number of MC Records found in SA DB is %d\n",
564 start_cnt);
565 }
566
567 /* This flow is being added due to bug discovered using SilverStorm stack -
568 The bug was initializing MCast with MTU & RATE min values that do
569 not match the subnet capability, even though that OpenSM
570 reponds with the correct value it does not store it in the MCG.
571 We want the check a join request to already existing group (ipoib)
572 without using MTU or RATE then getting response from OpenSM with
573 the correct values then join again with them and get IB_SUCCESS
574 all the way
575 */
576
577 /* First validate IPoIB exist in the SA DB */
578 p_mgrp = (osmtest_mgrp_t *) cl_qmap_head(p_mgrp_mlid_tbl);
579 /* scan all available multicast groups in the DB and fill in the table */
580 while (p_mgrp != (osmtest_mgrp_t *) cl_qmap_end(p_mgrp_mlid_tbl)) {
581 /* search for ipoib mgid */
582 if (IS_IPOIB_MGID(&p_mgrp->mcmember_rec.mgid)) {
583 start_ipoib_cnt++;
584 } else {
585 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
586 "Non-IPoIB MC Groups exist: mgid=%s\n",
587 inet_ntop(AF_INET6,
588 p_mgrp->mcmember_rec.mgid.raw,
589 gid_str, sizeof gid_str));
590 mcg_outside_test_cnt++;
591 }
592
593 p_mgrp = (osmtest_mgrp_t *) cl_qmap_next(&p_mgrp->map_item);
594 }
595
596 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
597 "Found %d non-IPoIB MC Groups\n", mcg_outside_test_cnt);
598
599 if (start_ipoib_cnt) {
600 /* o15-0.2.4 - Check a join request to already created MCG */
601 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
602 "Found IPoIB MC Group, so we run SilverStorm Bug Flow...\n");
603 /* Try to join first like IPoIB of SilverStorm */
604 memcpy(&mc_req_rec.mgid, &osm_ipoib_good_mgid,
605 sizeof(ib_gid_t));
606 /* Request Join */
607 ib_member_set_join_state(&mc_req_rec,
608 IB_MC_REC_STATE_FULL_MEMBER);
609 comp_mask =
610 IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
611 IB_MCR_COMPMASK_JOIN_STATE;
612
613 status = osmt_send_mcast_request(p_osmt, 0xff, /* User Defined query Set */
614 &mc_req_rec,
615 comp_mask, &res_sa_mad);
616
617 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
618 "Joining an existing IPoIB multicast group\n");
619 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
620 "Sent Join request with :\n\t\tport_gid=%s, mgid=%s\n"
621 "\t\tjoin state= 0x%x, response is : %s\n",
622 inet_ntop(AF_INET6, mc_req_rec.port_gid.raw,
623 gid_str, sizeof gid_str),
624 inet_ntop(AF_INET6, mc_req_rec.mgid.raw,
625 gid_str2, sizeof gid_str2),
626 (mc_req_rec.scope_state & 0x0F),
627 ib_get_err_str(status));
628 if (status != IB_SUCCESS) {
629 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B3: "
630 "Failed joining existing IPoIB MCGroup - got %s\n",
631 ib_get_err_str(status));
632 goto Exit;
633 }
634 /* Check MTU & Rate Value and resend with SA suggested values */
635 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
636
637 /* Prepare the mc_req_rec for the rest of the flow */
638 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
639 /*
640 We simulate the same situation as in SilverStorm - a response with the
641 exact RATE & MTU as the SA responded with. Actually the query
642 has included some more fields but we know that problem was
643 genereated by the RATE
644 */
645 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
646 "Received attributes of MCG : \n\t\tMTU=0x%02X, RATE=0x%02X\n",
647 p_mc_res->mtu, p_mc_res->rate);
648
649 mc_req_rec.mtu = p_mc_res->mtu;
650 mc_req_rec.rate = p_mc_res->rate;
651 /* Set feasible mtu & rate that will allow check the
652 exact statement of OpenSM */
653 mtu_phys = p_mc_res->mtu;
654 rate_phys = p_mc_res->rate;
655
656 memcpy(&mc_req_rec.mgid, &osm_ipoib_good_mgid,
657 sizeof(ib_gid_t));
658 /* Request Join */
659 ib_member_set_join_state(&mc_req_rec,
660 IB_MC_REC_STATE_FULL_MEMBER);
661 comp_mask =
662 IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
663 IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_MTU_SEL |
664 IB_MCR_COMPMASK_MTU | IB_MCR_COMPMASK_RATE_SEL |
665 IB_MCR_COMPMASK_RATE;
666
667 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
668 "Sending attributes of MCG : \n\t\tMTU=0x%02X, RATE=0x%02X\n",
669 mc_req_rec.mtu, mc_req_rec.rate);
670 status = osmt_send_mcast_request(p_osmt, 0xff, /* User Defined query */
671 &mc_req_rec,
672 comp_mask, &res_sa_mad);
673 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
674 "Sent Join request using response values, response is : %s\n",
675 ib_get_err_str(status));
676 if (status != IB_SUCCESS) {
677 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EF: "
678 "Query as Full Member of already existing "
679 "ipoib group gid %s has failed\n",
680 inet_ntop(AF_INET6, mc_req_rec.mgid.raw,
681 gid_str, sizeof gid_str));
682 goto Exit;
683 }
684 /* We do not want to leave the MCG since its IPoIB */
685 }
686
687 /**************************************************************************/
688 /* Check Get with invalid mlid */
689
690 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
691 "Checking Get with invalid mlid...\n");
692 /* Request Get */
693 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
694 mc_req_rec.mlid = invalid_mlid;
695 comp_mask = IB_MCR_COMPMASK_MLID;
696
697 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
698 status = osmt_send_mcast_request(p_osmt, 0xee, /* User Defined query Get */
699 &mc_req_rec, comp_mask, &res_sa_mad);
700 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
701
702 if (status == IB_SUCCESS) {
703 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 2E0 "
704 "SubnAdmGet with invalid mlid 0x%x succeeded\n",
705 cl_ntoh16(mc_req_rec.mlid));
706 status = IB_ERROR;
707 goto Exit;
708 }
709
710 /* Prepare the mc_req_rec for the rest of the flow */
711 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
712 /**************************************************************************/
713 /* Check Get with invalid port guid */
714
715 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
716 "Checking Get with invalid port guid (0x0) but valid interface ID : 0x%"
717 PRIx64 "...\n",
718 cl_ntoh64(mc_req_rec.port_gid.unicast.interface_id));
719
720 /* Request Get */
721 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
722 memset(&mc_req_rec.port_gid.unicast.interface_id, 0,
723 sizeof(ib_net64_t));
724 comp_mask = IB_MCR_COMPMASK_GID;
725
726 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
727 status = osmt_send_mcast_request(p_osmt, 0xee, /* User Defined query Get */
728 &mc_req_rec, comp_mask, &res_sa_mad);
729 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
730
731 if (status == IB_SUCCESS) {
732 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 2E4 "
733 "SubnAdmGet with invalid port guid succeeded\n");
734 status = IB_ERROR;
735 goto Exit;
736 }
737
738 /* Prepare the mc_req_rec for the rest of the flow */
739 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
740 /**************************************************************************/
741
742 /* o15.0.1.3: */
743 /* - Request Join with insufficient comp_mask */
744
745 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
746 "Checking Join with insufficient comp mask qkey & pkey (o15.0.1.3)...\n");
747
748 /* no MGID */
749 memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
750 /* Request Join */
751 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
752
753 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
754 /* IB_MCR_COMPMASK_QKEY | */
755 /* IB_MCR_COMPMASK_PKEY | intentionaly missed to raise the error */
756 IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
757 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
758
759 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
760 status = osmt_send_mcast_request(p_osmt, 1,
761 &mc_req_rec, comp_mask, &res_sa_mad);
762 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
763
764 if (status != IB_REMOTE_ERROR ||
765 ((ib_net16_t) (res_sa_mad.status & IB_SMP_STATUS_MASK)) !=
766 IB_SA_MAD_STATUS_INSUF_COMPS) {
767 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EE: "
768 "Expectedd REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n",
769 ib_get_err_str(status),
770 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
771 status = IB_ERROR;
772 goto Exit;
773 }
774
775 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
776 "Checking Join with insufficient comp mask - sl (15.0.1.3)...\n");
777
778 /* no MGID */
779 memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
780 /* Request Join */
781 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
782
783 comp_mask =
784 IB_MCR_COMPMASK_MGID |
785 IB_MCR_COMPMASK_PORT_GID |
786 IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY |
787 /* IB_MCR_COMPMASK_SL | */
788 IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
789 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
790
791 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
792 status = osmt_send_mcast_request(p_osmt, 1,
793 &mc_req_rec, comp_mask, &res_sa_mad);
794 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
795
796 if (status != IB_REMOTE_ERROR ||
797 ((ib_net16_t) (res_sa_mad.status & IB_SMP_STATUS_MASK)) !=
798 IB_SA_MAD_STATUS_INSUF_COMPS) {
799 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02ED: "
800 "Expectedd REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n",
801 ib_get_err_str(status),
802 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
803 status = IB_ERROR;
804 goto Exit;
805 }
806
807 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
808 /* no MGID */
809 memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
810
811 mc_req_rec.mgid.raw[15] = 0x01;
812
813 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
814
815 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
816 "Checking Join with insufficient comp mask - flow label (o15.0.1.3)...\n");
817
818 /* Request Join */
819 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
820
821 comp_mask =
822 IB_MCR_COMPMASK_MGID |
823 IB_MCR_COMPMASK_PORT_GID |
824 IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL |
825 /* IB_MCR_COMPMASK_FLOW | intentionaly missed to raise the error */
826 IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
827 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
828
829 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
830 status = osmt_send_mcast_request(p_osmt, 1,
831 &mc_req_rec, comp_mask, &res_sa_mad);
832 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
833
834 if (status != IB_REMOTE_ERROR ||
835 ((ib_net16_t) (res_sa_mad.status & IB_SMP_STATUS_MASK)) !=
836 IB_SA_MAD_STATUS_INSUF_COMPS) {
837 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EC: "
838 "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n",
839 ib_get_err_str(status),
840 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
841 status = IB_ERROR;
842 goto Exit;
843 }
844
845 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
846
847 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
848
849 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
850 "Checking Join with insufficient comp mask - tclass (o15.0.1.3)...\n");
851
852 /* Request Join */
853 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
854
855 comp_mask =
856 IB_MCR_COMPMASK_MGID |
857 IB_MCR_COMPMASK_PORT_GID |
858 IB_MCR_COMPMASK_QKEY |
859 IB_MCR_COMPMASK_PKEY |
860 IB_MCR_COMPMASK_SL |
861 IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE |
862 /* IB_MCR_COMPMASK_TCLASS | Intentionally missed to raise an error */
863 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
864
865 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
866 status = osmt_send_mcast_request(p_osmt, 1,
867 &mc_req_rec, comp_mask, &res_sa_mad);
868 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
869
870 if (status != IB_REMOTE_ERROR ||
871 ((ib_net16_t) (res_sa_mad.status & IB_SMP_STATUS_MASK)) !=
872 IB_SA_MAD_STATUS_INSUF_COMPS) {
873 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EA: "
874 "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n",
875 ib_get_err_str(status),
876 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
877 status = IB_ERROR;
878 goto Exit;
879 }
880
881 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
882
883 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
884
885 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
886 "Checking Join with insufficient comp mask - tclass qkey (o15.0.1.3)...\n");
887
888 /* no MGID */
889 /* memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); */
890 /* Request Join */
891 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
892
893 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
894 /* IB_MCR_COMPMASK_QKEY | intentionaly missed to raise the error */
895 IB_MCR_COMPMASK_PKEY |
896 IB_MCR_COMPMASK_SL |
897 IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE |
898 /* IB_MCR_COMPMASK_TCLASS | intentionaly missed to raise the error */
899 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
900
901 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
902 status = osmt_send_mcast_request(p_osmt, 1,
903 &mc_req_rec, comp_mask, &res_sa_mad);
904 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
905
906 if (status != IB_REMOTE_ERROR ||
907 ((ib_net16_t) (res_sa_mad.status & IB_SMP_STATUS_MASK)) !=
908 IB_SA_MAD_STATUS_INSUF_COMPS) {
909 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E9: "
910 "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n",
911 ib_get_err_str(status),
912 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
913 status = IB_ERROR;
914 goto Exit;
915 }
916
917 /* o15.0.1.8: */
918 /* - Request join with irrelevant RATE : get a ERR_INSUFFICIENT_COMPONENTS */
919 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
920 "Checking Join with unrealistic rate (o15.0.1.8)...\n");
921
922 /* impossible requested rate */
923 mc_req_rec.rate =
924 IB_LINK_WIDTH_ACTIVE_12X | IB_PATH_SELECTOR_GREATER_THAN << 6;
925
926 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
927 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
928
929 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
930 status = osmt_send_mcast_request(p_osmt, 1,
931 &mc_req_rec, comp_mask, &res_sa_mad);
932 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
933
934 if (status != IB_REMOTE_ERROR ||
935 res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID) {
936 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0207: "
937 "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
938 ib_get_err_str(status),
939 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
940 status = IB_ERROR;
941 goto Exit;
942 }
943
944 /* Check Valid value which is unreasonable now */
945 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
946 "Checking Join with unrealistic rate 120GB (o15.0.1.8)...\n");
947
948 /* impossible requested rate */
949 mc_req_rec.rate =
950 IB_PATH_RECORD_RATE_120_GBS | IB_PATH_SELECTOR_GREATER_THAN << 6;
951
952 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
953 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
954
955 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
956 status = osmt_send_mcast_request(p_osmt, 1,
957 &mc_req_rec, comp_mask, &res_sa_mad);
958 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
959
960 if (status != IB_REMOTE_ERROR ||
961 res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID) {
962 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0208: "
963 "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
964 ib_get_err_str(status),
965 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
966 status = IB_ERROR;
967 goto Exit;
968 }
969
970 /* Check Valid value which is unreasonable now */
971 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
972 "Checking Join with less than min rate 2.5GB (o15.0.1.8)...\n");
973
974 /* impossible requested rate */
975 mc_req_rec.rate =
976 IB_PATH_RECORD_RATE_2_5_GBS | IB_PATH_SELECTOR_LESS_THAN << 6;
977
978 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
979 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
980
981 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
982 status = osmt_send_mcast_request(p_osmt, 1,
983 &mc_req_rec, comp_mask, &res_sa_mad);
984 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
985
986 if (status != IB_REMOTE_ERROR ||
987 res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID) {
988 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AB: "
989 "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
990 ib_get_err_str(status),
991 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
992 status = IB_ERROR;
993 goto Exit;
994 }
995
996 /* Checking above max value of MTU which is impossible */
997 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
998 "Checking Join with unrealistic mtu : \n\t\tmore than 4096 -"
999 " max (o15.0.1.8)...\n");
1000
1001 /* impossible requested mtu */
1002 mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_GREATER_THAN << 6;
1003
1004 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1005 IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
1006
1007 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1008 status = osmt_send_mcast_request(p_osmt, 1,
1009 &mc_req_rec, comp_mask, &res_sa_mad);
1010 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1011
1012 if (status != IB_REMOTE_ERROR ||
1013 res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID) {
1014 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AC: "
1015 "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
1016 ib_get_err_str(status),
1017 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad))
1018 );
1019 status = IB_ERROR;
1020 goto Exit;
1021 }
1022
1023 /* Checking below min value of MTU which is impossible */
1024 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1025 "Checking Join with unrealistic mtu : \n\t\tless than 256 -"
1026 " min (o15.0.1.8)...\n");
1027
1028 /* impossible requested mtu */
1029 mc_req_rec.mtu = IB_MTU_LEN_256 | IB_PATH_SELECTOR_LESS_THAN << 6;
1030
1031 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1032 IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
1033
1034 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1035 status = osmt_send_mcast_request(p_osmt, 1,
1036 &mc_req_rec, comp_mask, &res_sa_mad);
1037 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1038
1039 if (status != IB_REMOTE_ERROR ||
1040 res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID) {
1041 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AD: "
1042 "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
1043 ib_get_err_str(status),
1044 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1045 status = IB_ERROR;
1046 goto Exit;
1047 }
1048
1049 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1050 "Checking Join with unrealistic mtu (o15.0.1.8)...\n");
1051
1052 /* impossible requested mtu */
1053 mc_req_rec.mtu = 0x6 | IB_PATH_SELECTOR_GREATER_THAN << 6;
1054
1055 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1056 IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
1057
1058 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1059 status = osmt_send_mcast_request(p_osmt, 1,
1060 &mc_req_rec, comp_mask, &res_sa_mad);
1061 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1062
1063 if (status != IB_REMOTE_ERROR ||
1064 res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID) {
1065 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AE: "
1066 "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
1067 ib_get_err_str(status),
1068 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1069 status = IB_ERROR;
1070 goto Exit;
1071 }
1072 #if 0
1073 /* Currently PacketLifeTime isn't checked in opensm */
1074 /* Check PacketLifeTime as 0 */
1075 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1076 "Checking Create with unrealistic packet life value less than 0 (o15.0.1.8)...\n");
1077
1078 /* impossible requested packet life */
1079 mc_req_rec.pkt_life = 0 | IB_PATH_SELECTOR_LESS_THAN << 6;
1080
1081 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1082 IB_MCR_COMPMASK_LIFE | IB_MCR_COMPMASK_LIFE_SEL;
1083
1084 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1085 status = osmt_send_mcast_request(p_osmt, 1,
1086 &mc_req_rec, comp_mask, &res_sa_mad);
1087 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1088
1089 if (status != IB_REMOTE_ERROR ||
1090 res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID) {
1091 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AF: "
1092 "Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
1093 ib_get_err_str(status),
1094 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1095 status = IB_ERROR;
1096 goto Exit;
1097 }
1098 #endif
1099
1100 /* o15.0.1.4: */
1101 /* - Create an MGID by asking for a join with MGID = 0 */
1102 /* providing P_Key, Q_Key, SL, FlowLabel, Tclass. */
1103
1104 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1105 "Checking Create given MGID=0 skip service level (o15.0.1.4)...\n");
1106
1107 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
1108
1109 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
1110
1111 /* no MGID */
1112 memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
1113 /* Request Join */
1114 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
1115
1116 comp_mask =
1117 IB_MCR_COMPMASK_MGID |
1118 IB_MCR_COMPMASK_PORT_GID |
1119 IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY |
1120 /* IB_MCR_COMPMASK_SL | Intentionally missed */
1121 IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1122 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
1123
1124 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1125 status = osmt_send_mcast_request(p_osmt, 1,
1126 &mc_req_rec, comp_mask, &res_sa_mad);
1127 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1128
1129 if (status != IB_REMOTE_ERROR ||
1130 ((ib_net16_t) (res_sa_mad.status & IB_SMP_STATUS_MASK)) !=
1131 IB_SA_MAD_STATUS_INSUF_COMPS) {
1132 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A8: "
1133 "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n",
1134 ib_get_err_str(status),
1135 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1136 status = IB_ERROR;
1137 goto Exit;
1138 }
1139
1140 /* Check that no same MCG in the SMDB */
1141 status = osmt_query_mcast(p_osmt);
1142
1143 if (status != IB_SUCCESS) {
1144 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AA: "
1145 "Could not get all MC Records in subnet, got:%s/%s\n",
1146 ib_get_err_str(status),
1147 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1148 goto Exit;
1149 }
1150
1151 /* Only when we are on single mode check flow - do the count comparison, otherwise skip */
1152 if (p_osmt->opt.mmode == 1 || p_osmt->opt.mmode == 3) {
1153 middle_cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl);
1154 OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(post false create): "
1155 "Number of MC Records found in SA DB is %d\n",
1156 middle_cnt);
1157 if (middle_cnt != start_cnt) {
1158 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1159 "Got different number of records stored in SA DB (before any creation)\n"
1160 "Instead of %d got %d\n", start_cnt,
1161 middle_cnt);
1162 }
1163 }
1164
1165 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1166 "Checking Create given MGID=0 skip Qkey and Pkey (o15.0.1.4)...\n");
1167
1168 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
1169
1170 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
1171
1172 /* no MGID */
1173 memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
1174 /* Request Join */
1175 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
1176
1177 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
1178 /* IB_MCR_COMPMASK_QKEY | */
1179 /* IB_MCR_COMPMASK_PKEY | Intentionally missed */
1180 IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1181 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
1182
1183 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1184 status = osmt_send_mcast_request(p_osmt, 1,
1185 &mc_req_rec, comp_mask, &res_sa_mad);
1186 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1187
1188 if (status != IB_REMOTE_ERROR ||
1189 ((ib_net16_t) (res_sa_mad.status & IB_SMP_STATUS_MASK)) !=
1190 IB_SA_MAD_STATUS_INSUF_COMPS) {
1191 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A7: "
1192 "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n",
1193 ib_get_err_str(status),
1194 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1195 status = IB_ERROR;
1196 goto Exit;
1197 }
1198
1199 /* Bad Query o15.0.1.4 */
1200
1201 status = osmt_query_mcast(p_osmt);
1202
1203 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1204 "Checking Create given MGID=0 skip TClass (o15.0.1.4)...\n");
1205
1206 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
1207
1208 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
1209
1210 /* no MGID */
1211 memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
1212 /* Request Join */
1213 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
1214
1215 comp_mask =
1216 IB_MCR_COMPMASK_MGID |
1217 IB_MCR_COMPMASK_PORT_GID |
1218 IB_MCR_COMPMASK_QKEY |
1219 IB_MCR_COMPMASK_PKEY |
1220 IB_MCR_COMPMASK_SL |
1221 IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE |
1222 /* IB_MCR_COMPMASK_TCLASS | Intentionally missed */
1223 /* all above are required */
1224 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
1225
1226 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1227 status = osmt_send_mcast_request(p_osmt, 1,
1228 &mc_req_rec, comp_mask, &res_sa_mad);
1229 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1230
1231 if (status != IB_REMOTE_ERROR ||
1232 ((ib_net16_t) (res_sa_mad.status & IB_SMP_STATUS_MASK)) !=
1233 IB_SA_MAD_STATUS_INSUF_COMPS) {
1234 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A6: "
1235 "Expected REMOTE ERROR IB_SA_MAD_STATUS_INSUF_COMPS got:%s/%s\n",
1236 ib_get_err_str(status),
1237 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1238 status = IB_ERROR;
1239 goto Exit;
1240 }
1241
1242 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1243 "Checking Create given MGID=0 valid Set several options :\n\t\t"
1244 "First above min RATE, Second less than max RATE\n\t\t"
1245 "Third above min MTU, Second less than max MTU\n\t\t"
1246 "Fifth exact MTU & RATE feasible, Sixth exact RATE feasible\n\t\t"
1247 "Seventh exact MTU feasible (o15.0.1.4)...\n");
1248
1249 /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
1250
1251 mc_req_rec.rate =
1252 IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6;
1253
1254 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1255 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
1256
1257 status = osmt_send_mcast_request(p_osmt, 1,
1258 &mc_req_rec, comp_mask, &res_sa_mad);
1259 if (status != IB_SUCCESS) {
1260 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A5: "
1261 "Failed to create MCG for MGID=0 with higher than minimum RATE - got %s/%s\n",
1262 ib_get_err_str(status),
1263 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1264 goto Exit;
1265 }
1266
1267 /* Save the mlid created in test_created_mlids map */
1268 p_recvd_rec =
1269 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1270 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "created MGID:%s MLID:0x%04X\n",
1271 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1272 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1273 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1274 p_recvd_rec);
1275
1276 /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
1277
1278 mc_req_rec.rate =
1279 IB_LINK_WIDTH_ACTIVE_12X | IB_PATH_SELECTOR_LESS_THAN << 6;
1280
1281 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1282 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
1283
1284 status = osmt_send_mcast_request(p_osmt, 1,
1285 &mc_req_rec, comp_mask, &res_sa_mad);
1286 if (status != IB_SUCCESS) {
1287 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0211: "
1288 "Failed to create MCG for MGID=0 with less than highest RATE - got %s/%s\n",
1289 ib_get_err_str(status),
1290 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1291 goto Exit;
1292 }
1293
1294 /* Save the mlid created in test_created_mlids map */
1295 p_recvd_rec =
1296 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1297 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1298 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1299 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1300 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1301 p_recvd_rec);
1302
1303 /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
1304
1305 mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_LESS_THAN << 6;
1306
1307 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1308 IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
1309
1310 status = osmt_send_mcast_request(p_osmt, 1,
1311 &mc_req_rec, comp_mask, &res_sa_mad);
1312 if (status != IB_SUCCESS) {
1313 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0238: "
1314 "Failed to create MCG for MGID=0 with less than highest MTU - got %s/%s\n",
1315 ib_get_err_str(status),
1316 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1317 goto Exit;
1318 }
1319
1320 /* Save the mlid created in test_created_mlids map */
1321 p_recvd_rec =
1322 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1323 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1324 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1325 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1326 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1327 p_recvd_rec);
1328
1329 /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
1330 mc_req_rec.mtu = IB_MTU_LEN_256 | IB_PATH_SELECTOR_GREATER_THAN << 6;
1331
1332 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1333 IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
1334
1335 status = osmt_send_mcast_request(p_osmt, 1,
1336 &mc_req_rec, comp_mask, &res_sa_mad);
1337 if (status != IB_SUCCESS) {
1338 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0239: "
1339 "Failed to create MCG for MGID=0 with higher than lowest MTU - got %s/%s\n",
1340 ib_get_err_str(status),
1341 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1342 goto Exit;
1343 }
1344
1345 /* Save the mlid created in test_created_mlids map */
1346 p_recvd_rec =
1347 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1348 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1349 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1350 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1351 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1352 p_recvd_rec);
1353
1354 /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
1355 /* Using Exact feasible MTU & RATE */
1356
1357 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
1358 "Using Exact feasible MTU & RATE: "
1359 "MTU = 0x%02X, RATE = 0x%02X\n", mtu_phys, rate_phys);
1360
1361 mc_req_rec.mtu = mtu_phys;
1362 mc_req_rec.rate = rate_phys;
1363
1364 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1365 IB_MCR_COMPMASK_MTU_SEL |
1366 IB_MCR_COMPMASK_MTU |
1367 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
1368
1369 status = osmt_send_mcast_request(p_osmt, 1,
1370 &mc_req_rec, comp_mask, &res_sa_mad);
1371
1372 if (status != IB_SUCCESS) {
1373 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0240: "
1374 "Failed to create MCG for MGID=0 with exact MTU & RATE - got %s/%s\n",
1375 ib_get_err_str(status),
1376 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1377 goto Exit;
1378 }
1379
1380 /* Save the mlid created in test_created_mlids map */
1381 p_recvd_rec =
1382 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1383 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1384 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1385 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1386 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1387 p_recvd_rec);
1388
1389 /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
1390 /* Using Exact feasible RATE */
1391
1392 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
1393 "Using Exact feasible RATE: 0x%02X\n", rate_phys);
1394
1395 mc_req_rec.rate = rate_phys;
1396
1397 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1398 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
1399
1400 status = osmt_send_mcast_request(p_osmt, 1,
1401 &mc_req_rec, comp_mask, &res_sa_mad);
1402 if (status != IB_SUCCESS) {
1403 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0241: "
1404 "Failed to create MCG for MGID=0 with exact RATE - got %s/%s\n",
1405 ib_get_err_str(status),
1406 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1407 goto Exit;
1408 }
1409
1410 /* Save the mlid created in test_created_mlids map */
1411 p_recvd_rec =
1412 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1413 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1414 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1415 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1416 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1417 p_recvd_rec);
1418
1419 /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
1420 /* Using Exact feasible MTU */
1421
1422 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
1423 "Using Exact feasible MTU: 0x%02X\n", mtu_phys);
1424
1425 mc_req_rec.mtu = mtu_phys;
1426
1427 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1428 IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
1429
1430 status = osmt_send_mcast_request(p_osmt, 1,
1431 &mc_req_rec, comp_mask, &res_sa_mad);
1432 if (status != IB_SUCCESS) {
1433 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0242: "
1434 "Failed to create MCG for MGID=0 with exact MTU - got %s/%s\n",
1435 ib_get_err_str(status),
1436 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1437 goto Exit;
1438 }
1439
1440 /* Save the mlid created in test_created_mlids map */
1441 p_recvd_rec =
1442 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1443 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1444 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1445 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1446 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1447 p_recvd_rec);
1448
1449 /* o15.0.1.5: */
1450 /* - Check the returned MGID is valid. (p 804) */
1451 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1452 "Validating resulting MGID (o15.0.1.5)...\n");
1453 /* prefix 0xFF1 Scope 0xA01B */
1454 /* Since we did not directly specified SCOPE in comp mask
1455 we should get the comp mask that is link-local scope */
1456 if ((p_mc_res->mgid.multicast.header[0] != 0xFF) ||
1457 (p_mc_res->mgid.multicast.header[1] != 0x12) ||
1458 (p_mc_res->mgid.multicast.raw_group_id[0] != 0xA0) ||
1459 (p_mc_res->mgid.multicast.raw_group_id[1] != 0x1B)) {
1460 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0209: "
1461 "Validating MGID failed. MGID:%s\n",
1462 inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
1463 sizeof gid_str));
1464 status = IB_ERROR;
1465 goto Exit;
1466 }
1467
1468 /* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
1469 /* Using feasible GREATER_THAN 0 packet lifitime */
1470 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1471 "Checking Create given MGID=0 (o15.0.1.4)...\n");
1472
1473 status = osmt_query_mcast(p_osmt);
1474
1475 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
1476
1477 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
1478
1479 /* no MGID */
1480 memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
1481 /* Request Join */
1482 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
1483
1484 mc_req_rec.pkt_life = 0 | IB_PATH_SELECTOR_GREATER_THAN << 6;
1485
1486 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
1487 IB_MCR_COMPMASK_LIFE | IB_MCR_COMPMASK_LIFE_SEL;
1488
1489 status = osmt_send_mcast_request(p_osmt, 1,
1490 &mc_req_rec, comp_mask, &res_sa_mad);
1491 if (status != IB_SUCCESS) {
1492 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0210: "
1493 "Failed to create MCG for MGID=0 - got %s/%s\n",
1494 ib_get_err_str(status),
1495 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1496 goto Exit;
1497 }
1498
1499 /* Save the mlid created in test_created_mlids map */
1500 p_recvd_rec =
1501 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1502 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1503 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1504 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1505 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1506 p_recvd_rec);
1507
1508 /* o15.0.1.6: */
1509 /* - Create a new MCG with valid requested MGID. */
1510 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
1511 mc_req_rec.mgid = good_mgid;
1512
1513 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1514 "Checking Create given valid MGID=%s (o15.0.1.6)...\n",
1515 inet_ntop(AF_INET6, mc_req_rec.mgid.raw, gid_str,
1516 sizeof gid_str));
1517
1518 /* Before creation, need to check that this group doesn't exist */
1519 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1520 "Verifying that MCGroup with this MGID doesn't exist by trying to Join it (o15.0.1.13)...\n");
1521
1522 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_NON_MEMBER);
1523
1524 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1525 status = osmt_send_mcast_request(p_osmt, 1, /* join */
1526 &mc_req_rec, comp_mask, &res_sa_mad);
1527 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1528
1529 if ((status != IB_REMOTE_ERROR) ||
1530 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
1531 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0301: "
1532 "Tried joining group that shouldn't have existed - got %s/%s\n",
1533 ib_get_err_str(status),
1534 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1535 status = IB_ERROR;
1536 goto Exit;
1537 }
1538
1539 /* Set State to full member to allow group creation */
1540 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
1541
1542 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1543 "Now creating group with given valid MGID=%s (o15.0.1.6)...\n",
1544 inet_ntop(AF_INET6, mc_req_rec.mgid.raw, gid_str,
1545 sizeof gid_str));
1546
1547 status = osmt_send_mcast_request(p_osmt, 1,
1548 &mc_req_rec, comp_mask, &res_sa_mad);
1549 if (status != IB_SUCCESS) {
1550 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0211: "
1551 "Failed to create MCG for MGID=%s (o15.0.1.6) - got %s/%s\n",
1552 inet_ntop(AF_INET6, good_mgid.raw, gid_str,
1553 sizeof gid_str), ib_get_err_str(status),
1554 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1555 goto Exit;
1556 }
1557
1558 /* Save the mlid created in test_created_mlids map */
1559 p_recvd_rec =
1560 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1561 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1562 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1563 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1564 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1565 p_recvd_rec);
1566
1567 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1568 "Validating resulting MGID (o15.0.1.6)...\n");
1569 /* prefix 0xFF1 Scope 0xA01B */
1570 if ((p_mc_res->mgid.multicast.header[0] != 0xFF) || (p_mc_res->mgid.multicast.header[1] != 0x12) || /* HACK hardcoded scope = 0x02 */
1571 (p_mc_res->mgid.multicast.raw_group_id[0] != 0xA0) ||
1572 (p_mc_res->mgid.multicast.raw_group_id[1] != 0x1C)) {
1573 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0212: "
1574 "Validating MGID failed. MGID:%s\n",
1575 inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
1576 sizeof gid_str));
1577 status = IB_ERROR;
1578 goto Exit;
1579 }
1580
1581 /* - Try to create a new MCG with invalid MGID : get back ERR_REQ_INVALID */
1582 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1583 "Checking BAD MGID=0xFA..... (o15.0.1.6)...\n");
1584
1585 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1586
1587 mc_req_rec.mgid.raw[0] = 0xFA;
1588 status = osmt_send_mcast_request(p_osmt, 1,
1589 &mc_req_rec, comp_mask, &res_sa_mad);
1590 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1591
1592 if ((status != IB_REMOTE_ERROR) ||
1593 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
1594 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0213: "
1595 "Failed to recognize MGID error for MGID=0xFA - got %s/%s\n",
1596 ib_get_err_str(status),
1597 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1598 status = IB_ERROR;
1599 goto Exit;
1600 }
1601
1602 /* - Try again with MGID prefix = 0xA01B (maybe 0x1BA0 little or big ?) */
1603 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1604 "Checking BAD MGID=0xFF12A01B..... with link-local scope (o15.0.1.6)...\n");
1605
1606 mc_req_rec.mgid.raw[0] = 0xFF;
1607 mc_req_rec.mgid.raw[3] = 0x1B;
1608 comp_mask = comp_mask | IB_MCR_COMPMASK_SCOPE;
1609 mc_req_rec.scope_state = mc_req_rec.scope_state & 0x2F; /* local scope */
1610 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1611 status = osmt_send_mcast_request(p_osmt, 1,
1612 &mc_req_rec, comp_mask, &res_sa_mad);
1613 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1614
1615 if ((status != IB_REMOTE_ERROR) ||
1616 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
1617 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0214: "
1618 "Failed to recognize MGID error for A01B with link-local bit (status %s) (rem status %s)\n",
1619 ib_get_err_str(status),
1620 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1621 status = IB_ERROR;
1622 goto Exit;
1623 }
1624
1625 /* Change the mgid prefix - get back ERR_REQ_INVALID */
1626
1627 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1628 "Checking BAD MGID PREFIX=0xEF... (o15.0.1.6)...\n");
1629
1630 mc_req_rec.mgid = good_mgid;
1631
1632 mc_req_rec.mgid.raw[0] = 0xEF;
1633
1634 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1635 status = osmt_send_mcast_request(p_osmt, 1,
1636 &mc_req_rec, comp_mask, &res_sa_mad);
1637 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1638
1639 if ((status != IB_REMOTE_ERROR) ||
1640 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
1641 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0215: "
1642 "Failed to recognize MGID PREFIX error for MGID=0xEF - got %s/%s\n",
1643 ib_get_err_str(status),
1644 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1645 status = IB_ERROR;
1646 goto Exit;
1647 }
1648
1649 /* Change the scope to reserved - get back VALID REQ */
1650
1651 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1652 "Checking local scope with full member \n\t\tand valid mgid %s"
1653 " ... (o15.0.1.6)...\n",
1654 inet_ntop(AF_INET6, mc_req_rec.mgid.raw, gid_str,
1655 sizeof gid_str));
1656
1657 mc_req_rec.mgid = good_mgid;
1658
1659 mc_req_rec.mgid.raw[1] = 0x1F;
1660
1661 status = osmt_send_mcast_request(p_osmt, 1,
1662 &mc_req_rec, comp_mask, &res_sa_mad);
1663 if (status != IB_SUCCESS) {
1664 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0216: "
1665 "Failed to create MCG for MGID=%s - got %s/%s\n",
1666 inet_ntop(AF_INET6, good_mgid.raw, gid_str,
1667 sizeof gid_str), ib_get_err_str(status),
1668 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1669 goto Exit;
1670 }
1671
1672 /* Save the mlid created in test_created_mlids map */
1673 p_recvd_rec =
1674 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1675 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1676 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1677 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1678 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1679 p_recvd_rec);
1680
1681 /* Change the flags to invalid value 0x2 - get back INVALID REQ */
1682
1683 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1684 "Checking invalid flags=0xFF 22 ... (o15.0.1.6)...\n");
1685
1686 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1687
1688 mc_req_rec.mgid = good_mgid;
1689
1690 mc_req_rec.mgid.raw[1] = 0x22;
1691
1692 status = osmt_send_mcast_request(p_osmt, 1,
1693 &mc_req_rec, comp_mask, &res_sa_mad);
1694
1695 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1696
1697 if ((status != IB_REMOTE_ERROR) ||
1698 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
1699 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0217: "
1700 "Failed to recognize create with invalid flags value 0x2 - got %s/%s\n",
1701 ib_get_err_str(status),
1702 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1703 status = IB_ERROR;
1704 goto Exit;
1705 }
1706
1707 /* Change the MGID to link local MGID - get back VALID REQ */
1708
1709 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1710 "Checking link local MGID 0xFF02:0:0:0:0:0:0:1 (o15.0.1.6)...\n");
1711
1712 mc_req_rec.mgid = osm_link_local_mgid;
1713
1714 status = osmt_send_mcast_request(p_osmt, 1,
1715 &mc_req_rec, comp_mask, &res_sa_mad);
1716 if (status != IB_SUCCESS) {
1717 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0218: "
1718 "Failed to create MCG for MGID=0xFF02:0:0:0:0:0:0:1 - got %s/%s\n",
1719 ib_get_err_str(status),
1720 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1721 goto Exit;
1722 }
1723
1724 /* Save the mlid created in test_created_mlids map */
1725 p_recvd_rec =
1726 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1727 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1728 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1729 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1730 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1731 p_recvd_rec);
1732
1733 /* o15.0.1.7 - implicitlly checked during the prev steps. */
1734 /* o15.0.1.8 - implicitlly checked during the prev steps. */
1735
1736 /* o15.0.1.9 */
1737 /* - Create MCG with Invalid JoinState.FullMember != 1 : get ERR_REQ_INVALID */
1738
1739 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1740 "Checking new MGID with invalid join state (o15.0.1.9)...\n");
1741
1742 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1743
1744 mc_req_rec.mgid = good_mgid;
1745 mc_req_rec.mgid.raw[12] = 0xFF;
1746 mc_req_rec.scope_state = 0x22; /* link-local scope, non-member state */
1747
1748 status = osmt_send_mcast_request(p_osmt, 1,
1749 &mc_req_rec, comp_mask, &res_sa_mad);
1750 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1751
1752 if ((status != IB_REMOTE_ERROR) ||
1753 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
1754 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0219: "
1755 "Failed to recognize create with JoinState != FullMember - got %s/%s\n",
1756 ib_get_err_str(status),
1757 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1758 status = IB_ERROR;
1759 goto Exit;
1760 }
1761
1762 /* Lets try a valid join scope state */
1763 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1764 "Checking new MGID with valid join state (o15.0.1.9)...\n");
1765
1766 mc_req_rec.mgid = good_mgid;
1767 mc_req_rec.scope_state = 0x23; /* link-local scope, non member and full member */
1768
1769 status = osmt_send_mcast_request(p_osmt, 1,
1770 &mc_req_rec, comp_mask, &res_sa_mad);
1771
1772 if (status != IB_SUCCESS) {
1773 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0220: "
1774 "Failed to create MCG with valid join state 0x3 - got %s/%s\n",
1775 ib_get_err_str(status),
1776 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1777 goto Exit;
1778 }
1779
1780 /* Save the mlid created in test_created_mlids map */
1781 p_recvd_rec =
1782 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1783 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1784 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1785 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1786 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1787 p_recvd_rec);
1788
1789 /* Lets try another invalid join scope state */
1790 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1791 "Checking new MGID with invalid join state (o15.0.1.9)...\n");
1792
1793 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1794
1795 /* We have created a new MCG so now we need different mgid when cresting group otherwise it will be counted as join request . */
1796 mc_req_rec.mgid = good_mgid;
1797 mc_req_rec.mgid.raw[12] = 0xFC;
1798
1799 mc_req_rec.scope_state = 0x24; /* link-local scope, send only member */
1800
1801 status = osmt_send_mcast_request(p_osmt, 1,
1802 &mc_req_rec, comp_mask, &res_sa_mad);
1803 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1804
1805 if ((status != IB_REMOTE_ERROR) ||
1806 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
1807 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0221: "
1808 "Failed to recognize create with JoinState != FullMember - got %s/%s\n",
1809 ib_get_err_str(status),
1810 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1811 status = IB_ERROR;
1812 goto Exit;
1813 }
1814
1815 /* Lets try another valid join scope state */
1816 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1817 "Checking new MGID creation with valid join state (o15.0.2.3)...\n");
1818
1819 mc_req_rec.mgid = good_mgid;
1820 mc_req_rec.mgid.raw[12] = 0xFB;
1821 memcpy(&special_mgid, &mc_req_rec.mgid, sizeof(ib_gid_t));
1822 mc_req_rec.scope_state = 0x2F; /* link-local scope, Full member with all other bits turned on */
1823
1824 status = osmt_send_mcast_request(p_osmt, 1,
1825 &mc_req_rec, comp_mask, &res_sa_mad);
1826
1827 if (status != IB_SUCCESS) {
1828 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0222: "
1829 "Failed to create MCG with valid join state 0xF - got %s/%s\n",
1830 ib_get_err_str(status),
1831 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1832 goto Exit;
1833 }
1834
1835 /* Save the mlid created in test_created_mlids map */
1836 p_recvd_rec =
1837 (ib_member_rec_t *) ib_sa_mad_get_payload_ptr(&res_sa_mad);
1838 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
1839 inet_ntop(AF_INET6, p_recvd_rec->mgid.raw, gid_str,
1840 sizeof gid_str), cl_ntoh16(p_recvd_rec->mlid));
1841 cl_map_insert(&test_created_mlids, cl_ntoh16(p_recvd_rec->mlid),
1842 p_recvd_rec);
1843
1844 /* o15.0.1.10 - can't check on a single client .-- obsolete -
1845 checked by SilverStorm bug o15-0.2.4, never the less recheck */
1846 /* o15-0.2.4 - Check a join request to already created MCG */
1847 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
1848 OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "Check o15-0.2.4 statement...\n");
1849 /* Try to join */
1850 memcpy(&mc_req_rec.mgid, &p_mc_res->mgid, sizeof(ib_gid_t));
1851 /* Request Join */
1852 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_NON_MEMBER);
1853 comp_mask =
1854 IB_MCR_COMPMASK_MGID |
1855 IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_JOIN_STATE;
1856
1857 status = osmt_send_mcast_request(p_osmt, 0x1, /* SubnAdmSet */
1858 &mc_req_rec, comp_mask, &res_sa_mad);
1859 if (status != IB_SUCCESS) {
1860 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CC: "
1861 "Failed to join MCG with valid req, returned status = %s\n",
1862 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1863 goto Exit;
1864 }
1865
1866 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
1867 if ((p_mc_res->scope_state & 0x7) != 0x7) {
1868 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D0: "
1869 "Validating JoinState update failed. "
1870 "Expected 0x27 got 0x%02X\n",
1871 p_mc_res->scope_state);
1872 status = IB_ERROR;
1873 goto Exit;
1874 }
1875
1876 /* o15.0.1.11: */
1877 /* - Try to join into a MGID that exists with JoinState=SendOnlyMember - */
1878 /* see that it updates JoinState. What is the routing change? */
1879 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1880 "Checking Retry of existing MGID - See JoinState update (o15.0.1.11)...\n");
1881
1882 mc_req_rec.mgid = good_mgid;
1883
1884 /* first, make sure that the group exists */
1885 mc_req_rec.scope_state = 0x21;
1886 status = osmt_send_mcast_request(p_osmt, 1,
1887 &mc_req_rec, comp_mask, &res_sa_mad);
1888 if (status != IB_SUCCESS) {
1889 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CD: "
1890 "Failed to create/join as full member - got %s/%s\n",
1891 ib_get_err_str(status),
1892 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1893 goto Exit;
1894 }
1895
1896 mc_req_rec.scope_state = 0x22; /* link-local scope, non-member */
1897 status = osmt_send_mcast_request(p_osmt, 1,
1898 &mc_req_rec, comp_mask, &res_sa_mad);
1899 if (status != IB_SUCCESS) {
1900 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D1: "
1901 "Failed to update existing MGID - got %s/%s\n",
1902 ib_get_err_str(status),
1903 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1904 goto Exit;
1905 }
1906
1907 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1908 "Validating Join State update with NonMember (o15.0.1.11)...\n");
1909
1910 if (p_mc_res->scope_state != 0x23) { /* scope is LSB */
1911 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CE: "
1912 "Validating JoinState update failed. Expected 0x23 got: 0x%02X\n",
1913 p_mc_res->scope_state);
1914 status = IB_ERROR;
1915 goto Exit;
1916 }
1917
1918 /* Try delete current join state then update it with another value */
1919 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1920 "Checking JoinState update request should return 0x22 (o15.0.1.11)...\n");
1921
1922 mc_req_rec.rate =
1923 IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6;
1924 mc_req_rec.mgid = good_mgid;
1925
1926 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1927 "Checking Partially delete JoinState (o15.0.1.14)...\n");
1928
1929 /* link-local scope, both non-member bits,
1930 so we should not be able to delete) */
1931 mc_req_rec.scope_state = 0x26;
1932 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
1933 status = osmt_send_mcast_request(p_osmt, 0,
1934 &mc_req_rec, comp_mask, &res_sa_mad);
1935 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
1936
1937 if (status != IB_REMOTE_ERROR) {
1938 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CF: "
1939 "Expected to fail partially update JoinState, "
1940 "but got %s\n",
1941 ib_get_err_str(status));
1942 status = IB_ERROR;
1943 goto Exit;
1944 }
1945
1946 /* link-local scope, NonMember bit, the FullMember bit should stay */
1947 mc_req_rec.scope_state = 0x22;
1948 status = osmt_send_mcast_request(p_osmt, 0,
1949 &mc_req_rec, comp_mask, &res_sa_mad);
1950 if (status != IB_SUCCESS) {
1951 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D3: "
1952 "Failed to partially update JoinState : %s/%s\n",
1953 ib_get_err_str(status),
1954 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1955 status = IB_ERROR;
1956 goto Exit;
1957 }
1958
1959 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
1960 if (p_mc_res->scope_state != 0x21) {
1961 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D4: "
1962 "Failed to partially update JoinState : "
1963 "JoinState = 0x%02X, expected 0x%02X\n",
1964 p_mc_res->scope_state, 0x21);
1965 status = IB_ERROR;
1966 goto Exit;
1967 }
1968
1969 /* So far successfully delete state - Now change it */
1970 mc_req_rec.mgid = good_mgid;
1971 mc_req_rec.scope_state = 0x24; /* link-local scope, send only member */
1972
1973 status = osmt_send_mcast_request(p_osmt, 1,
1974 &mc_req_rec, comp_mask, &res_sa_mad);
1975 if (status != IB_SUCCESS) {
1976 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C0: "
1977 "Failed to update existing MCG - got %s/%s\n",
1978 ib_get_err_str(status),
1979 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
1980 goto Exit;
1981 }
1982
1983 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
1984 "Validating Join State update with Send Only Member (o15.0.1.11)...\n");
1985
1986 if (p_mc_res->scope_state != 0x25) { /* scope is MSB */
1987 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C1: "
1988 "Validating JoinState update failed. Expected 0x25 got: 0x%02X\n",
1989 p_mc_res->scope_state);
1990 status = IB_ERROR;
1991 goto Exit;
1992 }
1993 /* Now try to update value of join state */
1994 mc_req_rec.scope_state = 0x21; /* link-local scope, full member */
1995
1996 status = osmt_send_mcast_request(p_osmt, 1,
1997 &mc_req_rec, comp_mask, &res_sa_mad);
1998 if (status != IB_SUCCESS) {
1999 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C2: "
2000 "Failed to update existing MGID - got %s/%s\n",
2001 ib_get_err_str(status),
2002 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2003 goto Exit;
2004 }
2005
2006 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2007 "Validating Join State update with Full Member\n\t\t"
2008 "to an existing 0x5 state MCG (o15.0.1.11)...\n");
2009
2010 if (p_mc_res->scope_state != 0x25) { /* scope is LSB */
2011 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C3: "
2012 "Validating JoinState update failed. Expected 0x25 got: 0x%02X\n",
2013 p_mc_res->scope_state);
2014 status = IB_ERROR;
2015 goto Exit;
2016 }
2017
2018 /* Now try to update value of join state */
2019 mc_req_rec.scope_state = 0x22; /* link-local scope,non member */
2020
2021 status = osmt_send_mcast_request(p_osmt, 1,
2022 &mc_req_rec, comp_mask, &res_sa_mad);
2023 if (status != IB_SUCCESS) {
2024 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C4: "
2025 "Failed to update existing MGID - got %s/%s\n",
2026 ib_get_err_str(status),
2027 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2028 goto Exit;
2029 }
2030 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2031 "Validating Join State update with Non Member\n\t\t"
2032 "to an existing 0x5 state MCG (o15.0.1.11)...\n");
2033
2034 if (p_mc_res->scope_state != 0x27) { /* scope is LSB */
2035 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C5: "
2036 "Validating JoinState update failed. Expected 0x27 got: 0x%02X\n",
2037 p_mc_res->scope_state);
2038 status = IB_ERROR;
2039 goto Exit;
2040 }
2041
2042 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
2043 "DEBUG - Current scope_state value : 0x%02X...\n",
2044 p_mc_res->scope_state);
2045
2046 /* - We can not check simple join since we have only one tester (for now) */
2047
2048 /* o15.0.1.12: Not Supported */
2049 /* - The SendOnlyNonMem join should have a special treatment in the
2050 SA but what is it ? */
2051
2052 /* o15.0.1.13: */
2053 /* - Try joining with rate that does not exist in any MCG -
2054 ERR_REQ_INVALID */
2055
2056 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2057 "Checking BAD RATE when connecting to existing MGID (o15.0.1.13)...\n");
2058 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
2059
2060 mc_req_rec.mgid = good_mgid;
2061 mc_req_rec.rate =
2062 IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_LESS_THAN << 6;
2063 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
2064 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
2065
2066 status = osmt_send_mcast_request(p_osmt, 1,
2067 &mc_req_rec, comp_mask, &res_sa_mad);
2068 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
2069
2070 if ((status != IB_REMOTE_ERROR) ||
2071 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
2072 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C6: "
2073 "Failed to catch BAD RATE joining an exiting MGID: %s/%s\n",
2074 ib_get_err_str(status),
2075 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2076 status = IB_ERROR;
2077 goto Exit;
2078 }
2079
2080 /* Try MTU that does not exist in any MCG */
2081 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2082 "Checking BAD MTU (higher them max) when connecting to "
2083 "existing MGID (o15.0.1.13)...\n");
2084 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
2085
2086 mc_req_rec.mgid = osm_ipoib_mgid;
2087 mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_GREATER_THAN << 6;
2088 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
2089 IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
2090
2091 status = osmt_send_mcast_request(p_osmt, 1,
2092 &mc_req_rec, comp_mask, &res_sa_mad);
2093 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
2094
2095 if ((status != IB_REMOTE_ERROR) ||
2096 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
2097 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C7: "
2098 "Failed to catch BAD RATE (higher them max) joining an exiting MGID: %s/%s\n",
2099 ib_get_err_str(status),
2100 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2101 status = IB_ERROR;
2102 goto Exit;
2103 }
2104
2105 /* Try another MTU that does not exist in any MCG */
2106 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2107 "Checking BAD MTU (less than min) when connecting "
2108 "to existing MGID (o15.0.1.13)...\n");
2109 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
2110
2111 mc_req_rec.mgid = osm_ipoib_mgid;
2112 mc_req_rec.mtu = IB_MTU_LEN_256 | IB_PATH_SELECTOR_LESS_THAN << 6;
2113 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
2114 IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
2115
2116 status = osmt_send_mcast_request(p_osmt, 1,
2117 &mc_req_rec, comp_mask, &res_sa_mad);
2118 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
2119
2120 if ((status != IB_REMOTE_ERROR) ||
2121 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
2122 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C8: "
2123 "Failed to catch BAD RATE (less them min) joining an exiting MGID: %s/%s\n",
2124 ib_get_err_str(status),
2125 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2126 status = IB_ERROR;
2127 goto Exit;
2128 }
2129
2130 /* o15.0.1.14: */
2131 /* - Try partial delete - actually updating the join state. check it. */
2132
2133 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2134 "Checking partial JoinState delete request - removing NonMember (o15.0.1.14)...\n");
2135
2136 mc_req_rec.rate =
2137 IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6;
2138 mc_req_rec.mgid = good_mgid;
2139 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
2140 IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
2141 /* link-local scope, non member (so we should not be able to delete) */
2142 /* but the NonMember bit should be gone */
2143 mc_req_rec.scope_state = 0x22;
2144
2145 status = osmt_send_mcast_request(p_osmt, 0,
2146 &mc_req_rec, comp_mask, &res_sa_mad);
2147
2148 if (status != IB_SUCCESS) {
2149 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C9: "
2150 "Fail to partially update JoinState during delete: %s/%s\n",
2151 ib_get_err_str(status),
2152 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2153 status = IB_ERROR;
2154 goto Exit;
2155 }
2156
2157 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2158 "Validating Join State removal of Non Member bit (o15.0.1.14)...\n");
2159 if (p_mc_res->scope_state != 0x25) { /* scope is MSB - now only the full member & send only member have left */
2160 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CA: "
2161 "Validating JoinState update failed. Expected 0x25 got: 0x%02X\n",
2162 p_mc_res->scope_state);
2163 status = IB_ERROR;
2164 goto Exit;
2165 }
2166
2167 /* Now use the same scope_state and delete all JoinState - leave multicast group since state is 0x0 */
2168
2169 mc_req_rec.scope_state = 0x25;
2170 status = osmt_send_mcast_request(p_osmt, 0,
2171 &mc_req_rec, comp_mask, &res_sa_mad);
2172
2173 if (status != IB_SUCCESS) {
2174 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CB: "
2175 "Failed to update JoinState during delete: %s/%s\n",
2176 ib_get_err_str(status),
2177 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2178 status = IB_ERROR;
2179 goto Exit;
2180 }
2181
2182 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2183 "Validating Join State update remove (o15.0.1.14)...\n");
2184
2185 if (p_mc_res->scope_state != 0x25) { /* scope is MSB - now only 0x0 so port is removed from MCG */
2186 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BF: "
2187 "Validating JoinState update failed. Expected 0x25 got: 0x%02X\n",
2188 p_mc_res->scope_state);
2189 status = IB_ERROR;
2190 goto Exit;
2191 }
2192
2193 /* - Try joining (not full mem) again to see the group was deleted. (should fail) */
2194 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2195 "Checking Delete by trying to Join deleted group (o15.0.1.13)...\n");
2196
2197 mc_req_rec.scope_state = 0x22; /* use non member - so if no group fail */
2198
2199 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
2200 status = osmt_send_mcast_request(p_osmt, 1, /* join */
2201 &mc_req_rec, comp_mask, &res_sa_mad);
2202 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
2203
2204 if (status != IB_REMOTE_ERROR) {
2205 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BC: "
2206 "Succeeded Joining Deleted Group: %s/%s\n",
2207 ib_get_err_str(status),
2208 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2209 status = IB_ERROR;
2210 goto Exit;
2211 }
2212
2213 /* - Try deletion of the IPoIB MCG and get: ERR_REQ_INVALID */
2214 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2215 "Checking BAD Delete of Mgid membership (no prev join) (o15.0.1.15)...\n");
2216 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
2217
2218 mc_req_rec.mgid = osm_ipoib_mgid;
2219 mc_req_rec.rate =
2220 IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6;
2221 mc_req_rec.scope_state = 0x21; /* delete full member */
2222
2223 status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */
2224 &mc_req_rec, comp_mask, &res_sa_mad);
2225 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
2226
2227 if ((status != IB_REMOTE_ERROR) ||
2228 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
2229 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BD: "
2230 "Failed to catch BAD delete from IPoIB: %s/%s\n",
2231 ib_get_err_str(status),
2232 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2233 status = IB_ERROR;
2234 goto Exit;
2235 }
2236
2237 /* Prepare another MCG for the following tests : */
2238 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2239 "Checking Create given MGID=%s\n\t\t(o15.0.1.4)...\n",
2240 inet_ntop(AF_INET6, osm_ipoib_mgid.raw, gid_str,
2241 sizeof gid_str));
2242
2243 mc_req_rec.mgid = good_mgid;
2244 mc_req_rec.mgid.raw[12] = 0xAA;
2245 mc_req_rec.pkt_life = 0 | IB_PATH_SELECTOR_GREATER_THAN << 6;
2246 mc_req_rec.scope_state = 0x21; /* Full memeber */
2247 comp_mask = IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
2248 IB_MCR_COMPMASK_LIFE | IB_MCR_COMPMASK_LIFE_SEL;
2249
2250 status = osmt_send_mcast_request(p_osmt, 1,
2251 &mc_req_rec, comp_mask, &res_sa_mad);
2252 if (status != IB_SUCCESS) {
2253 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BE: "
2254 "Failed to create MCG for %s - got %s/%s\n",
2255 inet_ntop(AF_INET6, good_mgid.raw, gid_str,
2256 sizeof gid_str), ib_get_err_str(status),
2257 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2258 goto Exit;
2259 }
2260
2261 /* - Try delete with valid join state */
2262 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2263 "Checking Full Delete of a group (o15.0.1.14)...\n");
2264 mc_req_rec.scope_state = 0x21; /* the FullMember is the current JoinState */
2265 status = osmt_send_mcast_request(p_osmt, 0,
2266 &mc_req_rec, comp_mask, &res_sa_mad);
2267
2268 if (status != IB_SUCCESS) {
2269 goto Exit;
2270 }
2271
2272 /* o15.0.1.15: */
2273 /* - Try deletion of the IPoIB MCG and get: ERR_REQ_INVALID */
2274 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2275 "Checking BAD Delete of IPoIB membership (no prev join) (o15.0.1.15)...\n");
2276 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
2277
2278 mc_req_rec.mgid = osm_ipoib_mgid;
2279 mc_req_rec.rate =
2280 IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6;
2281 mc_req_rec.scope_state = 0x21; /* delete full member */
2282
2283 status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */
2284 &mc_req_rec, comp_mask, &res_sa_mad);
2285
2286 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
2287
2288 if ((status != IB_REMOTE_ERROR) ||
2289 (res_sa_mad.status != IB_SA_MAD_STATUS_REQ_INVALID)) {
2290 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0223: "
2291 "Failed to catch BAD delete from IPoIB: %s/%s\n",
2292 ib_get_err_str(status),
2293 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2294 status = IB_ERROR;
2295 goto Exit;
2296 }
2297
2298 /**************************************************************************/
2299 /* Checking join with invalid MTU */
2300 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
2301 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2302 "Checking Join with unrealistic mtu : \n"
2303 "\t\tFirst create new MCG than try to join it \n"
2304 "\t\twith unrealistic MTU greater than 4096 (o15.0.1.8)...\n");
2305
2306 /* First create new mgrp */
2307 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
2308 mc_req_rec.mtu = IB_MTU_LEN_1024 | IB_PATH_SELECTOR_EXACTLY << 6;
2309 memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
2310 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
2311 IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
2312
2313 status = osmt_send_mcast_request(p_osmt, 1,
2314 &mc_req_rec, comp_mask, &res_sa_mad);
2315 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
2316 if (status != IB_SUCCESS) {
2317 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EB: "
2318 "Failed to create new mgrp\n");
2319 goto Exit;
2320 }
2321 memcpy(&tmp_mgid, &p_mc_res->mgid, sizeof(ib_gid_t));
2322 osm_dump_mc_record(&p_osmt->log, p_mc_res, OSM_LOG_INFO);
2323 /* tmp_mtu = p_mc_res->mtu & 0x3F; */
2324
2325 /* impossible requested mtu always greater than exist in MCG */
2326 mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_GREATER_THAN << 6;
2327 memcpy(&mc_req_rec.mgid, &tmp_mgid, sizeof(ib_gid_t));
2328 ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
2329 comp_mask =
2330 IB_MCR_COMPMASK_GID |
2331 IB_MCR_COMPMASK_PORT_GID |
2332 IB_MCR_COMPMASK_JOIN_STATE |
2333 IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
2334
2335 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
2336 status = osmt_send_mcast_request(p_osmt, 1,
2337 &mc_req_rec, comp_mask, &res_sa_mad);
2338 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
2339
2340 if (status == IB_SUCCESS) {
2341 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E4: "
2342 "Expected REMOTE ERROR got:%s/%s\n",
2343 ib_get_err_str(status),
2344 ib_get_mad_status_str((ib_mad_t *) (&res_sa_mad)));
2345 status = IB_ERROR;
2346 goto Exit;
2347 }
2348
2349 /* - Try GetTable with PortGUID wildcarded and get back some groups. */
2350 status = osmt_query_mcast(p_osmt);
2351 cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl);
2352 OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(Before checking Max MCG creation): "
2353 "Number of MC Records found in SA DB is %d\n", cnt);
2354
2355 /**************************************************************************/
2356 /* Checking join on behalf of remote port gid */
2357 OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "Checking Proxy Join...\n");
2358 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
2359 memset(&context, 0, sizeof(context));
2360
2361 /*
2362 * Do a blocking query for all NodeRecords in the subnet.
2363 */
2364 status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_NODE_RECORD,
2365 sizeof(*p_rec), &context);
2366
2367 if (status != IB_SUCCESS) {
2368 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E5: "
2369 "osmtest_get_all_recs failed on getting all node records(%s)\n",
2370 ib_get_err_str(status));
2371 goto Exit;
2372 }
2373
2374 /*
2375 * Populate the database with the received records.
2376 */
2377 num_recs = context.result.result_cnt;
2378 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", num_recs);
2379
2380 for (i = 0; i < num_recs; i++) {
2381 p_rec =
2382 osmv_get_query_node_rec(context.result.p_result_madw, i);
2383 if (p_rec->node_info.port_guid != p_osmt->local_port.port_guid
2384 && p_rec->node_info.node_type == IB_NODE_TYPE_CA) {
2385 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
2386 "remote port_guid = 0x%" PRIx64 "\n",
2387 cl_ntoh64(p_rec->node_info.port_guid));
2388
2389 remote_port_guid = p_rec->node_info.port_guid;
2390 i = num_recs;
2391 break;
2392 }
2393 }
2394
2395 if (remote_port_guid != 0x0) {
2396 ib_member_set_join_state(&mc_req_rec,
2397 IB_MC_REC_STATE_FULL_MEMBER);
2398 memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
2399 mc_req_rec.port_gid.unicast.interface_id = remote_port_guid;
2400 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS; /* all above are required */
2401
2402 status = osmt_send_mcast_request(p_osmt, 1,
2403 &mc_req_rec,
2404 comp_mask, &res_sa_mad);
2405
2406 if (status != IB_SUCCESS) {
2407 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B4: "
2408 "Could not join on behalf of remote port 0x%016"
2409 PRIx64 " remote status: %s\n",
2410 cl_ntoh64(remote_port_guid),
2411 ib_get_mad_status_str((ib_mad_t
2412 *) (&res_sa_mad)));
2413 status = IB_ERROR;
2414 goto Exit;
2415 }
2416
2417 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
2418 memcpy(&proxy_mgid, &p_mc_res->mgid, sizeof(ib_gid_t));
2419
2420 /* First try a bad deletion then good one */
2421
2422 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2423 "Trying deletion of remote port with local port guid\n");
2424
2425 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
2426 ib_member_set_join_state(&mc_req_rec,
2427 IB_MC_REC_STATE_FULL_MEMBER);
2428 comp_mask =
2429 IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
2430 IB_MCR_COMPMASK_JOIN_STATE;
2431
2432 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
2433
2434 status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */
2435 &mc_req_rec,
2436 comp_mask, &res_sa_mad);
2437
2438 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
2439
2440 if (status == IB_SUCCESS) {
2441 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A9: "
2442 "Successful deletion of remote port guid with local one MGID : "
2443 "%s, Got : %s/%s\n",
2444 inet_ntop(AF_INET6,
2445 p_mgrp->mcmember_rec.mgid.raw,
2446 gid_str, sizeof gid_str),
2447 ib_get_err_str(status),
2448 ib_get_mad_status_str((ib_mad_t
2449 *) (&res_sa_mad)));
2450 status = IB_ERROR;
2451 goto Exit;
2452 }
2453
2454 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2455 "Trying deletion of remote port with the right port guid\n");
2456
2457 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
2458 ib_member_set_join_state(&mc_req_rec,
2459 IB_MC_REC_STATE_FULL_MEMBER);
2460 mc_req_rec.mgid = proxy_mgid;
2461 mc_req_rec.port_gid.unicast.interface_id = remote_port_guid;
2462 comp_mask =
2463 IB_MCR_COMPMASK_MGID |
2464 IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_JOIN_STATE;
2465 status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */
2466 &mc_req_rec,
2467 comp_mask, &res_sa_mad);
2468 if (status != IB_SUCCESS) {
2469 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B0: "
2470 "Failed to delete mgid with remote port guid MGID : "
2471 "%s, Got : %s/%s\n",
2472 inet_ntop(AF_INET6,
2473 p_mgrp->mcmember_rec.mgid.raw,
2474 gid_str, sizeof gid_str),
2475 ib_get_err_str(status),
2476 ib_get_mad_status_str((ib_mad_t
2477 *) (&res_sa_mad)));
2478 goto Exit;
2479 }
2480 } else {
2481 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2482 "Could not check proxy join since could not found remote port, different from local port\n");
2483 }
2484
2485 /* prepare init for next check */
2486 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
2487
2488 /**************************************************************************/
2489 if (p_osmt->opt.mmode > 2) {
2490 /* Check invalid Join with max mlid which is more than the
2491 Mellanox switches support 0xC000+0x1000 = 0xd000 */
2492 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2493 "Checking Creation of Maximum avaliable Groups (MulticastFDBCap)...\n");
2494 tmp_mlid = cl_ntoh16(max_mlid) - cnt;
2495
2496 while (tmp_mlid > 0 && !ReachedMlidLimit) {
2497 uint16_t cur_mlid = 0;
2498
2499 /* Request Set */
2500 ib_member_set_join_state(&mc_req_rec,
2501 IB_MC_REC_STATE_FULL_MEMBER);
2502 /* Good Flow - mgid is 0 while giving all required fields for
2503 join : P_Key, Q_Key, SL, FlowLabel, Tclass */
2504
2505 mc_req_rec.rate =
2506 IB_LINK_WIDTH_ACTIVE_1X |
2507 IB_PATH_SELECTOR_GREATER_THAN << 6;
2508 mc_req_rec.mlid = max_mlid;
2509 memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
2510 comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
2511 IB_MCR_COMPMASK_MLID;
2512 status = osmt_send_mcast_request(p_osmt, 1,
2513 &mc_req_rec,
2514 comp_mask,
2515 &res_sa_mad);
2516
2517 p_mc_res = ib_sa_mad_get_payload_ptr(&res_sa_mad);
2518 if (status != IB_SUCCESS) {
2519
2520 if (cur_mlid > cl_ntoh16(max_mlid)) {
2521
2522 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
2523 "ERR 2E1 "
2524 "Successful Join with greater mlid than switches support (MulticastFDBCap) 0x%04X\n",
2525 cur_mlid);
2526 status = IB_ERROR;
2527 osm_dump_mc_record(&p_osmt->log,
2528 p_mc_res,
2529 OSM_LOG_VERBOSE);
2530 goto Exit;
2531 } else
2532 if ((res_sa_mad.
2533 status & IB_SMP_STATUS_MASK) ==
2534 IB_SA_MAD_STATUS_NO_RESOURCES) {
2535 /* You can quitly exit the loop since no available mlid in SA DB
2536 i.e. reached the maximum valiad avalable mlid */
2537 ReachedMlidLimit = TRUE;
2538 }
2539 } else {
2540 cur_mlid = cl_ntoh16(p_mc_res->mlid);
2541 /* Save the mlid created in test_created_mlids map */
2542 p_recvd_rec =
2543 (ib_member_rec_t *)
2544 ib_sa_mad_get_payload_ptr(&res_sa_mad);
2545 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
2546 "Created MGID:%s MLID:0x%04X\n",
2547 inet_ntop(AF_INET6,
2548 p_recvd_rec->mgid.raw,
2549 gid_str, sizeof gid_str),
2550 cl_ntoh16(p_recvd_rec->mlid));
2551 cl_map_insert(&test_created_mlids,
2552 cl_ntoh16(p_recvd_rec->mlid),
2553 p_recvd_rec);
2554 }
2555 tmp_mlid--;
2556 }
2557 }
2558
2559 /* Prepare the mc_req_rec for the rest of the flow */
2560 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
2561
2562 /**************************************************************************/
2563 /* o15.0.1.16: */
2564 /* - Try GetTable with PortGUID wildcarded and get back some groups. */
2565
2566 status = osmt_query_mcast(p_osmt);
2567 if (status != IB_SUCCESS) {
2568 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B1: "
2569 "Failed to query multicast groups: %s\n",
2570 ib_get_err_str(status));
2571 goto Exit;
2572 }
2573
2574 cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl);
2575 OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(Before Deletion of all MCG): "
2576 "Number of MC Records found in SA DB is %d\n", cnt);
2577
2578 /* Delete all MCG that are not of IPoIB */
2579 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2580 "Cleanup all MCG that are not IPoIB...\n");
2581
2582 p_mgrp_mlid_tbl = &p_osmt->exp_subn.mgrp_mlid_tbl;
2583 p_mgrp = (osmtest_mgrp_t *) cl_qmap_head(p_mgrp_mlid_tbl);
2584 /* scan all available multicast groups in the DB and fill in the table */
2585 while (p_mgrp != (osmtest_mgrp_t *) cl_qmap_end(p_mgrp_mlid_tbl)) {
2586 /* Only if different from IPoIB Mgid try to delete */
2587 if (!IS_IPOIB_MGID(&p_mgrp->mcmember_rec.mgid)) {
2588 osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
2589 mc_req_rec.mgid = p_mgrp->mcmember_rec.mgid;
2590
2591 /* o15-0.1.4 - need to specify the oppsite state for a valid delete */
2592 if (!memcmp
2593 (&special_mgid, &p_mgrp->mcmember_rec.mgid,
2594 sizeof(special_mgid))) {
2595 mc_req_rec.scope_state = 0x2F;
2596 } else {
2597 mc_req_rec.scope_state = 0x21;
2598 }
2599 comp_mask =
2600 IB_MCR_COMPMASK_MGID |
2601 IB_MCR_COMPMASK_PORT_GID |
2602 IB_MCR_COMPMASK_JOIN_STATE;
2603
2604 OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
2605 "Sending request to delete MGID : %s"
2606 ", scope_state : 0x%02X\n",
2607 inet_ntop(AF_INET6, mc_req_rec.mgid.raw,
2608 gid_str, sizeof gid_str),
2609 mc_req_rec.scope_state);
2610 status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */
2611 &mc_req_rec,
2612 comp_mask,
2613 &res_sa_mad);
2614 if (status != IB_SUCCESS) {
2615 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
2616 "ERR 02FF: Failed to delete MGID : %s"
2617 " ,\n\t\t it is not our MCG, Status : %s/%s\n",
2618 inet_ntop(AF_INET6,
2619 p_mgrp->mcmember_rec.mgid.raw,
2620 gid_str, sizeof gid_str),
2621 ib_get_err_str(status),
2622 ib_get_mad_status_str((ib_mad_t *)
2623 (&res_sa_mad)));
2624 fail_to_delete_mcg++;
2625 }
2626 } else {
2627 end_ipoib_cnt++;
2628 }
2629 p_mgrp = (osmtest_mgrp_t *) cl_qmap_next(&p_mgrp->map_item);
2630 }
2631
2632 status = osmt_query_mcast(p_osmt);
2633
2634 if (status != IB_SUCCESS) {
2635 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B2 "
2636 "GetTable of all records has failed - got %s\n",
2637 ib_get_err_str(status));
2638 goto Exit;
2639 }
2640
2641 /* If we are in single mode check flow - need to make sure all the multicast groups
2642 that are left are not ones created during the flow.
2643 */
2644 if (p_osmt->opt.mmode == 1 || p_osmt->opt.mmode == 3) {
2645 end_cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl);
2646
2647 OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "Status of MC Records in SA DB during the test flow:\n" " Beginning of test\n" " Unrelated to the test: %d\n" " IPoIB MC Records : %d\n" " Total : %d\n" " End of test\n" " Failed to delete : %d\n" " IPoIB MC Records : %d\n" " Total : %d\n", mcg_outside_test_cnt, /* Non-IPoIB that existed at the beginning */
2648 start_ipoib_cnt, /* IPoIB records */
2649 start_cnt, /* Total: IPoIB and MC Records unrelated to the test */
2650 fail_to_delete_mcg, /* Failed to delete at the end */
2651 end_ipoib_cnt, /* IPoIB records */
2652 end_cnt); /* Total MC Records at the end */
2653
2654 /* when we compare num of MCG we should consider an outside source which create other MCGs */
2655 if ((end_cnt - fail_to_delete_mcg - end_ipoib_cnt) !=
2656 (start_cnt - mcg_outside_test_cnt - start_ipoib_cnt)) {
2657 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2658 "Got different number of non-IPoIB records stored in SA DB\n\t\t"
2659 "at Start got %d, at End got %d (IPoIB groups only)\n",
2660 (start_cnt - mcg_outside_test_cnt -
2661 start_ipoib_cnt),
2662 (end_cnt - fail_to_delete_mcg - end_ipoib_cnt));
2663 }
2664
2665 p_mgrp_mlid_tbl = &p_osmt->exp_subn.mgrp_mlid_tbl;
2666 p_mgrp = (osmtest_mgrp_t *) cl_qmap_head(p_mgrp_mlid_tbl);
2667 while (p_mgrp !=
2668 (osmtest_mgrp_t *) cl_qmap_end(p_mgrp_mlid_tbl)) {
2669 uint16_t mlid =
2670 (uint16_t) cl_qmap_key((cl_map_item_t *) p_mgrp);
2671
2672 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2673 "Found MLID:0x%04X\n", mlid);
2674 /* Check if the mlid is in the test_created_mlids. If TRUE, then we
2675 didn't delete a MCgroup that was created in this flow. */
2676 if (cl_map_get(&test_created_mlids, mlid) != NULL) {
2677 /* This means that we still have an mgrp that we created!! */
2678 OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02FE: "
2679 "Wasn't able to erase mgrp with MGID:%s"
2680 " MLID:0x%04X\n",
2681 inet_ntop(AF_INET6,
2682 p_mgrp->mcmember_rec.mgid.raw,
2683 gid_str, sizeof gid_str),
2684 mlid);
2685 got_error = TRUE;
2686 } else {
2687 OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
2688 "Still exists %s MGID:%s\n",
2689 (IS_IPOIB_MGID
2690 (&p_mgrp->mcmember_rec.
2691 mgid)) ? "IPoIB" : "non-IPoIB",
2692 inet_ntop(AF_INET6,
2693 p_mgrp->mcmember_rec.mgid.raw,
2694 gid_str, sizeof gid_str));
2695 }
2696 p_mgrp =
2697 (osmtest_mgrp_t *) cl_qmap_next(&p_mgrp->map_item);
2698 }
2699
2700 if (got_error) {
2701 __osmt_print_all_multicast_records(p_osmt);
2702 status = IB_ERROR;
2703 }
2704 }
2705 Exit:
2706 OSM_LOG_EXIT(&p_osmt->log);
2707 return status;
2708 }
2709