Skip to content

Commit b5a1d1f

Browse files
Florian Westphalklassert
authored andcommitted
xfrm: replay: remove last replay indirection
This replaces the overflow indirection with the new xfrm_replay_overflow helper. After this, the 'repl' pointer in xfrm_state is no longer needed and can be removed as well. xfrm_replay_overflow() is added in two incarnations, one is used when the kernel is compiled with xfrm hardware offload support enabled, the other when its disabled. Signed-off-by: Florian Westphal <[email protected]> Signed-off-by: Steffen Klassert <[email protected]>
1 parent adfc2fd commit b5a1d1f

File tree

3 files changed

+28
-33
lines changed

3 files changed

+28
-33
lines changed

include/net/xfrm.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,6 @@ struct xfrm_state {
221221
struct xfrm_replay_state preplay;
222222
struct xfrm_replay_state_esn *preplay_esn;
223223

224-
/* The functions for replay detection. */
225-
const struct xfrm_replay *repl;
226-
227224
/* replay detection mode */
228225
enum xfrm_replay_mode repl_mode;
229226
/* internal flag that only holds state for delayed aevent at the
@@ -305,10 +302,6 @@ struct km_event {
305302
struct net *net;
306303
};
307304

308-
struct xfrm_replay {
309-
int (*overflow)(struct xfrm_state *x, struct sk_buff *skb);
310-
};
311-
312305
struct xfrm_if_cb {
313306
struct xfrm_if *(*decode_session)(struct sk_buff *skb,
314307
unsigned short family);
@@ -1718,6 +1711,7 @@ static inline int xfrm_policy_id2dir(u32 index)
17181711
void xfrm_replay_advance(struct xfrm_state *x, __be32 net_seq);
17191712
int xfrm_replay_check(struct xfrm_state *x, struct sk_buff *skb, __be32 net_seq);
17201713
void xfrm_replay_notify(struct xfrm_state *x, int event);
1714+
int xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb);
17211715
int xfrm_replay_recheck(struct xfrm_state *x, struct sk_buff *skb, __be32 net_seq);
17221716

17231717
static inline int xfrm_aevent_is_on(struct net *net)

net/xfrm/xfrm_output.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ static int xfrm_output_one(struct sk_buff *skb, int err)
525525
goto error;
526526
}
527527

528-
err = x->repl->overflow(x, skb);
528+
err = xfrm_replay_overflow(x, skb);
529529
if (err) {
530530
XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATESEQERROR);
531531
goto error;

net/xfrm/xfrm_replay.c

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ void xfrm_replay_notify(struct xfrm_state *x, int event)
9595
x->xflags &= ~XFRM_TIME_DEFER;
9696
}
9797

98-
static int xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb)
98+
static int __xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb)
9999
{
100100
int err = 0;
101101
struct net *net = xs_net(x);
@@ -617,7 +617,7 @@ static int xfrm_replay_overflow_offload(struct xfrm_state *x, struct sk_buff *sk
617617
__u32 oseq = x->replay.oseq;
618618

619619
if (!xo)
620-
return xfrm_replay_overflow(x, skb);
620+
return __xfrm_replay_overflow(x, skb);
621621

622622
if (x->type->flags & XFRM_TYPE_REPLAY_PROT) {
623623
if (!skb_is_gso(skb)) {
@@ -737,29 +737,33 @@ static int xfrm_replay_overflow_offload_esn(struct xfrm_state *x, struct sk_buff
737737
return err;
738738
}
739739

740-
static const struct xfrm_replay xfrm_replay_legacy = {
741-
.overflow = xfrm_replay_overflow_offload,
742-
};
743-
744-
static const struct xfrm_replay xfrm_replay_bmp = {
745-
.overflow = xfrm_replay_overflow_offload_bmp,
746-
};
740+
int xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb)
741+
{
742+
switch (x->repl_mode) {
743+
case XFRM_REPLAY_MODE_LEGACY:
744+
break;
745+
case XFRM_REPLAY_MODE_BMP:
746+
return xfrm_replay_overflow_offload_bmp(x, skb);
747+
case XFRM_REPLAY_MODE_ESN:
748+
return xfrm_replay_overflow_offload_esn(x, skb);
749+
}
747750

748-
static const struct xfrm_replay xfrm_replay_esn = {
749-
.overflow = xfrm_replay_overflow_offload_esn,
750-
};
751+
return xfrm_replay_overflow_offload(x, skb);
752+
}
751753
#else
752-
static const struct xfrm_replay xfrm_replay_legacy = {
753-
.overflow = xfrm_replay_overflow,
754-
};
755-
756-
static const struct xfrm_replay xfrm_replay_bmp = {
757-
.overflow = xfrm_replay_overflow_bmp,
758-
};
754+
int xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb)
755+
{
756+
switch (x->repl_mode) {
757+
case XFRM_REPLAY_MODE_LEGACY:
758+
break;
759+
case XFRM_REPLAY_MODE_BMP:
760+
return xfrm_replay_overflow_bmp(x, skb);
761+
case XFRM_REPLAY_MODE_ESN:
762+
return xfrm_replay_overflow_esn(x, skb);
763+
}
759764

760-
static const struct xfrm_replay xfrm_replay_esn = {
761-
.overflow = xfrm_replay_overflow_esn,
762-
};
765+
return __xfrm_replay_overflow(x, skb);
766+
}
763767
#endif
764768

765769
int xfrm_init_replay(struct xfrm_state *x)
@@ -774,14 +778,11 @@ int xfrm_init_replay(struct xfrm_state *x)
774778
if (x->props.flags & XFRM_STATE_ESN) {
775779
if (replay_esn->replay_window == 0)
776780
return -EINVAL;
777-
x->repl = &xfrm_replay_esn;
778781
x->repl_mode = XFRM_REPLAY_MODE_ESN;
779782
} else {
780-
x->repl = &xfrm_replay_bmp;
781783
x->repl_mode = XFRM_REPLAY_MODE_BMP;
782784
}
783785
} else {
784-
x->repl = &xfrm_replay_legacy;
785786
x->repl_mode = XFRM_REPLAY_MODE_LEGACY;
786787
}
787788

0 commit comments

Comments
 (0)