/* * inserts (in front) a new entry in hash table, * called from ipsec_alg_register() when new algorithm is registered. */ static int ipsec_alg_insert(struct ipsec_alg *ixt) { int ret=-EINVAL; unsigned hashval=ipsec_alg_hashfn(ixt->ixt_alg_type, ixt->ixt_alg_id); struct list_head *head= ipsec_alg_hash_table + hashval; struct ipsec_alg *ixt_cur; /* new element must be virgin ... */ if (ixt->ixt_list.next != &ixt->ixt_list || ixt->ixt_list.prev != &ixt->ixt_list) { printk(KERN_ERR "ipsec_alg_insert: ixt object \"%s\" " "list head not initialized\n", ixt->ixt_name); return ret; } write_lock_bh(&ipsec_alg_lock); ixt_cur = __ipsec_alg_find(ixt->ixt_alg_type, ixt->ixt_alg_id, head); /* if previous (current) ipsec_alg found check excl flag of _anyone_ */ if (ixt_cur && ((ixt->ixt_state|ixt_cur->ixt_state) & IPSEC_ALG_ST_EXCL)) { barf_out("ipsec_alg for alg_type=%d, alg_id=%d already exist. " "Not loaded (ret=%d).\n", ixt->ixt_alg_type, ixt->ixt_alg_id, ret=-EEXIST); } list_add(&ixt->ixt_list, head); ixt->ixt_state |= IPSEC_ALG_ST_REGISTERED; ret=0; out: write_unlock_bh(&ipsec_alg_lock); return ret; }
/* * here @user context (read-only when @kernel bh context) * -> no bh disabling * * called from ipsec_sa_init() -> ipsec_alg_sa_init() */ static struct ipsec_alg *ipsec_alg_get(int alg_type, int alg_id) { unsigned hashval=ipsec_alg_hashfn(alg_type, alg_id); struct list_head *head= ipsec_alg_hash_table + hashval; struct ipsec_alg *ixt; read_lock(&ipsec_alg_lock); ixt=__ipsec_alg_find(alg_type, alg_id, head); if (ixt) __ipsec_alg_usage_inc(ixt); read_unlock(&ipsec_alg_lock); return ixt; }
/* * inserts (in front) a new entry in hash table, * called from ipsec_alg_register() when new algorithm is registered. */ static int ipsec_alg_insert(struct ipsec_alg *ixt) { int ret=-EINVAL; unsigned hashval=ipsec_alg_hashfn(ixt->ixt_alg_type, ixt->ixt_alg_id); struct list_head *head= ipsec_alg_hash_table + hashval; /* new element must be virgin ... */ if (ixt->ixt_list.next != &ixt->ixt_list || ixt->ixt_list.prev != &ixt->ixt_list) { printk(KERN_ERR "%s: ixt object \"%s\" " "list head not initialized\n", __FUNCTION__, ixt->ixt_name); return ret; } write_lock_bh(&ipsec_alg_lock); if (__ipsec_alg_find(ixt->ixt_alg_type, ixt->ixt_alg_id, head)) barf_out(KERN_WARNING "ipsec_alg for alg_type=%d, alg_id=%d already exist." "Not loaded (ret=%d).\n", ixt->ixt_alg_type, ixt->ixt_alg_id, ret=-EEXIST); list_add(&ixt->ixt_list, head); ret=0; out: write_unlock_bh(&ipsec_alg_lock); return ret; }