/* * 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; }
/* * 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; }
/** * @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; }
/* * 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; }
/** * @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; }
/* * 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; }
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; }
/** * @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; }
/** * @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; }
/* * 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; }
/** * @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; }
/** * 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; }
/** * 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; }
/* * 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; }
/** * @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; }
/** * @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; }
/* * 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; }
/* * 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; }
/** * @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; }
/* * 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; }
/** * @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; }
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; }
/* * 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; }
/* * 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; }
/* * 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; }
/* * 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; }