/** * @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; }
static void sai_buffer_profile_attribute_parse( _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list, switch_api_buffer_profile_t *buffer_profile_info) { const sai_attribute_t *attribute; uint32_t i = 0; sai_buffer_profile_threshold_mode_t threshold_mode; for (i = 0; i < attr_count; i++) { attribute = &attr_list[i]; switch (attribute->id) { case SAI_BUFFER_PROFILE_ATTR_POOL_ID: buffer_profile_info->pool_handle = attribute->value.oid; break; case SAI_BUFFER_PROFILE_ATTR_BUFFER_SIZE: buffer_profile_info->buffer_size = attribute->value.u32; break; /* case SAI_BUFFER_PROFILE_ATTR_TH_MODE: threshold_mode = attribute->value.u32; break; */ case SAI_BUFFER_PROFILE_ATTR_SHARED_DYNAMIC_TH: SAI_ASSERT(threshold_mode == SAI_BUFFER_PROFILE_THRESHOLD_MODE_DYNAMIC); buffer_profile_info->threshold_mode = SWITCH_BUFFER_THRESHOLD_MODE_DYNAMIC; buffer_profile_info->threshold = attribute->value.u32; break; case SAI_BUFFER_PROFILE_ATTR_SHARED_STATIC_TH: SAI_ASSERT(threshold_mode == SAI_BUFFER_PROFILE_THRESHOLD_MODE_STATIC); buffer_profile_info->threshold_mode = SWITCH_BUFFER_THRESHOLD_MODE_STATIC; buffer_profile_info->threshold = attribute->value.u32; break; case SAI_BUFFER_PROFILE_ATTR_XOFF_TH: buffer_profile_info->xoff_threshold = attribute->value.u32; break; case SAI_BUFFER_PROFILE_ATTR_XON_TH: buffer_profile_info->xon_threshold = attribute->value.u32; break; default: break; } } }
static void sai_neighbor_entry_parse( const sai_neighbor_entry_t *neighbor_entry, switch_api_neighbor_t *api_neighbor) { SAI_ASSERT(sai_object_type_query(neighbor_entry->rif_id) == SAI_OBJECT_TYPE_ROUTER_INTERFACE); api_neighbor->interface = (switch_handle_t) neighbor_entry->rif_id; api_neighbor->rw_type = SWITCH_API_NEIGHBOR_RW_TYPE_L3; sai_ip_addr_to_switch_ip_addr(&neighbor_entry->ip_address, &api_neighbor->ip_addr); }
/** * @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; }
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 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; }
/* * 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 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; }
static void sai_ipmc_entry_parse(_In_ const sai_ipmc_entry_t *ipmc_entry, _Out_ switch_handle_t *vrf_handle, _Out_ switch_ip_addr_t *src_addr, _Out_ switch_ip_addr_t *grp_addr) { SAI_ASSERT(sai_object_type_query(ipmc_entry->vr_id) == SAI_OBJECT_TYPE_VIRTUAL_ROUTER); *vrf_handle = (switch_handle_t)ipmc_entry->vr_id; memset(src_addr, 0, sizeof(switch_ip_addr_t)); sai_ip_addr_to_switch_ip_addr(&(ipmc_entry->source), src_addr); if (((src_addr->type == SWITCH_API_IP_ADDR_V4) && (src_addr->ip.v4addr == 0)) || ((src_addr->type == SWITCH_API_IP_ADDR_V6) && (memcmp(src_addr->ip.v6addr, &in6addr_any, sizeof(in6addr_any)) == 0))) { src_addr->prefix_len = 0; } sai_ip_prefix_to_switch_ip_addr(&(ipmc_entry->group), grp_addr); }
/* * 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; }
/** * @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; }
/* * 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: * 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: * 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; }