diff options
Diffstat (limited to 'net/xfrm/xfrm_input.c')
-rw-r--r-- | net/xfrm/xfrm_input.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c index 45f1c98d4fce..872065ca7f8c 100644 --- a/net/xfrm/xfrm_input.c +++ b/net/xfrm/xfrm_input.c | |||
@@ -107,6 +107,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) | |||
107 | struct net *net = dev_net(skb->dev); | 107 | struct net *net = dev_net(skb->dev); |
108 | int err; | 108 | int err; |
109 | __be32 seq; | 109 | __be32 seq; |
110 | __be32 seq_hi; | ||
110 | struct xfrm_state *x; | 111 | struct xfrm_state *x; |
111 | xfrm_address_t *daddr; | 112 | xfrm_address_t *daddr; |
112 | struct xfrm_mode *inner_mode; | 113 | struct xfrm_mode *inner_mode; |
@@ -118,7 +119,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) | |||
118 | if (encap_type < 0) { | 119 | if (encap_type < 0) { |
119 | async = 1; | 120 | async = 1; |
120 | x = xfrm_input_state(skb); | 121 | x = xfrm_input_state(skb); |
121 | seq = XFRM_SKB_CB(skb)->seq.input; | 122 | seq = XFRM_SKB_CB(skb)->seq.input.low; |
122 | goto resume; | 123 | goto resume; |
123 | } | 124 | } |
124 | 125 | ||
@@ -172,7 +173,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) | |||
172 | goto drop_unlock; | 173 | goto drop_unlock; |
173 | } | 174 | } |
174 | 175 | ||
175 | if (x->props.replay_window && xfrm_replay_check(x, skb, seq)) { | 176 | if (x->props.replay_window && x->repl->check(x, skb, seq)) { |
176 | XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR); | 177 | XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR); |
177 | goto drop_unlock; | 178 | goto drop_unlock; |
178 | } | 179 | } |
@@ -184,7 +185,10 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) | |||
184 | 185 | ||
185 | spin_unlock(&x->lock); | 186 | spin_unlock(&x->lock); |
186 | 187 | ||
187 | XFRM_SKB_CB(skb)->seq.input = seq; | 188 | seq_hi = htonl(xfrm_replay_seqhi(x, seq)); |
189 | |||
190 | XFRM_SKB_CB(skb)->seq.input.low = seq; | ||
191 | XFRM_SKB_CB(skb)->seq.input.hi = seq_hi; | ||
188 | 192 | ||
189 | nexthdr = x->type->input(x, skb); | 193 | nexthdr = x->type->input(x, skb); |
190 | 194 | ||
@@ -206,8 +210,7 @@ resume: | |||
206 | /* only the first xfrm gets the encap type */ | 210 | /* only the first xfrm gets the encap type */ |
207 | encap_type = 0; | 211 | encap_type = 0; |
208 | 212 | ||
209 | if (x->props.replay_window) | 213 | x->repl->advance(x, seq); |
210 | xfrm_replay_advance(x, seq); | ||
211 | 214 | ||
212 | x->curlft.bytes += skb->len; | 215 | x->curlft.bytes += skb->len; |
213 | x->curlft.packets++; | 216 | x->curlft.packets++; |