Lines Matching +full:key +full:- +full:release

1 // SPDX-License-Identifier: GPL-2.0-only
20 psd = rcu_dereference(dst_dev_rcu(dst)->psp_dev); in psp_dev_get_for_sock()
37 good = !pas || rcu_access_pointer(dev->psp_dev) == pas->psd; in psp_validate_xmit()
51 lockdep_assert_held(&psd->lock); in psp_assoc_create()
53 pas = kzalloc(struct_size(pas, drv_data, psd->caps->assoc_drv_spc), in psp_assoc_create()
58 pas->psd = psd; in psp_assoc_create()
59 pas->dev_id = psd->id; in psp_assoc_create()
60 pas->generation = psd->generation; in psp_assoc_create()
62 refcount_set(&pas->refcnt, 1); in psp_assoc_create()
64 list_add_tail(&pas->assocs_list, &psd->active_assocs); in psp_assoc_create()
71 struct psp_dev *psd = pas->psd; in psp_assoc_dummy()
74 lockdep_assert_held(&psd->lock); in psp_assoc_dummy()
76 sz = struct_size(pas, drv_data, psd->caps->assoc_drv_spc); in psp_assoc_dummy()
83 return psd->ops->tx_key_add(psd, pas, extack); in psp_dev_tx_key_add()
88 if (pas->tx.spi) in psp_dev_tx_key_del()
89 psd->ops->tx_key_del(psd, pas); in psp_dev_tx_key_del()
90 list_del(&pas->assocs_list); in psp_dev_tx_key_del()
96 struct psp_dev *psd = pas->psd; in psp_assoc_free()
98 mutex_lock(&psd->lock); in psp_assoc_free()
99 if (psd->ops) in psp_assoc_free()
101 mutex_unlock(&psd->lock); in psp_assoc_free()
110 INIT_WORK(&pas->work, psp_assoc_free); in psp_assoc_free_queue()
111 schedule_work(&pas->work); in psp_assoc_free_queue()
115 * psp_assoc_put() - release a reference on a PSP association
116 * @pas: association to release
120 if (pas && refcount_dec_and_test(&pas->refcnt)) in psp_assoc_put()
121 call_rcu(&pas->rcu, psp_assoc_free_queue); in psp_assoc_put()
126 struct psp_assoc *pas = rcu_dereference_protected(sk->psp_assoc, 1); in psp_sk_assoc_free()
128 rcu_assign_pointer(sk->psp_assoc, NULL); in psp_sk_assoc_free()
133 struct psp_key_parsed *key, in psp_sock_assoc_set_rx() argument
138 memcpy(&pas->rx, key, sizeof(*key)); in psp_sock_assoc_set_rx()
144 err = -EBUSY; in psp_sock_assoc_set_rx()
148 refcount_inc(&pas->refcnt); in psp_sock_assoc_set_rx()
149 rcu_assign_pointer(sk->psp_assoc, pas); in psp_sock_assoc_set_rx()
163 skb_rbtree_walk(skb, &tcp_sk(sk)->out_of_order_queue) { in psp_sock_recv_queue_check()
166 return -EBUSY; in psp_sock_recv_queue_check()
169 skb_queue_walk(&sk->sk_receive_queue, skb) { in psp_sock_recv_queue_check()
172 return -EBUSY; in psp_sock_recv_queue_check()
178 u32 version, struct psp_key_parsed *key, in psp_sock_assoc_set_tx() argument
189 NL_SET_ERR_MSG(extack, "Socket has no Rx key"); in psp_sock_assoc_set_tx()
190 err = -EINVAL; in psp_sock_assoc_set_tx()
193 if (pas->psd != psd) { in psp_sock_assoc_set_tx()
194 NL_SET_ERR_MSG(extack, "Rx key from different device"); in psp_sock_assoc_set_tx()
195 err = -EINVAL; in psp_sock_assoc_set_tx()
198 if (pas->version != version) { in psp_sock_assoc_set_tx()
201 err = -EINVAL; in psp_sock_assoc_set_tx()
204 if (pas->tx.spi) { in psp_sock_assoc_set_tx()
205 NL_SET_ERR_MSG(extack, "Tx key already set"); in psp_sock_assoc_set_tx()
206 err = -EBUSY; in psp_sock_assoc_set_tx()
217 * try to store pointers to it. For re-keying we'll need to in psp_sock_assoc_set_tx()
218 * re-allocate the assoc structures. in psp_sock_assoc_set_tx()
222 err = -ENOMEM; in psp_sock_assoc_set_tx()
226 memcpy(&dummy->tx, key, sizeof(*key)); in psp_sock_assoc_set_tx()
231 memcpy(pas->drv_data, dummy->drv_data, psd->caps->assoc_drv_spc); in psp_sock_assoc_set_tx()
232 memcpy(&pas->tx, key, sizeof(*key)); in psp_sock_assoc_set_tx()
234 WRITE_ONCE(sk->sk_validate_xmit_skb, psp_validate_xmit); in psp_sock_assoc_set_tx()
236 pas->upgrade_seq = tcp_sk(sk)->rcv_nxt; in psp_sock_assoc_set_tx()
239 icsk->icsk_ext_hdr_len += psp_sk_overhead(sk); in psp_sock_assoc_set_tx()
240 icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie); in psp_sock_assoc_set_tx()
256 list_for_each_entry_safe(pas, next, &psd->prev_assocs, assocs_list) in psp_assocs_key_rotated()
257 pas->generation |= ~PSP_GEN_VALID_MASK; in psp_assocs_key_rotated()
258 list_splice_init(&psd->prev_assocs, &psd->stale_assocs); in psp_assocs_key_rotated()
259 list_splice_init(&psd->active_assocs, &psd->prev_assocs); in psp_assocs_key_rotated()
269 refcount_inc(&pas->refcnt); in psp_twsk_init()
270 rcu_assign_pointer(tw->psp_assoc, pas); in psp_twsk_init()
271 tw->tw_validate_xmit_skb = psp_validate_xmit; in psp_twsk_init()
276 struct psp_assoc *pas = rcu_dereference_protected(tw->psp_assoc, 1); in psp_twsk_assoc_free()
278 rcu_assign_pointer(tw->psp_assoc, NULL); in psp_twsk_assoc_free()
288 if (pas && pas->tx.spi) in psp_reply_set_decrypted()
289 skb->decrypted = 1; in psp_reply_set_decrypted()