|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Copyright (c) 2006-2009 Voltaire, Inc. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2010 HNR Consulting. All rights reserved.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* This software is available to you under a choice of one of two
|
|
Packit |
13e616 |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
13e616 |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
13e616 |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
13e616 |
* OpenIB.org BSD license below:
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
13e616 |
* without modification, are permitted provided that the following
|
|
Packit |
13e616 |
* conditions are met:
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* - Redistributions of source code must retain the above
|
|
Packit |
13e616 |
* copyright notice, this list of conditions and the following
|
|
Packit |
13e616 |
* disclaimer.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
13e616 |
* copyright notice, this list of conditions and the following
|
|
Packit |
13e616 |
* disclaimer in the documentation and/or other materials
|
|
Packit |
13e616 |
* provided with the distribution.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
13e616 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
13e616 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
13e616 |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
13e616 |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
13e616 |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
13e616 |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
13e616 |
* SOFTWARE.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Abstract:
|
|
Packit |
13e616 |
* Implementation of Multicast Member testing flow..
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#ifndef __WIN__
|
|
Packit |
13e616 |
#include <unistd.h>
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
#include <stdio.h>
|
|
Packit |
13e616 |
#include <stdlib.h>
|
|
Packit |
13e616 |
#include <string.h>
|
|
Packit |
13e616 |
#include <arpa/inet.h>
|
|
Packit |
13e616 |
#include <complib/cl_debug.h>
|
|
Packit |
13e616 |
#include <complib/cl_map.h>
|
|
Packit |
13e616 |
#include <complib/cl_list.h>
|
|
Packit |
13e616 |
#include "osmtest.h"
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void __osmt_print_all_multicast_records(IN osmtest_t * const p_osmt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
uint32_t i;
|
|
Packit |
13e616 |
ib_api_status_t status;
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
osmv_user_query_t user;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
ib_member_rec_t *mcast_record;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&user, 0, sizeof(user));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_USER_DEFINED;
|
|
Packit |
13e616 |
req.timeout_ms = p_osmt->opt.transaction_timeout;
|
|
Packit |
13e616 |
req.retry_cnt = 1;
|
|
Packit |
13e616 |
req.flags = OSM_SA_FLAGS_SYNC;
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
req.query_context = &context;
|
|
Packit |
13e616 |
req.pfn_query_cb = osmtest_query_res_cb;
|
|
Packit |
13e616 |
req.p_query_input = &use;;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_osmt->opt.with_grh) {
|
|
Packit |
13e616 |
req.with_grh = 1;
|
|
Packit |
13e616 |
memcpy(&req.gid, &p_osmt->sm_port_gid, 16);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
/* UnTrusted (SMKey of 0) - get the multicast groups */
|
|
Packit |
13e616 |
status = osmv_query_sa(p_osmt->h_bind, &req;;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS || context.result.status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B5: "
|
|
Packit |
13e616 |
"Failed getting the multicast groups records - %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_err_str(context.result.status));
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_log(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"\n |------------------------------------------|"
|
|
Packit |
13e616 |
"\n | Remaining Multicast Groups |"
|
|
Packit |
13e616 |
"\n |------------------------------------------|\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i < context.result.result_cnt; i++) {
|
|
Packit |
13e616 |
mcast_record =
|
|
Packit |
13e616 |
osmv_get_query_mc_rec(context.result.p_result_madw, i);
|
|
Packit |
13e616 |
osm_dump_mc_record(&p_osmt->log, mcast_record, OSM_LOG_INFO);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Trusted - now get the multicast group members */
|
|
Packit |
13e616 |
req.sm_key = OSM_DEFAULT_SM_KEY;
|
|
Packit |
13e616 |
status = osmv_query_sa(p_osmt->h_bind, &req;;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS || context.result.status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B6: "
|
|
Packit |
13e616 |
"Failed getting the multicast group members records - %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_err_str(context.result.status));
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_log(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"\n |--------------------------------------------------|"
|
|
Packit |
13e616 |
"\n | Remaining Multicast Group Members |"
|
|
Packit |
13e616 |
"\n |--------------------------------------------------|\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i < context.result.result_cnt; i++) {
|
|
Packit |
13e616 |
mcast_record =
|
|
Packit |
13e616 |
osmv_get_query_mc_rec(context.result.p_result_madw, i);
|
|
Packit |
13e616 |
osm_dump_mc_record(&p_osmt->log, mcast_record, OSM_LOG_INFO);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static cl_status_t
|
|
Packit |
13e616 |
__match_mgids(IN const void *const p_object, IN void *context)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
ib_gid_t *p_mgid_context = (ib_gid_t *) context;
|
|
Packit |
13e616 |
ib_gid_t *p_mgid_list_item = (ib_gid_t *) p_object;
|
|
Packit |
13e616 |
int32_t count;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
count = memcmp(p_mgid_context, p_mgid_list_item, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
if (count == 0)
|
|
Packit |
13e616 |
return CL_SUCCESS;
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
return CL_NOT_FOUND;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t osmt_query_mcast(IN osmtest_t * const p_osmt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
ib_api_status_t status = IB_SUCCESS;
|
|
Packit |
13e616 |
osmv_user_query_t user;
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
ib_member_rec_t *p_rec;
|
|
Packit |
13e616 |
uint32_t i, num_recs = 0;
|
|
Packit |
13e616 |
cl_list_t mgids_list;
|
|
Packit |
13e616 |
cl_list_t *p_mgids_list;
|
|
Packit |
13e616 |
cl_list_iterator_t p_mgids_res;
|
|
Packit |
13e616 |
cl_status_t cl_status;
|
|
Packit |
13e616 |
cl_map_item_t *p_item, *p_next_item;
|
|
Packit |
13e616 |
osmtest_mgrp_t *p_mgrp;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&p_osmt->log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Do a blocking query for all Multicast Records in the subnet.
|
|
Packit |
13e616 |
* The result is returned in the result field of the caller's
|
|
Packit |
13e616 |
* context structure.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* The query structures are locals.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&user, 0, sizeof(user));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_USER_DEFINED;
|
|
Packit |
13e616 |
req.timeout_ms = p_osmt->opt.transaction_timeout;
|
|
Packit |
13e616 |
req.retry_cnt = p_osmt->opt.retry_count;
|
|
Packit |
13e616 |
req.flags = OSM_SA_FLAGS_SYNC;
|
|
Packit |
13e616 |
req.query_context = &context;
|
|
Packit |
13e616 |
req.pfn_query_cb = osmtest_query_res_cb;
|
|
Packit |
13e616 |
req.p_query_input = &use;;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_osmt->opt.with_grh) {
|
|
Packit |
13e616 |
req.with_grh = 1;
|
|
Packit |
13e616 |
memcpy(&req.gid, &p_osmt->sm_port_gid, 16);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmv_query_sa(p_osmt->h_bind, &req;;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0203: "
|
|
Packit |
13e616 |
"ib_query failed (%s)\n", ib_get_err_str(status));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = context.result.status;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0264: "
|
|
Packit |
13e616 |
"ib_query failed (%s)\n", ib_get_err_str(status));
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"Remote error = %s.\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str(osm_madw_get_mad_ptr
|
|
Packit |
13e616 |
(context.result.
|
|
Packit |
13e616 |
p_result_madw)));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* ok we have got something */
|
|
Packit |
13e616 |
/* First Delete the old MGID Table */
|
|
Packit |
13e616 |
p_next_item = cl_qmap_head(&p_osmt->exp_subn.mgrp_mlid_tbl);
|
|
Packit |
13e616 |
while (p_next_item != cl_qmap_end(&p_osmt->exp_subn.mgrp_mlid_tbl)) {
|
|
Packit |
13e616 |
p_item = p_next_item;
|
|
Packit |
13e616 |
p_next_item = cl_qmap_next(p_item);
|
|
Packit |
13e616 |
cl_qmap_remove_item(&p_osmt->exp_subn.mgrp_mlid_tbl, p_item);
|
|
Packit |
13e616 |
free(p_item);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
cl_list_construct(&mgids_list);
|
|
Packit |
13e616 |
cl_list_init(&mgids_list, num_recs);
|
|
Packit |
13e616 |
p_mgids_list = &mgids_list;
|
|
Packit |
13e616 |
num_recs = context.result.result_cnt;
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n",
|
|
Packit |
13e616 |
num_recs);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i < num_recs; i++) {
|
|
Packit |
13e616 |
p_rec = osmv_get_query_result(context.result.p_result_madw, i);
|
|
Packit |
13e616 |
p_mgids_res =
|
|
Packit |
13e616 |
cl_list_find_from_head(p_mgids_list, __match_mgids,
|
|
Packit |
13e616 |
&(p_rec->mgid));
|
|
Packit |
13e616 |
/* If returns iterator other than end of list, same mgid exists already */
|
|
Packit |
13e616 |
if (p_mgids_res != cl_list_end(p_mgids_list)) {
|
|
Packit |
13e616 |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0265: "
|
|
Packit |
13e616 |
"MCG MGIDs are the same - invalid MGID : %s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_rec->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
osm_dump_mc_record(&p_osmt->log, p_rec, OSM_LOG_VERBOSE);
|
|
Packit |
13e616 |
cl_status = cl_list_insert_head(p_mgids_list, &(p_rec->mgid));
|
|
Packit |
13e616 |
if (cl_status) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0205: "
|
|
Packit |
13e616 |
"Could not add MGID to cl_list\n");
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
p_mgrp = (osmtest_mgrp_t *) malloc(sizeof(*p_mgrp));
|
|
Packit |
13e616 |
if (!p_mgrp) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0204: "
|
|
Packit |
13e616 |
"Could not allocate new MCG\n");
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
memcpy(&p_mgrp->mcmember_rec, p_rec,
|
|
Packit |
13e616 |
sizeof(p_mgrp->mcmember_rec));
|
|
Packit |
13e616 |
cl_qmap_insert(&p_osmt->exp_subn.mgrp_mlid_tbl,
|
|
Packit |
13e616 |
cl_ntoh16(p_rec->mlid), &p_mgrp->map_item);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
if (context.result.p_result_madw != NULL) {
|
|
Packit |
13e616 |
osm_mad_pool_put(&p_osmt->mad_pool,
|
|
Packit |
13e616 |
context.result.p_result_madw);
|
|
Packit |
13e616 |
context.result.p_result_madw = NULL;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_EXIT(&p_osmt->log);
|
|
Packit |
13e616 |
return (status);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* given a multicast request send and wait for response. */
|
|
Packit |
13e616 |
ib_api_status_t
|
|
Packit |
13e616 |
osmt_send_mcast_request(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN uint8_t is_set,
|
|
Packit |
13e616 |
IN ib_member_rec_t * p_mc_req,
|
|
Packit |
13e616 |
IN uint64_t comp_mask, OUT ib_sa_mad_t * p_res)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
ib_api_status_t status = IB_SUCCESS;
|
|
Packit |
13e616 |
osmv_user_query_t user;
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&p_osmt->log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Do a blocking query for this record in the subnet.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* The query structures are locals.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&user, 0, sizeof(user));
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
memset(p_res, 0, sizeof(ib_sa_mad_t));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
user.p_attr = p_mc_req;
|
|
Packit |
13e616 |
user.comp_mask = comp_mask;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (is_set == 1)
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_UD_MULTICAST_SET;
|
|
Packit |
13e616 |
else if (is_set == 0)
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_UD_MULTICAST_DELETE;
|
|
Packit |
13e616 |
else if (is_set == 0xee) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Set USER DEFINED QUERY\n");
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_USER_DEFINED;
|
|
Packit |
13e616 |
user.method = IB_MAD_METHOD_GET;
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;
|
|
Packit |
13e616 |
} else if (is_set == 0xff) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Set USER DEFINED QUERY\n");
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_USER_DEFINED;
|
|
Packit |
13e616 |
user.method = IB_MAD_METHOD_SET;
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* TODO : Check the validity of all user fields in order to use
|
|
Packit |
13e616 |
OSMV_QUERY_USER_DEFINED
|
|
Packit |
13e616 |
p_user_query = ( osmv_user_query_t * ) p_query_req->p_query_input;
|
|
Packit |
13e616 |
if (p_user_query->method) sa_mad_data.method = p_user_query->method;
|
|
Packit |
13e616 |
sa_mad_data.attr_offset = p_user_query->attr_offset;
|
|
Packit |
13e616 |
sa_mad_data.attr_id = p_user_query->attr_id;
|
|
Packit |
13e616 |
sa_mad_data.comp_mask = p_user_query->comp_mask;
|
|
Packit |
13e616 |
sa_mad_data.p_attr = p_user_query->p_attr;
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
req.timeout_ms = p_osmt->opt.transaction_timeout;
|
|
Packit |
13e616 |
req.retry_cnt = p_osmt->opt.retry_count;
|
|
Packit |
13e616 |
req.flags = OSM_SA_FLAGS_SYNC;
|
|
Packit |
13e616 |
req.query_context = &context;
|
|
Packit |
13e616 |
req.pfn_query_cb = osmtest_query_res_cb;
|
|
Packit |
13e616 |
req.p_query_input = &use;;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_osmt->opt.with_grh) {
|
|
Packit |
13e616 |
req.with_grh = 1;
|
|
Packit |
13e616 |
memcpy(&req.gid, &p_osmt->sm_port_gid, 16);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmv_query_sa(p_osmt->h_bind, &req;;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0206: "
|
|
Packit |
13e616 |
"ib_query failed (%s)\n", ib_get_err_str(status));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* ok it worked */
|
|
Packit |
13e616 |
memcpy(p_res, osm_madw_get_mad_ptr(context.result.p_result_madw),
|
|
Packit |
13e616 |
sizeof(ib_sa_mad_t));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = context.result.status;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0224: "
|
|
Packit |
13e616 |
"ib_query failed (%s)\n", ib_get_err_str(status));
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"Remote error = %s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str(osm_madw_get_mad_ptr
|
|
Packit |
13e616 |
(context.result.
|
|
Packit |
13e616 |
p_result_madw)));
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Return the IB query MAD to the pool as necessary.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
if (context.result.p_result_madw != NULL) {
|
|
Packit |
13e616 |
osm_mad_pool_put(&p_osmt->mad_pool,
|
|
Packit |
13e616 |
context.result.p_result_madw);
|
|
Packit |
13e616 |
context.result.p_result_madw = NULL;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_EXIT(&p_osmt->log);
|
|
Packit |
13e616 |
return (status);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osmt_init_mc_query_rec(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN OUT ib_member_rec_t * p_mc_req)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
/* use default values so we can change only what we want later */
|
|
Packit |
13e616 |
memset(p_mc_req, 0, sizeof(ib_member_rec_t));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* we leave the MGID to the user */
|
|
Packit |
13e616 |
memcpy(&p_mc_req->port_gid.unicast.interface_id,
|
|
Packit |
13e616 |
&p_osmt->local_port.port_guid,
|
|
Packit |
13e616 |
sizeof(p_osmt->local_port.port_guid));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* use our own subnet prefix: */
|
|
Packit |
13e616 |
p_mc_req->port_gid.unicast.prefix = cl_hton64(p_osmt->local_port_gid.unicast.prefix);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* ib_net32_t qkey; */
|
|
Packit |
13e616 |
/* ib_net16_t mlid; - we keep it zero for upper level to decide. */
|
|
Packit |
13e616 |
/* uint8_t mtu; - keep it zero means - anything you have please. */
|
|
Packit |
13e616 |
/* uint8_t tclass; can leave as zero for now (between subnets) */
|
|
Packit |
13e616 |
/* ib_net16_t pkey; leave as zero */
|
|
Packit |
13e616 |
p_mc_req->rate = IB_PATH_RECORD_RATE_2_5_GBS;
|
|
Packit |
13e616 |
/* uint8_t pkt_life; zero means greater than zero ... */
|
|
Packit |
13e616 |
/* ib_net32_t sl_flow_hop; keep it all zeros */
|
|
Packit |
13e616 |
/* we want to use a link local scope: 0x02 */
|
|
Packit |
13e616 |
p_mc_req->scope_state = ib_member_set_scope_state(0x02, 0);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/***********************************************************************
|
|
Packit |
13e616 |
* UD Multicast testing flow:
|
|
Packit |
13e616 |
* o15.0.1.3:
|
|
Packit |
13e616 |
* - Request new MCG with not enough components in comp_mask :
|
|
Packit |
13e616 |
* ERR_INSUFFICIENT_COMPONENTS
|
|
Packit |
13e616 |
* o15.0.1.8:
|
|
Packit |
13e616 |
* - Request a join with irrelevant RATE and get a ERR_INVALID_REQ
|
|
Packit |
13e616 |
* o15.0.1.4:
|
|
Packit |
13e616 |
* - Create an MGID by asking for a join with MGID = 0
|
|
Packit |
13e616 |
* providing P_Key, Q_Key, SL, FlowLabel, Tclass.
|
|
Packit |
13e616 |
* o15.0.1.5:
|
|
Packit |
13e616 |
* - Check the returned MGID is valid. (p 804)
|
|
Packit |
13e616 |
* o15.0.1.6:
|
|
Packit |
13e616 |
* - Create a new MCG with valid requested MGID.
|
|
Packit |
13e616 |
* - Try to create a new MCG with invalid MGID : get back ERR_REQ_INVALID
|
|
Packit |
13e616 |
* - Try again with MGID prefix = 0xA01B (maybe 0x1BA0 little or big ?)
|
|
Packit |
13e616 |
* - Try to create again the already created group: ERR_REQ_INVALID
|
|
Packit |
13e616 |
* o15.0.1.7 - implicitly checked during the prev steps.
|
|
Packit |
13e616 |
* o15.0.1.9
|
|
Packit |
13e616 |
* - Create MCG with Invalid JoinState.FullMember != 1 : get ERR_REQ_INVALID
|
|
Packit |
13e616 |
* o15.0.1.10 - can't check on a single client .
|
|
Packit |
13e616 |
* o15.0.1.11:
|
|
Packit |
13e616 |
* - Try to join into a MGID that exists with JoinState=SendOnlyMember -
|
|
Packit |
13e616 |
* see that it updates JoinState. What is the routing change?
|
|
Packit |
13e616 |
* - We can not check simple join since we have only one tester (for now)
|
|
Packit |
13e616 |
* o15.0.1.12:
|
|
Packit |
13e616 |
* - The last join should have a special treatment in the SA (sender only)
|
|
Packit |
13e616 |
* but what is it ?
|
|
Packit |
13e616 |
* o15.0.1.13:
|
|
Packit |
13e616 |
* - Try joining with wrong rate - ERR_REQ_INVALID
|
|
Packit |
13e616 |
* o15.0.1.14:
|
|
Packit |
13e616 |
* - Try partial delete - actually updating the join state. check it.
|
|
Packit |
13e616 |
* - Register by InformInfo flow to receive trap 67 on MCG delete.
|
|
Packit |
13e616 |
* - Try full delete (JoinState and should be 0)
|
|
Packit |
13e616 |
* - Wait for trap 67.
|
|
Packit |
13e616 |
* - Try joining (not full mem) again to see the group was deleted.
|
|
Packit |
13e616 |
* (should fail - o15.0.1.13)
|
|
Packit |
13e616 |
* o15.0.1.15:
|
|
Packit |
13e616 |
* - Try deletion of the IPoIB MCG and get: ERR_REQ_INVALID
|
|
Packit |
13e616 |
* o15.0.1.16:
|
|
Packit |
13e616 |
* - Try GetTable with PortGUID wildcarded and get back some groups.
|
|
Packit |
13e616 |
***********************************************************************/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#define PREFIX_MASK CL_HTON64(0xff10ffff00000000ULL)
|
|
Packit |
13e616 |
#define PREFIX_SIGNATURE CL_HTON64(0xff10601b00000000ULL)
|
|
Packit |
13e616 |
#define IPV4_PREFIX_MASK CL_HTON64(0xff10ffff00000000ULL)
|
|
Packit |
13e616 |
#define PREFIX_SIGNATURE_IPV4 CL_HTON64(0xff10401b00000000ULL)
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static unsigned is_ipv4_mgid(ib_gid_t * mgid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
return ((mgid->unicast.prefix & IPV4_PREFIX_MASK) == PREFIX_SIGNATURE_IPV4);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static unsigned is_ipv6_mgid(ib_gid_t * mgid)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
return ((mgid->unicast.prefix & PREFIX_MASK) == PREFIX_SIGNATURE);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* The following macro can be used only within the osmt_run_mcast_flow() function */
|
|
Packit |
13e616 |
#define IS_IPOIB_MGID(p_mgid) (is_ipv4_mgid(p_mgid) || is_ipv6_mgid(p_mgid))
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t osmt_run_mcast_flow(IN osmtest_t * const p_osmt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit |
13e616 |
char gid_str2[INET6_ADDRSTRLEN];
|
|
Packit |
13e616 |
ib_api_status_t status;
|
|
Packit |
13e616 |
ib_member_rec_t mc_req_rec;
|
|
Packit |
13e616 |
union {
|
|
Packit |
13e616 |
ib_sa_mad_t sa_mad;
|
|
Packit |
13e616 |
ib_member_rec_t mcmr;
|
|
Packit |
13e616 |
} res;
|
|
Packit |
13e616 |
ib_sa_mad_t *sa_mad;
|
|
Packit |
13e616 |
ib_member_rec_t *p_mc_res;
|
|
Packit |
13e616 |
uint64_t comp_mask = 0;
|
|
Packit |
13e616 |
ib_net64_t remote_port_guid = 0x0;
|
|
Packit |
13e616 |
cl_qmap_t *p_mgrp_mlid_tbl;
|
|
Packit |
13e616 |
osmtest_mgrp_t *p_mgrp;
|
|
Packit |
13e616 |
ib_gid_t special_mgid, tmp_mgid, proxy_mgid;
|
|
Packit |
13e616 |
ib_net16_t invalid_mlid = 0x0;
|
|
Packit |
13e616 |
ib_net16_t max_mlid = cl_hton16(0xFFFE), tmp_mlid;
|
|
Packit |
13e616 |
int start_cnt = 0, cnt, middle_cnt = 0, end_cnt = 0;
|
|
Packit |
13e616 |
int start_ipoib_cnt = 0, end_ipoib_cnt = 0;
|
|
Packit |
13e616 |
int mcg_outside_test_cnt = 0, fail_to_delete_mcg = 0;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
ib_node_record_t *p_rec;
|
|
Packit |
13e616 |
uint32_t num_recs = 0, i;
|
|
Packit |
13e616 |
uint8_t mtu_phys = 0, rate_phys = 0;
|
|
Packit |
13e616 |
cl_map_t test_created_mlids; /* List of all mlids created in this test */
|
|
Packit |
13e616 |
boolean_t got_error = FALSE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static ib_gid_t good_mgid = {
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
0xFF, 0x12, 0xA0, 0x1C,
|
|
Packit |
13e616 |
0xFE, 0x80, 0x00, 0x00,
|
|
Packit |
13e616 |
0x00, 0x00, 0x00, 0x00,
|
|
Packit |
13e616 |
0x12, 0x34, 0x56, 0x78}
|
|
Packit |
13e616 |
};
|
|
Packit |
13e616 |
static ib_gid_t osm_ipoib_mgid = {
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
0xff, /* multicast field */
|
|
Packit |
13e616 |
0x12, /* scope */
|
|
Packit |
13e616 |
0x40, 0x1b, /* IPv4 signature */
|
|
Packit |
13e616 |
0xff, 0xff, /* 16 bits of P_Key (to be filled in) */
|
|
Packit |
13e616 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */
|
|
Packit |
13e616 |
0xff, 0xff, 0xff, 0xee, /* 32 bit IPv4 broadcast address */
|
|
Packit |
13e616 |
},
|
|
Packit |
13e616 |
};
|
|
Packit |
13e616 |
#if 0
|
|
Packit |
13e616 |
static ib_gid_t osm_ts_ipoib_good_mgid = {
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
0xff, /* multicast field */
|
|
Packit |
13e616 |
0x12, /* non-permanent bit,scope */
|
|
Packit |
13e616 |
0x40, 0x1b, /* IPv4 signature */
|
|
Packit |
13e616 |
0xff, 0xff, /* 16 bits of P_Key (to be filled in) */
|
|
Packit |
13e616 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */
|
|
Packit |
13e616 |
0x00, 0x00, 0x00, 0x01, /* 32 bit IPv4 broadcast address */
|
|
Packit |
13e616 |
},
|
|
Packit |
13e616 |
};
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
static ib_gid_t osm_ipoib_good_mgid = {
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
0xff, /* multicast field */
|
|
Packit |
13e616 |
0x12, /* non-permanent bit,scope */
|
|
Packit |
13e616 |
0x40, 0x1b, /* IPv4 signature */
|
|
Packit |
13e616 |
0xff, 0xff, /* 16 bits of P_Key (to be filled in) */
|
|
Packit |
13e616 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 bits of zeros */
|
|
Packit |
13e616 |
0xff, 0xff, 0xff, 0xff, /* 32 bit IPv4 broadcast address */
|
|
Packit |
13e616 |
},
|
|
Packit |
13e616 |
};
|
|
Packit |
13e616 |
static ib_gid_t osm_link_local_mgid = {
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
0xFF, 0x02, 0x00, 0x00,
|
|
Packit |
13e616 |
0x00, 0x00, 0x00, 0x00,
|
|
Packit |
13e616 |
0x00, 0x00, 0x00, 0x00,
|
|
Packit |
13e616 |
0x00, 0x00, 0x00, 0x01},
|
|
Packit |
13e616 |
};
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&p_osmt->log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "GetTable of all current MCGs...\n");
|
|
Packit |
13e616 |
status = osmt_query_mcast(p_osmt);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02FF "
|
|
Packit |
13e616 |
"GetTable of all records has failed!\n");
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Initialize the test_created_mgrps map */
|
|
Packit |
13e616 |
cl_map_construct(&test_created_mlids);
|
|
Packit |
13e616 |
cl_map_init(&test_created_mlids, 1000);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_mgrp_mlid_tbl = &p_osmt->exp_subn.mgrp_mlid_tbl;
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
sa_mad = &res.sa_mad;
|
|
Packit |
13e616 |
p_mc_res = ib_sa_mad_get_payload_ptr(sa_mad);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Only when we are on single mode check flow - do the count comparison, otherwise skip */
|
|
Packit |
13e616 |
if (p_osmt->opt.mmode == 1 || p_osmt->opt.mmode == 3) {
|
|
Packit |
13e616 |
start_cnt = cl_qmap_count(p_mgrp_mlid_tbl);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(start): "
|
|
Packit |
13e616 |
"Number of MC Records found in SA DB is %d\n",
|
|
Packit |
13e616 |
start_cnt);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* This flow is being added due to bug discovered using SilverStorm stack -
|
|
Packit |
13e616 |
The bug was initializing MCast with MTU & RATE min values that do
|
|
Packit |
13e616 |
not match the subnet capability, even though that OpenSM
|
|
Packit |
13e616 |
reponds with the correct value it does not store it in the MCG.
|
|
Packit |
13e616 |
We want the check a join request to already existing group (ipoib)
|
|
Packit |
13e616 |
without using MTU or RATE then getting response from OpenSM with
|
|
Packit |
13e616 |
the correct values then join again with them and get IB_SUCCESS
|
|
Packit |
13e616 |
all the way
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* First validate IPoIB exist in the SA DB */
|
|
Packit |
13e616 |
p_mgrp = (osmtest_mgrp_t *) cl_qmap_head(p_mgrp_mlid_tbl);
|
|
Packit |
13e616 |
/* scan all available multicast groups in the DB and fill in the table */
|
|
Packit |
13e616 |
while (p_mgrp != (osmtest_mgrp_t *) cl_qmap_end(p_mgrp_mlid_tbl)) {
|
|
Packit |
13e616 |
/* search for ipoib mgid */
|
|
Packit |
13e616 |
if (IS_IPOIB_MGID(&p_mgrp->mcmember_rec.mgid))
|
|
Packit |
13e616 |
start_ipoib_cnt++;
|
|
Packit |
13e616 |
else {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Non-IPoIB MC Groups exist: mgid=%s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6,
|
|
Packit |
13e616 |
p_mgrp->mcmember_rec.mgid.raw,
|
|
Packit |
13e616 |
gid_str, sizeof gid_str));
|
|
Packit |
13e616 |
mcg_outside_test_cnt++;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_mgrp = (osmtest_mgrp_t *) cl_qmap_next(&p_mgrp->map_item);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Found %d non-IPoIB MC Groups\n", mcg_outside_test_cnt);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (start_ipoib_cnt) {
|
|
Packit |
13e616 |
/* o15-0.2.4 - Check a join request to already created MCG */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Found IPoIB MC Group, so we run SilverStorm Bug Flow...\n");
|
|
Packit |
13e616 |
/* Try to join first like IPoIB of SilverStorm */
|
|
Packit |
13e616 |
memcpy(&mc_req_rec.mgid, &osm_ipoib_good_mgid,
|
|
Packit |
13e616 |
sizeof(ib_gid_t));
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec,
|
|
Packit |
13e616 |
IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_JOIN_STATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0xff, /* User Defined query Set */
|
|
Packit |
13e616 |
&mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Joining an existing IPoIB multicast group\n");
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Sent Join request with :\n\t\tport_gid=%s, mgid=%s\n"
|
|
Packit |
13e616 |
"\t\tjoin state= 0x%x, response is : %s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, mc_req_rec.port_gid.raw,
|
|
Packit |
13e616 |
gid_str, sizeof gid_str),
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, mc_req_rec.mgid.raw,
|
|
Packit |
13e616 |
gid_str2, sizeof gid_str2),
|
|
Packit |
13e616 |
(mc_req_rec.scope_state & 0x0F),
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B3: "
|
|
Packit |
13e616 |
"Failed joining existing IPoIB MCGroup - got %s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
/* Check MTU & Rate Value and resend with SA suggested values */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Prepare the mc_req_rec for the rest of the flow */
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
We simulate the same situation as in SilverStorm - a response with the
|
|
Packit |
13e616 |
exact RATE & MTU as the SA responded with. Actually the query
|
|
Packit |
13e616 |
has included some more fields but we know that problem was
|
|
Packit |
13e616 |
genereated by the RATE
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Received attributes of MCG : \n\t\tMTU=0x%02X, RATE=0x%02X\n",
|
|
Packit |
13e616 |
p_mc_res->mtu, p_mc_res->rate);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mtu = p_mc_res->mtu;
|
|
Packit |
13e616 |
mc_req_rec.rate = p_mc_res->rate;
|
|
Packit |
13e616 |
/* Set feasible mtu & rate that will allow check the
|
|
Packit |
13e616 |
exact statement of OpenSM */
|
|
Packit |
13e616 |
mtu_phys = p_mc_res->mtu;
|
|
Packit |
13e616 |
rate_phys = p_mc_res->rate;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memcpy(&mc_req_rec.mgid, &osm_ipoib_good_mgid,
|
|
Packit |
13e616 |
sizeof(ib_gid_t));
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec,
|
|
Packit |
13e616 |
IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_MTU_SEL |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU | IB_MCR_COMPMASK_RATE_SEL |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Sending attributes of MCG : \n\t\tMTU=0x%02X, RATE=0x%02X\n",
|
|
Packit |
13e616 |
mc_req_rec.mtu, mc_req_rec.rate);
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0xff, /* User Defined query */
|
|
Packit |
13e616 |
&mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Sent Join request using response values, response is : %s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EF: "
|
|
Packit |
13e616 |
"Query as Full Member of already existing "
|
|
Packit |
13e616 |
"ipoib group gid %s has failed\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, mc_req_rec.mgid.raw,
|
|
Packit |
13e616 |
gid_str, sizeof gid_str));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
/* We do not want to leave the MCG since its IPoIB */
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/**************************************************************************/
|
|
Packit |
13e616 |
/* Check Get with invalid mlid */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Get with invalid mlid...\n");
|
|
Packit |
13e616 |
/* Request Get */
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
mc_req_rec.mlid = invalid_mlid;
|
|
Packit |
13e616 |
comp_mask = IB_MCR_COMPMASK_MLID;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0xee, /* User Defined query Get */
|
|
Packit |
13e616 |
&mc_req_rec, comp_mask, sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status == IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E0 "
|
|
Packit |
13e616 |
"SubnAdmGet with invalid mlid 0x%x succeeded\n",
|
|
Packit |
13e616 |
cl_ntoh16(mc_req_rec.mlid));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Prepare the mc_req_rec for the rest of the flow */
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
/**************************************************************************/
|
|
Packit |
13e616 |
/* Check Get with invalid port guid */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Get with invalid port guid (0x0) but valid interface ID : 0x%"
|
|
Packit |
13e616 |
PRIx64 "...\n",
|
|
Packit |
13e616 |
cl_ntoh64(mc_req_rec.port_gid.unicast.interface_id));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Request Get */
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
memset(&mc_req_rec.port_gid.unicast.interface_id, 0,
|
|
Packit |
13e616 |
sizeof(ib_net64_t));
|
|
Packit |
13e616 |
comp_mask = IB_MCR_COMPMASK_GID;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0xee, /* User Defined query Get */
|
|
Packit |
13e616 |
&mc_req_rec, comp_mask, sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status == IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E4 "
|
|
Packit |
13e616 |
"SubnAdmGet with invalid port guid succeeded\n");
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Prepare the mc_req_rec for the rest of the flow */
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
/**************************************************************************/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.3: */
|
|
Packit |
13e616 |
/* - Request Join with insufficient comp_mask */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with insufficient comp mask qkey & pkey (o15.0.1.3)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* no MGID */
|
|
Packit |
13e616 |
memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_QKEY | */
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_PKEY | intentionally missed to raise the error */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) !=
|
|
Packit |
13e616 |
IB_SA_MAD_STATUS_INSUF_COMPS)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Expected IB_SA_MAD_STATUS_INSUF_COMPS got:%s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EE: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR got:%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with insufficient comp mask - sl (15.0.1.3)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* no MGID */
|
|
Packit |
13e616 |
memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
mc_req_rec.pkey = IB_DEFAULT_PKEY;
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY |
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_SL | */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) !=
|
|
Packit |
13e616 |
IB_SA_MAD_STATUS_INSUF_COMPS)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Expected IB_SA_MAD_STATUS_INSUF_COMPS got:%s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02ED: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR got:%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
/* no MGID */
|
|
Packit |
13e616 |
memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[15] = 0x01;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with insufficient comp mask - flow label (o15.0.1.3)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
mc_req_rec.pkey = IB_DEFAULT_PKEY;
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL |
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_FLOW | intentionally missed to raise the error */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) !=
|
|
Packit |
13e616 |
IB_SA_MAD_STATUS_INSUF_COMPS)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Expected IB_SA_MAD_STATUS_INSUF_COMPS got:%s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EC: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR got:%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with insufficient comp mask - tclass (o15.0.1.3)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
mc_req_rec.pkey = IB_DEFAULT_PKEY;
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE |
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_TCLASS | Intentionally missed to raise an error */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) !=
|
|
Packit |
13e616 |
IB_SA_MAD_STATUS_INSUF_COMPS)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Expected IB_SA_MAD_STATUS_INSUF_COMPS got:%s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EA: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR got:%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with insufficient comp mask - tclass qkey (o15.0.1.3)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* no MGID */
|
|
Packit |
13e616 |
/* memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t)); */
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
mc_req_rec.pkey = IB_DEFAULT_PKEY;
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_QKEY | intentionally missed to raise the error */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE |
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_TCLASS | intentionally missed to raise the error */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) !=
|
|
Packit |
13e616 |
IB_SA_MAD_STATUS_INSUF_COMPS)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Expected IB_SA_MAD_STATUS_INSUF_COMPS got:%s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E9: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR got:%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.8: */
|
|
Packit |
13e616 |
/* - Request join with unrealistic RATE : get REQ INVALID status */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with unrealistic rate (o15.0.1.8)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* impossible requested rate */
|
|
Packit |
13e616 |
mc_req_rec.rate =
|
|
Packit |
13e616 |
IB_RATE_MAX | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR ||
|
|
Packit |
13e616 |
sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0207: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check Valid value which is unreasonable now */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with unrealistic rate 300GB (o15.0.1.8)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* impossible requested rate */
|
|
Packit |
13e616 |
mc_req_rec.rate =
|
|
Packit |
13e616 |
IB_PATH_RECORD_RATE_300_GBS | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR ||
|
|
Packit |
13e616 |
sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0208: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check Valid value which is unreasonable now */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with less than min rate 2.5GB (o15.0.1.8)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* impossible requested rate */
|
|
Packit |
13e616 |
mc_req_rec.rate =
|
|
Packit |
13e616 |
IB_PATH_RECORD_RATE_2_5_GBS | IB_PATH_SELECTOR_LESS_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR ||
|
|
Packit |
13e616 |
sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AB: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Checking above max value of MTU which is impossible */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with unrealistic mtu : \n\t\tmore than 4096 -"
|
|
Packit |
13e616 |
" max (o15.0.1.8)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* impossible requested mtu */
|
|
Packit |
13e616 |
mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR ||
|
|
Packit |
13e616 |
sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AC: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Checking below min value of MTU which is impossible */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with unrealistic mtu : \n\t\tless than 256 -"
|
|
Packit |
13e616 |
" min (o15.0.1.8)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* impossible requested mtu */
|
|
Packit |
13e616 |
mc_req_rec.mtu = IB_MTU_LEN_256 | IB_PATH_SELECTOR_LESS_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR ||
|
|
Packit |
13e616 |
sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AD: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with unrealistic mtu (o15.0.1.8)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* impossible requested mtu */
|
|
Packit |
13e616 |
mc_req_rec.mtu = 0x6 | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR ||
|
|
Packit |
13e616 |
sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AE: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
#if 0
|
|
Packit |
13e616 |
/* Currently PacketLifeTime isn't checked in opensm */
|
|
Packit |
13e616 |
/* Check PacketLifeTime as 0 */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Create with unrealistic packet life value less than 0 (o15.0.1.8)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* impossible requested packet life */
|
|
Packit |
13e616 |
mc_req_rec.pkt_life = 0 | IB_PATH_SELECTOR_LESS_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_LIFE | IB_MCR_COMPMASK_LIFE_SEL;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR ||
|
|
Packit |
13e616 |
sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AF: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR IB_SA_MAD_STATUS_REQ_INVALID got:%s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.4: */
|
|
Packit |
13e616 |
/* - Create an MGID by asking for a join with MGID = 0 */
|
|
Packit |
13e616 |
/* providing P_Key, Q_Key, SL, FlowLabel, Tclass. */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Create given MGID=0 skip service level (o15.0.1.4)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* no MGID */
|
|
Packit |
13e616 |
memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
mc_req_rec.pkey = IB_DEFAULT_PKEY;
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY |
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_SL | Intentionally missed */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) !=
|
|
Packit |
13e616 |
IB_SA_MAD_STATUS_INSUF_COMPS)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Expected IB_SA_MAD_STATUS_INSUF_COMPS got:%s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A8: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR got:%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check that no same MCG in the SMDB */
|
|
Packit |
13e616 |
status = osmt_query_mcast(p_osmt);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02AA: "
|
|
Packit |
13e616 |
"Could not get all MC Records in subnet, got:%s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Only when we are on single mode check flow - do the count comparison, otherwise skip */
|
|
Packit |
13e616 |
if (p_osmt->opt.mmode == 1 || p_osmt->opt.mmode == 3) {
|
|
Packit |
13e616 |
middle_cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(post false create): "
|
|
Packit |
13e616 |
"Number of MC Records found in SA DB is %d\n",
|
|
Packit |
13e616 |
middle_cnt);
|
|
Packit |
13e616 |
if (middle_cnt != start_cnt)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Got different number of records stored in SA DB (before any creation)\n"
|
|
Packit |
13e616 |
"Instead of %d got %d\n", start_cnt,
|
|
Packit |
13e616 |
middle_cnt);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Create given MGID=0 skip Qkey and Pkey (o15.0.1.4)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* no MGID */
|
|
Packit |
13e616 |
memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
comp_mask = IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_QKEY | */
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_PKEY | Intentionally missed */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_SL | IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE | IB_MCR_COMPMASK_TCLASS | /* all above are required */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) !=
|
|
Packit |
13e616 |
IB_SA_MAD_STATUS_INSUF_COMPS)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Expected IB_SA_MAD_STATUS_INSUF_COMPS got:%s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A7: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR got:%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Bad Query o15.0.1.4 */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_query_mcast(p_osmt);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Create given MGID=0 skip TClass (o15.0.1.4)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* no MGID */
|
|
Packit |
13e616 |
memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
mc_req_rec.pkey = IB_DEFAULT_PKEY;
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_QKEY | IB_MCR_COMPMASK_PKEY | IB_MCR_COMPMASK_SL |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_FLOW | IB_MCR_COMPMASK_JOIN_STATE |
|
|
Packit |
13e616 |
/* IB_MCR_COMPMASK_TCLASS | Intentionally missed */
|
|
Packit |
13e616 |
/* all above are required */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (((ib_net16_t) (sa_mad->status & IB_SMP_STATUS_MASK)) !=
|
|
Packit |
13e616 |
IB_SA_MAD_STATUS_INSUF_COMPS)
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Expected IB_SA_MAD_STATUS_INSUF_COMPS got:%s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A6: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR got:%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Create given MGID=0 valid Set several options :\n\t\t"
|
|
Packit |
13e616 |
"First any RATE, Second less than max RATE\n\t\t"
|
|
Packit |
13e616 |
"Third above min MTU, Fourth less than max MTU\n\t\t"
|
|
Packit |
13e616 |
"Fifth exact MTU & RATE feasible, Sixth exact RATE feasible\n\t\t"
|
|
Packit |
13e616 |
"Seventh exact MTU feasible (o15.0.1.4)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A5: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=0 with higher than minimum RATE - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.rate =
|
|
Packit |
13e616 |
IB_PATH_RECORD_RATE_60_GBS | IB_PATH_SELECTOR_LESS_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0211: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=0 with less than highest RATE - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_LESS_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0238: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=0 with less than highest MTU - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
|
|
Packit |
13e616 |
mc_req_rec.mtu = IB_MTU_LEN_256 | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0239: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=0 with higher than lowest MTU - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
|
|
Packit |
13e616 |
/* Using Exact feasible MTU & RATE */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Using Exact feasible MTU & RATE: "
|
|
Packit |
13e616 |
"MTU = 0x%02X, RATE = 0x%02X\n", mtu_phys, rate_phys);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mtu = mtu_phys;
|
|
Packit |
13e616 |
mc_req_rec.rate = rate_phys;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0240: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=0 with exact MTU & RATE - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
|
|
Packit |
13e616 |
/* Using Exact feasible RATE */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Using Exact feasible RATE: 0x%02X\n", rate_phys);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.rate = rate_phys;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0241: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=0 with exact RATE - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
|
|
Packit |
13e616 |
/* Using Exact feasible MTU */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Using Exact feasible MTU: 0x%02X\n", mtu_phys);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mtu = mtu_phys;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0242: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=0 with exact MTU - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.5: */
|
|
Packit |
13e616 |
/* - Check the returned MGID is valid. (p 804) */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Validating resulting MGID (o15.0.1.5)...\n");
|
|
Packit |
13e616 |
/* prefix 0xFF1 Scope 0xA01B */
|
|
Packit |
13e616 |
/* Since we did not directly specified SCOPE in comp mask
|
|
Packit |
13e616 |
we should get the comp mask that is link-local scope */
|
|
Packit |
13e616 |
if ((p_mc_res->mgid.multicast.header[0] != 0xFF) ||
|
|
Packit |
13e616 |
(p_mc_res->mgid.multicast.header[1] != 0x12) ||
|
|
Packit |
13e616 |
(p_mc_res->mgid.multicast.raw_group_id[0] != 0xA0) ||
|
|
Packit |
13e616 |
(p_mc_res->mgid.multicast.raw_group_id[1] != 0x1B)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0209: "
|
|
Packit |
13e616 |
"Validating MGID failed. MGID:%s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Good Flow - mgid is 0 while giving all required fields for join : P_Key, Q_Key, SL, FlowLabel, Tclass */
|
|
Packit |
13e616 |
/* Using feasible GREATER_THAN 0 packet lifitime */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Create given MGID=0 (o15.0.1.4)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_query_mcast(p_osmt);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* no MGID */
|
|
Packit |
13e616 |
memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
mc_req_rec.pkey = IB_DEFAULT_PKEY;
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.pkt_life = 0 | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_LIFE | IB_MCR_COMPMASK_LIFE_SEL;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0210: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=0 - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.6: */
|
|
Packit |
13e616 |
/* - Create a new MCG with valid requested MGID. */
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
mc_req_rec.pkey = IB_DEFAULT_PKEY;
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Create given valid MGID=%s (o15.0.1.6)...\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, mc_req_rec.mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Before creation, need to check that this group doesn't exist */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Verifying that MCGroup with this MGID doesn't exist by trying to Join it (o15.0.1.13)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_NON_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, /* join */
|
|
Packit |
13e616 |
&mc_req_rec, comp_mask, sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0301: "
|
|
Packit |
13e616 |
"Tried joining group that shouldn't have existed - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Set State to full member to allow group creation */
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Now creating group with given valid MGID=%s (o15.0.1.6)...\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, mc_req_rec.mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0211: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=%s (o15.0.1.6) - got %s/%s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, good_mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Validating resulting MGID (o15.0.1.6)...\n");
|
|
Packit |
13e616 |
/* prefix 0xFF1 Scope 0xA01B */
|
|
Packit |
13e616 |
if ((p_mc_res->mgid.multicast.header[0] != 0xFF) || (p_mc_res->mgid.multicast.header[1] != 0x12) || /* HACK hardcoded scope = 0x02 */
|
|
Packit |
13e616 |
(p_mc_res->mgid.multicast.raw_group_id[0] != 0xA0) ||
|
|
Packit |
13e616 |
(p_mc_res->mgid.multicast.raw_group_id[1] != 0x1C)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0212: "
|
|
Packit |
13e616 |
"Validating MGID failed. MGID:%s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* - Try to create a new MCG with invalid MGID : get back ERR_REQ_INVALID */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking BAD MGID=0xFA..... (o15.0.1.6)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[0] = 0xFA;
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0213: "
|
|
Packit |
13e616 |
"Failed to recognize MGID error for MGID=0xFA - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* - Try again with MGID prefix = 0xA01B (maybe 0x1BA0 little or big ?) */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking BAD MGID=0xFF12A01B..... with link-local scope (o15.0.1.6)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[0] = 0xFF;
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[3] = 0x1B;
|
|
Packit |
13e616 |
comp_mask = comp_mask | IB_MCR_COMPMASK_SCOPE;
|
|
Packit |
13e616 |
mc_req_rec.scope_state = mc_req_rec.scope_state & 0x2F; /* local scope */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0214: "
|
|
Packit |
13e616 |
"Failed to recognize MGID error for A01B with link-local bit (status %s) (rem status %s)\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Change the mgid prefix - get back ERR_REQ_INVALID */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking BAD MGID PREFIX=0xEF... (o15.0.1.6)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[0] = 0xEF;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0215: "
|
|
Packit |
13e616 |
"Failed to recognize MGID PREFIX error for MGID=0xEF - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Change the scope to reserved - get back VALID REQ */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking local scope with full member \n\t\tand valid mgid %s"
|
|
Packit |
13e616 |
" ... (o15.0.1.6)...\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, mc_req_rec.mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[1] = 0x1F;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0216: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=%s - got %s/%s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, good_mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Change the flags to invalid value 0x2 - get back INVALID REQ */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking invalid flags=0xFF 22 ... (o15.0.1.6)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[1] = 0x22;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0217: "
|
|
Packit |
13e616 |
"Failed to recognize create with invalid flags value 0x2 - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Change the MGID to link local MGID - get back VALID REQ */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking link local MGID 0xFF02:0:0:0:0:0:0:1 (o15.0.1.6)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = osm_link_local_mgid;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0218: "
|
|
Packit |
13e616 |
"Failed to create MCG for MGID=0xFF02:0:0:0:0:0:0:1 - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.7 - implicitly checked during the prev steps */
|
|
Packit |
13e616 |
/* o15.0.1.8 - implicitly checked during the prev steps */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.9 */
|
|
Packit |
13e616 |
/* - Create MCG with Invalid JoinState.FullMember != 1 : get ERR_REQ_INVALID */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking new MGID with invalid join state (o15.0.1.9)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[12] = 0xFF;
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x22; /* link-local scope, non-member state */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0219: "
|
|
Packit |
13e616 |
"Failed to recognize create with JoinState != FullMember - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Lets try a valid join scope state */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking new MGID with valid join state (o15.0.1.9)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x23; /* link-local scope, non member and full member */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0220: "
|
|
Packit |
13e616 |
"Failed to create MCG with valid join state 0x3 - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Lets try another invalid join scope state */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking new MGID with invalid join state (o15.0.1.9)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* We have created a new MCG so now we need different mgid when creating group otherwise it will be counted as join request */
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[12] = 0xFC;
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x24; /* link-local scope, send only member */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0221: "
|
|
Packit |
13e616 |
"Failed to recognize create with JoinState != FullMember - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Lets try another valid join scope state */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking new MGID creation with valid join state (o15.0.2.3)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[12] = 0xFB;
|
|
Packit |
13e616 |
memcpy(&special_mgid, &mc_req_rec.mgid, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x2F; /* link-local scope, Full member with all other bits turned on */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0222: "
|
|
Packit |
13e616 |
"Failed to create MCG with valid join state 0xF - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids, cl_ntoh16(p_mc_res->mlid), p_mc_res);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.10 - can't check on a single client .-- obsolete -
|
|
Packit |
13e616 |
checked by SilverStorm bug o15-0.2.4, never the less recheck */
|
|
Packit |
13e616 |
/* o15-0.2.4 - Check a join request to already created MCG */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "Check o15-0.2.4 statement...\n");
|
|
Packit |
13e616 |
/* Try to join */
|
|
Packit |
13e616 |
memcpy(&mc_req_rec.mgid, &p_mc_res->mgid, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
/* Request Join */
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_NON_MEMBER);
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_JOIN_STATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0x1, /* SubnAdmSet */
|
|
Packit |
13e616 |
&mc_req_rec, comp_mask, sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CC: "
|
|
Packit |
13e616 |
"Failed to join MCG with valid req, returned status = %s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((p_mc_res->scope_state & 0x7) != 0x7) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D0: "
|
|
Packit |
13e616 |
"Validating JoinState update failed. "
|
|
Packit |
13e616 |
"Expected 0x27 got 0x%02X\n", p_mc_res->scope_state);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.11: */
|
|
Packit |
13e616 |
/* - Try to join into a MGID that exists with JoinState=SendOnlyMember - */
|
|
Packit |
13e616 |
/* see that it updates JoinState. What is the routing change? */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Retry of existing MGID - See JoinState update (o15.0.1.11)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* first, make sure that the group exists */
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x21;
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CD: "
|
|
Packit |
13e616 |
"Failed to create/join as full member - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x22; /* link-local scope, non-member */
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D1: "
|
|
Packit |
13e616 |
"Failed to update existing MGID - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Validating Join State update with NonMember (o15.0.1.11)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_mc_res->scope_state != 0x23) { /* scope is LSB */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CE: "
|
|
Packit |
13e616 |
"Validating JoinState update failed. Expected 0x23 got: 0x%02X\n",
|
|
Packit |
13e616 |
p_mc_res->scope_state);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Try delete current join state then update it with another value */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking JoinState update request should return 0x22 (o15.0.1.11)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.rate =
|
|
Packit |
13e616 |
IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Partially delete JoinState (o15.0.1.14)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* link-local scope, both non-member bits,
|
|
Packit |
13e616 |
so we should not be able to delete) */
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x26;
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CF: "
|
|
Packit |
13e616 |
"Expected to fail partially update JoinState, "
|
|
Packit |
13e616 |
"but got %s\n", ib_get_err_str(status));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* link-local scope, NonMember bit, the FullMember bit should stay */
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x22;
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D3: "
|
|
Packit |
13e616 |
"Failed to partially update JoinState : %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_mc_res->scope_state != 0x21) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02D4: "
|
|
Packit |
13e616 |
"Failed to partially update JoinState : "
|
|
Packit |
13e616 |
"JoinState = 0x%02X, expected 0x%02X\n",
|
|
Packit |
13e616 |
p_mc_res->scope_state, 0x21);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* So far successfully delete state - Now change it */
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x24; /* link-local scope, send only member */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C0: "
|
|
Packit |
13e616 |
"Failed to update existing MCG - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Validating Join State update with Send Only Member (o15.0.1.11)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_mc_res->scope_state != 0x25) { /* scope is MSB */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C1: "
|
|
Packit |
13e616 |
"Validating JoinState update failed. Expected 0x25 got: 0x%02X\n",
|
|
Packit |
13e616 |
p_mc_res->scope_state);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
/* Now try to update value of join state */
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x21; /* link-local scope, full member */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C2: "
|
|
Packit |
13e616 |
"Failed to update existing MGID - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Validating Join State update with Full Member\n\t\t"
|
|
Packit |
13e616 |
"to an existing 0x5 state MCG (o15.0.1.11)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_mc_res->scope_state != 0x25) { /* scope is LSB */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C3: "
|
|
Packit |
13e616 |
"Validating JoinState update failed. Expected 0x25 got: 0x%02X\n",
|
|
Packit |
13e616 |
p_mc_res->scope_state);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Now try to update value of join state */
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x22; /* link-local scope, non member */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C4: "
|
|
Packit |
13e616 |
"Failed to update existing MGID - got %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Validating Join State update with Non Member\n\t\t"
|
|
Packit |
13e616 |
"to an existing 0x5 state MCG (o15.0.1.11)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_mc_res->scope_state != 0x27) { /* scope is LSB */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C5: "
|
|
Packit |
13e616 |
"Validating JoinState update failed. Expected 0x27 got: 0x%02X\n",
|
|
Packit |
13e616 |
p_mc_res->scope_state);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"DEBUG - Current scope_state value : 0x%02X...\n",
|
|
Packit |
13e616 |
p_mc_res->scope_state);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* - We can not check simple join since we have only one tester (for now) */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.12: Not Supported */
|
|
Packit |
13e616 |
/* - The SendOnlyNonMem join should have a special treatment in the
|
|
Packit |
13e616 |
SA but what is it ? */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.13: */
|
|
Packit |
13e616 |
/* - Try joining with rate that does not exist in any MCG -
|
|
Packit |
13e616 |
ERR_REQ_INVALID */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking BAD RATE when connecting to existing MGID (o15.0.1.13)...\n");
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
mc_req_rec.rate =
|
|
Packit |
13e616 |
IB_PATH_RECORD_RATE_2_5_GBS | IB_PATH_SELECTOR_LESS_THAN << 6;
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_RATE_SEL | IB_MCR_COMPMASK_RATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C6: "
|
|
Packit |
13e616 |
"Failed to catch BAD RATE joining an existing MGID: %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Try MTU that does not exist in any MCG */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking BAD MTU (higher than max) when connecting to "
|
|
Packit |
13e616 |
"existing MGID (o15.0.1.13)...\n");
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = osm_ipoib_mgid;
|
|
Packit |
13e616 |
mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C7: "
|
|
Packit |
13e616 |
"Failed to catch BAD RATE (higher than max) joining an existing MGID: %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Try another MTU that does not exist in any MCG */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking BAD MTU (less than min) when connecting "
|
|
Packit |
13e616 |
"to existing MGID (o15.0.1.13)...\n");
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = osm_ipoib_mgid;
|
|
Packit |
13e616 |
mc_req_rec.mtu = IB_MTU_LEN_256 | IB_PATH_SELECTOR_LESS_THAN << 6;
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C8: "
|
|
Packit |
13e616 |
"Failed to catch BAD RATE (less than min) joining an existing MGID: %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.14: */
|
|
Packit |
13e616 |
/* - Try partial delete - actually updating the join state. check it. */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking partial JoinState delete request - removing NonMember (o15.0.1.14)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
/* link-local scope, non member (so we should not be able to delete) */
|
|
Packit |
13e616 |
/* but the NonMember bit should be gone */
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x22;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02C9: "
|
|
Packit |
13e616 |
"Fail to partially update JoinState during delete: %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Validating Join State removal of Non Member bit (o15.0.1.14)...\n");
|
|
Packit |
13e616 |
if (p_mc_res->scope_state != 0x25) { /* scope is MSB - now only the full member & send only member have left */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CA: "
|
|
Packit |
13e616 |
"Validating JoinState update failed. Expected 0x25 got: 0x%02X\n",
|
|
Packit |
13e616 |
p_mc_res->scope_state);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Now use the same scope_state and delete all JoinState - leave multicast group since state is 0x0 */
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x25;
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02CB: "
|
|
Packit |
13e616 |
"Failed to update JoinState during delete: %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Validating Join State update remove (o15.0.1.14)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_mc_res->scope_state != 0x20) { /* scope is MSB - now only 0x0 so port is removed from MCG */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BF: "
|
|
Packit |
13e616 |
"Validating JoinState update failed. Expected 0x20 got: 0x%02X\n",
|
|
Packit |
13e616 |
p_mc_res->scope_state);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* - Try joining (not full mem) again to see the group was deleted. (should fail) */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Delete by trying to Join deleted group (o15.0.1.13)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x22; /* use non member - so if no group fail */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, /* join */
|
|
Packit |
13e616 |
&mc_req_rec, comp_mask, sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BC: "
|
|
Packit |
13e616 |
"Succeeded Joining Deleted Group: %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* - Try deletion of the IPoIB MCG and get: ERR_REQ_INVALID */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking BAD Delete of Mgid membership (no prev join) (o15.0.1.15)...\n");
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = osm_ipoib_mgid;
|
|
Packit |
13e616 |
mc_req_rec.rate =
|
|
Packit |
13e616 |
IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x21; /* delete full member */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */
|
|
Packit |
13e616 |
&mc_req_rec, comp_mask, sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BD: "
|
|
Packit |
13e616 |
"Failed to catch BAD delete from IPoIB: %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Prepare another MCG for the following tests : */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Create given MGID=%s\n\t\t(o15.0.1.4)...\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, osm_ipoib_mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = good_mgid;
|
|
Packit |
13e616 |
mc_req_rec.mgid.raw[12] = 0xAA;
|
|
Packit |
13e616 |
mc_req_rec.pkt_life = 0 | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x21; /* Full member */
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_LIFE | IB_MCR_COMPMASK_LIFE_SEL;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02BE: "
|
|
Packit |
13e616 |
"Failed to create MCG for %s - got %s/%s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, good_mgid.raw, gid_str,
|
|
Packit |
13e616 |
sizeof gid_str), ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* - Try delete with valid join state */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Full Delete of a group (o15.0.1.14)...\n");
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x21; /* the FullMember is the current JoinState */
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS)
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15.0.1.15: */
|
|
Packit |
13e616 |
/* - Try deletion of the IPoIB MCG and get: ERR_REQ_INVALID */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking BAD Delete of IPoIB membership (no prev join) (o15.0.1.15)...\n");
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.mgid = osm_ipoib_mgid;
|
|
Packit |
13e616 |
mc_req_rec.rate =
|
|
Packit |
13e616 |
IB_LINK_WIDTH_ACTIVE_1X | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x21; /* delete full member */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */
|
|
Packit |
13e616 |
&mc_req_rec, comp_mask, sa_mad);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if ((status != IB_REMOTE_ERROR) ||
|
|
Packit |
13e616 |
(sa_mad->status != IB_SA_MAD_STATUS_REQ_INVALID)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0223: "
|
|
Packit |
13e616 |
"Failed to catch BAD delete from IPoIB: %s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/**************************************************************************/
|
|
Packit |
13e616 |
/* Checking join with invalid MTU */
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Join with unrealistic mtu : \n"
|
|
Packit |
13e616 |
"\t\tFirst create new MCG than try to join it \n"
|
|
Packit |
13e616 |
"\t\twith unrealistic MTU greater than 4096 (o15.0.1.8)...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* First create new mgrp */
|
|
Packit |
13e616 |
mc_req_rec.pkey = IB_DEFAULT_PKEY;
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
mc_req_rec.mtu = IB_MTU_LEN_1024 | IB_PATH_SELECTOR_EXACTLY << 6;
|
|
Packit |
13e616 |
memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02EB: "
|
|
Packit |
13e616 |
"Failed to create new mgrp\n");
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
memcpy(&tmp_mgid, &p_mc_res->mgid, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
osm_dump_mc_record(&p_osmt->log, p_mc_res, OSM_LOG_INFO);
|
|
Packit |
13e616 |
/* tmp_mtu = p_mc_res->mtu & 0x3F; */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* impossible requested mtu always greater than exist in MCG */
|
|
Packit |
13e616 |
mc_req_rec.mtu = IB_MTU_LEN_4096 | IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
memcpy(&mc_req_rec.mgid, &tmp_mgid, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec, IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_GID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_JOIN_STATE |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MTU_SEL | IB_MCR_COMPMASK_MTU;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status == IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E4: "
|
|
Packit |
13e616 |
"Expected REMOTE ERROR got:%s/%s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* - Try GetTable with PortGUID wildcarded and get back some groups. */
|
|
Packit |
13e616 |
status = osmt_query_mcast(p_osmt);
|
|
Packit |
13e616 |
cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(Before checking Max MCG creation): "
|
|
Packit |
13e616 |
"Number of MC Records found in SA DB is %d\n", cnt);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/**************************************************************************/
|
|
Packit |
13e616 |
/* Checking join on behalf of remote port gid */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "Checking Proxy Join...\n");
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Do a blocking query for all NodeRecords in the subnet.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_NODE_RECORD,
|
|
Packit |
13e616 |
sizeof(*p_rec), &context);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E5: "
|
|
Packit |
13e616 |
"osmtest_get_all_recs failed on getting all node records(%s)\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Populate the database with the received records.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
num_recs = context.result.result_cnt;
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %u records\n", num_recs);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i < num_recs; i++) {
|
|
Packit |
13e616 |
p_rec =
|
|
Packit |
13e616 |
osmv_get_query_node_rec(context.result.p_result_madw, i);
|
|
Packit |
13e616 |
if (p_rec->node_info.port_guid != p_osmt->local_port.port_guid
|
|
Packit |
13e616 |
&& p_rec->node_info.node_type == IB_NODE_TYPE_CA) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"remote port_guid = 0x%" PRIx64 "\n",
|
|
Packit |
13e616 |
cl_ntoh64(p_rec->node_info.port_guid));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
remote_port_guid = p_rec->node_info.port_guid;
|
|
Packit |
13e616 |
i = num_recs;
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (remote_port_guid != 0x0) {
|
|
Packit |
13e616 |
mc_req_rec.pkey = IB_DEFAULT_PKEY;
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec,
|
|
Packit |
13e616 |
IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
mc_req_rec.port_gid.unicast.interface_id = remote_port_guid;
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec,
|
|
Packit |
13e616 |
comp_mask, sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B4: "
|
|
Packit |
13e616 |
"Could not join on behalf of remote port 0x%016"
|
|
Packit |
13e616 |
PRIx64 " remote status: %s\n",
|
|
Packit |
13e616 |
cl_ntoh64(remote_port_guid),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memcpy(&proxy_mgid, &p_mc_res->mgid, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* First try a bad deletion then good one */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Trying deletion of remote port with local port guid\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec,
|
|
Packit |
13e616 |
IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_JOIN_STATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_START "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */
|
|
Packit |
13e616 |
&mc_req_rec,
|
|
Packit |
13e616 |
comp_mask, sa_mad);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, EXPECTING_ERRORS_END "\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status == IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02A9: "
|
|
Packit |
13e616 |
"Successful deletion of remote port guid with local one MGID : "
|
|
Packit |
13e616 |
"%s, Got : %s/%s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6,
|
|
Packit |
13e616 |
p_mgrp->mcmember_rec.mgid.raw,
|
|
Packit |
13e616 |
gid_str, sizeof gid_str),
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Trying deletion of remote port with the right port guid\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec,
|
|
Packit |
13e616 |
IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
mc_req_rec.mgid = proxy_mgid;
|
|
Packit |
13e616 |
mc_req_rec.port_gid.unicast.interface_id = remote_port_guid;
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_PORT_GID | IB_MCR_COMPMASK_JOIN_STATE;
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */
|
|
Packit |
13e616 |
&mc_req_rec,
|
|
Packit |
13e616 |
comp_mask, sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B0: "
|
|
Packit |
13e616 |
"Failed to delete mgid with remote port guid MGID : "
|
|
Packit |
13e616 |
"%s, Got : %s/%s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6,
|
|
Packit |
13e616 |
p_mgrp->mcmember_rec.mgid.raw,
|
|
Packit |
13e616 |
gid_str, sizeof gid_str),
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *) sa_mad));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
} else
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Could not check proxy join since could not found remote port, different from local port\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* prepare init for next check */
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/**************************************************************************/
|
|
Packit |
13e616 |
if (p_osmt->opt.mmode > 2) {
|
|
Packit |
13e616 |
/* Check invalid Join with max mlid which is more than the
|
|
Packit |
13e616 |
Mellanox switches support 0xC000+0x1000 = 0xd000 */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Checking Creation of Maximum available Groups (MulticastFDBCap)...\n");
|
|
Packit |
13e616 |
tmp_mlid = cl_ntoh16(max_mlid) - cnt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
while (tmp_mlid > 0) {
|
|
Packit |
13e616 |
uint16_t cur_mlid = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Request Set */
|
|
Packit |
13e616 |
ib_member_set_join_state(&mc_req_rec,
|
|
Packit |
13e616 |
IB_MC_REC_STATE_FULL_MEMBER);
|
|
Packit |
13e616 |
/* Good Flow - mgid is 0 while giving all required fields for
|
|
Packit |
13e616 |
join : P_Key, Q_Key, SL, FlowLabel, Tclass */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mc_req_rec.rate =
|
|
Packit |
13e616 |
IB_LINK_WIDTH_ACTIVE_1X |
|
|
Packit |
13e616 |
IB_PATH_SELECTOR_GREATER_THAN << 6;
|
|
Packit |
13e616 |
mc_req_rec.mlid = max_mlid;
|
|
Packit |
13e616 |
memset(&mc_req_rec.mgid, 0, sizeof(ib_gid_t));
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MLID;
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 1, &mc_req_rec,
|
|
Packit |
13e616 |
comp_mask, sa_mad);
|
|
Packit |
13e616 |
if (status == IB_SUCCESS) {
|
|
Packit |
13e616 |
cur_mlid = cl_ntoh16(p_mc_res->mlid);
|
|
Packit |
13e616 |
/* Save the mlid created in test_created_mlids map */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Created MGID:%s MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, p_mc_res->mgid.raw,
|
|
Packit |
13e616 |
gid_str, sizeof gid_str),
|
|
Packit |
13e616 |
cl_ntoh16(p_mc_res->mlid));
|
|
Packit |
13e616 |
cl_map_insert(&test_created_mlids,
|
|
Packit |
13e616 |
cl_ntoh16(p_mc_res->mlid),
|
|
Packit |
13e616 |
p_mc_res);
|
|
Packit |
13e616 |
} else if (cur_mlid > cl_ntoh16(max_mlid)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02E1 "
|
|
Packit |
13e616 |
"Successful Join with greater mlid than switches support (MulticastFDBCap) 0x%04X\n",
|
|
Packit |
13e616 |
cur_mlid);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
osm_dump_mc_record(&p_osmt->log, p_mc_res,
|
|
Packit |
13e616 |
OSM_LOG_VERBOSE);
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
} else if ((sa_mad->status & IB_SMP_STATUS_MASK) ==
|
|
Packit |
13e616 |
IB_SA_MAD_STATUS_NO_RESOURCES)
|
|
Packit |
13e616 |
/* You can quietly exit the loop since no available mlid in SA DB
|
|
Packit |
13e616 |
i.e. reached the maximum valid avalable mlid */
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
tmp_mlid--;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Prepare the mc_req_rec for the rest of the flow */
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/**************************************************************************/
|
|
Packit |
13e616 |
/* o15.0.1.16: */
|
|
Packit |
13e616 |
/* - Try GetTable with PortGUID wildcarded and get back some groups. */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_query_mcast(p_osmt);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B1: "
|
|
Packit |
13e616 |
"Failed to query multicast groups: %s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO, "(Before Deletion of all MCG): "
|
|
Packit |
13e616 |
"Number of MC Records found in SA DB is %d\n", cnt);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Delete all MCG that are not of IPoIB */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Cleanup all MCG that are not IPoIB...\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_mgrp_mlid_tbl = &p_osmt->exp_subn.mgrp_mlid_tbl;
|
|
Packit |
13e616 |
p_mgrp = (osmtest_mgrp_t *) cl_qmap_head(p_mgrp_mlid_tbl);
|
|
Packit |
13e616 |
/* scan all available multicast groups in the DB and fill in the table */
|
|
Packit |
13e616 |
while (p_mgrp != (osmtest_mgrp_t *) cl_qmap_end(p_mgrp_mlid_tbl)) {
|
|
Packit |
13e616 |
/* Only if different from IPoIB Mgid try to delete */
|
|
Packit |
13e616 |
if (!IS_IPOIB_MGID(&p_mgrp->mcmember_rec.mgid)) {
|
|
Packit |
13e616 |
osmt_init_mc_query_rec(p_osmt, &mc_req_rec);
|
|
Packit |
13e616 |
mc_req_rec.mgid = p_mgrp->mcmember_rec.mgid;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* o15-0.1.4 - need to specify the oppsite state for a valid delete */
|
|
Packit |
13e616 |
if (!memcmp(&special_mgid, &p_mgrp->mcmember_rec.mgid,
|
|
Packit |
13e616 |
sizeof(special_mgid)))
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x2F;
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
mc_req_rec.scope_state = 0x21;
|
|
Packit |
13e616 |
comp_mask =
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
|
|
Packit |
13e616 |
IB_MCR_COMPMASK_JOIN_STATE;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Sending request to delete MGID : %s"
|
|
Packit |
13e616 |
", scope_state : 0x%02X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6, mc_req_rec.mgid.raw,
|
|
Packit |
13e616 |
gid_str, sizeof gid_str),
|
|
Packit |
13e616 |
mc_req_rec.scope_state);
|
|
Packit |
13e616 |
status = osmt_send_mcast_request(p_osmt, 0, /* delete flag */
|
|
Packit |
13e616 |
&mc_req_rec, comp_mask,
|
|
Packit |
13e616 |
sa_mad);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 02FF: Failed to delete MGID : %s"
|
|
Packit |
13e616 |
" ,\n\t\t it is not our MCG, Status : %s/%s\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6,
|
|
Packit |
13e616 |
p_mgrp->mcmember_rec.mgid.raw,
|
|
Packit |
13e616 |
gid_str, sizeof gid_str),
|
|
Packit |
13e616 |
ib_get_err_str(status),
|
|
Packit |
13e616 |
ib_get_mad_status_str((ib_mad_t *)
|
|
Packit |
13e616 |
sa_mad));
|
|
Packit |
13e616 |
fail_to_delete_mcg++;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
} else
|
|
Packit |
13e616 |
end_ipoib_cnt++;
|
|
Packit |
13e616 |
p_mgrp = (osmtest_mgrp_t *) cl_qmap_next(&p_mgrp->map_item);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_query_mcast(p_osmt);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02B2 "
|
|
Packit |
13e616 |
"GetTable of all records has failed - got %s\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* If we are in single mode check flow - need to make sure all the multicast groups
|
|
Packit |
13e616 |
that are left are not ones created during the flow.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
if (p_osmt->opt.mmode == 1 || p_osmt->opt.mmode == 3) {
|
|
Packit |
13e616 |
end_cnt = cl_qmap_count(&p_osmt->exp_subn.mgrp_mlid_tbl);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
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 */
|
|
Packit |
13e616 |
start_ipoib_cnt, /* IPoIB records */
|
|
Packit |
13e616 |
start_cnt, /* Total: IPoIB and MC Records unrelated to the test */
|
|
Packit |
13e616 |
fail_to_delete_mcg, /* Failed to delete at the end */
|
|
Packit |
13e616 |
end_ipoib_cnt, /* IPoIB records */
|
|
Packit |
13e616 |
end_cnt); /* Total MC Records at the end */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* when we compare num of MCG we should consider an outside source which create other MCGs */
|
|
Packit |
13e616 |
if ((end_cnt - fail_to_delete_mcg - end_ipoib_cnt) !=
|
|
Packit |
13e616 |
(start_cnt - mcg_outside_test_cnt - start_ipoib_cnt)) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Got different number of non-IPoIB records stored in SA DB\n\t\t"
|
|
Packit |
13e616 |
"at Start got %d, at End got %d (IPoIB groups only)\n",
|
|
Packit |
13e616 |
(start_cnt - mcg_outside_test_cnt -
|
|
Packit |
13e616 |
start_ipoib_cnt),
|
|
Packit |
13e616 |
(end_cnt - fail_to_delete_mcg - end_ipoib_cnt));
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_mgrp_mlid_tbl = &p_osmt->exp_subn.mgrp_mlid_tbl;
|
|
Packit |
13e616 |
p_mgrp = (osmtest_mgrp_t *) cl_qmap_head(p_mgrp_mlid_tbl);
|
|
Packit |
13e616 |
while (p_mgrp !=
|
|
Packit |
13e616 |
(osmtest_mgrp_t *) cl_qmap_end(p_mgrp_mlid_tbl)) {
|
|
Packit |
13e616 |
uint16_t mlid =
|
|
Packit |
13e616 |
(uint16_t) cl_qmap_key((cl_map_item_t *) p_mgrp);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Found MLID:0x%04X\n", mlid);
|
|
Packit |
13e616 |
/* Check if the mlid is in the test_created_mlids. If TRUE, then we
|
|
Packit |
13e616 |
didn't delete a MCgroup that was created in this flow. */
|
|
Packit |
13e616 |
if (cl_map_get(&test_created_mlids, mlid) != NULL) {
|
|
Packit |
13e616 |
/* This means that we still have an mgrp that we created!! */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 02FE: "
|
|
Packit |
13e616 |
"Wasn't able to erase mgrp with MGID:%s"
|
|
Packit |
13e616 |
" MLID:0x%04X\n",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6,
|
|
Packit |
13e616 |
p_mgrp->mcmember_rec.mgid.raw,
|
|
Packit |
13e616 |
gid_str, sizeof gid_str),
|
|
Packit |
13e616 |
mlid);
|
|
Packit |
13e616 |
got_error = TRUE;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Still exists %s MGID:%s\n",
|
|
Packit |
13e616 |
(IS_IPOIB_MGID
|
|
Packit |
13e616 |
(&p_mgrp->mcmember_rec.
|
|
Packit |
13e616 |
mgid)) ? "IPoIB" : "non-IPoIB",
|
|
Packit |
13e616 |
inet_ntop(AF_INET6,
|
|
Packit |
13e616 |
p_mgrp->mcmember_rec.mgid.raw,
|
|
Packit |
13e616 |
gid_str, sizeof gid_str));
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
p_mgrp =
|
|
Packit |
13e616 |
(osmtest_mgrp_t *) cl_qmap_next(&p_mgrp->map_item);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (got_error) {
|
|
Packit |
13e616 |
__osmt_print_all_multicast_records(p_osmt);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
OSM_LOG_EXIT(&p_osmt->log);
|
|
Packit |
13e616 |
return status;
|
|
Packit |
13e616 |
}
|