Blame opamgt/samples/simple_sa_query.c

Packit Service 3470d1
// core API
Packit Service 3470d1
#include <opamgt/opamgt.h>
Packit Service 3470d1
// extensions for SA queries
Packit Service 3470d1
#include <opamgt/opamgt_sa.h>
Packit Service 3470d1
Packit Service 3470d1
int main(int argc, char ** argv)
Packit Service 3470d1
{
Packit Service 3470d1
	OMGT_STATUS_T status = OMGT_STATUS_SUCCESS;
Packit Service 3470d1
	int exitcode = 0;
Packit Service 3470d1
	int i;
Packit Service 3470d1
	struct omgt_port * port = NULL;
Packit Service 3470d1
	int num_records;
Packit Service 3470d1
	STL_PORTINFO_RECORD *pi_records = NULL;
Packit Service 3470d1
Packit Service 3470d1
Packit Service 3470d1
	// create a session
Packit Service 3470d1
	status = omgt_open_port_by_num(&port, 1 /* hfi */, 1 /* port */, NULL);
Packit Service 3470d1
	if (OMGT_STATUS_SUCCESS != status) {
Packit Service 3470d1
		fprintf(stderr, "failed to open port\n");
Packit Service 3470d1
		exitcode=1;
Packit Service 3470d1
		goto fail1;
Packit Service 3470d1
	}
Packit Service 3470d1
Packit Service 3470d1
Packit Service 3470d1
	// specify how and what we want to query by
Packit Service 3470d1
	omgt_sa_selector_t selector;
Packit Service 3470d1
	selector.InputType = InputTypeLid;
Packit Service 3470d1
	selector.InputValue.PortInfoRecord.Lid = 1;
Packit Service 3470d1
Packit Service 3470d1
	// execute query synchronously
Packit Service 3470d1
	status = omgt_sa_get_portinfo_records(port, &selector, &num_records, &pi_records);
Packit Service 3470d1
	if (status != OMGT_STATUS_SUCCESS) {
Packit Service 3470d1
		exitcode=1;
Packit Service 3470d1
		fprintf(stderr, "failed to execute query. MadStatus=0x%x\n", omgt_get_sa_mad_status(port));
Packit Service 3470d1
		goto fail2;
Packit Service 3470d1
	}
Packit Service 3470d1
Packit Service 3470d1
	if (!num_records) {
Packit Service 3470d1
		// we can check result count independent of result type
Packit Service 3470d1
		printf("No records found.\n");
Packit Service 3470d1
	} else {
Packit Service 3470d1
		for (i = 0; i < num_records; ++i) {
Packit Service 3470d1
			// the result is a set of SA records, which often follow a pattern
Packit Service 3470d1
			// of including a RID section containing top-level identification of
Packit Service 3470d1
			// the record, and an encapsulated SM payload.
Packit Service 3470d1
			//
Packit Service 3470d1
			// in this case:
Packit Service 3470d1
			//   r->RID: contains the LID and port number as record identifiers
Packit Service 3470d1
			//   r->PortInfo: the encapsulated subnet management structure (STL_PORT_INFO)
Packit Service 3470d1
			STL_PORTINFO_RECORD * r = &pi_records[i]; // sa
Packit Service 3470d1
			printf("PortNum: %2u   PortLID: 0x%08x\n", r->RID.PortNum, r->RID.EndPortLID);
Packit Service 3470d1
		}
Packit Service 3470d1
	}
Packit Service 3470d1
Packit Service 3470d1
fail2:
Packit Service 3470d1
	// free our result buffer...
Packit Service 3470d1
	if (pi_records) omgt_sa_free_records(pi_records);
Packit Service 3470d1
	// ...and close our session
Packit Service 3470d1
	omgt_close_port(port);
Packit Service 3470d1
fail1:
Packit Service 3470d1
	return exitcode;
Packit Service 3470d1
}
Packit Service 3470d1