static indigo_error_t port_status_notify(of_port_no_t of_port_num, unsigned reason) { indigo_error_t result = INDIGO_ERROR_NONE; of_port_desc_t *of_port_desc = 0; of_port_status_t *of_port_status = 0; of_version_t ctrlr_of_version; if (indigo_cxn_get_async_version(&ctrlr_of_version) != INDIGO_ERROR_NONE) { LOG_TRACE("No active controller connection"); return INDIGO_ERROR_NONE; } if ((of_port_desc = of_port_desc_new(ctrlr_of_version)) == 0) { LOG_ERROR("of_port_desc_new() failed"); result = INDIGO_ERROR_UNKNOWN; goto done; } port_desc_set(of_port_desc, of_port_num); if ((of_port_status = of_port_status_new(ctrlr_of_version)) == 0) { LOG_ERROR("of_port_status_new() failed"); result = INDIGO_ERROR_UNKNOWN; goto done; } of_port_status_reason_set(of_port_status, reason); of_port_status_desc_set(of_port_status, of_port_desc); of_port_desc_delete(of_port_desc); indigo_core_port_status_update(of_port_status); of_port_desc = 0; /* No longer owned */ of_port_status = 0; /* No longer owned */ done: if (of_port_desc) of_port_desc_delete(of_port_desc); if (of_port_status) of_port_status_delete(of_port_status); return (result); }
void ind_ofdpa_port_event_receive(void) { of_port_desc_t *of_port_desc = 0; of_port_status_t *of_port_status = 0; ofdpaPortEvent_t portEventData; int reason = 0; LOG_TRACE("Reading Port Events"); memset(&portEventData, 0, sizeof(portEventData)); while (ofdpaPortEventNextGet(&portEventData) == OFDPA_E_NONE) { LOG_TRACE("client_event: retrieved port event: port no = %d, eventMask = 0x%x, state = %d\n", portEventData.portNum, portEventData.eventMask, portEventData.state); of_port_desc = of_port_desc_new(ofagent_of_version); if (of_port_desc == 0) { LOG_ERROR("of_port_desc_new() failed"); break; } if ((ind_ofdpa_port_desc_set(portEventData.portNum, of_port_desc)) < 0) { LOG_ERROR("ind_ofdpa_port_desc_set() failed"); break; } of_port_status = of_port_status_new(ofagent_of_version); if (of_port_status == 0) { LOG_ERROR("of_port_status_new() failed"); break; } if (portEventData.eventMask & OFDPA_EVENT_PORT_CREATE) { reason = OF_PORT_CHANGE_REASON_ADD; } else if (portEventData.eventMask & OFDPA_EVENT_PORT_DELETE) { reason = OF_PORT_CHANGE_REASON_DELETE; } else if (portEventData.eventMask & OFDPA_EVENT_PORT_STATE) { reason = OF_PORT_CHANGE_REASON_MODIFY; } of_port_status_reason_set(of_port_status, reason); if (of_port_status_desc_set(of_port_status, of_port_desc) < 0) { LOG_ERROR("Unexpected failure setting port desc"); break; } of_port_desc_delete(of_port_desc); indigo_core_port_status_update(of_port_status); of_port_desc = 0; /* No longer owned */ of_port_status = 0; /* No longer owned */ } if (of_port_desc) { of_port_desc_delete(of_port_desc); } return; }