diff options
Diffstat (limited to 'net/xfrm/xfrm_state.c')
-rw-r--r-- | net/xfrm/xfrm_state.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 9f63edd39346..f927b7330f02 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -70,7 +70,7 @@ static inline unsigned int xfrm_src_hash(xfrm_address_t *addr, | |||
70 | } | 70 | } |
71 | 71 | ||
72 | static inline unsigned int | 72 | static inline unsigned int |
73 | xfrm_spi_hash(xfrm_address_t *daddr, u32 spi, u8 proto, unsigned short family) | 73 | xfrm_spi_hash(xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family) |
74 | { | 74 | { |
75 | return __xfrm_spi_hash(daddr, spi, proto, family, xfrm_state_hmask); | 75 | return __xfrm_spi_hash(daddr, spi, proto, family, xfrm_state_hmask); |
76 | } | 76 | } |
@@ -96,9 +96,12 @@ static void xfrm_hash_transfer(struct hlist_head *list, | |||
96 | nhashmask); | 96 | nhashmask); |
97 | hlist_add_head(&x->bysrc, nsrctable+h); | 97 | hlist_add_head(&x->bysrc, nsrctable+h); |
98 | 98 | ||
99 | h = __xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, | 99 | if (x->id.spi) { |
100 | x->props.family, nhashmask); | 100 | h = __xfrm_spi_hash(&x->id.daddr, x->id.spi, |
101 | hlist_add_head(&x->byspi, nspitable+h); | 101 | x->id.proto, x->props.family, |
102 | nhashmask); | ||
103 | hlist_add_head(&x->byspi, nspitable+h); | ||
104 | } | ||
102 | } | 105 | } |
103 | } | 106 | } |
104 | 107 | ||
@@ -421,7 +424,7 @@ xfrm_init_tempsel(struct xfrm_state *x, struct flowi *fl, | |||
421 | return 0; | 424 | return 0; |
422 | } | 425 | } |
423 | 426 | ||
424 | static struct xfrm_state *__xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto, unsigned short family) | 427 | static struct xfrm_state *__xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family) |
425 | { | 428 | { |
426 | unsigned int h = xfrm_spi_hash(daddr, spi, proto, family); | 429 | unsigned int h = xfrm_spi_hash(daddr, spi, proto, family); |
427 | struct xfrm_state *x; | 430 | struct xfrm_state *x; |
@@ -622,7 +625,7 @@ static void __xfrm_state_insert(struct xfrm_state *x) | |||
622 | h = xfrm_src_hash(&x->props.saddr, x->props.family); | 625 | h = xfrm_src_hash(&x->props.saddr, x->props.family); |
623 | hlist_add_head(&x->bysrc, xfrm_state_bysrc+h); | 626 | hlist_add_head(&x->bysrc, xfrm_state_bysrc+h); |
624 | 627 | ||
625 | if (xfrm_id_proto_match(x->id.proto, IPSEC_PROTO_ANY)) { | 628 | if (x->id.spi) { |
626 | h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, | 629 | h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, |
627 | x->props.family); | 630 | x->props.family); |
628 | 631 | ||
@@ -916,7 +919,7 @@ err: | |||
916 | EXPORT_SYMBOL(xfrm_state_check); | 919 | EXPORT_SYMBOL(xfrm_state_check); |
917 | 920 | ||
918 | struct xfrm_state * | 921 | struct xfrm_state * |
919 | xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto, | 922 | xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, u8 proto, |
920 | unsigned short family) | 923 | unsigned short family) |
921 | { | 924 | { |
922 | struct xfrm_state *x; | 925 | struct xfrm_state *x; |
@@ -1040,7 +1043,7 @@ u32 xfrm_get_acqseq(void) | |||
1040 | EXPORT_SYMBOL(xfrm_get_acqseq); | 1043 | EXPORT_SYMBOL(xfrm_get_acqseq); |
1041 | 1044 | ||
1042 | void | 1045 | void |
1043 | xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi) | 1046 | xfrm_alloc_spi(struct xfrm_state *x, __be32 minspi, __be32 maxspi) |
1044 | { | 1047 | { |
1045 | unsigned int h; | 1048 | unsigned int h; |
1046 | struct xfrm_state *x0; | 1049 | struct xfrm_state *x0; |
@@ -1057,10 +1060,10 @@ xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi) | |||
1057 | x->id.spi = minspi; | 1060 | x->id.spi = minspi; |
1058 | } else { | 1061 | } else { |
1059 | u32 spi = 0; | 1062 | u32 spi = 0; |
1060 | minspi = ntohl(minspi); | 1063 | u32 low = ntohl(minspi); |
1061 | maxspi = ntohl(maxspi); | 1064 | u32 high = ntohl(maxspi); |
1062 | for (h=0; h<maxspi-minspi+1; h++) { | 1065 | for (h=0; h<high-low+1; h++) { |
1063 | spi = minspi + net_random()%(maxspi-minspi+1); | 1066 | spi = low + net_random()%(high-low+1); |
1064 | x0 = xfrm_state_lookup(&x->id.daddr, htonl(spi), x->id.proto, x->props.family); | 1067 | x0 = xfrm_state_lookup(&x->id.daddr, htonl(spi), x->id.proto, x->props.family); |
1065 | if (x0 == NULL) { | 1068 | if (x0 == NULL) { |
1066 | x->id.spi = htonl(spi); | 1069 | x->id.spi = htonl(spi); |
@@ -1180,11 +1183,10 @@ static void xfrm_replay_timer_handler(unsigned long data) | |||
1180 | spin_unlock(&x->lock); | 1183 | spin_unlock(&x->lock); |
1181 | } | 1184 | } |
1182 | 1185 | ||
1183 | int xfrm_replay_check(struct xfrm_state *x, u32 seq) | 1186 | int xfrm_replay_check(struct xfrm_state *x, __be32 net_seq) |
1184 | { | 1187 | { |
1185 | u32 diff; | 1188 | u32 diff; |
1186 | 1189 | u32 seq = ntohl(net_seq); | |
1187 | seq = ntohl(seq); | ||
1188 | 1190 | ||
1189 | if (unlikely(seq == 0)) | 1191 | if (unlikely(seq == 0)) |
1190 | return -EINVAL; | 1192 | return -EINVAL; |
@@ -1206,11 +1208,10 @@ int xfrm_replay_check(struct xfrm_state *x, u32 seq) | |||
1206 | } | 1208 | } |
1207 | EXPORT_SYMBOL(xfrm_replay_check); | 1209 | EXPORT_SYMBOL(xfrm_replay_check); |
1208 | 1210 | ||
1209 | void xfrm_replay_advance(struct xfrm_state *x, u32 seq) | 1211 | void xfrm_replay_advance(struct xfrm_state *x, __be32 net_seq) |
1210 | { | 1212 | { |
1211 | u32 diff; | 1213 | u32 diff; |
1212 | 1214 | u32 seq = ntohl(net_seq); | |
1213 | seq = ntohl(seq); | ||
1214 | 1215 | ||
1215 | if (seq > x->replay.seq) { | 1216 | if (seq > x->replay.seq) { |
1216 | diff = seq - x->replay.seq; | 1217 | diff = seq - x->replay.seq; |