Commit b5a1d1fe authored by Florian Westphal's avatar Florian Westphal Committed by Steffen Klassert

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: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent adfc2fdb
...@@ -221,9 +221,6 @@ struct xfrm_state { ...@@ -221,9 +221,6 @@ struct xfrm_state {
struct xfrm_replay_state preplay; struct xfrm_replay_state preplay;
struct xfrm_replay_state_esn *preplay_esn; struct xfrm_replay_state_esn *preplay_esn;
/* The functions for replay detection. */
const struct xfrm_replay *repl;
/* replay detection mode */ /* replay detection mode */
enum xfrm_replay_mode repl_mode; enum xfrm_replay_mode repl_mode;
/* internal flag that only holds state for delayed aevent at the /* internal flag that only holds state for delayed aevent at the
...@@ -305,10 +302,6 @@ struct km_event { ...@@ -305,10 +302,6 @@ struct km_event {
struct net *net; struct net *net;
}; };
struct xfrm_replay {
int (*overflow)(struct xfrm_state *x, struct sk_buff *skb);
};
struct xfrm_if_cb { struct xfrm_if_cb {
struct xfrm_if *(*decode_session)(struct sk_buff *skb, struct xfrm_if *(*decode_session)(struct sk_buff *skb,
unsigned short family); unsigned short family);
...@@ -1718,6 +1711,7 @@ static inline int xfrm_policy_id2dir(u32 index) ...@@ -1718,6 +1711,7 @@ static inline int xfrm_policy_id2dir(u32 index)
void xfrm_replay_advance(struct xfrm_state *x, __be32 net_seq); void xfrm_replay_advance(struct xfrm_state *x, __be32 net_seq);
int xfrm_replay_check(struct xfrm_state *x, struct sk_buff *skb, __be32 net_seq); int xfrm_replay_check(struct xfrm_state *x, struct sk_buff *skb, __be32 net_seq);
void xfrm_replay_notify(struct xfrm_state *x, int event); void xfrm_replay_notify(struct xfrm_state *x, int event);
int xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb);
int xfrm_replay_recheck(struct xfrm_state *x, struct sk_buff *skb, __be32 net_seq); int xfrm_replay_recheck(struct xfrm_state *x, struct sk_buff *skb, __be32 net_seq);
static inline int xfrm_aevent_is_on(struct net *net) static inline int xfrm_aevent_is_on(struct net *net)
......
...@@ -525,7 +525,7 @@ static int xfrm_output_one(struct sk_buff *skb, int err) ...@@ -525,7 +525,7 @@ static int xfrm_output_one(struct sk_buff *skb, int err)
goto error; goto error;
} }
err = x->repl->overflow(x, skb); err = xfrm_replay_overflow(x, skb);
if (err) { if (err) {
XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATESEQERROR); XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTSTATESEQERROR);
goto error; goto error;
......
...@@ -95,7 +95,7 @@ void xfrm_replay_notify(struct xfrm_state *x, int event) ...@@ -95,7 +95,7 @@ void xfrm_replay_notify(struct xfrm_state *x, int event)
x->xflags &= ~XFRM_TIME_DEFER; x->xflags &= ~XFRM_TIME_DEFER;
} }
static int xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb) static int __xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb)
{ {
int err = 0; int err = 0;
struct net *net = xs_net(x); struct net *net = xs_net(x);
...@@ -617,7 +617,7 @@ static int xfrm_replay_overflow_offload(struct xfrm_state *x, struct sk_buff *sk ...@@ -617,7 +617,7 @@ static int xfrm_replay_overflow_offload(struct xfrm_state *x, struct sk_buff *sk
__u32 oseq = x->replay.oseq; __u32 oseq = x->replay.oseq;
if (!xo) if (!xo)
return xfrm_replay_overflow(x, skb); return __xfrm_replay_overflow(x, skb);
if (x->type->flags & XFRM_TYPE_REPLAY_PROT) { if (x->type->flags & XFRM_TYPE_REPLAY_PROT) {
if (!skb_is_gso(skb)) { if (!skb_is_gso(skb)) {
...@@ -737,29 +737,33 @@ static int xfrm_replay_overflow_offload_esn(struct xfrm_state *x, struct sk_buff ...@@ -737,29 +737,33 @@ static int xfrm_replay_overflow_offload_esn(struct xfrm_state *x, struct sk_buff
return err; return err;
} }
static const struct xfrm_replay xfrm_replay_legacy = { int xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb)
.overflow = xfrm_replay_overflow_offload, {
}; switch (x->repl_mode) {
case XFRM_REPLAY_MODE_LEGACY:
static const struct xfrm_replay xfrm_replay_bmp = { break;
.overflow = xfrm_replay_overflow_offload_bmp, case XFRM_REPLAY_MODE_BMP:
}; return xfrm_replay_overflow_offload_bmp(x, skb);
case XFRM_REPLAY_MODE_ESN:
return xfrm_replay_overflow_offload_esn(x, skb);
}
static const struct xfrm_replay xfrm_replay_esn = { return xfrm_replay_overflow_offload(x, skb);
.overflow = xfrm_replay_overflow_offload_esn, }
};
#else #else
static const struct xfrm_replay xfrm_replay_legacy = { int xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb)
.overflow = xfrm_replay_overflow, {
}; switch (x->repl_mode) {
case XFRM_REPLAY_MODE_LEGACY:
static const struct xfrm_replay xfrm_replay_bmp = { break;
.overflow = xfrm_replay_overflow_bmp, case XFRM_REPLAY_MODE_BMP:
}; return xfrm_replay_overflow_bmp(x, skb);
case XFRM_REPLAY_MODE_ESN:
return xfrm_replay_overflow_esn(x, skb);
}
static const struct xfrm_replay xfrm_replay_esn = { return __xfrm_replay_overflow(x, skb);
.overflow = xfrm_replay_overflow_esn, }
};
#endif #endif
int xfrm_init_replay(struct xfrm_state *x) int xfrm_init_replay(struct xfrm_state *x)
...@@ -774,14 +778,11 @@ int xfrm_init_replay(struct xfrm_state *x) ...@@ -774,14 +778,11 @@ int xfrm_init_replay(struct xfrm_state *x)
if (x->props.flags & XFRM_STATE_ESN) { if (x->props.flags & XFRM_STATE_ESN) {
if (replay_esn->replay_window == 0) if (replay_esn->replay_window == 0)
return -EINVAL; return -EINVAL;
x->repl = &xfrm_replay_esn;
x->repl_mode = XFRM_REPLAY_MODE_ESN; x->repl_mode = XFRM_REPLAY_MODE_ESN;
} else { } else {
x->repl = &xfrm_replay_bmp;
x->repl_mode = XFRM_REPLAY_MODE_BMP; x->repl_mode = XFRM_REPLAY_MODE_BMP;
} }
} else { } else {
x->repl = &xfrm_replay_legacy;
x->repl_mode = XFRM_REPLAY_MODE_LEGACY; x->repl_mode = XFRM_REPLAY_MODE_LEGACY;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment