Blame opamgt/samples/simple_sa_notice.c

Packit 857059
// core API
Packit 857059
#include <opamgt/opamgt.h>
Packit 857059
// extensions for SA Notices
Packit 857059
#include <opamgt/opamgt_sa_notice.h>
Packit 857059
Packit 857059
// extension to print gid using inet_ntop()
Packit 857059
#include <arpa/inet.h>
Packit 857059
Packit 857059
Packit 857059
int main(void)
Packit 857059
{
Packit 857059
	int exit_code = 0;
Packit 857059
	struct omgt_port *port = NULL;
Packit 857059
	OMGT_STATUS_T status;
Packit 857059
Packit 857059
	STL_NOTICE *notice = NULL;
Packit 857059
	size_t notice_len = 0;
Packit 857059
	struct omgt_port *context = NULL;
Packit 857059
Packit 857059
	/* Set Init Params */
Packit 857059
	struct omgt_params params = {0};
Packit 857059
	params.error_file = stderr;
Packit 857059
	params.debug_file = NULL;
Packit 857059
	/* Open in-band port */
Packit 857059
	if ((status = omgt_open_port(&port, "hfi1_0", 1, &params)) != OMGT_STATUS_SUCCESS) {
Packit 857059
		fprintf(stderr, "Error: Could not open port: %s (%u)\n",
Packit 857059
			omgt_status_totext(status), status);
Packit 857059
		return 1;
Packit 857059
	}
Packit 857059
Packit 857059
	/* Register for Traps (Node Appear | Node Disappear) */
Packit 857059
	if ((status = omgt_sa_register_trap(port, STL_TRAP_GID_NOW_IN_SERVICE, port)) != OMGT_STATUS_SUCCESS) {
Packit 857059
		fprintf(stderr, "Error: Could not register for Trap %u: %s (%u)\n",
Packit 857059
			STL_TRAP_GID_NOW_IN_SERVICE, omgt_status_totext(status), status);
Packit 857059
		exit_code = 1;
Packit 857059
		goto close_port;
Packit 857059
	}
Packit 857059
	if ((status = omgt_sa_register_trap(port, STL_TRAP_GID_OUT_OF_SERVICE, port)) != OMGT_STATUS_SUCCESS) {
Packit 857059
		fprintf(stderr, "Error: Could not register for Trap %u: %s (%u)\n",
Packit 857059
			STL_TRAP_GID_OUT_OF_SERVICE, omgt_status_totext(status), status);
Packit 857059
		exit_code = 1;
Packit 857059
		goto unreg_trap1;
Packit 857059
	}
Packit 857059
Packit 857059
	/* Wait for Trap (-1 = indefinite wait time) */
Packit 857059
	if ((status = omgt_sa_get_notice_report(port, &notice, &notice_len, (void **)&context, -1)) != OMGT_STATUS_SUCCESS) {
Packit 857059
		fprintf(stderr, "Error: Could not wait for Notice: %s (%u)\n",
Packit 857059
			omgt_status_totext(status), status);
Packit 857059
		exit_code = 1;
Packit 857059
		goto unreg_trap2;
Packit 857059
	}
Packit 857059
	if (notice_len < sizeof(STL_NOTICE)) {
Packit 857059
		fprintf(stderr, "Error: Could not get Notice: Returned Length is less than expected: %zu < %zu\n",
Packit 857059
			notice_len, sizeof(STL_NOTICE));
Packit 857059
		exit_code = 2;
Packit 857059
		goto free_notice;
Packit 857059
	}
Packit 857059
	if (port != context) {
Packit 857059
		fprintf(stderr, "Error: Could not get Notice: Returned context (%p) is not port (%p)\n",
Packit 857059
			context, port);
Packit 857059
		exit_code = 2;
Packit 857059
		goto free_notice;
Packit 857059
	}
Packit 857059
Packit 857059
	/* Check Trap Number */
Packit 857059
	switch (notice->Attributes.Generic.TrapNumber) {
Packit 857059
	case STL_TRAP_GID_NOW_IN_SERVICE:
Packit 857059
		/* New Node Appears */
Packit 857059
		{
Packit 857059
			char gid_buf[46] = {0};
Packit 857059
			STL_TRAP_GID *new_gid = (STL_TRAP_GID *)&notice->Data[0];
Packit 857059
			fprintf(stderr, "New Node: %s\n",
Packit 857059
				inet_ntop(AF_INET6, new_gid, gid_buf, sizeof(gid_buf)));
Packit 857059
		}
Packit 857059
		break;
Packit 857059
	case STL_TRAP_GID_OUT_OF_SERVICE:
Packit 857059
		/* Node Disapears */
Packit 857059
		{
Packit 857059
			char gid_buf[46] = {0};
Packit 857059
			STL_TRAP_GID *new_gid = (STL_TRAP_GID *)&notice->Data[0];
Packit 857059
			fprintf(stderr, "Node Disappears: %s\n",
Packit 857059
				inet_ntop(AF_INET6, new_gid, gid_buf, sizeof(gid_buf)));
Packit 857059
		}
Packit 857059
		break;
Packit 857059
	default:
Packit 857059
		fprintf(stderr, "Unhandled Trap Received: %u\n", notice->Attributes.Generic.TrapNumber);
Packit 857059
		exit_code = 3;
Packit 857059
	}
Packit 857059
Packit 857059
	/* Clean Up Notice */
Packit 857059
free_notice:
Packit 857059
	if (notice) {
Packit 857059
		free(notice);
Packit 857059
		notice = NULL;
Packit 857059
	}
Packit 857059
Packit 857059
	/* Unregister Traps */
Packit 857059
unreg_trap2:
Packit 857059
	if ((status = omgt_sa_unregister_trap(port, STL_TRAP_GID_OUT_OF_SERVICE)) != OMGT_STATUS_SUCCESS) {
Packit 857059
		fprintf(stderr, "Error: Could not unregister for Trap %u: %s (%u)\n",
Packit 857059
			STL_TRAP_GID_OUT_OF_SERVICE, omgt_status_totext(status), status);
Packit 857059
		if (!exit_code) exit_code = 1;
Packit 857059
	}
Packit 857059
unreg_trap1:
Packit 857059
	if ((status = omgt_sa_unregister_trap(port, STL_TRAP_GID_NOW_IN_SERVICE)) != OMGT_STATUS_SUCCESS) {
Packit 857059
		fprintf(stderr, "Error: Could not unregister for Trap %u: %s (%u)\n",
Packit 857059
			STL_TRAP_GID_NOW_IN_SERVICE, omgt_status_totext(status), status);
Packit 857059
		if (!exit_code) exit_code = 1;
Packit 857059
	}
Packit 857059
Packit 857059
	/* Close port */
Packit 857059
close_port:
Packit 857059
	omgt_close_port(port);
Packit 857059
	port = NULL;
Packit 857059
Packit 857059
	return exit_code;
Packit 857059
}