예제 #1
0
static void nd_rcv_process_nd(IN osm_sm_t * sm, IN osm_node_t * p_node,
			      IN const ib_node_desc_t * p_nd)
{
	char *tmp_desc;
	char print_desc[IB_NODE_DESCRIPTION_SIZE + 1];

	OSM_LOG_ENTER(sm->p_log);

	memcpy(&p_node->node_desc.description, p_nd, sizeof(*p_nd));

	/* also set up a printable version */
	memcpy(print_desc, p_nd, sizeof(*p_nd));
	print_desc[IB_NODE_DESCRIPTION_SIZE] = '\0';
	tmp_desc = remap_node_name(sm->p_subn->p_osm->node_name_map,
				   cl_ntoh64(osm_node_get_node_guid(p_node)),
				   print_desc);

	/* make a copy for this node to "own" */
	if (p_node->print_desc)
		free(p_node->print_desc);
	p_node->print_desc = tmp_desc;

#ifdef ENABLE_OSM_PERF_MGR
	/* update the perfmgr entry if available */
	osm_perfmgr_update_nodename(&sm->p_subn->p_osm->perfmgr,
				cl_ntoh64(osm_node_get_node_guid(p_node)),
				p_node->print_desc);
#endif				/* ENABLE_OSM_PERF_MGR */

	OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
		"Node 0x%" PRIx64 ", Description = %s\n",
		cl_ntoh64(osm_node_get_node_guid(p_node)), p_node->print_desc);

	OSM_LOG_EXIT(sm->p_log);
}
예제 #2
0
파일: smpquery.c 프로젝트: Cai900205/test
static char *node_desc(ib_portid_t * dest, char **argv, int argc)
{
	int node_type, l;
	uint64_t node_guid;
	char nd[IB_SMP_DATA_SIZE] = { 0 };
	uint8_t data[IB_SMP_DATA_SIZE] = { 0 };
	char dots[128];
	char *nodename = NULL;

	if (!smp_query_via(data, dest, IB_ATTR_NODE_INFO, 0, 0, srcport))
		return "node info query failed";

	mad_decode_field(data, IB_NODE_TYPE_F, &node_type);
	mad_decode_field(data, IB_NODE_GUID_F, &node_guid);

	if (!smp_query_via(nd, dest, IB_ATTR_NODE_DESC, 0, 0, srcport))
		return "node desc query failed";

	nodename = remap_node_name(node_name_map, node_guid, nd);

	l = strlen(nodename);
	if (l < 32) {
		memset(dots, '.', 32 - l);
		dots[32 - l] = '\0';
	} else {
		dots[0] = '.';
		dots[1] = '\0';
	}

	printf("Node Description:%s%s\n", dots, nodename);
	free(nodename);
	return 0;
}
예제 #3
0
static void dump_endnode(int dump, char *prompt, Node * node, Port * port)
{
	char *nodename = NULL;

	if (!dump)
		return;
	if (dump == 1) {
		fprintf(f, "%s {0x%016" PRIx64 "}[%d]\n",
			prompt, node->nodeguid,
			node->type == IB_NODE_SWITCH ? 0 : port->portnum);
		return;
	}

	nodename =
	    remap_node_name(node_name_map, node->nodeguid, node->nodedesc);

	fprintf(f, "%s %s {0x%016" PRIx64 "} portnum %d lid %u-%u \"%s\"\n",
		prompt,
		(node->type <= IB_NODE_MAX ? node_type_str[node->type] : "???"),
		node->nodeguid,
		node->type == IB_NODE_SWITCH ? 0 : port->portnum, port->lid,
		port->lid + (1 << port->lmc) - 1, nodename);

	free(nodename);
}
static void nd_rcv_process_nd(IN osm_sm_t * sm, IN osm_node_t * p_node,
                              IN const ib_node_desc_t * p_nd)
{
    char *tmp_desc;
    char print_desc[IB_NODE_DESCRIPTION_SIZE + 1];

    OSM_LOG_ENTER(sm->p_log);

    memcpy(&p_node->node_desc.description, p_nd, sizeof(*p_nd));

    /* also set up a printable version */
    memcpy(print_desc, p_nd, sizeof(*p_nd));
    print_desc[IB_NODE_DESCRIPTION_SIZE] = '\0';
    tmp_desc = remap_node_name(sm->p_subn->p_osm->node_name_map,
                               cl_ntoh64(osm_node_get_node_guid(p_node)),
                               print_desc);

    /* make a copy for this node to "own" */
    if (p_node->print_desc)
        free(p_node->print_desc);
    p_node->print_desc = tmp_desc;

    OSM_LOG(sm->p_log, OSM_LOG_VERBOSE,
            "Node 0x%" PRIx64 "\n\t\t\t\tDescription = %s\n",
            cl_ntoh64(osm_node_get_node_guid(p_node)), p_node->print_desc);

    OSM_LOG_EXIT(sm->p_log);
}
예제 #5
0
void list_node(ibnd_node_t * node, void *user_data)
{
	char *node_type;
	char *nodename = remap_node_name(node_name_map, node->guid,
					 node->nodedesc);

	switch (node->type) {
	case IB_NODE_SWITCH:
		node_type = "Switch";
		break;
	case IB_NODE_CA:
		node_type = "Ca";
		break;
	case IB_NODE_ROUTER:
		node_type = "Router";
		break;
	default:
		node_type = "???";
		break;
	}
	fprintf(f,
		"%s\t : 0x%016" PRIx64
		" ports %d devid 0x%x vendid 0x%x \"%s\"\n", node_type,
		node->guid, node->numports, mad_get_field(node->info, 0,
							  IB_NODE_DEVID_F),
		mad_get_field(node->info, 0, IB_NODE_VENDORID_F), nodename);

	free(nodename);
}
예제 #6
0
void out_switch_detail(ibnd_node_t * node, char *sw_prefix)
{
	char *nodename = NULL;

	nodename = remap_node_name(node_name_map, node->guid, node->nodedesc);

	fprintf(f, "%sSwitch\t%d %s\t\t# \"%s\" %s port 0 lid %d lmc %d",
		sw_prefix ? sw_prefix : "", node->numports, node_name(node),
		nodename, node->smaenhsp0 ? "enhanced" : "base",
		node->smalid, node->smalmc);

	free(nodename);
}
예제 #7
0
void out_ca_port(ibnd_port_t * port, int group, char *out_prefix)
{
	char *str = NULL;
	char *rem_nodename = NULL;
	uint32_t iwidth = mad_get_field(port->info, 0,
					IB_PORT_LINK_WIDTH_ACTIVE_F);
	uint32_t ispeed = mad_get_field(port->info, 0,
					IB_PORT_LINK_SPEED_ACTIVE_F);
	uint32_t fdr10 = mad_get_field(port->ext_info, 0,
				       IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F);
	uint32_t cap_mask, espeed;

	fprintf(f, "%s[%d]", out_prefix ? out_prefix : "", port->portnum);
	if (port->node->type != IB_NODE_SWITCH)
		fprintf(f, "(%" PRIx64 ") ", port->guid);
	fprintf(f, "\t%s[%d]",
		node_name(port->remoteport->node), port->remoteport->portnum);
	str = out_ext_port(port->remoteport, group);
	if (str)
		fprintf(f, "%s", str);
	if (port->remoteport->node->type != IB_NODE_SWITCH)
		fprintf(f, " (%" PRIx64 ") ", port->remoteport->guid);

	rem_nodename = remap_node_name(node_name_map,
				       port->remoteport->node->guid,
				       port->remoteport->node->nodedesc);

	cap_mask = mad_get_field(port->info, 0, IB_PORT_CAPMASK_F);
	if (cap_mask & CL_NTOH32(IB_PORT_CAP_HAS_EXT_SPEEDS))
		espeed = mad_get_field(port->info, 0,
				       IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
	else
		espeed = 0;

	fprintf(f, "\t\t# lid %d lmc %d \"%s\" lid %d %s%s",
		port->base_lid, port->lmc, rem_nodename,
		port->remoteport->node->type == IB_NODE_SWITCH ?
		port->remoteport->node->smalid :
		port->remoteport->base_lid,
		dump_linkwidth_compat(iwidth),
		(ispeed != 4 && !espeed) ?
			dump_linkspeed_compat(ispeed) :
			dump_linkspeedext_compat(espeed, ispeed, fdr10));

	if (full_info)
		fprintf(f, " s=%d w=%d", ispeed, iwidth);
	fprintf(f, "\n");

	free(rem_nodename);
}
예제 #8
0
static void dump_route(int dump, Node * node, int outport, Port * port)
{
	char *nodename = NULL;

	if (!dump && !ibverbose)
		return;

	nodename =
	    remap_node_name(node_name_map, node->nodeguid, node->nodedesc);

	if (dump == 1)
		fprintf(f, "[%d] -> {0x%016" PRIx64 "}[%d]\n",
			outport, port->portguid, port->portnum);
	else
		fprintf(f, "[%d] -> %s port {0x%016" PRIx64
			"}[%d] lid %u-%u \"%s\"\n", outport,
			(node->type <=
			 IB_NODE_MAX ? node_type_str[node->type] : "???"),
			port->portguid, port->portnum, port->lid,
			port->lid + (1 << port->lmc) - 1, nodename);

	free(nodename);
}
예제 #9
0
void dump_ports_report(ibnd_node_t * node, void *user_data)
{
	int p = 0;
	ibnd_port_t *port = NULL;
	char *nodename = NULL;
	char *rem_nodename = NULL;

	/* for each port */
	for (p = node->numports, port = node->ports[p]; p > 0;
	     port = node->ports[--p]) {
		uint32_t iwidth, ispeed, fdr10, espeed, cap_mask;
		uint8_t *info = NULL;
		if (port == NULL)
			continue;
		iwidth =
		    mad_get_field(port->info, 0, IB_PORT_LINK_WIDTH_ACTIVE_F);
		ispeed =
		    mad_get_field(port->info, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
		if (port->node->type == IB_NODE_SWITCH) {
			if (port->node->ports[0])
				info = (uint8_t *)&port->node->ports[0]->info;
		}
		else
			info = (uint8_t *)&port->info;
		if (info) {
			cap_mask = mad_get_field(info, 0, IB_PORT_CAPMASK_F);
			if (cap_mask & CL_NTOH32(IB_PORT_CAP_HAS_EXT_SPEEDS))
				espeed = mad_get_field(port->info, 0,
						       IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
			else
				espeed = 0;
		} else {
			ispeed = 0;
			iwidth = 0;
			espeed = 0;
		}
		fdr10 = mad_get_field(port->ext_info, 0,
				      IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F);
		nodename = remap_node_name(node_name_map,
					   port->node->guid,
					   port->node->nodedesc);
		fprintf(stdout, "%2s %5d %2d 0x%016" PRIx64 " %s %s",
			ports_nt_str_compat(node),
			node->type ==
			IB_NODE_SWITCH ? node->smalid : port->base_lid,
			port->portnum, port->guid,
			dump_linkwidth_compat(iwidth),
			(ispeed != 4 && !espeed) ?
				dump_linkspeed_compat(ispeed) :
				dump_linkspeedext_compat(espeed, ispeed, fdr10));
		if (port->remoteport) {
			rem_nodename = remap_node_name(node_name_map,
					      port->remoteport->node->guid,
					      port->remoteport->node->nodedesc);
			fprintf(stdout,
				" - %2s %5d %2d 0x%016" PRIx64
				" ( '%s' - '%s' )\n",
				ports_nt_str_compat(port->remoteport->node),
				port->remoteport->node->type == IB_NODE_SWITCH ?
				port->remoteport->node->smalid :
				port->remoteport->base_lid,
				port->remoteport->portnum,
				port->remoteport->guid, nodename, rem_nodename);
			free(rem_nodename);
		} else
			fprintf(stdout, "%36s'%s'\n", "", nodename);

		free(nodename);
	}
}
예제 #10
0
void out_switch_port(ibnd_port_t * port, int group, char *out_prefix)
{
	char *ext_port_str = NULL;
	char *rem_nodename = NULL;
	uint32_t iwidth = mad_get_field(port->info, 0,
					IB_PORT_LINK_WIDTH_ACTIVE_F);
	uint32_t ispeed = mad_get_field(port->info, 0,
					IB_PORT_LINK_SPEED_ACTIVE_F);
	uint32_t fdr10 = mad_get_field(port->ext_info, 0,
				       IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F);
	uint32_t cap_mask, espeed;

	DEBUG("port %p:%d remoteport %p\n", port, port->portnum,
	      port->remoteport);
	fprintf(f, "%s[%d]", out_prefix ? out_prefix : "", port->portnum);

	ext_port_str = out_ext_port(port, group);
	if (ext_port_str)
		fprintf(f, "%s", ext_port_str);

	rem_nodename = remap_node_name(node_name_map,
				       port->remoteport->node->guid,
				       port->remoteport->node->nodedesc);

	ext_port_str = out_ext_port(port->remoteport, group);

	if (!port->node->ports[0]) {
		cap_mask = 0;
		ispeed = 0;
		espeed = 0;
	} else {
		cap_mask = mad_get_field(port->node->ports[0]->info, 0,
					 IB_PORT_CAPMASK_F);
		if (cap_mask & CL_NTOH32(IB_PORT_CAP_HAS_EXT_SPEEDS))
			espeed = mad_get_field(port->info, 0,
					       IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
		else
			espeed = 0;
	}
	fprintf(f, "\t%s[%d]%s",
		node_name(port->remoteport->node), port->remoteport->portnum,
		ext_port_str ? ext_port_str : "");
	if (port->remoteport->node->type != IB_NODE_SWITCH)
		fprintf(f, "(%" PRIx64 ") ", port->remoteport->guid);
	fprintf(f, "\t\t# \"%s\" lid %d %s%s",
		rem_nodename,
		port->remoteport->node->type == IB_NODE_SWITCH ?
		port->remoteport->node->smalid :
		port->remoteport->base_lid,
		dump_linkwidth_compat(iwidth),
		(ispeed != 4 && !espeed) ?
			dump_linkspeed_compat(ispeed) :
			dump_linkspeedext_compat(espeed, ispeed, fdr10));

	if (full_info)
		fprintf(f, " s=%d w=%d", ispeed, iwidth);

	if (ibnd_is_xsigo_tca(port->remoteport->guid))
		fprintf(f, " slot %d", port->portnum);
	else if (ibnd_is_xsigo_hca(port->remoteport->guid))
		fprintf(f, " (scp)");
	fprintf(f, "\n");

	free(rem_nodename);
}
예제 #11
0
void print_node(ibnd_node_t * node, void *user_data)
{
	int header_printed = 0;
	int p = 0;
	int startport = 1;
	int type = 0;
	int all_port_sup = 0;
	ib_portid_t portid = { 0 };
	uint16_t cap_mask = 0;
	char *node_name = NULL;

	switch (node->type) {
	case IB_NODE_SWITCH:
		type = PRINT_SWITCH;
		break;
	case IB_NODE_CA:
		type = PRINT_CA;
		break;
	case IB_NODE_ROUTER:
		type = PRINT_ROUTER;
		break;
	}

	if ((type & node_type_to_print) == 0)
		return;

	if (node->type == IB_NODE_SWITCH && node->smaenhsp0)
		startport = 0;

	node_name = remap_node_name(node_name_map, node->guid, node->nodedesc);

	if (node->type == IB_NODE_SWITCH) {
		ib_portid_set(&portid, node->smalid, 0, 0);
		p = 0;
	} else {
		for (p = 1; p <= node->numports; p++) {
			if (node->ports[p]) {
				ib_portid_set(&portid,
					      node->ports[p]->base_lid,
					      0, 0);
				break;
			}
		}
	}

	if ((query_cap_mask(&portid, node_name, p, &cap_mask) == 0) &&
	    (cap_mask & IB_PM_ALL_PORT_SELECT))
		all_port_sup = 1;

	if (data_counters_only) {
		for (p = startport; p <= node->numports; p++) {
			if (node->ports[p]) {
				if (node->type == IB_NODE_SWITCH)
					ib_portid_set(&portid, node->smalid, 0, 0);
				else
					ib_portid_set(&portid, node->ports[p]->base_lid,
						      0, 0);

				print_data_cnts(&portid, cap_mask, node_name, node, p,
						&header_printed);
				summary.ports_checked++;
				if (!all_port_sup)
					clear_port(&portid, cap_mask, node_name, p);
			}
		}
	} else {
		if (all_port_sup)
			if (!print_errors(&portid, cap_mask, node_name, node,
					  0xFF, &header_printed)) {
				summary.ports_checked += node->numports;
				goto clear;
			}

		for (p = startport; p <= node->numports; p++) {
			if (node->ports[p]) {
				if (node->type == IB_NODE_SWITCH)
					ib_portid_set(&portid, node->smalid, 0, 0);
				else
					ib_portid_set(&portid, node->ports[p]->base_lid,
						      0, 0);

				print_errors(&portid, cap_mask, node_name, node, p,
					     &header_printed);
				summary.ports_checked++;
				if (!all_port_sup)
					clear_port(&portid, cap_mask, node_name, p);
			}
		}
	}

clear:
	summary.nodes_checked++;
	if (all_port_sup)
		clear_port(&portid, cap_mask, node_name, 0xFF);

	free(node_name);
}
예제 #12
0
static void print_port_config(char *node_name, ibnd_node_t * node, int portnum)
{
	char width[64], speed[64], state[64], physstate[64];
	char remote_str[256];
	char link_str[256];
	char width_msg[256];
	char speed_msg[256];
	char ext_port_str[256];
	int iwidth, ispeed, fdr10, espeed, istate, iphystate, cap_mask;
	uint8_t *info;

	ibnd_port_t *port = node->ports[portnum];

	if (!port)
		return;

	iwidth = mad_get_field(port->info, 0, IB_PORT_LINK_WIDTH_ACTIVE_F);
	ispeed = mad_get_field(port->info, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
	fdr10 = mad_get_field(port->ext_info, 0,
			      IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F) & FDR10;

	if (port->node->type == IB_NODE_SWITCH)
		info = (uint8_t *)&port->node->ports[0]->info;
	else
		info = (uint8_t *)&port->info;
	cap_mask = mad_get_field(info, 0, IB_PORT_CAPMASK_F);
	if (cap_mask & CL_NTOH32(IB_PORT_CAP_HAS_EXT_SPEEDS))
		espeed = mad_get_field(port->info, 0,
				       IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
	else
		espeed = 0;
	istate = mad_get_field(port->info, 0, IB_PORT_STATE_F);
	iphystate = mad_get_field(port->info, 0, IB_PORT_PHYS_STATE_F);

	remote_str[0] = '\0';
	link_str[0] = '\0';
	width_msg[0] = '\0';
	speed_msg[0] = '\0';

	/* C14-24.2.1 states that a down port allows for invalid data to be
	 * returned for all PortInfo components except PortState and
	 * PortPhysicalState */
	if (istate != IB_LINK_DOWN) {
		if (!espeed) {
			if (fdr10)
				sprintf(speed, "10.0 Gbps (FDR10)");
			else
				mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, speed,
					     64, &ispeed);
		} else
			mad_dump_val(IB_PORT_LINK_SPEED_EXT_ACTIVE_F, speed,
			     64, &espeed);

		snprintf(link_str, 256, "(%3s %18s %6s/%8s)",
			 mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F, width, 64, &iwidth),
			 speed,
			 mad_dump_val(IB_PORT_STATE_F, state, 64, &istate),
			 mad_dump_val(IB_PORT_PHYS_STATE_F, physstate, 64, &iphystate));
	} else {
		snprintf(link_str, 256, "(              %6s/%8s)",
			 mad_dump_val(IB_PORT_STATE_F, state, 64, &istate),
			 mad_dump_val(IB_PORT_PHYS_STATE_F, physstate, 64, &iphystate));
	}

	if (port->remoteport) {
		char *rem_node_name = NULL;

		if (port->remoteport->ext_portnum)
			snprintf(ext_port_str, 256, "%d",
				 port->remoteport->ext_portnum);
		else
			ext_port_str[0] = '\0';

		get_max_msg(width_msg, speed_msg, 256, port);

		rem_node_name = remap_node_name(node_name_map,
						port->remoteport->node->guid,
						port->remoteport->node->
						nodedesc);

		snprintf(remote_str, 256,
			 "0x%016" PRIx64 " %6d %4d[%2s] \"%s\" (%s %s)\n",
			 port->remoteport->guid,
			 port->remoteport->base_lid ? port->remoteport->
			 base_lid : port->remoteport->node->smalid,
			 port->remoteport->portnum, ext_port_str, rem_node_name,
			 width_msg, speed_msg);

		free(rem_node_name);
	} else
		snprintf(remote_str, 256, "           [  ] \"\" ( )\n");

	if (port->ext_portnum)
		snprintf(ext_port_str, 256, "%d", port->ext_portnum);
	else
		ext_port_str[0] = '\0';

	if (node->type == IB_NODE_SWITCH)
		printf("       Link info: %6d", node->smalid);
	else
		printf("       Link info: %6d", port->base_lid);

	printf("%4d[%2s] ==%s==>  %s",
	       port->portnum, ext_port_str, link_str, remote_str);
}
/** =========================================================================
*/
static int
report_error(mysql_connection_t *conn, char *mask_str)
{
	int rc = 0;
	unsigned int  num_fields;
	unsigned int  num_rows, i;
	MYSQL_RES    *res;
	MYSQL_ROW     row;
	mask_val_t   *mask_vals = parse_mask(mask_str);

	if (QUERY(conn,
			"select pe.SymbolErrors, pe.LinkRecovers,"
			" pe.LinkDowned, pe.RcvErrors, pe.RcvRemotePhysErrors,"
			" pe.RcvSwitchRelayErrors, pe.XmtDiscards,"
			" pe.XmtConstraintErrors, pe.RcvConstraintErrors,"
			" pe.LinkIntegrityErrors, pe.ExcBufOverrunErrors,"
			" pe.VL15Dropped, n.name, pe.port, n.guid,"
			" pd.xmit_data, pd.rcv_data, pd.xmit_pkts, pd.rcv_pkts,"
			" pd.unicast_xmit_pkts, pd.unicast_rcv_pkts,"
			" pd.multicast_xmit_pkts, pd.multicast_rcv_pkts, "
			" pd.port "
			" from "
			" port_errors as pe,nodes as n,port_data_counters as pd "
			" where"
			" n.guid=pe.guid and n.guid=pd.guid and pe.port=pd.port;"
			)) {
		fprintf(stderr, "Failed to query node errors\n");
		return (1);
	}

	res = mysql_store_result(conn->conn);

	if ((num_fields = mysql_num_fields(res)) != 24) {
		fprintf(stderr, "%s:%d Failed to query node errors %d != 24\n",
			__FUNCTION__, __LINE__, num_fields);
		rc = 1;
		goto free_res;
	}

	num_rows = mysql_num_rows(res);

	if (num_rows == 0) {
		fprintf(stderr, "Failed to find any nodes in DB\n");
		rc = 1;
		goto free_res;
	}

	for (i = 0; i < num_rows; i++) {
		uint64_t SymbolErrors;
		uint64_t LinkRecovers;
		uint64_t LinkDowned;
		uint64_t RcvErrors;
		uint64_t RcvRemotePhysErrors;
		uint64_t RcvSwitchRelayErrors;
		uint64_t XmtDiscards;
		uint64_t XmtConstraintErrors;
		uint64_t RcvConstraintErrors;
		uint64_t LinkIntegrityErrors;
		uint64_t ExcBufOverrunErrors;
		uint64_t VL15Dropped;
		uint64_t total = 0;

		row = mysql_fetch_row(res);

		SymbolErrors = COL_TO_UINT64(0);
		total += CHECK_MASK(SymbolErrors, mask_vals);
		LinkRecovers = COL_TO_UINT64(1);
		total += CHECK_MASK(LinkRecovers, mask_vals);
		LinkDowned = COL_TO_UINT64(2);
		total += CHECK_MASK(LinkDowned, mask_vals);
		RcvErrors = COL_TO_UINT64(3);
		total += CHECK_MASK(RcvErrors, mask_vals);
		RcvRemotePhysErrors = COL_TO_UINT64(4);
		total += CHECK_MASK(RcvRemotePhysErrors, mask_vals);
		RcvSwitchRelayErrors = COL_TO_UINT64(5);
		total += CHECK_MASK(RcvSwitchRelayErrors, mask_vals);
		XmtDiscards = COL_TO_UINT64(6);
		total += CHECK_MASK(XmtDiscards, mask_vals);
		XmtConstraintErrors = COL_TO_UINT64(7);
		total += CHECK_MASK(XmtConstraintErrors, mask_vals);
		RcvConstraintErrors = COL_TO_UINT64(8);
		total += CHECK_MASK(RcvConstraintErrors, mask_vals);
		LinkIntegrityErrors = COL_TO_UINT64(9);
		total += CHECK_MASK(LinkIntegrityErrors, mask_vals);
		ExcBufOverrunErrors = COL_TO_UINT64(10);
		total += CHECK_MASK(ExcBufOverrunErrors, mask_vals);
		VL15Dropped = COL_TO_UINT64(11);
		total += CHECK_MASK(VL15Dropped, mask_vals);

		if (total > 0) {
			char node_desc[65];
			char *node_name = NULL;
			strncpy(node_desc, row[12], 64);
			node_name = remap_node_name(node_name_map, COL_TO_UINT64(14), node_desc);
			print_report_error_res(node_name, row, total);
			free(node_name);
		}
	}

free_res:
	mysql_free_result(res);
	return (rc);
}
/** =========================================================================
 * Port <= 0 indicates "all" ports
 */
static int
report(mysql_connection_t *conn, char *node, int port)
{
	int rc = 0;
	unsigned int  num_fields;
	unsigned int  num_rows, i;
	MYSQL_RES    *res;
	MYSQL_ROW     row;
#define CLAUSE_SIZE (256)
	char          node_clause[CLAUSE_SIZE];
	char          port_clause[CLAUSE_SIZE];

	if (node) {
		/* check to see if the node is specified by name or guid */
		uint64_t guid = strtoull(node, NULL, 0);
		if (guid == 0)
			guid = get_guid_for_name(node_name_map, node);
		if (guid == 0) {
			snprintf(node_clause, CLAUSE_SIZE,
				" and n.name=\"%s\"", node);
		} else {
			snprintf(node_clause, CLAUSE_SIZE,
				" and n.guid=%"PRIuLEAST64, guid);
		}
	} else {
		node_clause[0] = '\0';
	}
	if (port > 0) {
		snprintf(port_clause, CLAUSE_SIZE, " and pe.port=%d", port);
	} else {
		port_clause[0] = '\0';
	}

	if (QUERY(conn,
			"select pe.SymbolErrors, pe.LinkRecovers,"
			" pe.LinkDowned, pe.RcvErrors, pe.RcvRemotePhysErrors,"
			" pe.RcvSwitchRelayErrors, pe.XmtDiscards,"
			" pe.XmtConstraintErrors, pe.RcvConstraintErrors,"
			" pe.LinkIntegrityErrors, pe.ExcBufOverrunErrors,"
			" pe.VL15Dropped, n.name, pe.port, n.guid,"
			" pd.xmit_data, pd.rcv_data, pd.xmit_pkts, pd.rcv_pkts,"
			" pd.unicast_xmit_pkts, pd.unicast_rcv_pkts,"
			" pd.multicast_xmit_pkts, pd.multicast_rcv_pkts, "
			" pd.port "
			" from "
			" port_errors as pe,nodes as n,port_data_counters as pd "
			" where"
			" n.guid=pe.guid and n.guid=pd.guid and pe.port=pd.port %s %s;",
			node_clause,
			port_clause)) {
		fprintf(stderr, "Failed to query node errors");
		if (node) {
			fprintf(stderr, " for \"%s\"", node);
		} else {
			fprintf(stderr, "\n");
		}
		return (1);
	}

	res = mysql_store_result(conn->conn);

	if ((num_fields = mysql_num_fields(res)) != 24) {
		fprintf(stderr, "%s:%d Failed to query node errors %d != 24\n",
			__FUNCTION__, __LINE__, num_fields);
		rc = 1;
		goto free_res;
	}

	num_rows = mysql_num_rows(res);

	if (num_rows == 0) {
		if (node) {
			if (port <= 0) {
				fprintf(stderr, "Node \"%s\" (port %s) not found in DB\n",
					node, "\"all\"");
			} else {
				fprintf(stderr, "Node \"%s\" (port %d) not found in DB\n",
					node, port);
			}
		} else {
			fprintf(stderr, "Failed to find any nodes in DB\n");
		}
		rc = 1;
		goto free_res;
	}

	for (i = 0; i < num_rows; i++) {
		char node_desc[65];
		char *node_name = NULL;

		row = mysql_fetch_row(res);

		strncpy(node_desc, row[12], 64);
		node_name = remap_node_name(node_name_map, COL_TO_UINT64(14), node_desc);
		if (skummee_output) {
			clean_node_name(node_name);
			print_report_line_res(node_name, row);
		} else
			print_report_res(node_name, row);
		free(node_name);
	}

free_res:
	mysql_free_result(res);
	return (rc);
}
static int
query_status(mysql_connection_t *conn)
{
	int rc = 0;
	unsigned int  num_fields;
	unsigned int  num_rows, i;
	uint64_t      errors = 0;
	MYSQL_RES    *res;
	MYSQL_ROW     row;
#if HAVE_LIBGENDERS
	genders_t genders_handle;
	char        **nodes = NULL;
	int           num_nodes = 0;
	switch_error_sum_t switch_error_sum;

	memset(&switch_error_sum, 0, (sizeof switch_error_sum));
#endif

	/* issue the query join for any errors */
	if (QUERY(conn,
			"select pe.SymbolErrors, pe.LinkRecovers,"
			" pe.LinkDowned, pe.RcvErrors, pe.RcvRemotePhysErrors,"
			" pe.RcvSwitchRelayErrors, pe.XmtDiscards,"
			" pe.XmtConstraintErrors, pe.RcvConstraintErrors,"
			" pe.LinkIntegrityErrors, pe.ExcBufOverrunErrors,"
			" pe.VL15Dropped, n.name, pe.port, n.guid"
			" from port_errors as pe,nodes as n where n.guid=pe.guid;")) {
		fprintf(stderr, "Failed to query node errors\n");
		return (1);
	}

	res = mysql_store_result(conn->conn);

	if ((num_fields = mysql_num_fields(res)) != 15) {
		fprintf(stderr, "%s:%d Failed to query status %d != 14\n",
			__FUNCTION__, __LINE__, num_fields);
		rc = 1;
		goto free_res;
	}

	num_rows = mysql_num_rows(res);

#if HAVE_LIBGENDERS
	genders_handle = genders_handle_create();
	if (!genders_handle || genders_load_data(genders_handle, NULL)) {
		fprintf(stderr, "Genders load failed: %s\n", genders_handle ?
			genders_errormsg(genders_handle)
			: "handle creation failed");
		goto genders_open_fail;
	}
#endif

	/* The basic algo is to sum up all the errors and report them together */
	for (i = 0; i < num_rows; i++) {
		char node_desc[65];
		char *node_name = NULL;

		row = mysql_fetch_row(res);

		/* add up all the errors reported. */
		errors = 0;
		errors += COL_TO_UINT64(0);
		errors += COL_TO_UINT64(1);
		errors += COL_TO_UINT64(2);
		errors += COL_TO_UINT64(3);
		errors += COL_TO_UINT64(4);
		errors += COL_TO_UINT64(5);
		errors += COL_TO_UINT64(6);
		errors += COL_TO_UINT64(7);
		errors += COL_TO_UINT64(8);
		errors += COL_TO_UINT64(9);
		errors += COL_TO_UINT64(10);
		errors += COL_TO_UINT64(11);

#if HAVE_LIBGENDERS
		if (sum_fabric_errors && !genders_isnode(genders_handle, row[12])) {
			switch_error_sum.SymbolErrors         += COL_TO_UINT64(0);
			switch_error_sum.LinkRecovers         += COL_TO_UINT64(1);
			switch_error_sum.LinkDowned           += COL_TO_UINT64(2);
			switch_error_sum.RcvErrors            += COL_TO_UINT64(3);
			switch_error_sum.RcvRemotePhysErrors  += COL_TO_UINT64(4);
			switch_error_sum.RcvSwitchRelayErrors += COL_TO_UINT64(5);
			switch_error_sum.XmtDiscards          += COL_TO_UINT64(6);
			switch_error_sum.XmtConstraintErrors  += COL_TO_UINT64(7);
			switch_error_sum.RcvConstraintErrors  += COL_TO_UINT64(8);
			switch_error_sum.LinkIntegrityErrors  += COL_TO_UINT64(9);
			switch_error_sum.ExcBufOverrunErrors  += COL_TO_UINT64(10);
			switch_error_sum.VL15Dropped          += COL_TO_UINT64(11);
		}
#endif

		strncpy(node_desc, row[12], 64);
		node_name = remap_node_name(node_name_map, COL_TO_UINT64(14), node_desc);
		clean_node_name(node_name);
		printf("%s,ibport%s-error_sum,%"PRIuLEAST64"\n",
			node_name, row[13], errors);
		free(node_name);
	}

#if HAVE_LIBGENDERS
	if (sum_fabric_errors) {
		printf("%s,SymbolErrors_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.SymbolErrors);
		printf("%s,SymbolErrors_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.SymbolErrors);

		printf("%s,LinkRecovers_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.LinkRecovers);
		printf("%s,LinkRecovers_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.LinkRecovers);

		printf("%s,LinkDowned_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.LinkDowned);
		printf("%s,LinkDowned_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.LinkDowned);

		printf("%s,RcvErrors_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.RcvErrors);
		printf("%s,RcvErrors_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.RcvErrors);

		printf("%s,RcvRemotePhysErrors_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.RcvRemotePhysErrors);
		printf("%s,RcvRemotePhysErrors_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.RcvRemotePhysErrors);

		printf("%s,RcvSwitchRelayErrors_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.RcvSwitchRelayErrors);
		printf("%s,RcvSwitchRelayErrors_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.RcvSwitchRelayErrors);

		printf("%s,XmtDiscards_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.XmtDiscards);
		printf("%s,XmtDiscards_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.XmtDiscards);

		printf("%s,XmtConstraintErrors_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.XmtConstraintErrors);
		printf("%s,XmtConstraintErrors_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.XmtConstraintErrors);

		printf("%s,RcvConstraintErrors_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.RcvConstraintErrors);
		printf("%s,RcvConstraintErrors_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.RcvConstraintErrors);

		printf("%s,LinkIntegrityErrors_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.LinkIntegrityErrors);
		printf("%s,LinkIntegrityErrors_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.LinkIntegrityErrors);

		printf("%s,ExcBufOverrunErrors_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.ExcBufOverrunErrors);
		printf("%s,ExcBufOverrunErrors_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.ExcBufOverrunErrors);

		printf("%s,VL15Dropped_sum,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.VL15Dropped);
		printf("%s,VL15Dropped_sum_counter,%"PRIuLEAST64"\n",
			IB_SWITCH_TOTAL_NODE_NAME,
			switch_error_sum.VL15Dropped);
	}
genders_open_fail:
	genders_handle_destroy(genders_handle);
#endif

free_res:
	mysql_free_result(res);
	return (rc);
}