Commit d14f28b8 authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Steffen Klassert
Browse files

xfrm: add new packet offload flag



In the next patches, the xfrm core code will be extended to support
new type of offload - packet offload. In that mode, both policy and state
should be specially configured in order to perform whole offloaded data
path.

Full offload takes care of encryption, decryption, encapsulation and
other operations with headers.

As this mode is new for XFRM policy flow, we can "start fresh" with flag
bits and release first and second bit for future use.

Reviewed-by: default avatarRaed Salem <raeds@nvidia.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent 65e6af6c
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -131,12 +131,19 @@ enum {
	XFRM_DEV_OFFLOAD_OUT,
};

enum {
	XFRM_DEV_OFFLOAD_UNSPECIFIED,
	XFRM_DEV_OFFLOAD_CRYPTO,
	XFRM_DEV_OFFLOAD_PACKET,
};

struct xfrm_dev_offload {
	struct net_device	*dev;
	netdevice_tracker	dev_tracker;
	struct net_device	*real_dev;
	unsigned long		offload_handle;
	u8			dir : 2;
	u8			type : 2;
};

struct xfrm_mode {
+6 −0
Original line number Diff line number Diff line
@@ -519,6 +519,12 @@ struct xfrm_user_offload {
 */
#define XFRM_OFFLOAD_IPV6	1
#define XFRM_OFFLOAD_INBOUND	2
/* Two bits above are relevant for state path only, while
 * offload is used for both policy and state flows.
 *
 * In policy offload mode, they are free and can be safely reused.
 */
#define XFRM_OFFLOAD_PACKET	4

struct xfrm_userpolicy_default {
#define XFRM_USERPOLICY_UNSPEC	0
+3 −0
Original line number Diff line number Diff line
@@ -291,12 +291,15 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,
	else
		xso->dir = XFRM_DEV_OFFLOAD_OUT;

	xso->type = XFRM_DEV_OFFLOAD_CRYPTO;

	err = dev->xfrmdev_ops->xdo_dev_state_add(x);
	if (err) {
		xso->dev = NULL;
		xso->dir = 0;
		xso->real_dev = NULL;
		netdev_put(dev, &xso->dev_tracker);
		xso->type = XFRM_DEV_OFFLOAD_UNSPECIFIED;

		if (err != -EOPNOTSUPP) {
			NL_SET_ERR_MSG(extack, "Device failed to offload this state");
+2 −0
Original line number Diff line number Diff line
@@ -956,6 +956,8 @@ static int copy_user_offload(struct xfrm_dev_offload *xso, struct sk_buff *skb)
	xuo->ifindex = xso->dev->ifindex;
	if (xso->dir == XFRM_DEV_OFFLOAD_IN)
		xuo->flags = XFRM_OFFLOAD_INBOUND;
	if (xso->type == XFRM_DEV_OFFLOAD_PACKET)
		xuo->flags |= XFRM_OFFLOAD_PACKET;

	return 0;
}