static inline int switchlink_db_mac_cmp(const void *key1, const void *arg) { switchlink_db_mac_obj_t *obj = (switchlink_db_mac_obj_t *)arg; uint8_t key2[SWITCHLINK_MAC_KEY_LEN]; switchlink_db_mac_key_hash(obj->addr, obj->bridge_h, key2, NULL); return (memcmp(key1, key2, SWITCHLINK_MAC_KEY_LEN)); }
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; }
switchlink_db_status_t switchlink_db_mac_get_intf(switchlink_mac_addr_t mac_addr, switchlink_handle_t bridge_h, switchlink_handle_t *intf_h) { switchlink_db_mac_obj_t * obj; uint32_t hash; uint8_t key[SWITCHLINK_MAC_KEY_LEN]; switchlink_db_mac_key_hash(mac_addr, bridge_h, key, &hash); obj = tommy_hashlin_search(&switchlink_db_mac_obj_hash, switchlink_db_mac_cmp, key, hash); if (!obj) { return SWITCHLINK_DB_STATUS_ITEM_NOT_FOUND; } *intf_h = obj->intf_h; return SWITCHLINK_DB_STATUS_SUCCESS; }
switchlink_db_status_t switchlink_db_mac_delete(switchlink_mac_addr_t mac_addr, switchlink_handle_t bridge_h) { switchlink_db_mac_obj_t *obj; uint32_t hash; uint8_t key[SWITCHLINK_MAC_KEY_LEN]; switchlink_db_mac_key_hash(mac_addr, bridge_h, key, &hash); obj = tommy_hashlin_search( &switchlink_db_mac_obj_hash, switchlink_db_mac_cmp, key, hash); if (!obj) { return SWITCHLINK_DB_STATUS_ITEM_NOT_FOUND; } tommy_hashlin_remove_existing(&switchlink_db_mac_obj_hash, &obj->hash_node); tommy_list_remove_existing(&switchlink_db_mac_obj_list, &obj->list_node); switchlink_free(obj); return SWITCHLINK_DB_STATUS_SUCCESS; }