Пример #1
0
/*
* Routine Description:
*    Create virtual router
*
* Arguments:
*    [out] vr_id - virtual router id
*    [in] attr_count - number of attributes
*    [in] attr_list - array of attributes
*
* Return Values:
*  - SAI_STATUS_SUCCESS on success
*  - SAI_STATUS_ADDR_NOT_FOUND if neither SAI_SWITCH_ATTR_SRC_MAC_ADDRESS nor
*    SAI_VIRTUAL_ROUTER_ATTR_SRC_MAC_ADDRESS is set.
*/
sai_status_t sai_create_virtual_router_entry(
    _Out_ sai_object_id_t *vr_id,
    _In_ uint32_t attr_count,
    _In_ const sai_attribute_t *attr_list) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  switch_vrf_id_t vrf_id = 1;

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

  sai_vrf_entry_attribute_parse(attr_count, attr_list);

  *vr_id = (sai_object_id_t)switch_api_vrf_create(device, vrf_id);

  status = (*vr_id == SWITCH_API_INVALID_HANDLE) ? SAI_STATUS_FAILURE
                                                 : SAI_STATUS_SUCCESS;

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

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Пример #2
0
/*
* Routine Description:
*    Remove neighbor entry 
*
* Arguments:
*    [in] neighbor_entry - neighbor entry 
*
* Return Values:
*    SAI_STATUS_SUCCESS on success
*    Failure status code on error
*
* Note: IP address expected in Network Byte Order.
*/
sai_status_t sai_remove_neighbor_entry(
        _In_ const sai_neighbor_entry_t* neighbor_entry) {

    SAI_LOG_ENTER();

    sai_status_t status = SAI_STATUS_SUCCESS;
    switch_status_t switch_status = SWITCH_STATUS_SUCCESS;
    switch_api_neighbor_t api_neighbor;
    switch_handle_t neighbor_handle;

    if (!neighbor_entry) {
        status = SAI_STATUS_INVALID_PARAMETER;
        SAI_LOG_ERROR("null neighbor entry: %s",
                       sai_status_to_string(status));
        return status;
    }

    memset(&api_neighbor, 0, sizeof(switch_api_neighbor_t));
    sai_neighbor_entry_parse(neighbor_entry, &api_neighbor);
    sai_neighbor_entry_nexthop_get(&api_neighbor);

    neighbor_handle = switch_api_neighbor_handle_get(api_neighbor.nhop_handle);
    switch_status = switch_api_neighbor_entry_remove(device, neighbor_handle);
    status = sai_switch_status_to_sai_status(switch_status);
    if (status != SAI_STATUS_SUCCESS) {
        SAI_LOG_ERROR("failed to create neighbor entry: %s",
                       sai_status_to_string(status));
    }

    SAI_LOG_EXIT();

    return (sai_status_t) status;
}
Пример #3
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;
}
Пример #4
0
/*
* Routine Description:
*    Get neighbor attribute value
*
* Arguments:
*    [in] neighbor_entry - neighbor entry
*    [in] attr_count - number of attributes
*    [inout] attrs - array of attributes
*
* Return Values:
*    SAI_STATUS_SUCCESS on success
*    Failure status code on error
*/
sai_status_t sai_get_neighbor_entry_attribute(
        _In_ const sai_neighbor_entry_t* neighbor_entry,
        _In_ uint32_t attr_count,
        _Inout_ sai_attribute_t *attr_list) {

    SAI_LOG_ENTER();

    sai_status_t status = SAI_STATUS_SUCCESS;

    if (!neighbor_entry) {
        status = SAI_STATUS_INVALID_PARAMETER;
        SAI_LOG_ERROR("null neighbor entry: %s",
                       sai_status_to_string(status));
        return status;
    }

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

    SAI_LOG_EXIT();

    return (sai_status_t) status;
}
Пример #5
0
/**
 * @brief Create Policer
 *
 * @param[out] policer_id - the policer id
 * @param[in] attr_count - number of attributes
 * @param[in] attr_list - array of attributes
 *
 * @return SAI_STATUS_SUCCESS on success
 *         Failure status code on error
 */
sai_status_t sai_create_policer(_Out_ sai_object_id_t *policer_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_meter_t api_meter_info;

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

  memset(&api_meter_info, 0, sizeof(switch_api_meter_t));
  sai_policer_attr_parse(attr_count, attr_list, &api_meter_info);
  *policer_id = switch_api_meter_create(device, &api_meter_info);
  status = (*policer_id == SWITCH_API_INVALID_HANDLE) ? SAI_STATUS_FAILURE
                                                      : SAI_STATUS_SUCCESS;

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

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Пример #6
0
/*
 * Routine Description:
 *    Create IP multicast entry
 *
 * Arguments:
 *    [in] ipmc_entry - IP multicast entry
 *    [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_ipmc_entry(_In_ const sai_ipmc_entry_t *ipmc_entry,
                                   _In_ uint32_t attr_count,
                                   _In_ const sai_attribute_t *attr_list) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  switch_status_t switch_status = SWITCH_STATUS_SUCCESS;
  switch_ip_addr_t src_addr, grp_addr;
  switch_handle_t vrf_handle = 0;
  switch_handle_t *oif_list_handle = 0;
  switch_handle_t *rpf_list_handle = 0;
  int oif_list_count = 0;
  int rpf_list_count = 0;
  int action = -1, pri = -1;
  switch_handle_t mcast_handle;
  char entry_string[SAI_MAX_ENTRY_STRING_LEN];

  if (!ipmc_entry) {
    status = SAI_STATUS_INVALID_PARAMETER;
    SAI_LOG_ERROR("null ipmc entry: %s", sai_status_to_string(status));
    return status;
  }

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

  sai_ipmc_entry_parse(ipmc_entry, &vrf_handle, &src_addr, &grp_addr);
  sai_ipmc_entry_attribute_parse(attr_count,
                                 attr_list,
                                 &oif_list_handle,
                                 &oif_list_count,
                                 &rpf_list_handle,
                                 &rpf_list_count,
                                 &action,
                                 &pri);

  sai_ipmc_entry_to_string(ipmc_entry, entry_string);
  mcast_handle = sai_ipmc_tree_create(
      vrf_handle, &src_addr, &grp_addr, oif_list_count, oif_list_handle);
  status = sai_switch_status_to_sai_status(switch_status);

  switch_status = switch_api_multicast_mroute_add(device,
                                                  mcast_handle,
                                                  vrf_handle,
                                                  &src_addr,
                                                  &grp_addr,
                                                  1,
                                                  rpf_list_handle,
                                                  rpf_list_count);
  status = sai_switch_status_to_sai_status(switch_status);

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Пример #7
0
static sai_status_t sai_qos_map_attribute_parse(
    _In_ uint32_t attr_count,
    _In_ const sai_attribute_t *attr_list,
    _Out_ switch_direction_t *direction,
    _Out_ switch_qos_map_ingress_t *ingress_qos_map_type,
    _Out_ switch_qos_map_egress_t *egress_qos_map_type,
    _Out_ uint32_t *num_entries,
    _Out_ switch_qos_map_t **switch_qos_map_list) {
  const sai_attribute_t *attribute;
  uint32_t i = 0, j = 0;
  sai_status_t status = SAI_STATUS_SUCCESS;
  sai_qos_map_t *qos_map = NULL;
  switch_qos_map_t *switch_qos_map = NULL;
  sai_qos_map_type_t qos_map_type = 0;

  for (i = 0; i < attr_count; i++) {
    attribute = &attr_list[i];
    switch (attribute->id) {
      case SAI_QOS_MAP_ATTR_TYPE:
        status = sai_qos_map_type_to_switch_qos_map_type(attribute->value.u32,
                                                         direction,
                                                         ingress_qos_map_type,
                                                         egress_qos_map_type);
        if (status != SAI_STATUS_SUCCESS) {
          SAI_LOG_ERROR("qos map attribute parse failed %s",
                        sai_status_to_string(status));
          return status;
        }
        qos_map_type = attribute->value.u32;
        break;
      case SAI_QOS_MAP_ATTR_MAP_TO_VALUE_LIST:
        *num_entries = attribute->value.qosmap.count;
        *switch_qos_map_list =
            SAI_MALLOC(sizeof(switch_qos_map_t) * (*num_entries));
        if (!(*switch_qos_map_list)) {
          status = SAI_STATUS_NO_MEMORY;
          SAI_LOG_ERROR("memory allocation failed for qos map %s",
                        sai_status_to_string(status));
          return status;
        }

        memset(*switch_qos_map_list,
               0x0,
               sizeof(switch_qos_map_t) * (*num_entries));
        for (j = 0; j < (*num_entries); j++) {
          qos_map = &attribute->value.qosmap.list[j];
          switch_qos_map = &(*switch_qos_map_list)[j];
          sai_qos_map_to_switch_qos_map(qos_map_type, qos_map, switch_qos_map);
        }
        break;
      default:
        break;
    }
  }

  return status;
}
Пример #8
0
/**
 * @brief Create buffer profile
 * @param[out] buffer_profile_id buffer profile id
 * @param[in] attr_count number of attributes
 * @param[in] attr_list array of attributes
 * @return SAI_STATUS_SUCCESS on success
 *           Failure status code on error
 */
sai_status_t sai_create_buffer_profile(_Out_ sai_object_id_t *buffer_profile_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_buffer_profile_t buffer_profile_info;

  memset(&buffer_profile_info, 0x0, sizeof(buffer_profile_info));

  sai_buffer_profile_attribute_parse(
      attr_count, attr_list, &buffer_profile_info);
  *buffer_profile_id =
      switch_api_buffer_profile_create(device, &buffer_profile_info);

  status = (*buffer_profile_id == SWITCH_API_INVALID_HANDLE)
               ? SAI_STATUS_FAILURE
               : SAI_STATUS_SUCCESS;

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

  SAI_LOG_EXIT();

  return status;
}
Пример #9
0
/**
 * @brief Create buffer pool
 * @param[out] pool_id buffer pool id
 * @param[in] attr_count number of attributes
 * @param[in] attr_list array of attributes
 * @return SAI_STATUS_SUCCESS on success
 *           Failure status code on error
 */
sai_status_t sai_create_buffer_pool(_Out_ sai_object_id_t *pool_id,
                                    _In_ uint32_t attr_count,
                                    _In_ const sai_attribute_t *attr_list) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  switch_direction_t direction = 0;
  uint32_t size = 0;

  sai_buffer_pool_attribute_parse(attr_count, attr_list, &direction, &size);

  *pool_id = switch_api_buffer_pool_create(device, direction, size);

  status = (*pool_id == SWITCH_API_INVALID_HANDLE) ? SAI_STATUS_FAILURE
                                                   : SAI_STATUS_SUCCESS;

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

  SAI_LOG_EXIT();

  return status;
}
Пример #10
0
/*
* Routine Description:
*    Create neighbor entry 
*
* Arguments:
*    [in] neighbor_entry - neighbor entry 
*    [in] attr_count - number of attributes
*    [in] attrs - array of attributes
*
* Return Values:
*    SAI_STATUS_SUCCESS on success
*    Failure status code on error
*
* Note: IP address expected in Network Byte Order.
*/
sai_status_t sai_create_neighbor_entry(
        _In_ const sai_neighbor_entry_t* neighbor_entry,
        _In_ uint32_t attr_count,
        _In_ const sai_attribute_t *attr_list) {

    SAI_LOG_ENTER();

    sai_status_t status = SAI_STATUS_SUCCESS;
    switch_handle_t neighbor_handle = SWITCH_API_INVALID_HANDLE;
    char entry_string[SAI_MAX_ENTRY_STRING_LEN];
    switch_api_neighbor_t api_neighbor;

    if (!neighbor_entry) {
        status = SAI_STATUS_INVALID_PARAMETER;
        SAI_LOG_ERROR("null neighbor entry: %s",
                       sai_status_to_string(status));
        return status;
    }

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

    memset(&api_neighbor, 0, sizeof(switch_api_neighbor_t));
    sai_neighbor_entry_parse(neighbor_entry, &api_neighbor);
    sai_neighbor_entry_attribute_parse(attr_count, attr_list, &api_neighbor);
    sai_neighbor_entry_nexthop_get(&api_neighbor);

    sai_neighbor_entry_to_string(neighbor_entry, entry_string);

    neighbor_handle = switch_api_neighbor_entry_add(device, &api_neighbor);
    status = neighbor_handle == SWITCH_API_INVALID_HANDLE ?
             SAI_STATUS_FAILURE :
             SAI_STATUS_SUCCESS;
    if (status != SAI_STATUS_SUCCESS) {
        SAI_LOG_ERROR("failed to create neighbor entry: %s",
                       sai_status_to_string(status));
    }

    SAI_LOG_EXIT();

    return (sai_status_t) status;
}
Пример #11
0
/**
 * @brief Create Qos Map
 *
 * @param[out] qos_map_id Qos Map Id
 * @param[in] attr_count number of attributes
 * @param[in] attr_list array of attributes
 *
 * @return  SAI_STATUS_SUCCESS on success
 *          Failure status code on error
 */
sai_status_t sai_create_qos_map(_Out_ sai_object_id_t *qos_map_id,
                                _In_ uint32_t attr_count,
                                _In_ const sai_attribute_t *attr_list) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  uint32_t num_entries = 0;
  switch_qos_map_t *switch_qos_map_list = NULL;
  switch_direction_t direction = 0;
  switch_qos_map_ingress_t ingress_qos_map_type = 0;
  switch_qos_map_egress_t egress_qos_map_type = 0;

  status = sai_qos_map_attribute_parse(attr_count,
                                       attr_list,
                                       &direction,
                                       &ingress_qos_map_type,
                                       &egress_qos_map_type,
                                       &num_entries,
                                       &switch_qos_map_list);
  if (status != SAI_STATUS_SUCCESS) {
    SAI_LOG_ERROR("qos map attribute parse failed %s",
                  sai_status_to_string(status));
    return status;
  }

  if (direction == SWITCH_API_DIRECTION_INGRESS) {
    *qos_map_id = switch_api_qos_map_ingress_create(
        device, ingress_qos_map_type, num_entries, switch_qos_map_list);
  } else {
    *qos_map_id = switch_api_qos_map_egress_create(
        device, egress_qos_map_type, num_entries, switch_qos_map_list);
  }

  status = (*qos_map_id == SWITCH_API_INVALID_HANDLE) ? SAI_STATUS_FAILURE
                                                      : SAI_STATUS_SUCCESS;

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

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Пример #12
0
/**
 * Routine Description:
 *    Set IP multicast entry attribute value
 *
 * Arguments:
 *    [in] IP multicast - IP multicast entry
 *    [in] attr - attribute
 *
 * Return Values:
 *    SAI_STATUS_SUCCESS on success
 *    Failure status code on error
 */
sai_status_t sai_set_ipmc_entry_attribute(
    _In_ const sai_ipmc_entry_t *ipmc_entry, _In_ const sai_attribute_t *attr) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;

  if (!ipmc_entry) {
    status = SAI_STATUS_INVALID_PARAMETER;
    SAI_LOG_ERROR("null ipmc entry: %s", sai_status_to_string(status));
    return status;
  }

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

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Пример #13
0
/**
 * Routine Description:
 *    Remove IP multicast entry
 *
 * Arguments:
 *    [in] ipmc_entry - IP multicast entry
 *
 * Return Values:
 *    SAI_STATUS_SUCCESS on success
 *    Failure status code on error
 */
sai_status_t sai_remove_ipmc_entry(_In_ const sai_ipmc_entry_t *ipmc_entry) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  switch_status_t switch_status = SWITCH_STATUS_SUCCESS;
  switch_ip_addr_t src_addr, grp_addr;
  switch_handle_t vrf_handle = 0;

  if (!ipmc_entry) {
    status = SAI_STATUS_INVALID_PARAMETER;
    SAI_LOG_ERROR("null ipmc entry: %s", sai_status_to_string(status));
    return status;
  }

  sai_ipmc_entry_parse(ipmc_entry, &vrf_handle, &src_addr, &grp_addr);

  switch_handle_t mcast_handle;
  switch_status = switch_api_multicast_mroute_tree_get(
      device, vrf_handle, &src_addr, &grp_addr, &mcast_handle);
  if (status == SWITCH_STATUS_SUCCESS) {
    switch_status = switch_api_multicast_tree_delete(device, mcast_handle);
    assert(switch_status == SWITCH_STATUS_SUCCESS);
  }

  switch_status = switch_api_multicast_mroute_delete(
      device, vrf_handle, &src_addr, &grp_addr);
  status = sai_switch_status_to_sai_status(switch_status);

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

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Пример #14
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;
}
Пример #15
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;
}
Пример #16
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;
}
Пример #17
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;
}
Пример #18
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;
}
Пример #19
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;
}
Пример #20
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;
}
Пример #21
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;
}
Пример #22
0
sai_status_t sai_get_policer_statistics(
    _In_ sai_object_id_t policer_id,
    _In_ const sai_policer_stat_t *counter_ids,
    _In_ uint32_t number_of_counters,
    _Out_ uint64_t *counters) {
  SAI_LOG_ENTER();

  sai_status_t status = SAI_STATUS_SUCCESS;
  switch_counter_t *switch_counters = NULL;
  switch_meter_stats_t *meter_stat_ids = NULL;
  switch_status_t switch_status = SWITCH_STATUS_SUCCESS;
  uint32_t index = 0;

  switch_counters =
      SAI_MALLOC(sizeof(switch_counter_t) * SWITCH_METER_STATS_MAX);
  if (!switch_counters) {
    status = SAI_STATUS_NO_MEMORY;
    SAI_LOG_ERROR("failed to get meter stats %lx: %s",
                  policer_id,
                  sai_status_to_string(status));
    return status;
  }

  meter_stat_ids =
      SAI_MALLOC(sizeof(switch_meter_stats_t) * SWITCH_METER_STATS_MAX);
  if (!meter_stat_ids) {
    status = SAI_STATUS_NO_MEMORY;
    SAI_LOG_ERROR("failed to get meter stats %lx: %s",
                  policer_id,
                  sai_status_to_string(status));
    SAI_FREE(switch_counters);
    return status;
  }

  for (index = 0; index < SWITCH_METER_STATS_MAX; index++) {
    meter_stat_ids[index] = index;
  }

  switch_status = switch_api_meter_stats_get(device,
                                             policer_id,
                                             SWITCH_METER_STATS_MAX,
                                             meter_stat_ids,
                                             switch_counters);
  status = sai_switch_status_to_sai_status(switch_status);

  if (status != SWITCH_STATUS_SUCCESS) {
    status = SAI_STATUS_NO_MEMORY;
    SAI_LOG_ERROR("failed to get meter stats %lx: %s",
                  policer_id,
                  sai_status_to_string(status));
    SAI_FREE(meter_stat_ids);
    SAI_FREE(switch_counters);
    return status;
  }

  switch_meter_counters_to_sai_meter_counters(
      number_of_counters, counter_ids, switch_counters, counters);

  SAI_FREE(meter_stat_ids);
  SAI_FREE(switch_counters);

  SAI_LOG_EXIT();

  return (sai_status_t)status;
}
Пример #23
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;
}
Пример #24
0
/*
* Routine Description:
*   Get port attribute value.
*
* Arguments:
*    [in] port_id - port 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_port_attribute(
        _In_ sai_object_id_t port_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 list: %s",
                       sai_status_to_string(status));
        return status;
    }

    // attribute value holders
    // Unused for now
    /* int enable; */
    /* switch_port_speed_t speed; */

    int index;
    sai_attribute_t *attribute;
    switch_status_t switch_status;
    for (index = 0; index < attr_count; index++) {
        attribute = &attr_list[index];
        switch(attribute->id) {
            case SAI_PORT_ATTR_OPER_STATUS:
                switch_status = switch_api_port_state_get(
                    device,
                    (switch_port_t) port_id,
                    &attribute->value.booldata);
                if ((status = sai_switch_status_to_sai_status(switch_status))
                    != SAI_STATUS_SUCCESS) {
                    SAI_LOG_ERROR("failed to get port %d oper state: %s",
                        port_id, sai_status_to_string(status));
                    return status;
                }
                status = sai_switch_port_enabled_to_sai_oper_status(attribute);
                break;
            case SAI_PORT_ATTR_SPEED:
                switch_status = switch_api_port_speed_get(
                    device,
                    (switch_port_t) port_id,
                    (switch_port_speed_t *) &attribute->value.u8);
                if ((status = sai_switch_status_to_sai_status(switch_status))
                    != SAI_STATUS_SUCCESS) {
                    SAI_LOG_ERROR("failed to get port %d speed: %s",
                        port_id, sai_status_to_string(status));
                    return status;
                }
                break;
            case SAI_PORT_ATTR_SUPPORTED_SPEED:
                // TODO: implement this, should return list of supported port speeds
                attribute->value.u32list.count = 0;
                break;
            default:
                return SAI_STATUS_NOT_SUPPORTED;
        }
    }

    SAI_LOG_EXIT();

    return (sai_status_t) status;
}
Пример #25
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;
}
Пример #26
0
/*
* Routine Description:
*   Set port attribute value.
*
* Arguments:
*    [in] port_id - port id
*    [in] attr - attribute
*
* Return Values:
*    SAI_STATUS_SUCCESS on success
*    Failure status code on error
*/
sai_status_t sai_set_port_attribute(
        _In_ sai_object_id_t port_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;
    switch_handle_t vlan_handle = SWITCH_API_INVALID_HANDLE;
    switch_port_speed_t port_speed;

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

    switch (attr->id) {
        case SAI_PORT_ATTR_PORT_VLAN_ID:
            switch_status = switch_api_vlan_id_to_handle_get((switch_vlan_t) attr->value.u16, &vlan_handle);
            status = sai_switch_status_to_sai_status(switch_status);
            if (status != SAI_STATUS_SUCCESS) {
                SAI_LOG_ERROR("failed to get vlan %d: %s",
                              sai_status_to_string(status));
                return status;
            }
            /* TBD: Default BD */

            break;
        case SAI_PORT_ATTR_GLOBAL_FLOW_CONTROL:
            // need for disabling ports on shutdown
            break;
        case SAI_PORT_ATTR_INGRESS_FILTERING:
            // need to enable ingress filtering
            break;
        case SAI_PORT_ATTR_SPEED:
            if ((status = sai_port_speed_to_switch_port_speed(
                    attr->value.u32,
                    &port_speed))
                != SAI_STATUS_SUCCESS) {
                SAI_LOG_ERROR("bad port speed for port %d speed: %s",
                    port_id, sai_status_to_string(status));
                return status;
            }
            switch_status = switch_api_port_speed_set(
                device,
                (switch_port_t) port_id,
                (switch_port_speed_t) attr->value.u8);
            if ((status = sai_switch_status_to_sai_status(switch_status))
                != SAI_STATUS_SUCCESS) {
                SAI_LOG_ERROR("failed to set port %d speed: %s",
                    port_id, sai_status_to_string(status));
                return status;
            }
            break;


        default:
            break;
    }

    SAI_LOG_EXIT();

    return (sai_status_t) status;
}