indigo_error_t indigo_port_modify(of_port_mod_t *port_mod) { OFDPA_ERROR_t ofdpa_rv = OFDPA_E_NONE; of_port_no_t of_port_no; of_mac_addr_t of_mac; uint32_t of_config; uint32_t of_mask; uint32_t of_advertise; ofdpaMacAddr_t mac; LOG_TRACE("%s() called", __FUNCTION__); of_port_mod_port_no_get(port_mod, &of_port_no); /* Check if the port hardware address is the same. Sanity check */ ofdpa_rv = ofdpaPortMacGet(of_port_no, &mac); if (ofdpa_rv != OFDPA_E_NONE) { LOG_ERROR("Failed to get MAC address on port %d. (ofdpa_rv = %d)", of_port_no, ofdpa_rv); return (indigoConvertOfdpaRv(ofdpa_rv)); } of_port_mod_hw_addr_get(port_mod, &of_mac); if (memcmp(&of_mac, &mac, sizeof(of_mac)) != 0) { LOG_ERROR("Invalid mac address."); } /* Set the port config state (admin state)*/ of_port_mod_config_get(port_mod, &of_config); of_port_mod_mask_get(port_mod, &of_mask); of_config &= of_mask; ofdpa_rv = ofdpaPortConfigSet(of_port_no, of_config); if (ofdpa_rv != OFDPA_E_NONE) { LOG_ERROR("Failed to set config state on port %d. (ofdpa_rv = %d)", of_port_no, ofdpa_rv); return (indigoConvertOfdpaRv(ofdpa_rv)); } /* Set advertise features */ of_port_mod_advertise_get(port_mod, &of_advertise); ofdpa_rv = ofdpaPortAdvertiseFeatureSet(of_port_no, of_advertise); if (ofdpa_rv != OFDPA_E_NONE) { LOG_ERROR("Failed to set advertise features on port %d. (ofdpa_rv = %d)", of_port_no, ofdpa_rv); return (indigoConvertOfdpaRv(ofdpa_rv)); } return INDIGO_ERROR_NONE; }
indigo_error_t indigo_port_modify(of_port_mod_t *port_mod) { of_port_no_t port_no; of_port_mod_port_no_get(port_mod, &port_no); uint32_t config; of_port_mod_config_get(port_mod, &config); uint32_t mask; of_port_mod_mask_get(port_mod, &mask); struct ind_ovs_port *port = ind_ovs_port_lookup(port_no); if (port == NULL) { return INDIGO_ERROR_NOT_FOUND; } port->config = (port->config & ~mask) | (config & mask); /* TODO change other configuration? */ ind_ovs_kflow_invalidate_all(); return INDIGO_ERROR_NONE; }