Skip to content

Commit b6ccf61

Browse files
rleonklassert
authored andcommitted
xfrm: simplify SA initialization routine
SA replay mode is initialized differently for user-space and kernel-space users, but the call to xfrm_init_replay() existed in common path with boolean protection. That caused to situation where we have two different function orders. So let's rewrite the SA initialization flow to have same order for both in-kernel and user-space callers. Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Steffen Klassert <[email protected]>
1 parent 585b64f commit b6ccf61

File tree

3 files changed

+12
-15
lines changed

3 files changed

+12
-15
lines changed

include/net/xfrm.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1769,8 +1769,7 @@ void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);
17691769
u32 xfrm_replay_seqhi(struct xfrm_state *x, __be32 net_seq);
17701770
int xfrm_init_replay(struct xfrm_state *x, struct netlink_ext_ack *extack);
17711771
u32 xfrm_state_mtu(struct xfrm_state *x, int mtu);
1772-
int __xfrm_init_state(struct xfrm_state *x, bool init_replay,
1773-
struct netlink_ext_ack *extack);
1772+
int __xfrm_init_state(struct xfrm_state *x, struct netlink_ext_ack *extack);
17741773
int xfrm_init_state(struct xfrm_state *x);
17751774
int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type);
17761775
int xfrm_input_resume(struct sk_buff *skb, int nexthdr);

net/xfrm/xfrm_state.c

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3120,8 +3120,7 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu)
31203120
}
31213121
EXPORT_SYMBOL_GPL(xfrm_state_mtu);
31223122

3123-
int __xfrm_init_state(struct xfrm_state *x, bool init_replay,
3124-
struct netlink_ext_ack *extack)
3123+
int __xfrm_init_state(struct xfrm_state *x, struct netlink_ext_ack *extack)
31253124
{
31263125
const struct xfrm_mode *inner_mode;
31273126
const struct xfrm_mode *outer_mode;
@@ -3188,12 +3187,6 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay,
31883187
}
31893188

31903189
x->outer_mode = *outer_mode;
3191-
if (init_replay) {
3192-
err = xfrm_init_replay(x, extack);
3193-
if (err)
3194-
goto error;
3195-
}
3196-
31973190
if (x->nat_keepalive_interval) {
31983191
if (x->dir != XFRM_SA_DIR_OUT) {
31993192
NL_SET_ERR_MSG(extack, "NAT keepalive is only supported for outbound SAs");
@@ -3225,11 +3218,16 @@ int xfrm_init_state(struct xfrm_state *x)
32253218
{
32263219
int err;
32273220

3228-
err = __xfrm_init_state(x, true, NULL);
3229-
if (!err)
3230-
x->km.state = XFRM_STATE_VALID;
3221+
err = __xfrm_init_state(x, NULL);
3222+
if (err)
3223+
return err;
32313224

3232-
return err;
3225+
err = xfrm_init_replay(x, NULL);
3226+
if (err)
3227+
return err;
3228+
3229+
x->km.state = XFRM_STATE_VALID;
3230+
return 0;
32333231
}
32343232

32353233
EXPORT_SYMBOL(xfrm_init_state);

net/xfrm/xfrm_user.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -919,7 +919,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
919919
goto error;
920920
}
921921

922-
err = __xfrm_init_state(x, false, extack);
922+
err = __xfrm_init_state(x, extack);
923923
if (err)
924924
goto error;
925925

0 commit comments

Comments
 (0)