|
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, ¶ms)) != 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, ¬ice, ¬ice_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 *)¬ice->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 *)¬ice->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 |
}
|