Example #1
0
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;
}
Example #2
0
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;
}