Beispiel #1
0
/** ========================================================================= */
int oib_open_port_by_guid(struct oib_port **port, uint64_t port_guid)
{
	FSTATUS fstatus;
	char      name[IBV_SYSFS_NAME_MAX];
	int       ca_num;
	int       num;
	uint64_t  prefix;
	uint16    sm_lid;
	uint8     sm_sl;
	uint8     port_state;
	int       rc = 0;
	
    fstatus = oib_get_hfi_from_portguid(port_guid, name, &ca_num, &num,
										&prefix, &sm_lid, &sm_sl, &port_state);
    if (fstatus != FSUCCESS) {
		return (EIO);
	}

	rc = oib_open_port(port, name, num);

	if (rc == 0) {
		(*port)->hfi_num = ca_num;
		snprintf((*port)->hfi_name, IBV_SYSFS_NAME_MAX, "%s", name);
		(*port)->hfi_port_num = num;
		(*port)->local_gid.Type.Global.SubnetPrefix = prefix;
		(*port)->local_gid.Type.Global.InterfaceID = port_guid;
	}

	return rc;
}
Beispiel #2
0
/**
 * Load up xml parser and extract values 
 * 
 * @return int 0 on success.
 */
int loadConfig(void){
	FMXmlCompositeConfig_t *xml_config = NULL;
	int i, j, hfi, port;

	char      name[UMAD_CA_NAME_LEN];
	uint64_t guid;
	uint64_t  prefix;
	uint16    sm_lid;
	uint8     sm_sl;
	uint8     port_state;

	xml_config = parseFmConfig(FM_XML_CONFIG, IXML_PARSER_FLAG_NONE, /* instance does not matter for startup */ 0, /* full parse */ 1, /* embedded */ 0);
	if (!xml_config) {
		fprintf(stdout, "Could not open or there was a parse error while reading configuration file ('%s')\n", FM_XML_CONFIG);
		return -1;
	}

	for (i = 0; i < FM_MAX_INSTANCES; i++) {
		if (!xml_config->fm_instance[i]) {
			config.instance[i].enabled = 0;
		} else {
			config.instance[i].enabled = xml_config->fm_instance[i]->fm_config.start;
			config.instance[i].component[SM_COMPONENT].enabled = xml_config->fm_instance[i]->sm_config.start;
			config.instance[i].component[SM_COMPONENT].maxRetries = xml_config->fm_instance[i]->sm_config.startup_retries;
			config.instance[i].component[SM_COMPONENT].retryTimeout = xml_config->fm_instance[i]->sm_config.startup_stable_wait * 60;
			config.instance[i].component[FE_COMPONENT].enabled = xml_config->fm_instance[i]->fe_config.start;
			config.instance[i].component[FE_COMPONENT].maxRetries = xml_config->fm_instance[i]->fe_config.startup_retries;
			config.instance[i].component[FE_COMPONENT].retryTimeout = xml_config->fm_instance[i]->fe_config.startup_stable_wait * 60;
		}
	}

	struct { // Struct created to make the if tree below more readable.
		uint32 hfi;
		uint32 port;
		uint64 guid;
	} selected_device[FM_MAX_INSTANCES] = {{0}};

	for (i = 0; i < FM_MAX_INSTANCES; ++i) {
		selected_device[i].hfi = xml_config->fm_instance[i]->fm_config.hca;
		selected_device[i].port = xml_config->fm_instance[i]->fm_config.port;
		selected_device[i].guid = xml_config->fm_instance[i]->fm_config.port_guid;
		if (xml_config->fm_instance[i]->fm_config.start) {
			// To make sure we don't miss mismatched guid and hfi/port configs, we want to fill in missing info
			if (selected_device[i].guid && oib_get_hfi_from_portguid(selected_device[i].guid, name, &hfi, &port, &prefix, &sm_lid, &sm_sl, &port_state) == VSTATUS_OK) {
				selected_device[i].hfi = hfi;
				selected_device[i].port = port;
			} else if (selected_device[i].port &&
					   oib_get_portguid(selected_device[i].hfi, selected_device[i].port, NULL, NULL, &guid, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == VSTATUS_OK) {
				selected_device[i].guid = guid;
			}
			if (!selected_device[i].guid || !selected_device[i].port) {
				fprintf(stderr, "Invalid config detected! Coundn't find device for instance %d!.\n", i);
				releaseXmlConfig(xml_config, /* full */ 1);
				return 1;
			}
		}
	}

	for (i = 0; i < FM_MAX_INSTANCES; ++i) {
		if (xml_config->fm_instance[i]->fm_config.start) { // only compare enabled instances
			for (j = i + 1; j < FM_MAX_INSTANCES; ++j) {
				if (xml_config->fm_instance[j]->fm_config.start && // against other enabled instances
					((selected_device[i].hfi == selected_device[j].hfi &&
					selected_device[i].port == selected_device[j].port) ||
					selected_device[i].guid == selected_device[j].guid)) {
						fprintf(stderr, "Invalid config detected! Same HFI detected for multiple enabled FM instances.\n");
						releaseXmlConfig(xml_config, /* full */ 1);
						return 1;
				}
			}
		}
	}

	releaseXmlConfig(xml_config, /* full */ 1);
	return 0;
}