>From 00fc5af96f90846f1e1882b141699fb62a9f0a73 Mon Sep 17 00:00:00 2001 From: Antony Antony Date: Mon, 13 Nov 2023 14:20:45 +0100 Subject: [PATCH] xfrm iptfs migrate poc proof of concept for IP-TFS migrate support --- include/net/xfrm.h | 1 + net/xfrm/xfrm_iptfs.c | 20 ++++++++++++++++++++ net/xfrm/xfrm_state.c | 6 ++++++ 3 files changed, 27 insertions(+) diff --git a/include/net/xfrm.h b/include/net/xfrm.h index a6e0e848918d..176ab5ac436e 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -456,6 +456,7 @@ struct xfrm_mode_cbs { int (*user_init)(struct net *net, struct xfrm_state *x, struct nlattr **attrs); int (*copy_to_user)(struct xfrm_state *x, struct sk_buff *skb); + int (*clone)(struct xfrm_state *orig, struct xfrm_state *x); u32 (*get_inner_mtu)(struct xfrm_state *x, int outer_mtu); diff --git a/net/xfrm/xfrm_iptfs.c b/net/xfrm/xfrm_iptfs.c index 65f7acdbe6a8..cef269a02b11 100644 --- a/net/xfrm/xfrm_iptfs.c +++ b/net/xfrm/xfrm_iptfs.c @@ -2613,6 +2613,25 @@ static int iptfs_copy_to_user(struct xfrm_state *x, struct sk_buff *skb) return ret; } +static int iptfs_clone(struct xfrm_state *orig, struct xfrm_state *x) +{ + + x->mode_data = kmemdup(orig->mode_data, sizeof(*x->mode_data), + GFP_KERNEL); + /** may be some values, such as the following, should not be copied ?? + * and need different handling ? + * xtfs->iptfs_timer; + * xtfs->drop_timer + * xtfs->drop_lock + * xtfs->w_saved + * xtfs; + */ + + if (!x->mode_data) + return -ENOMEM; + + return 0; +} static int iptfs_create_state(struct xfrm_state *x) { struct xfrm_iptfs_data *xtfs; @@ -2667,6 +2686,7 @@ static const struct xfrm_mode_cbs iptfs_mode_cbs = { .delete_state = iptfs_delete_state, .user_init = iptfs_user_init, .copy_to_user = iptfs_copy_to_user, + .clone = iptfs_clone, .get_inner_mtu = iptfs_get_inner_mtu, .input = iptfs_input, .output = iptfs_output_collect, diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 786f3fc0d428..c56d3be56229 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -720,6 +720,7 @@ struct xfrm_state *xfrm_state_alloc(struct net *net) x->replay_maxage = 0; x->replay_maxdiff = 0; spin_lock_init(&x->lock); + x->mode_data = NULL; } return x; } @@ -1787,6 +1788,11 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, x->new_mapping = 0; x->new_mapping_sport = 0; + if (x->mode_cbs && x->mode_cbs->clone && orig->mode_data) { + if (!x->mode_cbs->clone(x,orig)) + goto error; + } + return x; error: -- 2.42.0