1219820Sjeff/* 2219820Sjeff * Copyright (c) 2006 Voltaire, Inc. All rights reserved. 3219820Sjeff * 4219820Sjeff * This software is available to you under a choice of one of two 5219820Sjeff * licenses. You may choose to be licensed under the terms of the GNU 6219820Sjeff * General Public License (GPL) Version 2, available from the file 7219820Sjeff * COPYING in the main directory of this source tree, or the 8219820Sjeff * OpenIB.org BSD license below: 9219820Sjeff * 10219820Sjeff * Redistribution and use in source and binary forms, with or 11219820Sjeff * without modification, are permitted provided that the following 12219820Sjeff * conditions are met: 13219820Sjeff * 14219820Sjeff * - Redistributions of source code must retain the above 15219820Sjeff * copyright notice, this list of conditions and the following 16219820Sjeff * disclaimer. 17219820Sjeff * 18219820Sjeff * - Redistributions in binary form must reproduce the above 19219820Sjeff * copyright notice, this list of conditions and the following 20219820Sjeff * disclaimer in the documentation and/or other materials 21219820Sjeff * provided with the distribution. 22219820Sjeff * 23219820Sjeff * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24219820Sjeff * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25219820Sjeff * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26219820Sjeff * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27219820Sjeff * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28219820Sjeff * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29219820Sjeff * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30219820Sjeff * SOFTWARE. 31219820Sjeff * 32219820Sjeff */ 33219820Sjeff 34219820Sjeff#include <stdio.h> 35219820Sjeff#include <string.h> 36219820Sjeff#include <errno.h> 37219820Sjeff#include <inttypes.h> 38219820Sjeff 39219820Sjeff#include <infiniband/umad.h> 40219820Sjeff#include <infiniband/mad.h> 41219820Sjeff 42219820Sjeff#define info(fmt, arg...) fprintf(stderr, "INFO: " fmt, ##arg ) 43219820Sjeff#define err(fmt, arg...) fprintf(stderr, "ERR: " fmt, ##arg ) 44219820Sjeff#ifdef NOISY_DEBUG 45219820Sjeff#define dbg(fmt, arg...) fprintf(stderr, "DBG: " fmt, ##arg ) 46219820Sjeff#else 47219820Sjeff#define dbg(fmt, arg...) 48219820Sjeff#endif 49219820Sjeff 50219820Sjeff#define TMO 100 51219820Sjeff 52219820Sjeff/* Multicast Member Record Component Masks */ 53219820Sjeff#define IB_MCR_COMPMASK_MGID (1ULL<<0) 54219820Sjeff#define IB_MCR_COMPMASK_PORT_GID (1ULL<<1) 55219820Sjeff#define IB_MCR_COMPMASK_QKEY (1ULL<<2) 56219820Sjeff#define IB_MCR_COMPMASK_MLID (1ULL<<3) 57219820Sjeff#define IB_MCR_COMPMASK_MTU_SEL (1ULL<<4) 58219820Sjeff#define IB_MCR_COMPMASK_MTU (1ULL<<5) 59219820Sjeff#define IB_MCR_COMPMASK_TCLASS (1ULL<<6) 60219820Sjeff#define IB_MCR_COMPMASK_PKEY (1ULL<<7) 61219820Sjeff#define IB_MCR_COMPMASK_RATE_SEL (1ULL<<8) 62219820Sjeff#define IB_MCR_COMPMASK_RATE (1ULL<<9) 63219820Sjeff#define IB_MCR_COMPMASK_LIFE_SEL (1ULL<<10) 64219820Sjeff#define IB_MCR_COMPMASK_LIFE (1ULL<<11) 65219820Sjeff#define IB_MCR_COMPMASK_SL (1ULL<<12) 66219820Sjeff#define IB_MCR_COMPMASK_FLOW (1ULL<<13) 67219820Sjeff#define IB_MCR_COMPMASK_HOP (1ULL<<14) 68219820Sjeff#define IB_MCR_COMPMASK_SCOPE (1ULL<<15) 69219820Sjeff#define IB_MCR_COMPMASK_JOIN_STATE (1ULL<<16) 70219820Sjeff#define IB_MCR_COMPMASK_PROXY (1ULL<<17) 71219820Sjeff 72219820Sjeffstatic ibmad_gid_t mgid_ipoib = { 73219820Sjeff 0xff, 0x12, 0x40, 0x1b, 0xff, 0xff, 0x00, 0x00, 74219820Sjeff 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff 75219820Sjeff}; 76219820Sjeff 77219820Sjeffuint64_t build_mcm_rec(uint8_t *data, ibmad_gid_t mgid, ibmad_gid_t port_gid) 78219820Sjeff{ 79219820Sjeff memset(data, 0, IB_SA_DATA_SIZE); 80219820Sjeff mad_set_array(data, 0, IB_SA_MCM_MGID_F, mgid); 81219820Sjeff mad_set_array(data, 0, IB_SA_MCM_PORTGID_F, port_gid); 82219820Sjeff mad_set_field(data, 0, IB_SA_MCM_JOIN_STATE_F, 1); 83219820Sjeff 84219820Sjeff return IB_MCR_COMPMASK_MGID|IB_MCR_COMPMASK_PORT_GID| 85219820Sjeff IB_MCR_COMPMASK_JOIN_STATE; 86219820Sjeff} 87219820Sjeff 88219820Sjeffstatic void build_mcm_rec_umad(void *umad, ib_portid_t *dport, int method, 89219820Sjeff uint64_t comp_mask, uint8_t *data) 90219820Sjeff{ 91219820Sjeff ib_rpc_t rpc; 92219820Sjeff 93219820Sjeff memset(&rpc, 0, sizeof(rpc)); 94219820Sjeff rpc.mgtclass = IB_SA_CLASS; 95219820Sjeff rpc.method = method; 96219820Sjeff rpc.attr.id = IB_SA_ATTR_MCRECORD; 97219820Sjeff rpc.attr.mod = 0; // ??? 98219820Sjeff rpc.mask = comp_mask; 99219820Sjeff rpc.datasz = IB_SA_DATA_SIZE; 100219820Sjeff rpc.dataoffs = IB_SA_DATA_OFFS; 101219820Sjeff 102219820Sjeff mad_build_pkt(umad, &rpc, dport, NULL, data); 103219820Sjeff} 104219820Sjeff 105219820Sjeffstatic int rereg_send(int port, int agent, ib_portid_t *dport, 106219820Sjeff uint8_t *umad, int len, int method, ibmad_gid_t port_gid) 107219820Sjeff{ 108219820Sjeff uint8_t data[IB_SA_DATA_SIZE]; 109219820Sjeff uint64_t comp_mask; 110219820Sjeff 111219820Sjeff comp_mask = build_mcm_rec(data, mgid_ipoib, port_gid); 112219820Sjeff 113219820Sjeff build_mcm_rec_umad(umad, dport, method, comp_mask, data); 114219820Sjeff if(umad_send(port, agent, umad, len, TMO, 0) < 0) { 115219820Sjeff err("umad_send leave failed: %s\n", strerror(errno)); 116219820Sjeff return -1; 117219820Sjeff } 118219820Sjeff dbg("umad_send %d: tid = 0x%016" PRIx64 "\n", method, 119219820Sjeff mad_get_field64(umad_get_mad(umad), 0, IB_MAD_TRID_F)); 120219820Sjeff 121219820Sjeff return 0; 122219820Sjeff} 123219820Sjeff 124219820Sjeffstatic int rereg_port_gid(int port, int agent, ib_portid_t *dport, 125219820Sjeff uint8_t *umad, int len, ibmad_gid_t port_gid) 126219820Sjeff{ 127219820Sjeff uint8_t data[IB_SA_DATA_SIZE]; 128219820Sjeff uint64_t comp_mask; 129219820Sjeff 130219820Sjeff comp_mask = build_mcm_rec(data, mgid_ipoib, port_gid); 131219820Sjeff 132219820Sjeff build_mcm_rec_umad(umad, dport, IB_MAD_METHOD_DELETE, 133219820Sjeff comp_mask, data); 134219820Sjeff if(umad_send(port, agent, umad, len, TMO, 0) < 0) { 135219820Sjeff err("umad_send leave failed: %s\n", strerror(errno)); 136219820Sjeff return -1; 137219820Sjeff } 138219820Sjeff dbg("umad_send leave: tid = 0x%016" PRIx64 "\n", 139219820Sjeff mad_get_field64(umad_get_mad(umad), 0, IB_MAD_TRID_F)); 140219820Sjeff 141219820Sjeff build_mcm_rec_umad(umad, dport, IB_MAD_METHOD_SET, 142219820Sjeff comp_mask, data); 143219820Sjeff if(umad_send(port, agent, umad, len, TMO, 0) < 0) { 144219820Sjeff err("umad_send join failed: %s\n", strerror(errno)); 145219820Sjeff return -1; 146219820Sjeff } 147219820Sjeff dbg("umad_send join: tid = 0x%016" PRIx64 "\n", 148219820Sjeff mad_get_field64(umad_get_mad(umad), 0, IB_MAD_TRID_F)); 149219820Sjeff 150219820Sjeff return 0; 151219820Sjeff} 152219820Sjeff 153219820Sjeffstruct guid_trid { 154219820Sjeff ibmad_gid_t gid; 155219820Sjeff uint64_t guid; 156219820Sjeff uint64_t trid; 157219820Sjeff}; 158219820Sjeff 159219820Sjeffstatic int rereg_send_all(int port, int agent, ib_portid_t *dport, 160219820Sjeff struct guid_trid *list, unsigned cnt) 161219820Sjeff{ 162219820Sjeff uint8_t *umad; 163219820Sjeff int len = umad_size() + 256; 164219820Sjeff int i, ret; 165219820Sjeff 166219820Sjeff info("rereg_send_all... cnt = %u\n", cnt); 167219820Sjeff 168219820Sjeff umad = calloc(1, len); 169219820Sjeff if (!umad) { 170219820Sjeff err("cannot alloc mem for umad: %s\n", strerror(errno)); 171219820Sjeff return -1; 172219820Sjeff } 173219820Sjeff 174219820Sjeff for (i = 0; i < cnt; i++) { 175219820Sjeff ret = rereg_port_gid(port, agent, dport, umad, len, list[i].gid); 176219820Sjeff if (ret < 0) { 177219820Sjeff err("rereg_send_all: rereg_port_gid 0x%016" PRIx64 178219820Sjeff " failed\n", list[i].guid); 179219820Sjeff continue; 180219820Sjeff } 181219820Sjeff list[i].trid = mad_get_field64(umad_get_mad(umad), 0, 182219820Sjeff IB_MAD_TRID_F); 183219820Sjeff } 184219820Sjeff 185219820Sjeff info("rereg_send_all: sent %u requests\n", cnt*2); 186219820Sjeff 187219820Sjeff free(umad); 188219820Sjeff 189219820Sjeff return 0; 190219820Sjeff} 191219820Sjeff 192219820Sjeff#if 0 193219820Sjeffstatic int rereg_mcm_rec_send(int port, int agent, ib_portid_t *dport, int cnt) 194219820Sjeff{ 195219820Sjeff ib_portid_t portid; 196219820Sjeff ibmad_gid_t port_gid; 197219820Sjeff uint8_t *umad; 198219820Sjeff int len, ret = 0; 199219820Sjeff 200219820Sjeff ib_resolve_self(&portid, NULL, &port_gid); 201219820Sjeff 202219820Sjeff len = umad_size() + 256; 203219820Sjeff umad = calloc(1, len); 204219820Sjeff if (!umad) { 205219820Sjeff err("cannot alloc mem for umad: %s\n", strerror(errno)); 206219820Sjeff return -1; 207219820Sjeff } 208219820Sjeff 209219820Sjeff while(cnt--) { 210219820Sjeff if (!rereg_port_gid(port, agent, dport, umad, len, port_gid)) 211219820Sjeff ret += 2; 212219820Sjeff } 213219820Sjeff 214219820Sjeff free(umad); 215219820Sjeff 216219820Sjeff return ret; 217219820Sjeff} 218219820Sjeff#endif 219219820Sjeff 220219820Sjeffstatic int rereg_recv(int port, int agent, ib_portid_t *dport, 221219820Sjeff uint8_t *umad, int length, int tmo) 222219820Sjeff{ 223219820Sjeff int ret, retry = 0; 224219820Sjeff int len = length; 225219820Sjeff 226219820Sjeff while((ret = umad_recv(port, umad, &len, tmo)) < 0 && 227219820Sjeff errno == ETIMEDOUT) { 228219820Sjeff if (retry++ > 3) 229219820Sjeff return 0; 230219820Sjeff } 231219820Sjeff if (ret < 0) { 232219820Sjeff err("umad_recv %d failed: %s\n", ret, strerror(errno)); 233219820Sjeff return -1; 234219820Sjeff } 235219820Sjeff dbg("umad_recv (retries %d), tid = 0x%016" PRIx64 ": len = %d, status = %d\n", 236219820Sjeff retry, 237219820Sjeff mad_get_field64(umad_get_mad(umad), 0, IB_MAD_TRID_F), 238219820Sjeff len, umad_status(umad)); 239219820Sjeff 240219820Sjeff return 1; 241219820Sjeff} 242219820Sjeff 243219820Sjeffstatic int rereg_recv_all(int port, int agent, ib_portid_t *dport, 244219820Sjeff struct guid_trid *list, unsigned cnt) 245219820Sjeff{ 246219820Sjeff uint8_t *umad, *mad; 247219820Sjeff int len = umad_size() + 256; 248219820Sjeff uint64_t trid; 249219820Sjeff unsigned n, method, status; 250219820Sjeff int i; 251219820Sjeff 252219820Sjeff info("rereg_recv_all...\n"); 253219820Sjeff 254219820Sjeff umad = calloc(1, len); 255219820Sjeff if (!umad) { 256219820Sjeff err("cannot alloc mem for umad: %s\n", strerror(errno)); 257219820Sjeff return -1; 258219820Sjeff } 259219820Sjeff 260219820Sjeff n = 0; 261219820Sjeff while (rereg_recv(port, agent, dport, umad, len, TMO) > 0) { 262219820Sjeff dbg("rereg_recv_all: done %d\n", n); 263219820Sjeff n++; 264219820Sjeff mad = umad_get_mad(umad); 265219820Sjeff 266219820Sjeff method = mad_get_field(mad, 0, IB_MAD_METHOD_F); 267219820Sjeff status = mad_get_field(mad, 0, IB_MAD_STATUS_F); 268219820Sjeff 269219820Sjeff if (status) 270219820Sjeff dbg("MAD status %x, method %x\n", status, method); 271219820Sjeff 272219820Sjeff if (status && 273219820Sjeff (method&0x7f) == (IB_MAD_METHOD_GET_RESPONSE&0x7f)) { 274219820Sjeff trid = mad_get_field64(mad, 0, IB_MAD_TRID_F); 275219820Sjeff for (i = 0; i < cnt; i++) 276219820Sjeff if (trid == list[i].trid) 277219820Sjeff break; 278219820Sjeff if (i == cnt) { 279219820Sjeff err("cannot find trid 0x%016" PRIx64 "\n", 280219820Sjeff trid); 281219820Sjeff continue; 282219820Sjeff } 283219820Sjeff info("guid 0x%016" PRIx64 ": method = %x status = %x. Resending\n", 284219820Sjeff ntohll(list[i].guid), method, status); 285219820Sjeff rereg_port_gid(port, agent, dport, umad, len, 286219820Sjeff list[i].gid); 287219820Sjeff list[i].trid = mad_get_field64(umad_get_mad(umad), 0, 288219820Sjeff IB_MAD_TRID_F); 289219820Sjeff } 290219820Sjeff } 291219820Sjeff 292219820Sjeff info("rereg_recv_all: got %u responses\n", n); 293219820Sjeff 294219820Sjeff free(umad); 295219820Sjeff return 0; 296219820Sjeff} 297219820Sjeff 298219820Sjeffstatic int rereg_query_all(int port, int agent, ib_portid_t *dport, 299219820Sjeff struct guid_trid *list, unsigned cnt) 300219820Sjeff{ 301219820Sjeff uint8_t *umad, *mad; 302219820Sjeff int len = umad_size() + 256; 303219820Sjeff unsigned method, status; 304219820Sjeff int i, ret; 305219820Sjeff 306219820Sjeff info("rereg_query_all...\n"); 307219820Sjeff 308219820Sjeff umad = calloc(1, len); 309219820Sjeff if (!umad) { 310219820Sjeff err("cannot alloc mem for umad: %s\n", strerror(errno)); 311219820Sjeff return -1; 312219820Sjeff } 313219820Sjeff 314219820Sjeff for ( i = 0; i < cnt; i++ ) { 315219820Sjeff ret = rereg_send(port, agent, dport, umad, len, 316219820Sjeff IB_MAD_METHOD_GET, list[i].gid); 317219820Sjeff if (ret < 0) { 318219820Sjeff err("query_all: rereg_send failed.\n"); 319219820Sjeff continue; 320219820Sjeff } 321219820Sjeff 322219820Sjeff ret = rereg_recv(port, agent, dport, umad, len, TMO); 323219820Sjeff if (ret < 0) { 324219820Sjeff err("query_all: rereg_recv failed.\n"); 325219820Sjeff continue; 326219820Sjeff } 327219820Sjeff 328219820Sjeff mad = umad_get_mad(umad); 329219820Sjeff 330219820Sjeff method = mad_get_field(mad, 0, IB_MAD_METHOD_F); 331219820Sjeff status = mad_get_field(mad, 0, IB_MAD_STATUS_F); 332219820Sjeff 333219820Sjeff if (status) 334219820Sjeff info("guid 0x%016" PRIx64 ": status %x, method %x\n", 335219820Sjeff ntohll(list[i].guid), status, method); 336219820Sjeff } 337219820Sjeff 338219820Sjeff info("rereg_query_all: %u queried.\n", cnt); 339219820Sjeff 340219820Sjeff free(umad); 341219820Sjeff return 0; 342219820Sjeff} 343219820Sjeff 344219820Sjeff#if 0 345219820Sjeffstatic int rereg_mcm_rec_recv(int port, int agent, int cnt) 346219820Sjeff{ 347219820Sjeff uint8_t *umad, *mad; 348219820Sjeff int len = umad_size() + 256; 349219820Sjeff int i; 350219820Sjeff 351219820Sjeff umad = calloc(1, len); 352219820Sjeff if (!umad) { 353219820Sjeff err("cannot alloc mem for umad: %s\n", strerror(errno)); 354219820Sjeff return -1; 355219820Sjeff } 356219820Sjeff 357219820Sjeff for ( i = 0; i < cnt; i++ ) { 358219820Sjeff int retry; 359219820Sjeff retry = 0; 360219820Sjeff while (umad_recv(port, umad, &len, TMO) < 0 && 361219820Sjeff errno == ETIMEDOUT) 362219820Sjeff if (retry++ > 3) { 363219820Sjeff err("umad_recv %d failed: %s\n", 364219820Sjeff i, strerror(errno)); 365219820Sjeff free(umad); 366219820Sjeff return -1; 367219820Sjeff } 368219820Sjeff dbg("umad_recv %d (retries %d), tid = 0x%016" PRIx64 ": len = %d, status = %d\n", 369219820Sjeff i, retry, 370219820Sjeff mad_get_field64(umad_get_mad(umad), 0, IB_MAD_TRID_F), 371219820Sjeff len, umad_status(umad)); 372219820Sjeff mad = umad_get_mad(umad); 373219820Sjeff } 374219820Sjeff 375219820Sjeff free(umad); 376219820Sjeff return 0; 377219820Sjeff} 378219820Sjeff#endif 379219820Sjeff 380219820Sjeff#define MAX_CLIENTS 50 381219820Sjeff 382219820Sjeffstatic int rereg_and_test_port(char *guid_file, int port, int agent, ib_portid_t *dport, int timeout) 383219820Sjeff{ 384219820Sjeff char line[256]; 385219820Sjeff FILE *f; 386219820Sjeff ibmad_gid_t port_gid; 387219820Sjeff uint64_t prefix = htonll(0xfe80000000000000llu); 388219820Sjeff uint64_t guid = htonll(0x0002c90200223825llu); 389219820Sjeff struct guid_trid *list; 390219820Sjeff int i = 0; 391219820Sjeff 392219820Sjeff list = calloc(MAX_CLIENTS, sizeof(*list)); 393219820Sjeff if (!list) { 394219820Sjeff err("cannot alloc mem for guid/trid list: %s\n", strerror(errno)); 395219820Sjeff return -1; 396219820Sjeff } 397219820Sjeff 398219820Sjeff f = fopen(guid_file, "r"); 399219820Sjeff if (!f) { 400219820Sjeff err("cannot open %s: %s\n", guid_file, strerror(errno)); 401219820Sjeff return -1; 402219820Sjeff } 403219820Sjeff 404219820Sjeff while (fgets(line, sizeof(line), f)) { 405219820Sjeff guid = strtoull(line, NULL, 0); 406219820Sjeff guid = htonll(guid); 407219820Sjeff memcpy(&port_gid[0], &prefix, 8); 408219820Sjeff memcpy(&port_gid[8], &guid, 8); 409219820Sjeff 410219820Sjeff list[i].guid = guid; 411219820Sjeff memcpy(list[i].gid, port_gid, sizeof(list[i].gid)); 412219820Sjeff list[i].trid = 0; 413219820Sjeff if (++i >= MAX_CLIENTS) 414219820Sjeff break; 415219820Sjeff } 416219820Sjeff fclose(f); 417219820Sjeff 418219820Sjeff rereg_send_all(port, agent, dport, list, i); 419219820Sjeff rereg_recv_all(port, agent, dport, list, i); 420219820Sjeff 421219820Sjeff rereg_query_all(port, agent, dport, list, i); 422219820Sjeff 423219820Sjeff free(list); 424219820Sjeff return 0; 425219820Sjeff} 426219820Sjeff 427219820Sjeffint main(int argc, char **argv) 428219820Sjeff{ 429219820Sjeff char *guid_file = "port_guids.list"; 430219820Sjeff int mgmt_classes[2] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS}; 431219820Sjeff ib_portid_t dport_id; 432219820Sjeff int port, agent; 433219820Sjeff uint8_t *umad, *mad; 434219820Sjeff int len; 435219820Sjeff 436219820Sjeff if (argc > 1) 437219820Sjeff guid_file = argv[1]; 438219820Sjeff 439219820Sjeff madrpc_init(NULL, 0, mgmt_classes, 2); 440219820Sjeff 441219820Sjeff#if 1 442219820Sjeff ib_resolve_smlid(&dport_id, TMO); 443219820Sjeff#else 444219820Sjeff memset(&dport_id, 0, sizeof(dport_id)); 445219820Sjeff dport_id.lid = 1; 446219820Sjeff#endif 447219820Sjeff dport_id.qp = 1; 448219820Sjeff if (!dport_id.qkey) 449219820Sjeff dport_id.qkey = IB_DEFAULT_QP1_QKEY; 450219820Sjeff 451219820Sjeff 452219820Sjeff len = umad_size() + 256; 453219820Sjeff umad = calloc(1, len); 454219820Sjeff if (!umad) { 455219820Sjeff err("cannot alloc mem for umad: %s\n", strerror(errno)); 456219820Sjeff return -1; 457219820Sjeff } 458219820Sjeff 459219820Sjeff#if 1 460219820Sjeff port = madrpc_portid(); 461219820Sjeff#else 462219820Sjeff ret = umad_init(); 463219820Sjeff 464219820Sjeff port = umad_open_port(NULL, 0); 465219820Sjeff if (port < 0) { 466219820Sjeff err("umad_open_port failed: %s\n", strerror(errno)); 467219820Sjeff return port; 468219820Sjeff } 469219820Sjeff#endif 470219820Sjeff 471219820Sjeff agent = umad_register(port, IB_SA_CLASS, 2, 0, NULL); 472219820Sjeff 473219820Sjeff#if 0 474219820Sjeff int cnt; 475219820Sjeff cnt = rereg_mcm_rec_send(port, agent, &dport_id, cnt); 476219820Sjeff 477219820Sjeff rereg_recv_all(port, agent, &dport_id); 478219820Sjeff#else 479219820Sjeff rereg_and_test_port(guid_file, port, agent, &dport_id, TMO); 480219820Sjeff#endif 481219820Sjeff mad = umad_get_mad(umad); 482219820Sjeff 483219820Sjeff free(umad); 484219820Sjeff umad_unregister(port, agent); 485219820Sjeff umad_close_port(port); 486219820Sjeff umad_done(); 487219820Sjeff 488219820Sjeff return 0; 489219820Sjeff} 490