/* * 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; }
/* * 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_API_PORT); sai_status_t status = SAI_STATUS_SUCCESS; switch_handle_t vlan_handle = 0; switch_vlan_port_t switch_port; if(attr) { switch(attr->id) { //case SAI_PORT_ATTR_PORT_VLAN_ID: case SAI_PORT_ATTR_DEFAULT_VLAN: status = switch_api_vlan_id_to_handle_get((switch_vlan_t) attr->value.u16, &vlan_handle); switch_port.handle = (switch_handle_t)port_id; switch_port.tagging_mode = SWITCH_VLAN_PORT_UNTAGGED; status = switch_api_vlan_ports_add(device, vlan_handle, 1, &switch_port); break; default: // unsupported break; } } SAI_LOG_EXIT(SAI_API_PORT); 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: * 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 Get the attribute of STP instance. * * @param[in] stp_id stp instance id * @param[in] attr_count number of the attribute * @param[in] attr_list attribute value * @return SAI_STATUS_SUCCESS if operation is successful otherwise a different * error code is returned. */ sai_status_t sai_get_stp_port_state( _In_ sai_object_id_t stp_id, _In_ sai_object_id_t port_id, _Out_ sai_port_stp_port_state_t *stp_port_state) { SAI_LOG_ENTER(SAI_API_STP); sai_status_t status = SAI_STATUS_SUCCESS; switch_stp_state_t switch_stp_state = SWITCH_PORT_STP_STATE_NONE; status = switch_api_stp_port_state_get(device, stp_id, port_id, &switch_stp_state); switch (switch_stp_state) { case SWITCH_PORT_STP_STATE_LEARNING: *stp_port_state = SAI_PORT_STP_STATE_LEARNING; break; case SWITCH_PORT_STP_STATE_FORWARDING: *stp_port_state = SAI_PORT_STP_STATE_FORWARDING; break; case SWITCH_PORT_STP_STATE_BLOCKING: *stp_port_state = SAI_PORT_STP_STATE_BLOCKING; break; default: *stp_port_state = 0; } SAI_LOG_EXIT(SAI_API_STP); return (sai_status_t) status; }
/** * @brief Create stp instance with default port state as forwarding. * * @param[out] stp_id stp instance id * @param[in] attr_count Number of attributes * @param[in] attr_list Value of attributes * @return SAI_STATUS_SUCCESS if operation is successful otherwise a different * error code is returned. */ sai_status_t sai_create_stp_entry( _Out_ sai_object_id_t *stp_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list) { SAI_LOG_ENTER(SAI_API_STP); sai_status_t status = SAI_STATUS_SUCCESS; const sai_attribute_t *attribute; const sai_vlan_list_t *vlans; sai_vlan_id_t vlan_id = 0; uint32_t index1 = 0, index2 = 0; switch_handle_t *vlan_handle; *stp_id = (sai_object_id_t) switch_api_stp_group_create(device, 0); for (index1 = 0; index1 < attr_count; index1++) { attribute = &attr_list[index1]; if (attribute->id == SAI_STP_ATTR_VLAN_LIST) { vlans = &attribute->value.vlanlist; vlan_handle = (switch_handle_t *) malloc(sizeof(switch_handle_t) * vlans->vlan_count); for (index2 = 0; index2 < vlans->vlan_count; index2++) { vlan_id = vlans->vlan_list[index2]; switch_api_vlan_id_to_handle_get(vlan_id, &vlan_handle[index2]); } status = switch_api_stp_group_vlans_add(device, *stp_id, vlans->vlan_count, vlan_handle); free(vlan_handle); } } SAI_LOG_EXIT(SAI_API_STP); 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; }
/** * @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; }
/* * 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; }
/** * @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 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; }
/** * @brief Retrieve stp state of a port in specified stp instance. * * @param[in] stp_id stp instance id * @param[in] port_id port id * @param[out] stp_port_state stp state of the port * @return SAI_STATUS_SUCCESS if operation is successful otherwise a different * error code is returned. */ sai_status_t sai_get_stp_entry_attribute( _In_ sai_object_id_t stp_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list) { SAI_LOG_ENTER(SAI_API_STP); SAI_LOG_EXIT(SAI_API_STP); return 0; }
/* \brief Remove LAG \param[in] lag_id LAG id \return Success: SAI_STATUS_SUCCESS Failure: Failure status code on error */ sai_status_t sai_remove_lag_entry( _In_ sai_object_id_t lag_id) { SAI_LOG_ENTER(SAI_API_LAG); sai_status_t status = SAI_STATUS_SUCCESS; status = switch_api_lag_delete(device, (switch_handle_t) lag_id); SAI_LOG_EXIT(SAI_API_LAG); return (sai_status_t) status; }
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; }
/** * @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; }
/* \brief Set LAG Attribute \param[in] lag_id LAG id \param[in] attr Structure containing ID and value to be set \return Success: SAI_STATUS_SUCCESS Failure: Failure status code on error */ sai_status_t sai_set_lag_entry_attribute( _In_ sai_object_id_t lag_id, _In_ const sai_attribute_t *attr) { SAI_LOG_ENTER(SAI_API_LAG); sai_status_t status = SAI_STATUS_SUCCESS; SAI_LOG_EXIT(SAI_API_LAG); return (sai_status_t) status; }
/** * @brief Get ingress priority group attributes * @param[in] ingress_pg_id ingress priority group 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_ingress_priority_group_attribute( _In_ sai_object_id_t ingress_pg_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list) { SAI_LOG_ENTER(); sai_status_t status = SAI_STATUS_SUCCESS; SAI_LOG_EXIT(); return status; }
/* \brief Get LAG Attribute \param[in] lag_id LAG id \param[in] attr_count Number of attributes to be get \param[in,out] attr_list List of structures containing ID and value to be get \return Success: SAI_STATUS_SUCCESS Failure: Failure status code on error */ sai_status_t sai_get_lag_entry_attribute( _In_ sai_object_id_t lag_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list) { SAI_LOG_ENTER(SAI_API_LAG); sai_status_t status = SAI_STATUS_SUCCESS; SAI_LOG_EXIT(SAI_API_LAG); return (sai_status_t) status; }
/* * Routine Description: * Get port statistics counters. * * Arguments: * [in] port_id - port id * [in] counter_ids - specifies the array of counter ids * [in] number_of_counters - number of counters in the array * [out] counters - array of resulting counter values. * * Return Values: * SAI_STATUS_SUCCESS on success * Failure status code on error */ sai_status_t sai_get_port_stats( _In_ sai_object_id_t port_id, _In_ const sai_port_stat_counter_t *counter_ids, _In_ uint32_t number_of_counters, _Out_ uint64_t* counters) { SAI_LOG_ENTER(); sai_status_t status = SAI_STATUS_SUCCESS; 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 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; }
/** * @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: * 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 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 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 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; }
/* * 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 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; }
/* \brief Remove ports from LAG. \param[in] lag_id LAG id \param[in] port_count number of ports \param[in] port_list pointer to membership structures \return Success: SAI_STATUS_SUCCESS Failure: Failure status code on error */ sai_status_t sai_remove_ports_from_lag( _In_ sai_object_id_t lag_id, _In_ const sai_object_list_t *port_list) { SAI_LOG_ENTER(SAI_API_LAG); sai_status_t status = SAI_STATUS_SUCCESS; switch_direction_t direction = SWITCH_API_DIRECTION_BOTH; uint32_t index = 0; for (index = 0; index < port_list->count; index++) { status = switch_api_lag_member_delete(device, (switch_handle_t) lag_id, direction, port_list->list[index]); } SAI_LOG_EXIT(SAI_API_LAG); return (sai_status_t) status; }