diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/Kconfig | 1 | ||||
-rw-r--r-- | net/ipv4/ah4.c | 36 | ||||
-rw-r--r-- | net/ipv4/esp4.c | 85 | ||||
-rw-r--r-- | net/ipv4/fib_trie.c | 8 | ||||
-rw-r--r-- | net/ipv4/ipcomp.c | 25 | ||||
-rw-r--r-- | net/ipv4/ipvs/ip_vs_ftp.c | 27 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp_lp.c | 35 |
8 files changed, 127 insertions, 92 deletions
diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig index 8514106761b0..3b5d504a74be 100644 --- a/net/ipv4/Kconfig +++ b/net/ipv4/Kconfig | |||
@@ -386,6 +386,7 @@ config INET_ESP | |||
386 | select CRYPTO | 386 | select CRYPTO |
387 | select CRYPTO_HMAC | 387 | select CRYPTO_HMAC |
388 | select CRYPTO_MD5 | 388 | select CRYPTO_MD5 |
389 | select CRYPTO_CBC | ||
389 | select CRYPTO_SHA1 | 390 | select CRYPTO_SHA1 |
390 | select CRYPTO_DES | 391 | select CRYPTO_DES |
391 | ---help--- | 392 | ---help--- |
diff --git a/net/ipv4/ah4.c b/net/ipv4/ah4.c index 1366bc6ce6a5..2b98943e6b02 100644 --- a/net/ipv4/ah4.c +++ b/net/ipv4/ah4.c | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <linux/err.h> | ||
1 | #include <linux/module.h> | 2 | #include <linux/module.h> |
2 | #include <net/ip.h> | 3 | #include <net/ip.h> |
3 | #include <net/xfrm.h> | 4 | #include <net/xfrm.h> |
@@ -97,7 +98,10 @@ static int ah_output(struct xfrm_state *x, struct sk_buff *skb) | |||
97 | ah->spi = x->id.spi; | 98 | ah->spi = x->id.spi; |
98 | ah->seq_no = htonl(++x->replay.oseq); | 99 | ah->seq_no = htonl(++x->replay.oseq); |
99 | xfrm_aevent_doreplay(x); | 100 | xfrm_aevent_doreplay(x); |
100 | ahp->icv(ahp, skb, ah->auth_data); | 101 | err = ah_mac_digest(ahp, skb, ah->auth_data); |
102 | if (err) | ||
103 | goto error; | ||
104 | memcpy(ah->auth_data, ahp->work_icv, ahp->icv_trunc_len); | ||
101 | 105 | ||
102 | top_iph->tos = iph->tos; | 106 | top_iph->tos = iph->tos; |
103 | top_iph->ttl = iph->ttl; | 107 | top_iph->ttl = iph->ttl; |
@@ -119,6 +123,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) | |||
119 | { | 123 | { |
120 | int ah_hlen; | 124 | int ah_hlen; |
121 | int ihl; | 125 | int ihl; |
126 | int err = -EINVAL; | ||
122 | struct iphdr *iph; | 127 | struct iphdr *iph; |
123 | struct ip_auth_hdr *ah; | 128 | struct ip_auth_hdr *ah; |
124 | struct ah_data *ahp; | 129 | struct ah_data *ahp; |
@@ -166,8 +171,11 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) | |||
166 | 171 | ||
167 | memcpy(auth_data, ah->auth_data, ahp->icv_trunc_len); | 172 | memcpy(auth_data, ah->auth_data, ahp->icv_trunc_len); |
168 | skb_push(skb, ihl); | 173 | skb_push(skb, ihl); |
169 | ahp->icv(ahp, skb, ah->auth_data); | 174 | err = ah_mac_digest(ahp, skb, ah->auth_data); |
170 | if (memcmp(ah->auth_data, auth_data, ahp->icv_trunc_len)) { | 175 | if (err) |
176 | goto out; | ||
177 | err = -EINVAL; | ||
178 | if (memcmp(ahp->work_icv, auth_data, ahp->icv_trunc_len)) { | ||
171 | x->stats.integrity_failed++; | 179 | x->stats.integrity_failed++; |
172 | goto out; | 180 | goto out; |
173 | } | 181 | } |
@@ -179,7 +187,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) | |||
179 | return 0; | 187 | return 0; |
180 | 188 | ||
181 | out: | 189 | out: |
182 | return -EINVAL; | 190 | return err; |
183 | } | 191 | } |
184 | 192 | ||
185 | static void ah4_err(struct sk_buff *skb, u32 info) | 193 | static void ah4_err(struct sk_buff *skb, u32 info) |
@@ -204,6 +212,7 @@ static int ah_init_state(struct xfrm_state *x) | |||
204 | { | 212 | { |
205 | struct ah_data *ahp = NULL; | 213 | struct ah_data *ahp = NULL; |
206 | struct xfrm_algo_desc *aalg_desc; | 214 | struct xfrm_algo_desc *aalg_desc; |
215 | struct crypto_hash *tfm; | ||
207 | 216 | ||
208 | if (!x->aalg) | 217 | if (!x->aalg) |
209 | goto error; | 218 | goto error; |
@@ -221,24 +230,27 @@ static int ah_init_state(struct xfrm_state *x) | |||
221 | 230 | ||
222 | ahp->key = x->aalg->alg_key; | 231 | ahp->key = x->aalg->alg_key; |
223 | ahp->key_len = (x->aalg->alg_key_len+7)/8; | 232 | ahp->key_len = (x->aalg->alg_key_len+7)/8; |
224 | ahp->tfm = crypto_alloc_tfm(x->aalg->alg_name, 0); | 233 | tfm = crypto_alloc_hash(x->aalg->alg_name, 0, CRYPTO_ALG_ASYNC); |
225 | if (!ahp->tfm) | 234 | if (IS_ERR(tfm)) |
235 | goto error; | ||
236 | |||
237 | ahp->tfm = tfm; | ||
238 | if (crypto_hash_setkey(tfm, ahp->key, ahp->key_len)) | ||
226 | goto error; | 239 | goto error; |
227 | ahp->icv = ah_hmac_digest; | ||
228 | 240 | ||
229 | /* | 241 | /* |
230 | * Lookup the algorithm description maintained by xfrm_algo, | 242 | * Lookup the algorithm description maintained by xfrm_algo, |
231 | * verify crypto transform properties, and store information | 243 | * verify crypto transform properties, and store information |
232 | * we need for AH processing. This lookup cannot fail here | 244 | * we need for AH processing. This lookup cannot fail here |
233 | * after a successful crypto_alloc_tfm(). | 245 | * after a successful crypto_alloc_hash(). |
234 | */ | 246 | */ |
235 | aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0); | 247 | aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0); |
236 | BUG_ON(!aalg_desc); | 248 | BUG_ON(!aalg_desc); |
237 | 249 | ||
238 | if (aalg_desc->uinfo.auth.icv_fullbits/8 != | 250 | if (aalg_desc->uinfo.auth.icv_fullbits/8 != |
239 | crypto_tfm_alg_digestsize(ahp->tfm)) { | 251 | crypto_hash_digestsize(tfm)) { |
240 | printk(KERN_INFO "AH: %s digestsize %u != %hu\n", | 252 | printk(KERN_INFO "AH: %s digestsize %u != %hu\n", |
241 | x->aalg->alg_name, crypto_tfm_alg_digestsize(ahp->tfm), | 253 | x->aalg->alg_name, crypto_hash_digestsize(tfm), |
242 | aalg_desc->uinfo.auth.icv_fullbits/8); | 254 | aalg_desc->uinfo.auth.icv_fullbits/8); |
243 | goto error; | 255 | goto error; |
244 | } | 256 | } |
@@ -262,7 +274,7 @@ static int ah_init_state(struct xfrm_state *x) | |||
262 | error: | 274 | error: |
263 | if (ahp) { | 275 | if (ahp) { |
264 | kfree(ahp->work_icv); | 276 | kfree(ahp->work_icv); |
265 | crypto_free_tfm(ahp->tfm); | 277 | crypto_free_hash(ahp->tfm); |
266 | kfree(ahp); | 278 | kfree(ahp); |
267 | } | 279 | } |
268 | return -EINVAL; | 280 | return -EINVAL; |
@@ -277,7 +289,7 @@ static void ah_destroy(struct xfrm_state *x) | |||
277 | 289 | ||
278 | kfree(ahp->work_icv); | 290 | kfree(ahp->work_icv); |
279 | ahp->work_icv = NULL; | 291 | ahp->work_icv = NULL; |
280 | crypto_free_tfm(ahp->tfm); | 292 | crypto_free_hash(ahp->tfm); |
281 | ahp->tfm = NULL; | 293 | ahp->tfm = NULL; |
282 | kfree(ahp); | 294 | kfree(ahp); |
283 | } | 295 | } |
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index fc2f8ce441de..b428489f6ccd 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <linux/err.h> | ||
1 | #include <linux/module.h> | 2 | #include <linux/module.h> |
2 | #include <net/ip.h> | 3 | #include <net/ip.h> |
3 | #include <net/xfrm.h> | 4 | #include <net/xfrm.h> |
@@ -16,7 +17,8 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb) | |||
16 | int err; | 17 | int err; |
17 | struct iphdr *top_iph; | 18 | struct iphdr *top_iph; |
18 | struct ip_esp_hdr *esph; | 19 | struct ip_esp_hdr *esph; |
19 | struct crypto_tfm *tfm; | 20 | struct crypto_blkcipher *tfm; |
21 | struct blkcipher_desc desc; | ||
20 | struct esp_data *esp; | 22 | struct esp_data *esp; |
21 | struct sk_buff *trailer; | 23 | struct sk_buff *trailer; |
22 | int blksize; | 24 | int blksize; |
@@ -36,7 +38,9 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb) | |||
36 | esp = x->data; | 38 | esp = x->data; |
37 | alen = esp->auth.icv_trunc_len; | 39 | alen = esp->auth.icv_trunc_len; |
38 | tfm = esp->conf.tfm; | 40 | tfm = esp->conf.tfm; |
39 | blksize = ALIGN(crypto_tfm_alg_blocksize(tfm), 4); | 41 | desc.tfm = tfm; |
42 | desc.flags = 0; | ||
43 | blksize = ALIGN(crypto_blkcipher_blocksize(tfm), 4); | ||
40 | clen = ALIGN(clen + 2, blksize); | 44 | clen = ALIGN(clen + 2, blksize); |
41 | if (esp->conf.padlen) | 45 | if (esp->conf.padlen) |
42 | clen = ALIGN(clen, esp->conf.padlen); | 46 | clen = ALIGN(clen, esp->conf.padlen); |
@@ -92,7 +96,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb) | |||
92 | xfrm_aevent_doreplay(x); | 96 | xfrm_aevent_doreplay(x); |
93 | 97 | ||
94 | if (esp->conf.ivlen) | 98 | if (esp->conf.ivlen) |
95 | crypto_cipher_set_iv(tfm, esp->conf.ivec, crypto_tfm_alg_ivsize(tfm)); | 99 | crypto_blkcipher_set_iv(tfm, esp->conf.ivec, esp->conf.ivlen); |
96 | 100 | ||
97 | do { | 101 | do { |
98 | struct scatterlist *sg = &esp->sgbuf[0]; | 102 | struct scatterlist *sg = &esp->sgbuf[0]; |
@@ -103,26 +107,27 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb) | |||
103 | goto error; | 107 | goto error; |
104 | } | 108 | } |
105 | skb_to_sgvec(skb, sg, esph->enc_data+esp->conf.ivlen-skb->data, clen); | 109 | skb_to_sgvec(skb, sg, esph->enc_data+esp->conf.ivlen-skb->data, clen); |
106 | crypto_cipher_encrypt(tfm, sg, sg, clen); | 110 | err = crypto_blkcipher_encrypt(&desc, sg, sg, clen); |
107 | if (unlikely(sg != &esp->sgbuf[0])) | 111 | if (unlikely(sg != &esp->sgbuf[0])) |
108 | kfree(sg); | 112 | kfree(sg); |
109 | } while (0); | 113 | } while (0); |
110 | 114 | ||
115 | if (unlikely(err)) | ||
116 | goto error; | ||
117 | |||
111 | if (esp->conf.ivlen) { | 118 | if (esp->conf.ivlen) { |
112 | memcpy(esph->enc_data, esp->conf.ivec, crypto_tfm_alg_ivsize(tfm)); | 119 | memcpy(esph->enc_data, esp->conf.ivec, esp->conf.ivlen); |
113 | crypto_cipher_get_iv(tfm, esp->conf.ivec, crypto_tfm_alg_ivsize(tfm)); | 120 | crypto_blkcipher_get_iv(tfm, esp->conf.ivec, esp->conf.ivlen); |
114 | } | 121 | } |
115 | 122 | ||
116 | if (esp->auth.icv_full_len) { | 123 | if (esp->auth.icv_full_len) { |
117 | esp->auth.icv(esp, skb, (u8*)esph-skb->data, | 124 | err = esp_mac_digest(esp, skb, (u8 *)esph - skb->data, |
118 | sizeof(struct ip_esp_hdr) + esp->conf.ivlen+clen, trailer->tail); | 125 | sizeof(*esph) + esp->conf.ivlen + clen); |
119 | pskb_put(skb, trailer, alen); | 126 | memcpy(pskb_put(skb, trailer, alen), esp->auth.work_icv, alen); |
120 | } | 127 | } |
121 | 128 | ||
122 | ip_send_check(top_iph); | 129 | ip_send_check(top_iph); |
123 | 130 | ||
124 | err = 0; | ||
125 | |||
126 | error: | 131 | error: |
127 | return err; | 132 | return err; |
128 | } | 133 | } |
@@ -137,8 +142,10 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
137 | struct iphdr *iph; | 142 | struct iphdr *iph; |
138 | struct ip_esp_hdr *esph; | 143 | struct ip_esp_hdr *esph; |
139 | struct esp_data *esp = x->data; | 144 | struct esp_data *esp = x->data; |
145 | struct crypto_blkcipher *tfm = esp->conf.tfm; | ||
146 | struct blkcipher_desc desc = { .tfm = tfm }; | ||
140 | struct sk_buff *trailer; | 147 | struct sk_buff *trailer; |
141 | int blksize = ALIGN(crypto_tfm_alg_blocksize(esp->conf.tfm), 4); | 148 | int blksize = ALIGN(crypto_blkcipher_blocksize(tfm), 4); |
142 | int alen = esp->auth.icv_trunc_len; | 149 | int alen = esp->auth.icv_trunc_len; |
143 | int elen = skb->len - sizeof(struct ip_esp_hdr) - esp->conf.ivlen - alen; | 150 | int elen = skb->len - sizeof(struct ip_esp_hdr) - esp->conf.ivlen - alen; |
144 | int nfrags; | 151 | int nfrags; |
@@ -146,6 +153,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
146 | u8 nexthdr[2]; | 153 | u8 nexthdr[2]; |
147 | struct scatterlist *sg; | 154 | struct scatterlist *sg; |
148 | int padlen; | 155 | int padlen; |
156 | int err; | ||
149 | 157 | ||
150 | if (!pskb_may_pull(skb, sizeof(struct ip_esp_hdr))) | 158 | if (!pskb_may_pull(skb, sizeof(struct ip_esp_hdr))) |
151 | goto out; | 159 | goto out; |
@@ -155,15 +163,16 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
155 | 163 | ||
156 | /* If integrity check is required, do this. */ | 164 | /* If integrity check is required, do this. */ |
157 | if (esp->auth.icv_full_len) { | 165 | if (esp->auth.icv_full_len) { |
158 | u8 sum[esp->auth.icv_full_len]; | 166 | u8 sum[alen]; |
159 | u8 sum1[alen]; | ||
160 | |||
161 | esp->auth.icv(esp, skb, 0, skb->len-alen, sum); | ||
162 | 167 | ||
163 | if (skb_copy_bits(skb, skb->len-alen, sum1, alen)) | 168 | err = esp_mac_digest(esp, skb, 0, skb->len - alen); |
169 | if (err) | ||
170 | goto out; | ||
171 | |||
172 | if (skb_copy_bits(skb, skb->len - alen, sum, alen)) | ||
164 | BUG(); | 173 | BUG(); |
165 | 174 | ||
166 | if (unlikely(memcmp(sum, sum1, alen))) { | 175 | if (unlikely(memcmp(esp->auth.work_icv, sum, alen))) { |
167 | x->stats.integrity_failed++; | 176 | x->stats.integrity_failed++; |
168 | goto out; | 177 | goto out; |
169 | } | 178 | } |
@@ -178,7 +187,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
178 | 187 | ||
179 | /* Get ivec. This can be wrong, check against another impls. */ | 188 | /* Get ivec. This can be wrong, check against another impls. */ |
180 | if (esp->conf.ivlen) | 189 | if (esp->conf.ivlen) |
181 | crypto_cipher_set_iv(esp->conf.tfm, esph->enc_data, crypto_tfm_alg_ivsize(esp->conf.tfm)); | 190 | crypto_blkcipher_set_iv(tfm, esph->enc_data, esp->conf.ivlen); |
182 | 191 | ||
183 | sg = &esp->sgbuf[0]; | 192 | sg = &esp->sgbuf[0]; |
184 | 193 | ||
@@ -188,9 +197,11 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
188 | goto out; | 197 | goto out; |
189 | } | 198 | } |
190 | skb_to_sgvec(skb, sg, sizeof(struct ip_esp_hdr) + esp->conf.ivlen, elen); | 199 | skb_to_sgvec(skb, sg, sizeof(struct ip_esp_hdr) + esp->conf.ivlen, elen); |
191 | crypto_cipher_decrypt(esp->conf.tfm, sg, sg, elen); | 200 | err = crypto_blkcipher_decrypt(&desc, sg, sg, elen); |
192 | if (unlikely(sg != &esp->sgbuf[0])) | 201 | if (unlikely(sg != &esp->sgbuf[0])) |
193 | kfree(sg); | 202 | kfree(sg); |
203 | if (unlikely(err)) | ||
204 | return err; | ||
194 | 205 | ||
195 | if (skb_copy_bits(skb, skb->len-alen-2, nexthdr, 2)) | 206 | if (skb_copy_bits(skb, skb->len-alen-2, nexthdr, 2)) |
196 | BUG(); | 207 | BUG(); |
@@ -254,7 +265,7 @@ out: | |||
254 | static u32 esp4_get_max_size(struct xfrm_state *x, int mtu) | 265 | static u32 esp4_get_max_size(struct xfrm_state *x, int mtu) |
255 | { | 266 | { |
256 | struct esp_data *esp = x->data; | 267 | struct esp_data *esp = x->data; |
257 | u32 blksize = ALIGN(crypto_tfm_alg_blocksize(esp->conf.tfm), 4); | 268 | u32 blksize = ALIGN(crypto_blkcipher_blocksize(esp->conf.tfm), 4); |
258 | 269 | ||
259 | if (x->props.mode) { | 270 | if (x->props.mode) { |
260 | mtu = ALIGN(mtu + 2, blksize); | 271 | mtu = ALIGN(mtu + 2, blksize); |
@@ -293,11 +304,11 @@ static void esp_destroy(struct xfrm_state *x) | |||
293 | if (!esp) | 304 | if (!esp) |
294 | return; | 305 | return; |
295 | 306 | ||
296 | crypto_free_tfm(esp->conf.tfm); | 307 | crypto_free_blkcipher(esp->conf.tfm); |
297 | esp->conf.tfm = NULL; | 308 | esp->conf.tfm = NULL; |
298 | kfree(esp->conf.ivec); | 309 | kfree(esp->conf.ivec); |
299 | esp->conf.ivec = NULL; | 310 | esp->conf.ivec = NULL; |
300 | crypto_free_tfm(esp->auth.tfm); | 311 | crypto_free_hash(esp->auth.tfm); |
301 | esp->auth.tfm = NULL; | 312 | esp->auth.tfm = NULL; |
302 | kfree(esp->auth.work_icv); | 313 | kfree(esp->auth.work_icv); |
303 | esp->auth.work_icv = NULL; | 314 | esp->auth.work_icv = NULL; |
@@ -307,6 +318,7 @@ static void esp_destroy(struct xfrm_state *x) | |||
307 | static int esp_init_state(struct xfrm_state *x) | 318 | static int esp_init_state(struct xfrm_state *x) |
308 | { | 319 | { |
309 | struct esp_data *esp = NULL; | 320 | struct esp_data *esp = NULL; |
321 | struct crypto_blkcipher *tfm; | ||
310 | 322 | ||
311 | /* null auth and encryption can have zero length keys */ | 323 | /* null auth and encryption can have zero length keys */ |
312 | if (x->aalg) { | 324 | if (x->aalg) { |
@@ -322,22 +334,27 @@ static int esp_init_state(struct xfrm_state *x) | |||
322 | 334 | ||
323 | if (x->aalg) { | 335 | if (x->aalg) { |
324 | struct xfrm_algo_desc *aalg_desc; | 336 | struct xfrm_algo_desc *aalg_desc; |
337 | struct crypto_hash *hash; | ||
325 | 338 | ||
326 | esp->auth.key = x->aalg->alg_key; | 339 | esp->auth.key = x->aalg->alg_key; |
327 | esp->auth.key_len = (x->aalg->alg_key_len+7)/8; | 340 | esp->auth.key_len = (x->aalg->alg_key_len+7)/8; |
328 | esp->auth.tfm = crypto_alloc_tfm(x->aalg->alg_name, 0); | 341 | hash = crypto_alloc_hash(x->aalg->alg_name, 0, |
329 | if (esp->auth.tfm == NULL) | 342 | CRYPTO_ALG_ASYNC); |
343 | if (IS_ERR(hash)) | ||
344 | goto error; | ||
345 | |||
346 | esp->auth.tfm = hash; | ||
347 | if (crypto_hash_setkey(hash, esp->auth.key, esp->auth.key_len)) | ||
330 | goto error; | 348 | goto error; |
331 | esp->auth.icv = esp_hmac_digest; | ||
332 | 349 | ||
333 | aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0); | 350 | aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0); |
334 | BUG_ON(!aalg_desc); | 351 | BUG_ON(!aalg_desc); |
335 | 352 | ||
336 | if (aalg_desc->uinfo.auth.icv_fullbits/8 != | 353 | if (aalg_desc->uinfo.auth.icv_fullbits/8 != |
337 | crypto_tfm_alg_digestsize(esp->auth.tfm)) { | 354 | crypto_hash_digestsize(hash)) { |
338 | NETDEBUG(KERN_INFO "ESP: %s digestsize %u != %hu\n", | 355 | NETDEBUG(KERN_INFO "ESP: %s digestsize %u != %hu\n", |
339 | x->aalg->alg_name, | 356 | x->aalg->alg_name, |
340 | crypto_tfm_alg_digestsize(esp->auth.tfm), | 357 | crypto_hash_digestsize(hash), |
341 | aalg_desc->uinfo.auth.icv_fullbits/8); | 358 | aalg_desc->uinfo.auth.icv_fullbits/8); |
342 | goto error; | 359 | goto error; |
343 | } | 360 | } |
@@ -351,13 +368,11 @@ static int esp_init_state(struct xfrm_state *x) | |||
351 | } | 368 | } |
352 | esp->conf.key = x->ealg->alg_key; | 369 | esp->conf.key = x->ealg->alg_key; |
353 | esp->conf.key_len = (x->ealg->alg_key_len+7)/8; | 370 | esp->conf.key_len = (x->ealg->alg_key_len+7)/8; |
354 | if (x->props.ealgo == SADB_EALG_NULL) | 371 | tfm = crypto_alloc_blkcipher(x->ealg->alg_name, 0, CRYPTO_ALG_ASYNC); |
355 | esp->conf.tfm = crypto_alloc_tfm(x->ealg->alg_name, CRYPTO_TFM_MODE_ECB); | 372 | if (IS_ERR(tfm)) |
356 | else | ||
357 | esp->conf.tfm = crypto_alloc_tfm(x->ealg->alg_name, CRYPTO_TFM_MODE_CBC); | ||
358 | if (esp->conf.tfm == NULL) | ||
359 | goto error; | 373 | goto error; |
360 | esp->conf.ivlen = crypto_tfm_alg_ivsize(esp->conf.tfm); | 374 | esp->conf.tfm = tfm; |
375 | esp->conf.ivlen = crypto_blkcipher_ivsize(tfm); | ||
361 | esp->conf.padlen = 0; | 376 | esp->conf.padlen = 0; |
362 | if (esp->conf.ivlen) { | 377 | if (esp->conf.ivlen) { |
363 | esp->conf.ivec = kmalloc(esp->conf.ivlen, GFP_KERNEL); | 378 | esp->conf.ivec = kmalloc(esp->conf.ivlen, GFP_KERNEL); |
@@ -365,7 +380,7 @@ static int esp_init_state(struct xfrm_state *x) | |||
365 | goto error; | 380 | goto error; |
366 | get_random_bytes(esp->conf.ivec, esp->conf.ivlen); | 381 | get_random_bytes(esp->conf.ivec, esp->conf.ivlen); |
367 | } | 382 | } |
368 | if (crypto_cipher_setkey(esp->conf.tfm, esp->conf.key, esp->conf.key_len)) | 383 | if (crypto_blkcipher_setkey(tfm, esp->conf.key, esp->conf.key_len)) |
369 | goto error; | 384 | goto error; |
370 | x->props.header_len = sizeof(struct ip_esp_hdr) + esp->conf.ivlen; | 385 | x->props.header_len = sizeof(struct ip_esp_hdr) + esp->conf.ivlen; |
371 | if (x->props.mode) | 386 | if (x->props.mode) |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 23fb9d9768e3..01801c0f885d 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -1281,18 +1281,18 @@ static inline int check_leaf(struct trie *t, struct leaf *l, | |||
1281 | struct fib_result *res) | 1281 | struct fib_result *res) |
1282 | { | 1282 | { |
1283 | int err, i; | 1283 | int err, i; |
1284 | t_key mask; | 1284 | __be32 mask; |
1285 | struct leaf_info *li; | 1285 | struct leaf_info *li; |
1286 | struct hlist_head *hhead = &l->list; | 1286 | struct hlist_head *hhead = &l->list; |
1287 | struct hlist_node *node; | 1287 | struct hlist_node *node; |
1288 | 1288 | ||
1289 | hlist_for_each_entry_rcu(li, node, hhead, hlist) { | 1289 | hlist_for_each_entry_rcu(li, node, hhead, hlist) { |
1290 | i = li->plen; | 1290 | i = li->plen; |
1291 | mask = ntohl(inet_make_mask(i)); | 1291 | mask = inet_make_mask(i); |
1292 | if (l->key != (key & mask)) | 1292 | if (l->key != (key & ntohl(mask))) |
1293 | continue; | 1293 | continue; |
1294 | 1294 | ||
1295 | if ((err = fib_semantic_match(&li->falh, flp, res, l->key, mask, i)) <= 0) { | 1295 | if ((err = fib_semantic_match(&li->falh, flp, res, htonl(l->key), mask, i)) <= 0) { |
1296 | *plen = i; | 1296 | *plen = i; |
1297 | #ifdef CONFIG_IP_FIB_TRIE_STATS | 1297 | #ifdef CONFIG_IP_FIB_TRIE_STATS |
1298 | t->stats.semantic_match_passed++; | 1298 | t->stats.semantic_match_passed++; |
diff --git a/net/ipv4/ipcomp.c b/net/ipv4/ipcomp.c index a0c28b2b756e..5bb9c9f03fb6 100644 --- a/net/ipv4/ipcomp.c +++ b/net/ipv4/ipcomp.c | |||
@@ -32,7 +32,7 @@ | |||
32 | 32 | ||
33 | struct ipcomp_tfms { | 33 | struct ipcomp_tfms { |
34 | struct list_head list; | 34 | struct list_head list; |
35 | struct crypto_tfm **tfms; | 35 | struct crypto_comp **tfms; |
36 | int users; | 36 | int users; |
37 | }; | 37 | }; |
38 | 38 | ||
@@ -46,7 +46,7 @@ static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb) | |||
46 | int err, plen, dlen; | 46 | int err, plen, dlen; |
47 | struct ipcomp_data *ipcd = x->data; | 47 | struct ipcomp_data *ipcd = x->data; |
48 | u8 *start, *scratch; | 48 | u8 *start, *scratch; |
49 | struct crypto_tfm *tfm; | 49 | struct crypto_comp *tfm; |
50 | int cpu; | 50 | int cpu; |
51 | 51 | ||
52 | plen = skb->len; | 52 | plen = skb->len; |
@@ -107,7 +107,7 @@ static int ipcomp_compress(struct xfrm_state *x, struct sk_buff *skb) | |||
107 | struct iphdr *iph = skb->nh.iph; | 107 | struct iphdr *iph = skb->nh.iph; |
108 | struct ipcomp_data *ipcd = x->data; | 108 | struct ipcomp_data *ipcd = x->data; |
109 | u8 *start, *scratch; | 109 | u8 *start, *scratch; |
110 | struct crypto_tfm *tfm; | 110 | struct crypto_comp *tfm; |
111 | int cpu; | 111 | int cpu; |
112 | 112 | ||
113 | ihlen = iph->ihl * 4; | 113 | ihlen = iph->ihl * 4; |
@@ -302,7 +302,7 @@ static void **ipcomp_alloc_scratches(void) | |||
302 | return scratches; | 302 | return scratches; |
303 | } | 303 | } |
304 | 304 | ||
305 | static void ipcomp_free_tfms(struct crypto_tfm **tfms) | 305 | static void ipcomp_free_tfms(struct crypto_comp **tfms) |
306 | { | 306 | { |
307 | struct ipcomp_tfms *pos; | 307 | struct ipcomp_tfms *pos; |
308 | int cpu; | 308 | int cpu; |
@@ -324,28 +324,28 @@ static void ipcomp_free_tfms(struct crypto_tfm **tfms) | |||
324 | return; | 324 | return; |
325 | 325 | ||
326 | for_each_possible_cpu(cpu) { | 326 | for_each_possible_cpu(cpu) { |
327 | struct crypto_tfm *tfm = *per_cpu_ptr(tfms, cpu); | 327 | struct crypto_comp *tfm = *per_cpu_ptr(tfms, cpu); |
328 | crypto_free_tfm(tfm); | 328 | crypto_free_comp(tfm); |
329 | } | 329 | } |
330 | free_percpu(tfms); | 330 | free_percpu(tfms); |
331 | } | 331 | } |
332 | 332 | ||
333 | static struct crypto_tfm **ipcomp_alloc_tfms(const char *alg_name) | 333 | static struct crypto_comp **ipcomp_alloc_tfms(const char *alg_name) |
334 | { | 334 | { |
335 | struct ipcomp_tfms *pos; | 335 | struct ipcomp_tfms *pos; |
336 | struct crypto_tfm **tfms; | 336 | struct crypto_comp **tfms; |
337 | int cpu; | 337 | int cpu; |
338 | 338 | ||
339 | /* This can be any valid CPU ID so we don't need locking. */ | 339 | /* This can be any valid CPU ID so we don't need locking. */ |
340 | cpu = raw_smp_processor_id(); | 340 | cpu = raw_smp_processor_id(); |
341 | 341 | ||
342 | list_for_each_entry(pos, &ipcomp_tfms_list, list) { | 342 | list_for_each_entry(pos, &ipcomp_tfms_list, list) { |
343 | struct crypto_tfm *tfm; | 343 | struct crypto_comp *tfm; |
344 | 344 | ||
345 | tfms = pos->tfms; | 345 | tfms = pos->tfms; |
346 | tfm = *per_cpu_ptr(tfms, cpu); | 346 | tfm = *per_cpu_ptr(tfms, cpu); |
347 | 347 | ||
348 | if (!strcmp(crypto_tfm_alg_name(tfm), alg_name)) { | 348 | if (!strcmp(crypto_comp_name(tfm), alg_name)) { |
349 | pos->users++; | 349 | pos->users++; |
350 | return tfms; | 350 | return tfms; |
351 | } | 351 | } |
@@ -359,12 +359,13 @@ static struct crypto_tfm **ipcomp_alloc_tfms(const char *alg_name) | |||
359 | INIT_LIST_HEAD(&pos->list); | 359 | INIT_LIST_HEAD(&pos->list); |
360 | list_add(&pos->list, &ipcomp_tfms_list); | 360 | list_add(&pos->list, &ipcomp_tfms_list); |
361 | 361 | ||
362 | pos->tfms = tfms = alloc_percpu(struct crypto_tfm *); | 362 | pos->tfms = tfms = alloc_percpu(struct crypto_comp *); |
363 | if (!tfms) | 363 | if (!tfms) |
364 | goto error; | 364 | goto error; |
365 | 365 | ||
366 | for_each_possible_cpu(cpu) { | 366 | for_each_possible_cpu(cpu) { |
367 | struct crypto_tfm *tfm = crypto_alloc_tfm(alg_name, 0); | 367 | struct crypto_comp *tfm = crypto_alloc_comp(alg_name, 0, |
368 | CRYPTO_ALG_ASYNC); | ||
368 | if (!tfm) | 369 | if (!tfm) |
369 | goto error; | 370 | goto error; |
370 | *per_cpu_ptr(tfms, cpu) = tfm; | 371 | *per_cpu_ptr(tfms, cpu) = tfm; |
diff --git a/net/ipv4/ipvs/ip_vs_ftp.c b/net/ipv4/ipvs/ip_vs_ftp.c index a19a33ceb811..37fafb1fbcff 100644 --- a/net/ipv4/ipvs/ip_vs_ftp.c +++ b/net/ipv4/ipvs/ip_vs_ftp.c | |||
@@ -46,14 +46,7 @@ | |||
46 | */ | 46 | */ |
47 | static int ports[IP_VS_APP_MAX_PORTS] = {21, 0}; | 47 | static int ports[IP_VS_APP_MAX_PORTS] = {21, 0}; |
48 | module_param_array(ports, int, NULL, 0); | 48 | module_param_array(ports, int, NULL, 0); |
49 | 49 | MODULE_PARM_DESC(ports, "Ports to monitor for FTP control commands"); | |
50 | /* | ||
51 | * Debug level | ||
52 | */ | ||
53 | #ifdef CONFIG_IP_VS_DEBUG | ||
54 | static int debug=0; | ||
55 | module_param(debug, int, 0); | ||
56 | #endif | ||
57 | 50 | ||
58 | 51 | ||
59 | /* Dummy variable */ | 52 | /* Dummy variable */ |
@@ -177,7 +170,7 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp, | |||
177 | &start, &end) != 1) | 170 | &start, &end) != 1) |
178 | return 1; | 171 | return 1; |
179 | 172 | ||
180 | IP_VS_DBG(1-debug, "PASV response (%u.%u.%u.%u:%d) -> " | 173 | IP_VS_DBG(7, "PASV response (%u.%u.%u.%u:%d) -> " |
181 | "%u.%u.%u.%u:%d detected\n", | 174 | "%u.%u.%u.%u:%d detected\n", |
182 | NIPQUAD(from), ntohs(port), NIPQUAD(cp->caddr), 0); | 175 | NIPQUAD(from), ntohs(port), NIPQUAD(cp->caddr), 0); |
183 | 176 | ||
@@ -280,7 +273,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, | |||
280 | while (data <= data_limit - 6) { | 273 | while (data <= data_limit - 6) { |
281 | if (strnicmp(data, "PASV\r\n", 6) == 0) { | 274 | if (strnicmp(data, "PASV\r\n", 6) == 0) { |
282 | /* Passive mode on */ | 275 | /* Passive mode on */ |
283 | IP_VS_DBG(1-debug, "got PASV at %zd of %zd\n", | 276 | IP_VS_DBG(7, "got PASV at %zd of %zd\n", |
284 | data - data_start, | 277 | data - data_start, |
285 | data_limit - data_start); | 278 | data_limit - data_start); |
286 | cp->app_data = &ip_vs_ftp_pasv; | 279 | cp->app_data = &ip_vs_ftp_pasv; |
@@ -302,7 +295,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, | |||
302 | &start, &end) != 1) | 295 | &start, &end) != 1) |
303 | return 1; | 296 | return 1; |
304 | 297 | ||
305 | IP_VS_DBG(1-debug, "PORT %u.%u.%u.%u:%d detected\n", | 298 | IP_VS_DBG(7, "PORT %u.%u.%u.%u:%d detected\n", |
306 | NIPQUAD(to), ntohs(port)); | 299 | NIPQUAD(to), ntohs(port)); |
307 | 300 | ||
308 | /* Passive mode off */ | 301 | /* Passive mode off */ |
@@ -311,7 +304,7 @@ static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, | |||
311 | /* | 304 | /* |
312 | * Now update or create a connection entry for it | 305 | * Now update or create a connection entry for it |
313 | */ | 306 | */ |
314 | IP_VS_DBG(1-debug, "protocol %s %u.%u.%u.%u:%d %u.%u.%u.%u:%d\n", | 307 | IP_VS_DBG(7, "protocol %s %u.%u.%u.%u:%d %u.%u.%u.%u:%d\n", |
315 | ip_vs_proto_name(iph->protocol), | 308 | ip_vs_proto_name(iph->protocol), |
316 | NIPQUAD(to), ntohs(port), NIPQUAD(cp->vaddr), 0); | 309 | NIPQUAD(to), ntohs(port), NIPQUAD(cp->vaddr), 0); |
317 | 310 | ||
@@ -372,11 +365,17 @@ static int __init ip_vs_ftp_init(void) | |||
372 | for (i=0; i<IP_VS_APP_MAX_PORTS; i++) { | 365 | for (i=0; i<IP_VS_APP_MAX_PORTS; i++) { |
373 | if (!ports[i]) | 366 | if (!ports[i]) |
374 | continue; | 367 | continue; |
368 | if (ports[i] < 0 || ports[i] > 0xffff) { | ||
369 | IP_VS_WARNING("ip_vs_ftp: Ignoring invalid " | ||
370 | "configuration port[%d] = %d\n", | ||
371 | i, ports[i]); | ||
372 | continue; | ||
373 | } | ||
375 | ret = register_ip_vs_app_inc(app, app->protocol, ports[i]); | 374 | ret = register_ip_vs_app_inc(app, app->protocol, ports[i]); |
376 | if (ret) | 375 | if (ret) |
377 | break; | 376 | break; |
378 | IP_VS_DBG(1-debug, "%s: loaded support on port[%d] = %d\n", | 377 | IP_VS_INFO("%s: loaded support on port[%d] = %d\n", |
379 | app->name, i, ports[i]); | 378 | app->name, i, ports[i]); |
380 | } | 379 | } |
381 | 380 | ||
382 | if (ret) | 381 | if (ret) |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 111ff39a08c5..159fa3f1ba67 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -89,7 +89,7 @@ int sysctl_tcp_frto; | |||
89 | int sysctl_tcp_nometrics_save; | 89 | int sysctl_tcp_nometrics_save; |
90 | 90 | ||
91 | int sysctl_tcp_moderate_rcvbuf = 1; | 91 | int sysctl_tcp_moderate_rcvbuf = 1; |
92 | int sysctl_tcp_abc = 1; | 92 | int sysctl_tcp_abc; |
93 | 93 | ||
94 | #define FLAG_DATA 0x01 /* Incoming frame contained data. */ | 94 | #define FLAG_DATA 0x01 /* Incoming frame contained data. */ |
95 | #define FLAG_WIN_UPDATE 0x02 /* Incoming ACK was a window update. */ | 95 | #define FLAG_WIN_UPDATE 0x02 /* Incoming ACK was a window update. */ |
diff --git a/net/ipv4/tcp_lp.c b/net/ipv4/tcp_lp.c index 1f977b6ee9a1..48f28d617ce6 100644 --- a/net/ipv4/tcp_lp.c +++ b/net/ipv4/tcp_lp.c | |||
@@ -3,13 +3,8 @@ | |||
3 | * | 3 | * |
4 | * TCP Low Priority is a distributed algorithm whose goal is to utilize only | 4 | * TCP Low Priority is a distributed algorithm whose goal is to utilize only |
5 | * the excess network bandwidth as compared to the ``fair share`` of | 5 | * the excess network bandwidth as compared to the ``fair share`` of |
6 | * bandwidth as targeted by TCP. Available from: | 6 | * bandwidth as targeted by TCP. |
7 | * http://www.ece.rice.edu/~akuzma/Doc/akuzma/TCP-LP.pdf | ||
8 | * | 7 | * |
9 | * Original Author: | ||
10 | * Aleksandar Kuzmanovic <akuzma@northwestern.edu> | ||
11 | * | ||
12 | * See http://www-ece.rice.edu/networks/TCP-LP/ for their implementation. | ||
13 | * As of 2.6.13, Linux supports pluggable congestion control algorithms. | 8 | * As of 2.6.13, Linux supports pluggable congestion control algorithms. |
14 | * Due to the limitation of the API, we take the following changes from | 9 | * Due to the limitation of the API, we take the following changes from |
15 | * the original TCP-LP implementation: | 10 | * the original TCP-LP implementation: |
@@ -24,11 +19,20 @@ | |||
24 | * o OWD is handled in relative format, where local time stamp will in | 19 | * o OWD is handled in relative format, where local time stamp will in |
25 | * tcp_time_stamp format. | 20 | * tcp_time_stamp format. |
26 | * | 21 | * |
27 | * Port from 2.4.19 to 2.6.16 as module by: | 22 | * Original Author: |
28 | * Wong Hoi Sing Edison <hswong3i@gmail.com> | 23 | * Aleksandar Kuzmanovic <akuzma@northwestern.edu> |
29 | * Hung Hing Lun <hlhung3i@gmail.com> | 24 | * Available from: |
25 | * http://www.ece.rice.edu/~akuzma/Doc/akuzma/TCP-LP.pdf | ||
26 | * Original implementation for 2.4.19: | ||
27 | * http://www-ece.rice.edu/networks/TCP-LP/ | ||
30 | * | 28 | * |
31 | * Version: $Id: tcp_lp.c,v 1.22 2006-05-02 18:18:19 hswong3i Exp $ | 29 | * 2.6.x module Authors: |
30 | * Wong Hoi Sing, Edison <hswong3i@gmail.com> | ||
31 | * Hung Hing Lun, Mike <hlhung3i@gmail.com> | ||
32 | * SourceForge project page: | ||
33 | * http://tcp-lp-mod.sourceforge.net/ | ||
34 | * | ||
35 | * Version: $Id: tcp_lp.c,v 1.24 2006/09/05 20:22:53 hswong3i Exp $ | ||
32 | */ | 36 | */ |
33 | 37 | ||
34 | #include <linux/config.h> | 38 | #include <linux/config.h> |
@@ -153,16 +157,19 @@ static u32 tcp_lp_remote_hz_estimator(struct sock *sk) | |||
153 | if (m < 0) | 157 | if (m < 0) |
154 | m = -m; | 158 | m = -m; |
155 | 159 | ||
156 | if (rhz != 0) { | 160 | if (rhz > 0) { |
157 | m -= rhz >> 6; /* m is now error in remote HZ est */ | 161 | m -= rhz >> 6; /* m is now error in remote HZ est */ |
158 | rhz += m; /* 63/64 old + 1/64 new */ | 162 | rhz += m; /* 63/64 old + 1/64 new */ |
159 | } else | 163 | } else |
160 | rhz = m << 6; | 164 | rhz = m << 6; |
161 | 165 | ||
166 | out: | ||
162 | /* record time for successful remote HZ calc */ | 167 | /* record time for successful remote HZ calc */ |
163 | lp->flag |= LP_VALID_RHZ; | 168 | if (rhz > 0) |
169 | lp->flag |= LP_VALID_RHZ; | ||
170 | else | ||
171 | lp->flag &= ~LP_VALID_RHZ; | ||
164 | 172 | ||
165 | out: | ||
166 | /* record reference time stamp */ | 173 | /* record reference time stamp */ |
167 | lp->remote_ref_time = tp->rx_opt.rcv_tsval; | 174 | lp->remote_ref_time = tp->rx_opt.rcv_tsval; |
168 | lp->local_ref_time = tp->rx_opt.rcv_tsecr; | 175 | lp->local_ref_time = tp->rx_opt.rcv_tsecr; |
@@ -333,6 +340,6 @@ static void __exit tcp_lp_unregister(void) | |||
333 | module_init(tcp_lp_register); | 340 | module_init(tcp_lp_register); |
334 | module_exit(tcp_lp_unregister); | 341 | module_exit(tcp_lp_unregister); |
335 | 342 | ||
336 | MODULE_AUTHOR("Wong Hoi Sing Edison, Hung Hing Lun"); | 343 | MODULE_AUTHOR("Wong Hoi Sing Edison, Hung Hing Lun Mike"); |
337 | MODULE_LICENSE("GPL"); | 344 | MODULE_LICENSE("GPL"); |
338 | MODULE_DESCRIPTION("TCP Low Priority"); | 345 | MODULE_DESCRIPTION("TCP Low Priority"); |