Re: [PATCH v2 08/17] net: psp: add socket security association code

Daniel Zahka
2025-06-26T12:37:39Z

On 6/25/25 10:12 PM, Willem de Bruijn wrote:
> Daniel Zahka wrote:
>> From: Jakub Kicinski <kuba@kernel.org>
>>
>> Add the ability to install PSP Rx and Tx crypto keys on TCP
>> connections. Netlink ops are provided for both operations.
>> Rx side combines allocating a new Rx key and installing it
>> on the socket. Theoretically these are separate actions,
>> but in practice they will always be used one after the
>> other. We can add distinct "alloc" and "install" ops later.
>>
>> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
>> Signed-off-by: Daniel Zahka <daniel.zahka@gmail.com>
>> Co-developed-by: Daniel Zahka <daniel.zahka@gmail.com>
>> /**
>> * struct psp_dev_ops - netdev driver facing PSP callbacks
>> */
>> @@ -109,6 +145,28 @@ struct psp_dev_ops {
>> * @key_rotate: rotate the device key
>> */
>> int (*key_rotate)(struct psp_dev *psd, struct netlink_ext_ack *extack);
>> +
>> + /**
>> + * @rx_spi_alloc: allocate an Rx SPI+key pair
>> + * Allocate an Rx SPI and resulting derived key.
>> + * This key should remain valid until key rotation.
>> + */
>> + int (*rx_spi_alloc)(struct psp_dev *psd, u32 version,
>> + struct psp_key_parsed *assoc,
>> + struct netlink_ext_ack *extack);
>> +
>> + /**
>> + * @tx_key_add: add a Tx key to the device
>> + * Install an association in the device. Core will allocate space
>> + * for the driver to use at drv_data.
>> + */
>> + int (*tx_key_add)(struct psp_dev *psd, struct psp_assoc *pas,
>> + struct netlink_ext_ack *extack);
>> + /**
>> + * @tx_key_del: remove a Tx key from the device
>> + * Remove an association from the device.
>> + */
>> + void (*tx_key_del)(struct psp_dev *psd, struct psp_assoc *pas);
>> };
> This Tx driver API is necessary for devices that store keys in an
> on-device key database.
>
> The preferred device model for PSP is keys-in-descriptor, in line with
> the protocol design goal of O(1) device state.
>
> In that case, can the driver leave these callbacks NULL? And, in the
> driver tx datapath, access the tx key from psp_sk_assoc().

As it is now, psp_dev_create() will complain if the tx key management
functions are NULL, but that should be changed. From the driver tx
datapath, psp_skb_get_assoc_rcu() should be used for both
keys-in-descriptors and SADB implementations. For SADB use, the SADB
handle can be stashed in pas->drv_data. The mlx5 patches demonstrate this.