Commit 25cfb8bc authored by Florian Westphal's avatar Florian Westphal Committed by Steffen Klassert
Browse files

xfrm: replay: remove recheck indirection



Adds new xfrm_replay_recheck() helper and calls it from
xfrm input path instead of the indirection.

Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent c7f87783
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -309,9 +309,6 @@ struct xfrm_replay {
	int	(*check)(struct xfrm_state *x,
			 struct sk_buff *skb,
			 __be32 net_seq);
	int	(*recheck)(struct xfrm_state *x,
			   struct sk_buff *skb,
			   __be32 net_seq);
	int	(*overflow)(struct xfrm_state *x, struct sk_buff *skb);
};

@@ -1723,6 +1720,7 @@ static inline int xfrm_policy_id2dir(u32 index)
#ifdef CONFIG_XFRM
void xfrm_replay_advance(struct xfrm_state *x, __be32 net_seq);
void xfrm_replay_notify(struct xfrm_state *x, int event);
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)
{
+1 −1
Original line number Diff line number Diff line
@@ -660,7 +660,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
		/* only the first xfrm gets the encap type */
		encap_type = 0;

		if (x->repl->recheck(x, skb, seq)) {
		if (xfrm_replay_recheck(x, skb, seq)) {
			XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR);
			goto drop_unlock;
		}
+16 −6
Original line number Diff line number Diff line
@@ -519,6 +519,22 @@ static int xfrm_replay_recheck_esn(struct xfrm_state *x,
	return xfrm_replay_check_esn(x, skb, net_seq);
}

int xfrm_replay_recheck(struct xfrm_state *x,
			struct sk_buff *skb, __be32 net_seq)
{
	switch (x->repl_mode) {
	case XFRM_REPLAY_MODE_LEGACY:
		break;
	case XFRM_REPLAY_MODE_BMP:
		/* no special recheck treatment */
		return xfrm_replay_check_bmp(x, skb, net_seq);
	case XFRM_REPLAY_MODE_ESN:
		return xfrm_replay_recheck_esn(x, skb, net_seq);
	}

	return xfrm_replay_check(x, skb, net_seq);
}

static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq)
{
	unsigned int bitnr, nr, i;
@@ -708,37 +724,31 @@ static int xfrm_replay_overflow_offload_esn(struct xfrm_state *x, struct sk_buff

static const struct xfrm_replay xfrm_replay_legacy = {
	.check		= xfrm_replay_check,
	.recheck	= xfrm_replay_check,
	.overflow	= xfrm_replay_overflow_offload,
};

static const struct xfrm_replay xfrm_replay_bmp = {
	.check		= xfrm_replay_check_bmp,
	.recheck	= xfrm_replay_check_bmp,
	.overflow	= xfrm_replay_overflow_offload_bmp,
};

static const struct xfrm_replay xfrm_replay_esn = {
	.check		= xfrm_replay_check_esn,
	.recheck	= xfrm_replay_recheck_esn,
	.overflow	= xfrm_replay_overflow_offload_esn,
};
#else
static const struct xfrm_replay xfrm_replay_legacy = {
	.check		= xfrm_replay_check,
	.recheck	= xfrm_replay_check,
	.overflow	= xfrm_replay_overflow,
};

static const struct xfrm_replay xfrm_replay_bmp = {
	.check		= xfrm_replay_check_bmp,
	.recheck	= xfrm_replay_check_bmp,
	.overflow	= xfrm_replay_overflow_bmp,
};

static const struct xfrm_replay xfrm_replay_esn = {
	.check		= xfrm_replay_check_esn,
	.recheck	= xfrm_replay_recheck_esn,
	.overflow	= xfrm_replay_overflow_esn,
};
#endif