Beispiel #1
0
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));
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}