Blame osmtest/osmt_multicast.c

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
}