Exemplo n.º 1
0
/**
 * @brief Remove Qos Map
 *
 *  @param[in] qos_map_id Qos Map id to be removed.
 *
 *  @return  SAI_STATUS_SUCCESS on success
 *           Failure status code on error
 */
sai_status_t sai_remove_qos_map(_In_ sai_object_id_t qos_map_id) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;

  SAI_ASSERT(sai_object_type_query(qos_map_id) == SAI_OBJECT_TYPE_QOS_MAPS);

  status = switch_api_qos_map_ingress_delete(device, qos_map_id);
  if (status != SWITCH_STATUS_SUCCESS &&
      status != SWITCH_STATUS_INVALID_HANDLE) {
    SAI_LOG_ERROR("failed to remove ingress qos map %s",
                  sai_status_to_string(status));
    return status;
  }

  status = switch_api_qos_map_egress_delete(device, qos_map_id);
  if (status != SWITCH_STATUS_SUCCESS) {
    SAI_LOG_ERROR("failed to remove egress qos map %s",
                  sai_status_to_string(status));
    return status;
  }

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Exemplo n.º 2
0
static void sai_buffer_profile_attribute_parse(
    _In_ uint32_t attr_count,
    _In_ const sai_attribute_t *attr_list,
    switch_api_buffer_profile_t *buffer_profile_info) {
  const sai_attribute_t *attribute;
  uint32_t i = 0;
  sai_buffer_profile_threshold_mode_t threshold_mode;

  for (i = 0; i < attr_count; i++) {
    attribute = &attr_list[i];
    switch (attribute->id) {
      case SAI_BUFFER_PROFILE_ATTR_POOL_ID:
        buffer_profile_info->pool_handle = attribute->value.oid;
        break;
      case SAI_BUFFER_PROFILE_ATTR_BUFFER_SIZE:
        buffer_profile_info->buffer_size = attribute->value.u32;
        break;
      /*
      case SAI_BUFFER_PROFILE_ATTR_TH_MODE:
          threshold_mode = attribute->value.u32;
          break;
     */
      case SAI_BUFFER_PROFILE_ATTR_SHARED_DYNAMIC_TH:
        SAI_ASSERT(threshold_mode == SAI_BUFFER_PROFILE_THRESHOLD_MODE_DYNAMIC);
        buffer_profile_info->threshold_mode =
            SWITCH_BUFFER_THRESHOLD_MODE_DYNAMIC;
        buffer_profile_info->threshold = attribute->value.u32;
        break;
      case SAI_BUFFER_PROFILE_ATTR_SHARED_STATIC_TH:
        SAI_ASSERT(threshold_mode == SAI_BUFFER_PROFILE_THRESHOLD_MODE_STATIC);
        buffer_profile_info->threshold_mode =
            SWITCH_BUFFER_THRESHOLD_MODE_STATIC;
        buffer_profile_info->threshold = attribute->value.u32;
        break;
      case SAI_BUFFER_PROFILE_ATTR_XOFF_TH:
        buffer_profile_info->xoff_threshold = attribute->value.u32;
        break;
      case SAI_BUFFER_PROFILE_ATTR_XON_TH:
        buffer_profile_info->xon_threshold = attribute->value.u32;
        break;
      default:
        break;
    }
  }
}
Exemplo n.º 3
0
static void sai_neighbor_entry_parse(
        const sai_neighbor_entry_t *neighbor_entry,
        switch_api_neighbor_t *api_neighbor) {

    SAI_ASSERT(sai_object_type_query(neighbor_entry->rif_id) == 
               SAI_OBJECT_TYPE_ROUTER_INTERFACE);

    api_neighbor->interface = (switch_handle_t) neighbor_entry->rif_id;
    api_neighbor->rw_type = SWITCH_API_NEIGHBOR_RW_TYPE_L3;
    sai_ip_addr_to_switch_ip_addr(&neighbor_entry->ip_address, &api_neighbor->ip_addr);
}
Exemplo n.º 4
0
/**
 * @brief Set buffer pool attribute
 * @param[in] pool_id buffer pool id
 * @param[in] attr attribute
 * @return SAI_STATUS_SUCCESS on success
 *           Failure status code on error
 */
sai_status_t sai_set_buffer_pool_attribute(_In_ sai_object_id_t pool_id,
                                           _In_ const sai_attribute_t *attr) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;

  SAI_ASSERT(sai_object_type_query(pool_id) == SAI_OBJECT_TYPE_BUFFER_POOL);

  SAI_LOG_EXIT();

  return status;
}
Exemplo n.º 5
0
sai_status_t sai_set_qos_map_attribute(_In_ sai_object_id_t qos_map_id,
                                       _In_ const sai_attribute_t *attr) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;

  SAI_ASSERT(sai_object_type_query(qos_map_id) == SAI_OBJECT_TYPE_QOS_MAPS);

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Exemplo n.º 6
0
/**
 * @brief Set ingress priority group attribute
 * @param[in] ingress_pg_id ingress priority group id
 * @param[in] attr attribute to set
 *
 * @return  SAI_STATUS_SUCCESS on success
 *           Failure status code on error
 */
sai_status_t sai_set_ingress_priority_group_attribute(
    _In_ sai_object_id_t ingress_pg_id, _In_ const sai_attribute_t *attr) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;

  SAI_ASSERT(sai_object_type_query(ingress_pg_id) ==
             SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP);
  SAI_ASSERT(sai_object_type_query(attr->value.oid) ==
             SAI_OBJECT_TYPE_BUFFER_PROFILE);

  status = switch_api_priority_group_buffer_profile_set(
      device, ingress_pg_id, attr->value.oid);
  if (status != SAI_STATUS_SUCCESS) {
    SAI_LOG_ERROR("failed to set pg buffer profile :%s",
                  sai_status_to_string(status));
  }

  SAI_LOG_EXIT();

  return status;
}
Exemplo n.º 7
0
/*
* Routine Description:
*    Set router interface attribute
*
* Arguments:
*    [in] rif_id - router interface id
*    [in] attr - attribute
*
* Return Values:
*    SAI_STATUS_SUCCESS on success
*    Failure status code on error
*/
sai_status_t sai_set_router_interface_attribute(
    _In_ sai_object_id_t rif_id, _In_ const sai_attribute_t *attr) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  switch_status_t switch_status = SWITCH_STATUS_SUCCESS;

  if (!attr) {
    status = SAI_STATUS_INVALID_PARAMETER;
    SAI_LOG_ERROR("null attribute: %s", sai_status_to_string(status));
    return status;
  }

  SAI_ASSERT(sai_object_type_query(rif_id) == SAI_OBJECT_TYPE_ROUTER_INTERFACE);

  switch (attr->id) {
    case SAI_ROUTER_INTERFACE_ATTR_ADMIN_V4_STATE:
      switch_status = switch_api_interface_ipv4_unicast_enabled_set(
          rif_id, attr->value.booldata);
      break;
    case SAI_ROUTER_INTERFACE_ATTR_ADMIN_V6_STATE:
      switch_status = switch_api_interface_ipv6_unicast_enabled_set(
          rif_id, attr->value.booldata);
      break;
    case SAI_ROUTER_INTERFACE_ATTR_ADMIN_V4_MULTICAST_STATE:
      switch_status = switch_api_interface_ipv4_multicast_enabled_set(
          rif_id, attr->value.booldata);
      break;
    case SAI_ROUTER_INTERFACE_ATTR_ADMIN_V6_MULTICAST_STATE:
      switch_status = switch_api_interface_ipv6_multicast_enabled_set(
          rif_id, attr->value.booldata);
      break;
    case SAI_ROUTER_INTERFACE_ATTR_V4_URPF_MODE:
      switch_status = switch_api_interface_ipv4_urpf_mode_set(
          rif_id, sai_to_switch_urpf_mode(attr->value.s32));
      break;
    case SAI_ROUTER_INTERFACE_ATTR_V6_URPF_MODE:
      switch_status = switch_api_interface_ipv6_urpf_mode_set(
          rif_id, sai_to_switch_urpf_mode(attr->value.s32));
      break;
    default:
      return SAI_STATUS_INVALID_PARAMETER;
  }

  SAI_LOG_EXIT();

  status = sai_switch_status_to_sai_status(switch_status);
  return status;
}
Exemplo n.º 8
0
/**
 * @brief Get buffer profile attributes
 * @param[in] buffer_profile_id buffer profile id
 * @param[in] attr_count number of attributes
 * @param[inout] attr_list array of attributes
 * @return SAI_STATUS_SUCCESS on success
 *           Failure status code on error
 */
sai_status_t sai_get_buffer_profile_attribute(
    _In_ sai_object_id_t buffer_profile_id,
    _In_ uint32_t attr_count,
    _Inout_ sai_attribute_t *attr_list) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;

  SAI_ASSERT(sai_object_type_query(buffer_profile_id) ==
             SAI_OBJECT_TYPE_BUFFER_PROFILE);

  SAI_LOG_EXIT();

  return status;
}
Exemplo n.º 9
0
/**
 * @brief  Set Policer attribute
 *
 * @param[in] policer_id - Policer id
 * @param[in] attr - attribute
 *
 * @return SAI_STATUS_SUCCESS on success
 *        Failure status code on error
 */
sai_status_t sai_set_policer_attribute(_In_ sai_object_id_t policer_id,
                                       _In_ const sai_attribute_t *attr) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;

  if (!attr) {
    status = SAI_STATUS_INVALID_PARAMETER;
    SAI_LOG_ERROR("null attribute: %s", sai_status_to_string(status));
    return status;
  }

  SAI_ASSERT(sai_object_type_query(policer_id) == SAI_OBJECT_TYPE_POLICER);

  SAI_LOG_EXIT();
  return (sai_status_t)status;
}
Exemplo n.º 10
0
/**
 * @brief Remove buffer pool
 * @param[in] pool_id buffer pool id
 * @return SAI_STATUS_SUCCESS on success
 *           Failure status code on error
 */
sai_status_t sai_remove_buffer_pool(_In_ sai_object_id_t pool_id) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;

  SAI_ASSERT(sai_object_type_query(pool_id) == SAI_OBJECT_TYPE_BUFFER_POOL);

  status = switch_api_buffer_pool_delete(device, pool_id);
  if (status != SAI_STATUS_SUCCESS) {
    SAI_LOG_ERROR("failed to delete buffer pool: %s",
                  sai_status_to_string(status));
  }

  SAI_LOG_EXIT();

  return status;
}
Exemplo n.º 11
0
static void sai_ipmc_entry_parse(_In_ const sai_ipmc_entry_t *ipmc_entry,
                                 _Out_ switch_handle_t *vrf_handle,
                                 _Out_ switch_ip_addr_t *src_addr,
                                 _Out_ switch_ip_addr_t *grp_addr) {
  SAI_ASSERT(sai_object_type_query(ipmc_entry->vr_id) ==
             SAI_OBJECT_TYPE_VIRTUAL_ROUTER);
  *vrf_handle = (switch_handle_t)ipmc_entry->vr_id;

  memset(src_addr, 0, sizeof(switch_ip_addr_t));
  sai_ip_addr_to_switch_ip_addr(&(ipmc_entry->source), src_addr);
  if (((src_addr->type == SWITCH_API_IP_ADDR_V4) &&
       (src_addr->ip.v4addr == 0)) ||
      ((src_addr->type == SWITCH_API_IP_ADDR_V6) &&
       (memcmp(src_addr->ip.v6addr, &in6addr_any, sizeof(in6addr_any)) == 0))) {
    src_addr->prefix_len = 0;
  }
  sai_ip_prefix_to_switch_ip_addr(&(ipmc_entry->group), grp_addr);
}
Exemplo n.º 12
0
/*
* Routine Description:
*    Set virtual router attribute Value
*
* Arguments:
*    [in] vr_id - virtual router id
*    [in] attr - attribute
*
* Return Values:
*    SAI_STATUS_SUCCESS on success
*    Failure status code on error
*/
sai_status_t sai_set_virtual_router_entry_attribute(
    _In_ sai_object_id_t vr_id, _In_ const sai_attribute_t *attr) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;

  if (!attr) {
    status = SAI_STATUS_INVALID_PARAMETER;
    SAI_LOG_ERROR("null attribute: %s", sai_status_to_string(status));
    return status;
  }

  SAI_ASSERT(sai_object_type_query(vr_id) == SAI_OBJECT_TYPE_VIRTUAL_ROUTER);

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Exemplo n.º 13
0
/**
 * @brief Delete policer
 *
 * @param[in] policer_id - Policer id
 *
 * @return  SAI_STATUS_SUCCESS on success
 *         Failure status code on error
 */
sai_status_t sai_remove_policer(_In_ sai_object_id_t policer_id) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  switch_status_t switch_status = SWITCH_STATUS_SUCCESS;

  SAI_ASSERT(sai_object_type_query(policer_id) == SAI_OBJECT_TYPE_POLICER);

  switch_status = switch_api_meter_delete(device, policer_id);
  status = sai_switch_status_to_sai_status(switch_status);
  if (status != SAI_STATUS_SUCCESS) {
    SAI_LOG_ERROR("failed to delete policer %lx: %s",
                  policer_id,
                  sai_status_to_string(status));
  }

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Exemplo n.º 14
0
/*
* Routine Description:
*    Remove router interface
*
* Arguments:
*    [in] rif_id - router interface id
*
* Return Values:
*    SAI_STATUS_SUCCESS on success
*    Failure status code on error
*/
sai_status_t sai_remove_router_interface(_In_ sai_object_id_t rif_id) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  switch_status_t switch_status = SWITCH_STATUS_SUCCESS;

  SAI_ASSERT(sai_object_type_query(rif_id) == SAI_OBJECT_TYPE_ROUTER_INTERFACE);

  switch_status = switch_api_interface_delete(device, (switch_handle_t)rif_id);
  status = sai_switch_status_to_sai_status(switch_status);

  if (status != SAI_STATUS_SUCCESS) {
    SAI_LOG_ERROR("failed to remove router interface: %s",
                  sai_status_to_string(status));
  }

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Exemplo n.º 15
0
/*
* Routine Description:
*    Remove virtual router
*
* Arguments:
*    [in] vr_id - virtual router id
*
* Return Values:
*    SAI_STATUS_SUCCESS on success
*    Failure status code on error
*/
sai_status_t sai_remove_virtual_router_entry(_In_ sai_object_id_t vr_id) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  switch_status_t switch_status = SWITCH_STATUS_SUCCESS;

  SAI_ASSERT(sai_object_type_query(vr_id) == SAI_OBJECT_TYPE_VIRTUAL_ROUTER);

  switch_status = switch_api_vrf_delete(device, vr_id);
  status = sai_switch_status_to_sai_status(switch_status);

  if (status != SAI_STATUS_SUCCESS) {
    SAI_LOG_ERROR("failed to remove virtual router entry %lx : %s",
                  vr_id,
                  sai_status_to_string(status));
  }

  SAI_LOG_EXIT();
  return (sai_status_t)status;
}
Exemplo n.º 16
0
/*
* Routine Description:
*    Get router interface attribute
*
* Arguments:
*    [in] rif_id - router interface id
*    [in] attr_count - number of attributes
*    [inout] attr_list - array of attributes
*
* Return Values:
*    SAI_STATUS_SUCCESS on success
*    Failure status code on error
*/
sai_status_t sai_get_router_interface_attribute(
    _In_ sai_object_id_t rif_id,
    _In_ uint32_t attr_count,
    _Inout_ sai_attribute_t *attr_list) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;

  if (!attr_list) {
    status = SAI_STATUS_INVALID_PARAMETER;
    SAI_LOG_ERROR("null attribute: %s", sai_status_to_string(status));
    return status;
  }

  uint32_t index;
  uint64_t value;
  switch_status_t switch_status = -1;
  sai_attribute_t *attribute;
  for (index = 0; index < attr_count; index++) {
    attribute = &attr_list[index];
    switch (attribute->id) {
      case SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID:
        switch_status = switch_api_interface_attribute_get(
            (switch_handle_t)rif_id, SWITCH_INTF_ATTR_VRF, &value);
        attribute->value.oid = value;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_TYPE:
        break;
      case SAI_ROUTER_INTERFACE_ATTR_PORT_ID:
        switch_status = switch_api_interface_attribute_get(
            (switch_handle_t)rif_id, SWITCH_INTF_ATTR_PORT_ID, &value);
        attribute->value.oid = value;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_VLAN_ID:
        switch_status = switch_api_interface_attribute_get(
            (switch_handle_t)rif_id, SWITCH_INTF_ATTR_VLAN_ID, &value);
        attribute->value.u16 = value;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_SRC_MAC_ADDRESS:
        switch_status = switch_api_interface_attribute_get(
            (switch_handle_t)rif_id, SWITCH_INTF_ATTR_RMAC_ADDR, &value);
        memcpy(attribute->value.mac, (uint8_t *)&value, sizeof(sai_mac_t));
        break;
      case SAI_ROUTER_INTERFACE_ATTR_ADMIN_V4_STATE:
        switch_status = switch_api_interface_attribute_get(
            (switch_handle_t)rif_id, SWITCH_INTF_ATTR_V4_UNICAST, &value);
        attribute->value.booldata = value;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_ADMIN_V6_STATE:
        switch_status = switch_api_interface_attribute_get(
            (switch_handle_t)rif_id, SWITCH_INTF_ATTR_V6_UNICAST, &value);
        attribute->value.booldata = value;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_MTU:
        // return the default for now
        attribute->value.u32 = 1514;
        break;
      default:
        return SAI_STATUS_INVALID_PARAMETER;
    }

    if ((status = sai_switch_status_to_sai_status(switch_status)) !=
        SAI_STATUS_SUCCESS) {
      return status;
    }
  }

  SAI_ASSERT(sai_object_type_query(rif_id) == SAI_OBJECT_TYPE_ROUTER_INTERFACE);

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Exemplo n.º 17
0
/*
* Routine Description:
*    Create router interface.
*
* Arguments:
*    [out] rif_id - router interface id
*    [in] attr_count - number of attributes
*    [in] attr_list - array of attributes
*
* Return Values:
*    SAI_STATUS_SUCCESS on success
*    Failure status code on error
*/
sai_status_t sai_create_router_interface(
    _Out_ sai_object_id_t *rif_id,
    _In_ uint32_t attr_count,
    _In_ const sai_attribute_t *attr_list) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  switch_api_interface_info_t intf_info;
  const sai_attribute_t *attribute;
  sai_router_interface_type_t sai_intf_type = -1;
  uint32_t index = 0;

  if (!attr_list) {
    status = SAI_STATUS_INVALID_PARAMETER;
    SAI_LOG_ERROR("null attribute list: %s", sai_status_to_string(status));
    return status;
  }

  memset(&intf_info, 0, sizeof(switch_api_interface_info_t));
  intf_info.ipv4_unicast_enabled = true;
  intf_info.ipv6_unicast_enabled = true;
  intf_info.ipv4_multicast_enabled = false;
  intf_info.ipv6_multicast_enabled = false;
  intf_info.ipv4_urpf_mode = SWITCH_API_RPF_CHECK_DEFAULT;
  intf_info.ipv6_urpf_mode = SWITCH_API_RPF_CHECK_DEFAULT;
  for (index = 0; index < attr_count; index++) {
    attribute = &attr_list[index];
    switch (attribute->id) {
      case SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID:
        SAI_ASSERT(sai_object_type_query(attribute->value.oid) ==
                   SAI_OBJECT_TYPE_VIRTUAL_ROUTER);
        intf_info.vrf_handle = (switch_handle_t)attribute->value.oid;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_TYPE:
        sai_intf_type = attribute->value.s32;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_PORT_ID:
        SAI_ASSERT(sai_intf_type == SAI_ROUTER_INTERFACE_TYPE_PORT);
        intf_info.type = SWITCH_API_INTERFACE_L3;
        intf_info.u.port_lag_handle = attribute->value.oid;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_VLAN_ID:
        SAI_ASSERT(sai_intf_type == SAI_ROUTER_INTERFACE_TYPE_VLAN);
        intf_info.type = SWITCH_API_INTERFACE_L3_VLAN;
        intf_info.u.vlan_id = attribute->value.u16;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_SRC_MAC_ADDRESS:
        intf_info.mac_valid = TRUE;
        memcpy(&intf_info.mac, &attribute->value.mac, 6);
        break;
      case SAI_ROUTER_INTERFACE_ATTR_ADMIN_V4_STATE:
        intf_info.ipv4_unicast_enabled = attribute->value.booldata;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_ADMIN_V6_STATE:
        intf_info.ipv6_unicast_enabled = attribute->value.booldata;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_ADMIN_V4_MULTICAST_STATE:
        intf_info.ipv4_multicast_enabled = attribute->value.booldata;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_ADMIN_V6_MULTICAST_STATE:
        intf_info.ipv6_multicast_enabled = attribute->value.booldata;
        break;
      case SAI_ROUTER_INTERFACE_ATTR_V4_URPF_MODE:
        intf_info.ipv4_urpf_mode =
            sai_to_switch_urpf_mode(attribute->value.s32);
        break;
      case SAI_ROUTER_INTERFACE_ATTR_V6_URPF_MODE:
        intf_info.ipv6_urpf_mode =
            sai_to_switch_urpf_mode(attribute->value.s32);
        break;
      case SAI_ROUTER_INTERFACE_ATTR_MTU:
        // TODO:
        break;
      default:
        return SAI_STATUS_INVALID_PARAMETER;
    }
  }

  *rif_id = (sai_object_id_t)switch_api_interface_create(device, &intf_info);
  status = (*rif_id == SWITCH_API_INVALID_HANDLE) ? SAI_STATUS_FAILURE
                                                  : SAI_STATUS_SUCCESS;

  if (status != SAI_STATUS_SUCCESS) {
    SAI_LOG_ERROR("failed to create router interface: %s",
                  sai_status_to_string(status));
  }

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}