|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2002-2006 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 service records testing flow..
|
|
Packit |
13e616 |
* Top level is osmt_run_service_records_flow:
|
|
Packit |
13e616 |
* osmt_register_service
|
|
Packit |
13e616 |
* osmt_get_service_by_name
|
|
Packit |
13e616 |
* osmt_get_all_services
|
|
Packit |
13e616 |
* osmt_delete_service_by_name
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#ifndef __WIN__
|
|
Packit |
13e616 |
#include <unistd.h>
|
|
Packit |
13e616 |
#else
|
|
Packit |
13e616 |
#include <time.h>
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
#include <stdio.h>
|
|
Packit |
13e616 |
#include <stdlib.h>
|
|
Packit |
13e616 |
#include <string.h>
|
|
Packit |
13e616 |
#include <complib/cl_debug.h>
|
|
Packit |
13e616 |
#include "osmtest.h"
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t
|
|
Packit |
13e616 |
osmt_register_service(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN ib_net64_t service_id,
|
|
Packit |
13e616 |
IN ib_net16_t service_pkey,
|
|
Packit |
13e616 |
IN ib_net32_t service_lease,
|
|
Packit |
13e616 |
IN uint8_t service_key_lsb, IN char *service_name)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
osmv_user_query_t user;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
ib_service_record_t svc_rec;
|
|
Packit |
13e616 |
osm_log_t *p_log = &p_osmt->log;
|
|
Packit |
13e616 |
ib_api_status_t status;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(p_log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Registering service: name: %s id: 0x%" PRIx64 "\n",
|
|
Packit |
13e616 |
service_name, cl_ntoh64(service_id));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
memset(&user, 0, sizeof(user));
|
|
Packit |
13e616 |
memset(&svc_rec, 0, sizeof(svc_rec));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* set the new service record fields */
|
|
Packit |
13e616 |
svc_rec.service_id = service_id;
|
|
Packit |
13e616 |
svc_rec.service_pkey = service_pkey;
|
|
Packit |
13e616 |
svc_rec.service_gid.unicast.prefix = p_osmt->local_port_gid.unicast.prefix;
|
|
Packit |
13e616 |
svc_rec.service_gid.unicast.interface_id = p_osmt->local_port.port_guid;
|
|
Packit |
13e616 |
svc_rec.service_lease = service_lease;
|
|
Packit |
13e616 |
memset(&svc_rec.service_key, 0, 16 * sizeof(uint8_t));
|
|
Packit |
13e616 |
svc_rec.service_key[0] = service_key_lsb;
|
|
Packit |
13e616 |
memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name));
|
|
Packit |
13e616 |
memcpy(svc_rec.service_name, service_name,
|
|
Packit |
13e616 |
(strlen(service_name) + 1) * sizeof(char));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* prepare the data used for this query */
|
|
Packit |
13e616 |
/* sa_mad_data.method = IB_MAD_METHOD_SET; */
|
|
Packit |
13e616 |
/* sa_mad_data.sm_key = 0; */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
req.query_context = &context;
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_USER_DEFINED;
|
|
Packit |
13e616 |
req.pfn_query_cb = osmtest_query_res_cb;
|
|
Packit |
13e616 |
req.p_query_input = &use;;
|
|
Packit |
13e616 |
req.flags = OSM_SA_FLAGS_SYNC;
|
|
Packit |
13e616 |
req.sm_key = 0;
|
|
Packit |
13e616 |
req.timeout_ms = p_osmt->opt.transaction_timeout;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
user.method = IB_MAD_METHOD_SET;
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_SERVICE_RECORD;
|
|
Packit |
13e616 |
if (ib_pkey_is_invalid(service_pkey)) {
|
|
Packit |
13e616 |
/* if given an invalid service_pkey - don't turn the PKEY compmask on */
|
|
Packit |
13e616 |
user.comp_mask = IB_SR_COMPMASK_SID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SGID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SLEASE |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SKEY | IB_SR_COMPMASK_SNAME;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
user.comp_mask = IB_SR_COMPMASK_SID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SGID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SPKEY |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SLEASE |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SKEY | IB_SR_COMPMASK_SNAME;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
user.p_attr = &svc_rec;
|
|
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 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A01: "
|
|
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 4A02: "
|
|
Packit |
13e616 |
"ib_query failed (%s)\n", ib_get_err_str(status));
|
|
Packit |
13e616 |
|
|
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 |
goto Exit;
|
|
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 |
ib_api_status_t
|
|
Packit |
13e616 |
osmt_register_service_with_full_key(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN ib_net64_t service_id,
|
|
Packit |
13e616 |
IN ib_net16_t service_pkey,
|
|
Packit |
13e616 |
IN ib_net32_t service_lease,
|
|
Packit |
13e616 |
IN uint8_t * service_key,
|
|
Packit |
13e616 |
IN char *service_name)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
osmv_user_query_t user;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
ib_service_record_t svc_rec, *p_rec;
|
|
Packit |
13e616 |
osm_log_t *p_log = &p_osmt->log;
|
|
Packit |
13e616 |
ib_api_status_t status;
|
|
Packit |
13e616 |
uint8_t i, skey[16];
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(p_log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Registering service: name: %s id: 0x%" PRIx64 "\n",
|
|
Packit |
13e616 |
service_name, cl_ntoh64(service_id));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
memset(&user, 0, sizeof(user));
|
|
Packit |
13e616 |
memset(&svc_rec, 0, sizeof(svc_rec));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* set the new service record fields */
|
|
Packit |
13e616 |
svc_rec.service_id = service_id;
|
|
Packit |
13e616 |
svc_rec.service_pkey = service_pkey;
|
|
Packit |
13e616 |
svc_rec.service_gid.unicast.prefix = p_osmt->local_port_gid.unicast.prefix;
|
|
Packit |
13e616 |
svc_rec.service_gid.unicast.interface_id = p_osmt->local_port.port_guid;
|
|
Packit |
13e616 |
svc_rec.service_lease = service_lease;
|
|
Packit |
13e616 |
memset(&svc_rec.service_key, 0, 16 * sizeof(uint8_t));
|
|
Packit |
13e616 |
memcpy(svc_rec.service_key, service_key, 16 * sizeof(uint8_t));
|
|
Packit |
13e616 |
memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name));
|
|
Packit |
13e616 |
memset(skey, 0, 16 * sizeof(uint8_t));
|
|
Packit |
13e616 |
memcpy(svc_rec.service_name, service_name,
|
|
Packit |
13e616 |
(strlen(service_name) + 1) * sizeof(char));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* prepare the data used for this query */
|
|
Packit |
13e616 |
/* sa_mad_data.method = IB_MAD_METHOD_SET; */
|
|
Packit |
13e616 |
/* sa_mad_data.sm_key = 0; */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
req.query_context = &context;
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_USER_DEFINED;
|
|
Packit |
13e616 |
req.pfn_query_cb = osmtest_query_res_cb;
|
|
Packit |
13e616 |
req.p_query_input = &use;;
|
|
Packit |
13e616 |
req.flags = OSM_SA_FLAGS_SYNC;
|
|
Packit |
13e616 |
req.sm_key = 0;
|
|
Packit |
13e616 |
req.timeout_ms = p_osmt->opt.transaction_timeout;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
user.method = IB_MAD_METHOD_SET;
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_SERVICE_RECORD;
|
|
Packit |
13e616 |
if (ib_pkey_is_invalid(service_pkey)) {
|
|
Packit |
13e616 |
/* if given an invalid service_pkey - don't turn the PKEY compmask on */
|
|
Packit |
13e616 |
user.comp_mask = IB_SR_COMPMASK_SID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SGID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SLEASE |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SKEY | IB_SR_COMPMASK_SNAME;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
user.comp_mask = IB_SR_COMPMASK_SID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SGID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SPKEY |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SLEASE |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SKEY | IB_SR_COMPMASK_SNAME;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
user.p_attr = &svc_rec;
|
|
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 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A03: "
|
|
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 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A04: "
|
|
Packit |
13e616 |
"ib_query failed (%s)\n", ib_get_err_str(status));
|
|
Packit |
13e616 |
|
|
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 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check service key on context to see if match */
|
|
Packit |
13e616 |
p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Comparing service key...\n" "return key is:\n");
|
|
Packit |
13e616 |
for (i = 0; i <= 15; i++) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"service_key sent[%u] = %u, service_key returned[%u] = %u\n",
|
|
Packit |
13e616 |
i, service_key[i], i, p_rec->service_key[i]);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
/* since c15-0.1.14 not supported all key association queries should bring in return zero in service key */
|
|
Packit |
13e616 |
if (memcmp(skey, p_rec->service_key, 16 * sizeof(uint8_t)) != 0) {
|
|
Packit |
13e616 |
status = IB_REMOTE_ERROR;
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A33: "
|
|
Packit |
13e616 |
"Data mismatch in service_key\n");
|
|
Packit |
13e616 |
goto Exit;
|
|
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 |
ib_api_status_t
|
|
Packit |
13e616 |
osmt_register_service_with_data(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN ib_net64_t service_id,
|
|
Packit |
13e616 |
IN ib_net16_t service_pkey,
|
|
Packit |
13e616 |
IN ib_net32_t service_lease,
|
|
Packit |
13e616 |
IN uint8_t service_key_lsb,
|
|
Packit |
13e616 |
IN uint8_t * service_data8,
|
|
Packit |
13e616 |
IN ib_net16_t * service_data16,
|
|
Packit |
13e616 |
IN ib_net32_t * service_data32,
|
|
Packit |
13e616 |
IN ib_net64_t * service_data64,
|
|
Packit |
13e616 |
IN char *service_name)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
osmv_user_query_t user;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
ib_service_record_t svc_rec, *p_rec;
|
|
Packit |
13e616 |
osm_log_t *p_log = &p_osmt->log;
|
|
Packit |
13e616 |
ib_api_status_t status;
|
|
Packit |
13e616 |
/* ib_service_record_t* p_rec; */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(p_log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Registering service: name: %s id: 0x%" PRIx64 "\n",
|
|
Packit |
13e616 |
service_name, cl_ntoh64(service_id));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
memset(&user, 0, sizeof(user));
|
|
Packit |
13e616 |
memset(&svc_rec, 0, sizeof(svc_rec));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* set the new service record fields */
|
|
Packit |
13e616 |
svc_rec.service_id = service_id;
|
|
Packit |
13e616 |
svc_rec.service_pkey = service_pkey;
|
|
Packit |
13e616 |
svc_rec.service_gid.unicast.prefix = p_osmt->local_port_gid.unicast.prefix;
|
|
Packit |
13e616 |
svc_rec.service_gid.unicast.interface_id = p_osmt->local_port.port_guid;
|
|
Packit |
13e616 |
svc_rec.service_lease = service_lease;
|
|
Packit |
13e616 |
memset(&svc_rec.service_key, 0, 16 * sizeof(uint8_t));
|
|
Packit |
13e616 |
svc_rec.service_key[0] = service_key_lsb;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Copy data to service_data arrays */
|
|
Packit |
13e616 |
memcpy(svc_rec.service_data8, service_data8, 16 * sizeof(uint8_t));
|
|
Packit |
13e616 |
memcpy(svc_rec.service_data16, service_data16, 8 * sizeof(ib_net16_t));
|
|
Packit |
13e616 |
memcpy(svc_rec.service_data32, service_data32, 4 * sizeof(ib_net32_t));
|
|
Packit |
13e616 |
memcpy(svc_rec.service_data64, service_data64, 2 * sizeof(ib_net64_t));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name));
|
|
Packit |
13e616 |
memcpy(svc_rec.service_name, service_name,
|
|
Packit |
13e616 |
(strlen(service_name) + 1) * sizeof(char));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* prepare the data used for this query */
|
|
Packit |
13e616 |
/* sa_mad_data.method = IB_MAD_METHOD_SET; */
|
|
Packit |
13e616 |
/* sa_mad_data.sm_key = 0; */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
req.query_context = &context;
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_USER_DEFINED;
|
|
Packit |
13e616 |
req.pfn_query_cb = osmtest_query_res_cb;
|
|
Packit |
13e616 |
req.p_query_input = &use;;
|
|
Packit |
13e616 |
req.flags = OSM_SA_FLAGS_SYNC;
|
|
Packit |
13e616 |
req.sm_key = 0;
|
|
Packit |
13e616 |
req.timeout_ms = p_osmt->opt.transaction_timeout;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
user.method = IB_MAD_METHOD_SET;
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_SERVICE_RECORD;
|
|
Packit |
13e616 |
if (ib_pkey_is_invalid(service_pkey)) {
|
|
Packit |
13e616 |
/* if given an invalid service_pkey - don't turn the PKEY compmask on */
|
|
Packit |
13e616 |
user.comp_mask = IB_SR_COMPMASK_SID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SGID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SLEASE |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SKEY |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SNAME |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA8_0 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA8_1 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA16_0 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA16_1 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA32_0 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA32_1 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA64_0 | IB_SR_COMPMASK_SDATA64_1;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
user.comp_mask = IB_SR_COMPMASK_SID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SGID |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SPKEY |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SLEASE |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SKEY |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SNAME |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA8_0 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA8_1 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA16_0 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA16_1 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA32_0 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA32_1 |
|
|
Packit |
13e616 |
IB_SR_COMPMASK_SDATA64_0 | IB_SR_COMPMASK_SDATA64_1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
user.p_attr = &svc_rec;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Dump to Service Data b4 send */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Dumping service data b4 send\n");
|
|
Packit |
13e616 |
osm_dump_service_record(&p_osmt->log, &svc_rec, OSM_LOG_VERBOSE);
|
|
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 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A05: "
|
|
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 4A06: "
|
|
Packit |
13e616 |
"ib_query failed (%s)\n", ib_get_err_str(status));
|
|
Packit |
13e616 |
|
|
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 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check data on context to see if match */
|
|
Packit |
13e616 |
p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Comparing service data...\n");
|
|
Packit |
13e616 |
if (memcmp(service_data8, p_rec->service_data8, 16 * sizeof(uint8_t)) !=
|
|
Packit |
13e616 |
0
|
|
Packit |
13e616 |
|| memcmp(service_data16, p_rec->service_data16,
|
|
Packit |
13e616 |
8 * sizeof(uint16_t)) != 0
|
|
Packit |
13e616 |
|| memcmp(service_data32, p_rec->service_data32,
|
|
Packit |
13e616 |
4 * sizeof(uint32_t)) != 0
|
|
Packit |
13e616 |
|| memcmp(service_data64, p_rec->service_data64,
|
|
Packit |
13e616 |
2 * sizeof(uint64_t)) != 0) {
|
|
Packit |
13e616 |
status = IB_REMOTE_ERROR;
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"Data mismatch in service_data8\n");
|
|
Packit |
13e616 |
goto Exit;
|
|
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 |
ib_api_status_t
|
|
Packit |
13e616 |
osmt_get_service_by_id_and_name(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN uint32_t rec_num,
|
|
Packit |
13e616 |
IN ib_net64_t sid,
|
|
Packit |
13e616 |
IN char *sr_name,
|
|
Packit |
13e616 |
OUT ib_service_record_t * p_out_rec)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t status = IB_SUCCESS;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
ib_service_record_t svc_rec, *p_rec;
|
|
Packit |
13e616 |
uint32_t num_recs = 0;
|
|
Packit |
13e616 |
osmv_user_query_t user;
|
|
Packit |
13e616 |
const uint16_t ERR_SIZE = 512;
|
|
Packit |
13e616 |
char mad_stat_err[ERR_SIZE];
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&p_osmt->log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Getting service record: id: 0x%016" PRIx64
|
|
Packit |
13e616 |
" and name: %s\n", cl_ntoh64(sid), sr_name);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Do a blocking query for this record 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 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* prepare the data used for this query */
|
|
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.sm_key = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&svc_rec, 0, sizeof(svc_rec));
|
|
Packit |
13e616 |
memset(&user, 0, sizeof(user));
|
|
Packit |
13e616 |
/* set the new service record fields */
|
|
Packit |
13e616 |
memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name));
|
|
Packit |
13e616 |
memcpy(svc_rec.service_name, sr_name,
|
|
Packit |
13e616 |
(strlen(sr_name) + 1) * sizeof(char));
|
|
Packit |
13e616 |
svc_rec.service_id = sid;
|
|
Packit |
13e616 |
req.p_query_input = &use;;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
user.method = IB_MAD_METHOD_GET;
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_SERVICE_RECORD;
|
|
Packit |
13e616 |
user.comp_mask = IB_SR_COMPMASK_SID | IB_SR_COMPMASK_SNAME;
|
|
Packit |
13e616 |
user.p_attr = &svc_rec;
|
|
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 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A07: "
|
|
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 |
num_recs = context.result.result_cnt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* If the failure is due to IB_SA_MAD_STATUS_NO_RECORDS and rec_num is 0,
|
|
Packit |
13e616 |
then this is fine */
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR)
|
|
Packit |
13e616 |
strncpy(mad_stat_err,
|
|
Packit |
13e616 |
ib_get_mad_status_str(osm_madw_get_mad_ptr
|
|
Packit |
13e616 |
(context.result.
|
|
Packit |
13e616 |
p_result_madw)),
|
|
Packit |
13e616 |
ERR_SIZE -1);
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
strncpy(mad_stat_err, ib_get_err_str(status),
|
|
Packit |
13e616 |
ERR_SIZE -1);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mad_stat_err[ERR_SIZE -1] = '\0';
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR &&
|
|
Packit |
13e616 |
!strcmp(mad_stat_err, "IB_SA_MAD_STATUS_NO_RECORDS") &&
|
|
Packit |
13e616 |
rec_num == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"IS EXPECTED ERROR ^^^^\n");
|
|
Packit |
13e616 |
status = IB_SUCCESS;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A08: "
|
|
Packit |
13e616 |
"Query failed: %s (%s)\n",
|
|
Packit |
13e616 |
ib_get_err_str(status), mad_stat_err);
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (rec_num && num_recs != rec_num) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"Unmatched number of records: expected: %d, received: %d\n",
|
|
Packit |
13e616 |
rec_num, num_recs);
|
|
Packit |
13e616 |
status = IB_REMOTE_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0);
|
|
Packit |
13e616 |
*p_out_rec = *p_rec;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (num_recs) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Found service record: name: %s id: 0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
p_rec->service_name, cl_ntoh64(p_rec->service_id));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_dump_service_record(&p_osmt->log, p_rec, OSM_LOG_DEBUG);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Expected and found %d records\n", rec_num);
|
|
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 |
ib_api_status_t
|
|
Packit |
13e616 |
osmt_get_service_by_id(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN uint32_t rec_num,
|
|
Packit |
13e616 |
IN ib_net64_t sid, OUT ib_service_record_t * p_out_rec)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t status = IB_SUCCESS;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
ib_service_record_t svc_rec, *p_rec;
|
|
Packit |
13e616 |
uint32_t num_recs = 0;
|
|
Packit |
13e616 |
osmv_user_query_t user;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&p_osmt->log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Getting service record: id: 0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
cl_ntoh64(sid));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Do a blocking query for this record 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 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* prepare the data used for this query */
|
|
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.sm_key = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&svc_rec, 0, sizeof(svc_rec));
|
|
Packit |
13e616 |
memset(&user, 0, sizeof(user));
|
|
Packit |
13e616 |
/* set the new service record fields */
|
|
Packit |
13e616 |
svc_rec.service_id = sid;
|
|
Packit |
13e616 |
req.p_query_input = &use;;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
user.method = IB_MAD_METHOD_GET;
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_SERVICE_RECORD;
|
|
Packit |
13e616 |
user.comp_mask = IB_SR_COMPMASK_SID;
|
|
Packit |
13e616 |
user.p_attr = &svc_rec;
|
|
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 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A09: "
|
|
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 |
num_recs = context.result.result_cnt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
char mad_stat_err[256];
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* If the failure is due to IB_SA_MAD_STATUS_NO_RECORDS and rec_num is 0,
|
|
Packit |
13e616 |
then this is fine */
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR)
|
|
Packit |
13e616 |
strcpy(mad_stat_err,
|
|
Packit |
13e616 |
ib_get_mad_status_str(osm_madw_get_mad_ptr
|
|
Packit |
13e616 |
(context.result.
|
|
Packit |
13e616 |
p_result_madw)));
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
strcpy(mad_stat_err, ib_get_err_str(status));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR &&
|
|
Packit |
13e616 |
!strcmp(mad_stat_err, "IB_SA_MAD_STATUS_NO_RECORDS") &&
|
|
Packit |
13e616 |
rec_num == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"IS EXPECTED ERROR ^^^^\n");
|
|
Packit |
13e616 |
status = IB_SUCCESS;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0A: "
|
|
Packit |
13e616 |
"Query failed: %s (%s)\n",
|
|
Packit |
13e616 |
ib_get_err_str(status), mad_stat_err);
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (rec_num && num_recs != rec_num) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0B: "
|
|
Packit |
13e616 |
"Unmatched number of records: expected: %d received: %d\n",
|
|
Packit |
13e616 |
rec_num, num_recs);
|
|
Packit |
13e616 |
status = IB_REMOTE_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0);
|
|
Packit |
13e616 |
*p_out_rec = *p_rec;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (num_recs) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Found service record: name: %s id: 0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
p_rec->service_name, cl_ntoh64(p_rec->service_id));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_dump_service_record(&p_osmt->log, p_rec, OSM_LOG_DEBUG);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Expected and found %d records\n", rec_num);
|
|
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 |
ib_api_status_t
|
|
Packit |
13e616 |
osmt_get_service_by_name_and_key(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN char *sr_name,
|
|
Packit |
13e616 |
IN uint32_t rec_num,
|
|
Packit |
13e616 |
IN uint8_t * skey,
|
|
Packit |
13e616 |
OUT ib_service_record_t * p_out_rec)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t status = IB_SUCCESS;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
ib_service_record_t svc_rec, *p_rec;
|
|
Packit |
13e616 |
uint32_t num_recs = 0, i;
|
|
Packit |
13e616 |
osmv_user_query_t user;
|
|
Packit |
13e616 |
const uint16_t ERR_SIZE = 512;
|
|
Packit |
13e616 |
char mad_stat_err[ERR_SIZE];
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&p_osmt->log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Getting service record: name: %s and key: "
|
|
Packit |
13e616 |
"0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
|
|
Packit |
13e616 |
sr_name, skey[0], skey[1], skey[2], skey[3], skey[4], skey[5],
|
|
Packit |
13e616 |
skey[6], skey[7], skey[8], skey[9], skey[10], skey[11],
|
|
Packit |
13e616 |
skey[12], skey[13], skey[14], skey[15]);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Do a blocking query for this record 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 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* prepare the data used for this query */
|
|
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.sm_key = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&svc_rec, 0, sizeof(svc_rec));
|
|
Packit |
13e616 |
memset(&user, 0, sizeof(user));
|
|
Packit |
13e616 |
/* set the new service record fields */
|
|
Packit |
13e616 |
memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name));
|
|
Packit |
13e616 |
memcpy(svc_rec.service_name, sr_name,
|
|
Packit |
13e616 |
(strlen(sr_name) + 1) * sizeof(char));
|
|
Packit |
13e616 |
for (i = 0; i <= 15; i++)
|
|
Packit |
13e616 |
svc_rec.service_key[i] = skey[i];
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
req.p_query_input = &use;;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
user.method = IB_MAD_METHOD_GET;
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_SERVICE_RECORD;
|
|
Packit |
13e616 |
user.comp_mask = IB_SR_COMPMASK_SNAME | IB_SR_COMPMASK_SKEY;
|
|
Packit |
13e616 |
user.p_attr = &svc_rec;
|
|
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 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0C: "
|
|
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 |
num_recs = context.result.result_cnt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* If the failure is due to IB_SA_MAD_STATUS_NO_RECORDS and rec_num is 0,
|
|
Packit |
13e616 |
then this is fine */
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR)
|
|
Packit |
13e616 |
strncpy(mad_stat_err,
|
|
Packit |
13e616 |
ib_get_mad_status_str(osm_madw_get_mad_ptr
|
|
Packit |
13e616 |
(context.result.
|
|
Packit |
13e616 |
p_result_madw)),
|
|
Packit |
13e616 |
ERR_SIZE -1);
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
strncpy(mad_stat_err, ib_get_err_str(status),
|
|
Packit |
13e616 |
ERR_SIZE -1);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
mad_stat_err[ERR_SIZE -1] = '\0';
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR &&
|
|
Packit |
13e616 |
!strcmp(mad_stat_err, "IB_SA_MAD_STATUS_NO_RECORDS") &&
|
|
Packit |
13e616 |
rec_num == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"IS EXPECTED ERROR ^^^^\n");
|
|
Packit |
13e616 |
status = IB_SUCCESS;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0D: "
|
|
Packit |
13e616 |
"Query failed:%s (%s)\n",
|
|
Packit |
13e616 |
ib_get_err_str(status), mad_stat_err);
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (rec_num && num_recs != rec_num) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"Unmatched number of records: expected: %d, received: %d\n",
|
|
Packit |
13e616 |
rec_num, num_recs);
|
|
Packit |
13e616 |
status = IB_REMOTE_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0);
|
|
Packit |
13e616 |
*p_out_rec = *p_rec;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (num_recs) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Found service record: name: %s id: 0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
sr_name, cl_ntoh64(p_rec->service_id));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_dump_service_record(&p_osmt->log, p_rec, OSM_LOG_DEBUG);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Expected and found %d records\n", rec_num);
|
|
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 |
ib_api_status_t
|
|
Packit |
13e616 |
osmt_get_service_by_name(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN char *sr_name,
|
|
Packit |
13e616 |
IN uint32_t rec_num,
|
|
Packit |
13e616 |
OUT ib_service_record_t * p_out_rec)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t status = IB_SUCCESS;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
ib_service_record_t *p_rec;
|
|
Packit |
13e616 |
ib_svc_name_t service_name;
|
|
Packit |
13e616 |
uint32_t num_recs = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&p_osmt->log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Getting service record: name: %s\n", sr_name);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Do a blocking query for this record 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 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* prepare the data used for this query */
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_SVC_REC_BY_NAME;
|
|
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.sm_key = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(service_name, 0, sizeof(service_name));
|
|
Packit |
13e616 |
memcpy(service_name, sr_name, (strlen(sr_name) + 1) * sizeof(char));
|
|
Packit |
13e616 |
req.p_query_input = service_name;
|
|
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 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0E: "
|
|
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 |
num_recs = context.result.result_cnt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
char mad_stat_err[256];
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* If the failure is due to IB_SA_MAD_STATUS_NO_RECORDS and rec_num is 0,
|
|
Packit |
13e616 |
then this is fine */
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR)
|
|
Packit |
13e616 |
strcpy(mad_stat_err,
|
|
Packit |
13e616 |
ib_get_mad_status_str(osm_madw_get_mad_ptr
|
|
Packit |
13e616 |
(context.result.
|
|
Packit |
13e616 |
p_result_madw)));
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
strcpy(mad_stat_err, ib_get_err_str(status));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR &&
|
|
Packit |
13e616 |
!strcmp(mad_stat_err, "IB_SA_MAD_STATUS_NO_RECORDS") &&
|
|
Packit |
13e616 |
rec_num == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"IS EXPECTED ERROR ^^^^\n");
|
|
Packit |
13e616 |
status = IB_SUCCESS;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A0F: "
|
|
Packit |
13e616 |
"Query failed: %s (%s)\n",
|
|
Packit |
13e616 |
ib_get_err_str(status), mad_stat_err);
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (rec_num && num_recs != rec_num) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A10: "
|
|
Packit |
13e616 |
"Unmatched number of records: expected: %d, received: %d\n",
|
|
Packit |
13e616 |
rec_num, num_recs);
|
|
Packit |
13e616 |
status = IB_REMOTE_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, 0);
|
|
Packit |
13e616 |
*p_out_rec = *p_rec;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (num_recs) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Found service record: name: %s id: 0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
sr_name, cl_ntoh64(p_rec->service_id));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_dump_service_record(&p_osmt->log, p_rec, OSM_LOG_DEBUG);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Expected and found %d records\n", rec_num);
|
|
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 |
#ifdef VENDOR_RMPP_SUPPORT
|
|
Packit |
13e616 |
ib_api_status_t
|
|
Packit |
13e616 |
osmt_get_all_services_and_check_names(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN ib_svc_name_t *
|
|
Packit |
13e616 |
const p_valid_service_names_arr,
|
|
Packit |
13e616 |
IN uint8_t num_of_valid_names,
|
|
Packit |
13e616 |
OUT uint32_t * num_services)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
ib_api_status_t status = IB_SUCCESS;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
ib_service_record_t *p_rec;
|
|
Packit |
13e616 |
uint32_t num_recs = 0, i, j;
|
|
Packit |
13e616 |
uint8_t *p_checked_names;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&p_osmt->log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Prepare tracker for the checked names */
|
|
Packit |
13e616 |
p_checked_names =
|
|
Packit |
13e616 |
(uint8_t *) malloc(sizeof(uint8_t) * num_of_valid_names);
|
|
Packit |
13e616 |
for (j = 0; j < num_of_valid_names; j++) {
|
|
Packit |
13e616 |
p_checked_names[j] = 0;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Getting all service records\n");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Do a blocking query for this record 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 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_ALL_SVC_RECS;
|
|
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.sm_key = 0;
|
|
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 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A12: "
|
|
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 |
if (status != IB_INVALID_PARAMETER) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A13: "
|
|
Packit |
13e616 |
"ib_query failed (%s)\n", ib_get_err_str(status));
|
|
Packit |
13e616 |
}
|
|
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 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
num_recs = context.result.result_cnt;
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Received %u records\n", num_recs);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i < num_recs; i++) {
|
|
Packit |
13e616 |
p_rec = osmv_get_query_svc_rec(context.result.p_result_madw, i);
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"Found service record: name: %s id: 0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
p_rec->service_name, cl_ntoh64(p_rec->service_id));
|
|
Packit |
13e616 |
osm_dump_service_record(&p_osmt->log, p_rec, OSM_LOG_VERBOSE);
|
|
Packit |
13e616 |
for (j = 0; j < num_of_valid_names; j++) {
|
|
Packit |
13e616 |
/* If the service names exist in the record, mark it as checked (1) */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"-I- Comparing source name : >%s<, with record name : >%s<, idx : %d\n",
|
|
Packit |
13e616 |
p_valid_service_names_arr[j],
|
|
Packit |
13e616 |
p_rec->service_name, p_checked_names[j]);
|
|
Packit |
13e616 |
if (strcmp
|
|
Packit |
13e616 |
((char *)p_valid_service_names_arr[j],
|
|
Packit |
13e616 |
(char *)p_rec->service_name) == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
|
|
Packit |
13e616 |
"-I- The service %s is valid\n",
|
|
Packit |
13e616 |
p_valid_service_names_arr[j]);
|
|
Packit |
13e616 |
p_checked_names[j] = 1;
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
/* Check that all service names have been identified */
|
|
Packit |
13e616 |
for (j = 0; j < num_of_valid_names; j++)
|
|
Packit |
13e616 |
if (p_checked_names[j] == 0) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A14: "
|
|
Packit |
13e616 |
"Missing valid service: name: %s\n",
|
|
Packit |
13e616 |
p_valid_service_names_arr[j]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
*num_services = num_recs;
|
|
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 |
free(p_checked_names);
|
|
Packit |
13e616 |
OSM_LOG_EXIT(&p_osmt->log);
|
|
Packit |
13e616 |
return status;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ib_api_status_t
|
|
Packit |
13e616 |
osmt_delete_service_by_name(IN osmtest_t * const p_osmt,
|
|
Packit |
13e616 |
IN uint8_t IsServiceExist,
|
|
Packit |
13e616 |
IN char *sr_name, IN uint32_t rec_num)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osmv_query_req_t req;
|
|
Packit |
13e616 |
osmv_user_query_t user;
|
|
Packit |
13e616 |
osmtest_req_context_t context;
|
|
Packit |
13e616 |
ib_service_record_t svc_rec;
|
|
Packit |
13e616 |
ib_api_status_t status;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&p_osmt->log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Trying to Delete service name: %s\n", sr_name);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&svc_rec, 0, sizeof(svc_rec));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt, sr_name, rec_num, &svc_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A15: "
|
|
Packit |
13e616 |
"Failed to get service: name: %s\n", sr_name);
|
|
Packit |
13e616 |
goto ExitNoDel;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
memset(&req, 0, sizeof(req));
|
|
Packit |
13e616 |
memset(&context, 0, sizeof(context));
|
|
Packit |
13e616 |
memset(&user, 0, sizeof(user));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* set the new service record fields */
|
|
Packit |
13e616 |
memset(svc_rec.service_name, 0, sizeof(svc_rec.service_name));
|
|
Packit |
13e616 |
memcpy(svc_rec.service_name, sr_name,
|
|
Packit |
13e616 |
(strlen(sr_name) + 1) * sizeof(char));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* prepare the data used for this query */
|
|
Packit |
13e616 |
context.p_osmt = p_osmt;
|
|
Packit |
13e616 |
req.timeout_ms = p_osmt->opt.transaction_timeout;
|
|
Packit |
13e616 |
req.query_context = &context;
|
|
Packit |
13e616 |
req.query_type = OSMV_QUERY_USER_DEFINED; /* basically a don't care here */
|
|
Packit |
13e616 |
req.pfn_query_cb = osmtest_query_res_cb;
|
|
Packit |
13e616 |
req.p_query_input = &use;;
|
|
Packit |
13e616 |
req.flags = OSM_SA_FLAGS_SYNC;
|
|
Packit |
13e616 |
req.sm_key = 0;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
user.method = IB_MAD_METHOD_DELETE;
|
|
Packit |
13e616 |
user.attr_id = IB_MAD_ATTR_SERVICE_RECORD;
|
|
Packit |
13e616 |
user.comp_mask = IB_SR_COMPMASK_SNAME;
|
|
Packit |
13e616 |
user.p_attr = &svc_rec;
|
|
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 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A16: "
|
|
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 |
if (IsServiceExist) {
|
|
Packit |
13e616 |
/* If IsServiceExist = 1 then we should succeed here */
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A17: "
|
|
Packit |
13e616 |
"ib_query failed (%s)\n",
|
|
Packit |
13e616 |
ib_get_err_str(status));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status == IB_REMOTE_ERROR) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"ERR 4A18: Remote error = %s\n",
|
|
Packit |
13e616 |
ib_get_mad_status_str
|
|
Packit |
13e616 |
(osm_madw_get_mad_ptr
|
|
Packit |
13e616 |
(context.result.p_result_madw)));
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
/* If IsServiceExist = 0 then we should fail here */
|
|
Packit |
13e616 |
if (status == IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A19: "
|
|
Packit |
13e616 |
"Succeeded to delete service: %s which "
|
|
Packit |
13e616 |
"shouldn't exist", sr_name);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
/* The deletion should have failed, since the service_name
|
|
Packit |
13e616 |
shouldn't exist. */
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"IS EXPECTED ERROR ^^^^\n");
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_INFO,
|
|
Packit |
13e616 |
"Failed to delete service_name: %s\n", sr_name);
|
|
Packit |
13e616 |
status = IB_SUCCESS;
|
|
Packit |
13e616 |
}
|
|
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 |
ExitNoDel:
|
|
Packit |
13e616 |
OSM_LOG_EXIT(&p_osmt->log);
|
|
Packit |
13e616 |
return status;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Run a complete service records flow:
|
|
Packit |
13e616 |
* - register a service
|
|
Packit |
13e616 |
* - register a service (with a lease period)
|
|
Packit |
13e616 |
* - get a service by name
|
|
Packit |
13e616 |
* - get all services / must be 2
|
|
Packit |
13e616 |
* - delete a service
|
|
Packit |
13e616 |
* - get all services / must be 1
|
|
Packit |
13e616 |
* - wait for the lease to expire
|
|
Packit |
13e616 |
* - get all services / must be 0
|
|
Packit |
13e616 |
* - get / set service by data
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
ib_api_status_t osmt_run_service_records_flow(IN osmtest_t * const p_osmt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
ib_service_record_t srv_rec;
|
|
Packit |
13e616 |
ib_api_status_t status;
|
|
Packit |
13e616 |
uint8_t instance, i;
|
|
Packit |
13e616 |
uint8_t service_data8[16], service_key[16];
|
|
Packit |
13e616 |
ib_net16_t service_data16[8];
|
|
Packit |
13e616 |
ib_net32_t service_data32[4];
|
|
Packit |
13e616 |
ib_net64_t service_data64[2];
|
|
Packit |
13e616 |
uint64_t pid = getpid();
|
|
Packit |
13e616 |
uint64_t id[7];
|
|
Packit |
13e616 |
/* We use up to seven service names - we use the extra for bad flow */
|
|
Packit |
13e616 |
ib_svc_name_t service_name[7];
|
|
Packit |
13e616 |
#ifdef VENDOR_RMPP_SUPPORT
|
|
Packit |
13e616 |
/* This array contain only the valid names after registering vs SM */
|
|
Packit |
13e616 |
ib_svc_name_t service_valid_names[3];
|
|
Packit |
13e616 |
uint32_t num_recs = 0;
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
OSM_LOG_ENTER(&p_osmt->log);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Init Service names */
|
|
Packit |
13e616 |
for (i = 0; i < 7; i++) {
|
|
Packit |
13e616 |
#ifdef __WIN__
|
|
Packit |
13e616 |
uint64_t rand_val = rand() - (uint64_t) i;
|
|
Packit |
13e616 |
#else
|
|
Packit |
13e616 |
uint64_t rand_val = random() - (uint64_t) i;
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
id[i] = abs((int)(pid - rand_val));
|
|
Packit |
13e616 |
/* Just to be unique any place on any host */
|
|
Packit |
13e616 |
sprintf((char *)(service_name[i]),
|
|
Packit |
13e616 |
"osmt.srvc.%" PRIu64 ".%" PRIu64, rand_val, pid);
|
|
Packit |
13e616 |
/*printf("-I- Service Name is : %s, ID is : 0x%" PRIx64 "\n",service_name[i],id[i]); */
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_register_service(p_osmt, cl_ntoh64(id[0]), /* IN ib_net64_t service_id, */
|
|
Packit |
13e616 |
IB_DEFAULT_PKEY, /* IN ib_net16_t service_pkey, */
|
|
Packit |
13e616 |
0xFFFFFFFF, /* IN ib_net32_t service_lease, */
|
|
Packit |
13e616 |
11, /* IN uint8_t service_key_lsb, */
|
|
Packit |
13e616 |
(char *)service_name[0] /* IN char *service_name */
|
|
Packit |
13e616 |
);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_register_service(p_osmt, cl_ntoh64(id[1]), /* IN ib_net64_t service_id, */
|
|
Packit |
13e616 |
IB_DEFAULT_PKEY, /* IN ib_net16_t service_pkey, */
|
|
Packit |
13e616 |
cl_hton32(0x00000004), /* IN ib_net32_t service_lease, */
|
|
Packit |
13e616 |
11, /* IN uint8_t service_key_lsb, */
|
|
Packit |
13e616 |
(char *)service_name[1] /* IN char *service_name */
|
|
Packit |
13e616 |
);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_register_service(p_osmt, cl_ntoh64(id[2]), /* IN ib_net64_t service_id, */
|
|
Packit |
13e616 |
0, /* IN ib_net16_t service_pkey, */
|
|
Packit |
13e616 |
0xFFFFFFFF, /* IN ib_net32_t service_lease, */
|
|
Packit |
13e616 |
11, /* Remove Service Record IN uint8_t service_key_lsb, */
|
|
Packit |
13e616 |
(char *)service_name[2] /* IN char *service_name */
|
|
Packit |
13e616 |
);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Generate 2 instances of service record with consecutive data */
|
|
Packit |
13e616 |
for (instance = 0; instance < 2; instance++) {
|
|
Packit |
13e616 |
/* First, clear all arrays */
|
|
Packit |
13e616 |
memset(service_data8, 0, 16 * sizeof(uint8_t));
|
|
Packit |
13e616 |
memset(service_data16, 0, 8 * sizeof(uint16_t));
|
|
Packit |
13e616 |
memset(service_data32, 0, 4 * sizeof(uint32_t));
|
|
Packit |
13e616 |
memset(service_data64, 0, 2 * sizeof(uint64_t));
|
|
Packit |
13e616 |
service_data8[instance] = instance + 1;
|
|
Packit |
13e616 |
service_data16[instance] = cl_hton16(instance + 2);
|
|
Packit |
13e616 |
service_data32[instance] = cl_hton32(instance + 3);
|
|
Packit |
13e616 |
service_data64[instance] = cl_hton64(instance + 4);
|
|
Packit |
13e616 |
status = osmt_register_service_with_data(p_osmt, cl_ntoh64(id[3]), /* IN ib_net64_t service_id, */
|
|
Packit |
13e616 |
IB_DEFAULT_PKEY, /* IN ib_net16_t service_pkey, */
|
|
Packit |
13e616 |
cl_ntoh32(10), /* IN ib_net32_t service_lease, */
|
|
Packit |
13e616 |
12, /* IN uint8_t service_key_lsb, */
|
|
Packit |
13e616 |
service_data8, service_data16, service_data32, service_data64, /* service data structures */
|
|
Packit |
13e616 |
(char *)service_name[3] /* IN char *service_name */
|
|
Packit |
13e616 |
);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Trying to create service with zero key */
|
|
Packit |
13e616 |
memset(service_key, 0, 16 * sizeof(uint8_t));
|
|
Packit |
13e616 |
status = osmt_register_service_with_full_key(p_osmt, cl_ntoh64(id[5]), /* IN ib_net64_t service_id, */
|
|
Packit |
13e616 |
0, /* IN ib_net16_t service_pkey, */
|
|
Packit |
13e616 |
0xFFFFFFFF, /* IN ib_net32_t service_lease, */
|
|
Packit |
13e616 |
service_key, /* full service_key, */
|
|
Packit |
13e616 |
(char *)service_name[5] /* IN char *service_name */
|
|
Packit |
13e616 |
);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Now update it with Unique key and different service name */
|
|
Packit |
13e616 |
for (i = 0; i <= 15; i++) {
|
|
Packit |
13e616 |
service_key[i] = i + 1;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
status = osmt_register_service_with_full_key(p_osmt, cl_ntoh64(id[5]), /* IN ib_net64_t service_id, */
|
|
Packit |
13e616 |
0, /* IN ib_net16_t service_pkey, */
|
|
Packit |
13e616 |
0xFFFFFFFF, /* IN ib_net32_t service_lease, */
|
|
Packit |
13e616 |
service_key, /* full service_key, */
|
|
Packit |
13e616 |
(char *)service_name[6] /* IN char *service_name */
|
|
Packit |
13e616 |
);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Let OpenSM handle it */
|
|
Packit |
13e616 |
usleep(100);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Make sure service_name[0] exists */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[0], 1, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1A: "
|
|
Packit |
13e616 |
"Fail to find service: name: %s\n",
|
|
Packit |
13e616 |
(char *)service_name[0]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Make sure service_name[1] exists */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[1], 1, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1B: "
|
|
Packit |
13e616 |
"Fail to find service: name: %s\n",
|
|
Packit |
13e616 |
(char *)service_name[1]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Make sure service_name[2] exists */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[2], 1, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1C: "
|
|
Packit |
13e616 |
"Fail to find service: name: %s\n",
|
|
Packit |
13e616 |
(char *)service_name[2]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Make sure service_name[3] exists. */
|
|
Packit |
13e616 |
/* After 10 seconds the service should not exist: service_lease = 10 */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[3], 1, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1D: "
|
|
Packit |
13e616 |
"Fail to find service: name: %s\n",
|
|
Packit |
13e616 |
(char *)service_name[3]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
sleep(10);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[3], 0, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1E: "
|
|
Packit |
13e616 |
"Found service: name: %s that should have been "
|
|
Packit |
13e616 |
"deleted due to service lease expiring\n",
|
|
Packit |
13e616 |
(char *)service_name[3]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check that for service: id[5] only one record exists */
|
|
Packit |
13e616 |
status = osmt_get_service_by_id(p_osmt, 1, cl_ntoh64(id[5]), &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A1F: "
|
|
Packit |
13e616 |
"Found number of records != 1 for "
|
|
Packit |
13e616 |
"service: id: 0x%016" PRIx64 "\n", id[5]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Bad Flow of Get with invalid Service ID: id[6] */
|
|
Packit |
13e616 |
status = osmt_get_service_by_id(p_osmt, 0, cl_ntoh64(id[6]), &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A20: "
|
|
Packit |
13e616 |
"Found service: id: 0x%016" PRIx64 " "
|
|
Packit |
13e616 |
"that is invalid\n", id[6]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check by both id and service name: id[0], service_name[0] */
|
|
Packit |
13e616 |
status = osmt_get_service_by_id_and_name(p_osmt, 1, cl_ntoh64(id[0]),
|
|
Packit |
13e616 |
(char *)service_name[0],
|
|
Packit |
13e616 |
&srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A21: "
|
|
Packit |
13e616 |
"Fail to find service: id: 0x%016" PRIx64 " "
|
|
Packit |
13e616 |
"name: %s\n", id[0], (char *)service_name[0]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check by both id and service name: id[5], service_name[6] */
|
|
Packit |
13e616 |
status = osmt_get_service_by_id_and_name(p_osmt, 1, cl_ntoh64(id[5]),
|
|
Packit |
13e616 |
(char *)service_name[6],
|
|
Packit |
13e616 |
&srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A22: "
|
|
Packit |
13e616 |
"Fail to find service: id: 0x%016" PRIx64 " "
|
|
Packit |
13e616 |
"name: %s\n", id[5], (char *)service_name[6]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Bad Flow of Get with invalid name(service_name[3]) and valid ID(id[0]) */
|
|
Packit |
13e616 |
status = osmt_get_service_by_id_and_name(p_osmt, 0, cl_ntoh64(id[0]),
|
|
Packit |
13e616 |
(char *)service_name[3],
|
|
Packit |
13e616 |
&srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A23: "
|
|
Packit |
13e616 |
"Found service: id: 0x%016" PRIx64
|
|
Packit |
13e616 |
"name: %s which is an invalid service\n",
|
|
Packit |
13e616 |
id[0], (char *)service_name[3]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Bad Flow of Get with unmatched name(service_name[5]) and id(id[3]) (both valid) */
|
|
Packit |
13e616 |
status = osmt_get_service_by_id_and_name(p_osmt, 0, cl_ntoh64(id[3]),
|
|
Packit |
13e616 |
(char *)service_name[5],
|
|
Packit |
13e616 |
&srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A24: "
|
|
Packit |
13e616 |
"Found service: id: 0x%016" PRIx64
|
|
Packit |
13e616 |
"name: %s which is an invalid service\n",
|
|
Packit |
13e616 |
id[3], (char *)service_name[5]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Bad Flow of Get with service name that doesn't exist (service_name[4]) */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[4], 0, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A25: "
|
|
Packit |
13e616 |
"Found service: name: %s that shouldn't exist\n",
|
|
Packit |
13e616 |
(char *)service_name[4]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Bad Flow : Check that getting service_name[5] brings no records since another service
|
|
Packit |
13e616 |
has been updated with the same ID (service_name[6] */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[5], 0, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A26: "
|
|
Packit |
13e616 |
"Found service: name: %s which is an "
|
|
Packit |
13e616 |
"invalid service\n", (char *)service_name[5]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check that getting service_name[6] by name ONLY is valid,
|
|
Packit |
13e616 |
since we do not support key&name association, also trusted queries */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[6], 1, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A27: "
|
|
Packit |
13e616 |
"Fail to find service: name: %s\n",
|
|
Packit |
13e616 |
(char *)service_name[6]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Test Service Key */
|
|
Packit |
13e616 |
memset(service_key, 0, 16 * sizeof(uint8_t));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check for service_name[5] with service_key=0 - the service shouldn't
|
|
Packit |
13e616 |
exist with this name. */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name_and_key(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[5],
|
|
Packit |
13e616 |
0, service_key, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A28: "
|
|
Packit |
13e616 |
"Found service: name: %s key:0 which is an "
|
|
Packit |
13e616 |
"invalid service (wrong name)\n",
|
|
Packit |
13e616 |
(char *)service_name[5]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Check for service_name[6] with service_key=0 - the service should
|
|
Packit |
13e616 |
exist with different key. */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name_and_key(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[6],
|
|
Packit |
13e616 |
0, service_key, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A29: "
|
|
Packit |
13e616 |
"Found service: name: %s key: 0 which is an "
|
|
Packit |
13e616 |
"invalid service (wrong service_key)\n",
|
|
Packit |
13e616 |
(char *)service_name[6]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* check for service_name[6] with the correct service_key */
|
|
Packit |
13e616 |
for (i = 0; i <= 15; i++)
|
|
Packit |
13e616 |
service_key[i] = i + 1;
|
|
Packit |
13e616 |
status = osmt_get_service_by_name_and_key(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[6],
|
|
Packit |
13e616 |
1, service_key, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2A: "
|
|
Packit |
13e616 |
"Fail to find service: name: %s with "
|
|
Packit |
13e616 |
"correct service key\n", (char *)service_name[6]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
#ifdef VENDOR_RMPP_SUPPORT
|
|
Packit |
13e616 |
/* These ar the only service_names which are valid */
|
|
Packit |
13e616 |
memcpy(&service_valid_names[0], &service_name[0], sizeof(uint8_t) * 64);
|
|
Packit |
13e616 |
memcpy(&service_valid_names[1], &service_name[2], sizeof(uint8_t) * 64);
|
|
Packit |
13e616 |
memcpy(&service_valid_names[2], &service_name[6], sizeof(uint8_t) * 64);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status =
|
|
Packit |
13e616 |
osmt_get_all_services_and_check_names(p_osmt, service_valid_names,
|
|
Packit |
13e616 |
3, &num_recs);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2B: "
|
|
Packit |
13e616 |
"Fail to find all services that should exist\n");
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
#endif
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Delete service_name[0] */
|
|
Packit |
13e616 |
status = osmt_delete_service_by_name(p_osmt, 1,
|
|
Packit |
13e616 |
(char *)service_name[0], 1);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2C: "
|
|
Packit |
13e616 |
"Fail to delete service: name: %s\n",
|
|
Packit |
13e616 |
(char *)service_name[0]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Make sure deletion of service_name[0] succeeded */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[0], 0, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2D: "
|
|
Packit |
13e616 |
"Found service: name: %s that was deleted\n",
|
|
Packit |
13e616 |
(char *)service_name[0]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Make sure service_name[1] doesn't exist (expired service lease) */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[1], 0, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2E: "
|
|
Packit |
13e616 |
"Found service: name: %s that should have expired\n",
|
|
Packit |
13e616 |
(char *)service_name[1]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Make sure service_name[2] exists */
|
|
Packit |
13e616 |
status = osmt_get_service_by_name(p_osmt,
|
|
Packit |
13e616 |
(char *)service_name[2], 1, &srv_rec);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A2F: "
|
|
Packit |
13e616 |
"Fail to find service: name: %s\n",
|
|
Packit |
13e616 |
(char *)service_name[2]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Bad Flow - try to delete non-existent service_name[5] */
|
|
Packit |
13e616 |
status = osmt_delete_service_by_name(p_osmt, 0,
|
|
Packit |
13e616 |
(char *)service_name[5], 0);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A30: "
|
|
Packit |
13e616 |
"Succeed to delete non-existent service: name: %s\n",
|
|
Packit |
13e616 |
(char *)service_name[5]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Delete service_name[2] */
|
|
Packit |
13e616 |
status = osmt_delete_service_by_name(p_osmt, 1,
|
|
Packit |
13e616 |
(char *)service_name[2], 1);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A31: "
|
|
Packit |
13e616 |
"Fail to delete service: name: %s\n",
|
|
Packit |
13e616 |
(char *)service_name[2]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* Delete service_name[6] */
|
|
Packit |
13e616 |
status = osmt_delete_service_by_name(p_osmt, 1,
|
|
Packit |
13e616 |
(char *)service_name[6], 1);
|
|
Packit |
13e616 |
if (status != IB_SUCCESS) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 4A32: "
|
|
Packit |
13e616 |
"Failed to delete service name: %s\n",
|
|
Packit |
13e616 |
(char *)service_name[6]);
|
|
Packit |
13e616 |
status = IB_ERROR;
|
|
Packit |
13e616 |
goto Exit;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
Exit:
|
|
Packit |
13e616 |
OSM_LOG_EXIT(&p_osmt->log);
|
|
Packit |
13e616 |
return status;
|
|
Packit |
13e616 |
}
|