switchlink_db_status_t switchlink_db_port_get_all_ports( uint16_t *num_ports, switchlink_db_port_obj_t **port_map) { *num_ports = sizeof(switchlink_db_port_map) / sizeof(switchlink_db_port_obj_t); *port_map = switchlink_malloc(sizeof(switchlink_db_port_obj_t), *num_ports); memcpy(*port_map, switchlink_db_port_map, sizeof(switchlink_db_port_map)); return SWITCHLINK_DB_STATUS_SUCCESS; }
switchlink_db_status_t switchlink_db_route_add(switchlink_db_route_info_t *route_info) { switchlink_db_route_obj_t * obj = switchlink_malloc(sizeof(switchlink_db_route_obj_t), 1); memcpy(&(obj->route_info), route_info, sizeof(switchlink_db_route_info_t)); tommy_list_insert_tail(&switchlink_db_route_obj_list, &obj->list_node, obj); return SWITCHLINK_DB_STATUS_SUCCESS; }
switchlink_db_status_t switchlink_db_bridge_add(uint32_t ifindex, switchlink_db_bridge_info_t *bridge) { switchlink_db_bridge_obj_t * obj = switchlink_malloc(sizeof(switchlink_db_bridge_obj_t), 1); obj->ifindex = ifindex; memcpy(&(obj->bridge), bridge, sizeof(switchlink_db_bridge_info_t)); tommy_trie_inplace_insert(&switchlink_db_bridge_obj_map, &obj->node, obj, obj->ifindex); return SWITCHLINK_DB_STATUS_SUCCESS; }
switchlink_db_status_t switchlink_db_ecmp_add(switchlink_db_ecmp_info_t *ecmp_info) { assert(ecmp_info->num_nhops < SWITCHLINK_ECMP_NUM_MEMBERS_MAX); switchlink_db_ecmp_obj_t * obj = switchlink_malloc(sizeof(switchlink_db_ecmp_obj_t), 1); memcpy(&(obj->ecmp_info), ecmp_info, sizeof(switchlink_db_ecmp_info_t)); obj->ref_count = 0; tommy_list_insert_tail(&switchlink_db_ecmp_obj_list, &obj->list_node, obj); tommy_trie_inplace_insert(&switchlink_db_handle_obj_map, &obj->handle_node, obj, obj->ecmp_info.ecmp_h); return SWITCHLINK_DB_STATUS_SUCCESS; }
switchlink_db_status_t switchlink_db_interface_add(uint32_t ifindex, switchlink_db_interface_info_t *intf_info) { switchlink_db_intf_obj_t * obj = switchlink_malloc(sizeof(switchlink_db_intf_obj_t), 1); obj->ifindex = ifindex; memcpy(&(obj->intf_info), intf_info, sizeof(switchlink_db_interface_info_t)); tommy_trie_inplace_insert(&switchlink_db_interface_obj_map, &obj->ifindex_node, obj, obj->ifindex); tommy_trie_inplace_insert(&switchlink_db_handle_obj_map, &obj->handle_node, obj, obj->intf_info.intf_h); return SWITCHLINK_DB_STATUS_SUCCESS; }
switchlink_db_status_t switchlink_db_oifl_add(switchlink_db_oifl_info_t *oifl_info) { static switchlink_handle_t s_oifl_h = 1; assert(oifl_info->num_intfs < SWITCHLINK_OIFL_NUM_MEMBERS_MAX); switchlink_db_oifl_obj_t * obj = switchlink_malloc(sizeof(switchlink_db_oifl_obj_t), 1); oifl_info->oifl_h = (s_oifl_h++ & ~SWITCHLINK_HANDLE_TYPE_OIFL) | SWITCHLINK_HANDLE_TYPE_OIFL; memcpy(&(obj->oifl_info), oifl_info, sizeof(switchlink_db_oifl_info_t)); obj->ref_count = 0; tommy_list_insert_tail(&switchlink_db_oifl_obj_list, &obj->list_node, obj); tommy_trie_inplace_insert(&switchlink_db_handle_obj_map, &obj->handle_node, obj, obj->oifl_info.oifl_h); return SWITCHLINK_DB_STATUS_SUCCESS; }
switchlink_db_status_t switchlink_db_mac_add(switchlink_mac_addr_t mac_addr, switchlink_handle_t bridge_h, switchlink_handle_t intf_h) { switchlink_db_mac_obj_t *obj = switchlink_malloc(sizeof(switchlink_db_mac_obj_t), 1); memcpy(obj->addr, mac_addr, sizeof(switchlink_mac_addr_t)); obj->bridge_h = bridge_h; obj->intf_h = intf_h; uint32_t hash; uint8_t key[SWITCHLINK_MAC_KEY_LEN]; switchlink_db_mac_key_hash(mac_addr, bridge_h, key, &hash); tommy_hashlin_insert(&switchlink_db_mac_obj_hash, &obj->hash_node, obj, hash); tommy_list_insert_tail(&switchlink_db_mac_obj_list, &obj->list_node, obj); return SWITCHLINK_DB_STATUS_SUCCESS; }
static void get_port_list() { sai_status_t status = SAI_STATUS_SUCCESS; sai_attribute_t port_attr; memset(&port_attr, 0, sizeof(port_attr)); port_attr.id = SAI_SWITCH_ATTR_CPU_PORT; status = switch_api->get_switch_attribute(1, &port_attr); assert(status == SAI_STATUS_SUCCESS); s_cpu_port = port_attr.value.oid; memset(&port_attr, 0, sizeof(port_attr)); port_attr.id = SAI_SWITCH_ATTR_PORT_NUMBER; status = switch_api->get_switch_attribute(1, &port_attr); assert(status == SAI_STATUS_SUCCESS); s_max_ports = port_attr.value.u32; memset(&port_attr, 0, sizeof(port_attr)); port_attr.id = SAI_SWITCH_ATTR_PORT_LIST; s_port_list = (sai_object_id_t *)switchlink_malloc(sizeof(sai_object_id_t), s_max_ports); port_attr.value.objlist.list = s_port_list; status = switch_api->get_switch_attribute(1, &port_attr); assert(status == SAI_STATUS_SUCCESS); }