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