1 /* 2 * xfrm_state.c 3 * 4 * Changes: 5 * Mitsuru KANDA @USAGI 6 * Kazunori MIYAZAWA @USAGI 7 * Kunihiro Ishiguro <kunihiro@ipinfusion.com> 8 * IPv6 support 9 * YOSHIFUJI Hideaki @USAGI 10 * Split up af-specific functions 11 * Derek Atkins <derek@ihtfp.com> 12 * Add UDP Encapsulation 13 * 14 */ 15 16 #include <linux/workqueue.h> 17 #include <net/xfrm.h> 18 #include <linux/pfkeyv2.h> 19 #include <linux/ipsec.h> 20 #include <linux/module.h> 21 #include <asm/uaccess.h> 22 23 /* Each xfrm_state may be linked to two tables: 24 25 1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl) 26 2. Hash table by daddr to find what SAs exist for given 27 destination/tunnel endpoint. (output) 28 */ 29 30 static DEFINE_SPINLOCK(xfrm_state_lock); 31 32 /* Hash table to find appropriate SA towards given target (endpoint 33 * of tunnel or destination of transport mode) allowed by selector. 34 * 35 * Main use is finding SA after policy selected tunnel or transport mode. 36 * Also, it can be used by ah/esp icmp error handler to find offending SA. 37 */ 38 static struct list_head xfrm_state_bydst[XFRM_DST_HSIZE]; 39 static struct list_head xfrm_state_byspi[XFRM_DST_HSIZE]; 40 41 DECLARE_WAIT_QUEUE_HEAD(km_waitq); 42 EXPORT_SYMBOL(km_waitq); 43 44 static DEFINE_RWLOCK(xfrm_state_afinfo_lock); 45 static struct xfrm_state_afinfo *xfrm_state_afinfo[NPROTO]; 46 47 static struct work_struct xfrm_state_gc_work; 48 static struct list_head xfrm_state_gc_list = LIST_HEAD_INIT(xfrm_state_gc_list); 49 static DEFINE_SPINLOCK(xfrm_state_gc_lock); 50 51 static int xfrm_state_gc_flush_bundles; 52 53 static void __xfrm_state_delete(struct xfrm_state *x); 54 55 static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family); 56 static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo); 57 58 static int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol); 59 static void km_state_expired(struct xfrm_state *x, int hard); 60 61 static void xfrm_state_gc_destroy(struct xfrm_state *x) 62 { 63 if (del_timer(&x->timer)) 64 BUG(); 65 if (x->aalg) 66 kfree(x->aalg); 67 if (x->ealg) 68 kfree(x->ealg); 69 if (x->calg) 70 kfree(x->calg); 71 if (x->encap) 72 kfree(x->encap); 73 if (x->type) { 74 x->type->destructor(x); 75 xfrm_put_type(x->type); 76 } 77 kfree(x); 78 } 79 80 static void xfrm_state_gc_task(void *data) 81 { 82 struct xfrm_state *x; 83 struct list_head *entry, *tmp; 84 struct list_head gc_list = LIST_HEAD_INIT(gc_list); 85 86 if (xfrm_state_gc_flush_bundles) { 87 xfrm_state_gc_flush_bundles = 0; 88 xfrm_flush_bundles(); 89 } 90 91 spin_lock_bh(&xfrm_state_gc_lock); 92 list_splice_init(&xfrm_state_gc_list, &gc_list); 93 spin_unlock_bh(&xfrm_state_gc_lock); 94 95 list_for_each_safe(entry, tmp, &gc_list) { 96 x = list_entry(entry, struct xfrm_state, bydst); 97 xfrm_state_gc_destroy(x); 98 } 99 wake_up(&km_waitq); 100 } 101 102 static inline unsigned long make_jiffies(long secs) 103 { 104 if (secs >= (MAX_SCHEDULE_TIMEOUT-1)/HZ) 105 return MAX_SCHEDULE_TIMEOUT-1; 106 else 107 return secs*HZ; 108 } 109 110 static void xfrm_timer_handler(unsigned long data) 111 { 112 struct xfrm_state *x = (struct xfrm_state*)data; 113 unsigned long now = (unsigned long)xtime.tv_sec; 114 long next = LONG_MAX; 115 int warn = 0; 116 117 spin_lock(&x->lock); 118 if (x->km.state == XFRM_STATE_DEAD) 119 goto out; 120 if (x->km.state == XFRM_STATE_EXPIRED) 121 goto expired; 122 if (x->lft.hard_add_expires_seconds) { 123 long tmo = x->lft.hard_add_expires_seconds + 124 x->curlft.add_time - now; 125 if (tmo <= 0) 126 goto expired; 127 if (tmo < next) 128 next = tmo; 129 } 130 if (x->lft.hard_use_expires_seconds) { 131 long tmo = x->lft.hard_use_expires_seconds + 132 (x->curlft.use_time ? : now) - now; 133 if (tmo <= 0) 134 goto expired; 135 if (tmo < next) 136 next = tmo; 137 } 138 if (x->km.dying) 139 goto resched; 140 if (x->lft.soft_add_expires_seconds) { 141 long tmo = x->lft.soft_add_expires_seconds + 142 x->curlft.add_time - now; 143 if (tmo <= 0) 144 warn = 1; 145 else if (tmo < next) 146 next = tmo; 147 } 148 if (x->lft.soft_use_expires_seconds) { 149 long tmo = x->lft.soft_use_expires_seconds + 150 (x->curlft.use_time ? : now) - now; 151 if (tmo <= 0) 152 warn = 1; 153 else if (tmo < next) 154 next = tmo; 155 } 156 157 if (warn) 158 km_state_expired(x, 0); 159 resched: 160 if (next != LONG_MAX && 161 !mod_timer(&x->timer, jiffies + make_jiffies(next))) 162 xfrm_state_hold(x); 163 goto out; 164 165 expired: 166 if (x->km.state == XFRM_STATE_ACQ && x->id.spi == 0) { 167 x->km.state = XFRM_STATE_EXPIRED; 168 wake_up(&km_waitq); 169 next = 2; 170 goto resched; 171 } 172 if (x->id.spi != 0) 173 km_state_expired(x, 1); 174 __xfrm_state_delete(x); 175 176 out: 177 spin_unlock(&x->lock); 178 xfrm_state_put(x); 179 } 180 181 struct xfrm_state *xfrm_state_alloc(void) 182 { 183 struct xfrm_state *x; 184 185 x = kmalloc(sizeof(struct xfrm_state), GFP_ATOMIC); 186 187 if (x) { 188 memset(x, 0, sizeof(struct xfrm_state)); 189 atomic_set(&x->refcnt, 1); 190 atomic_set(&x->tunnel_users, 0); 191 INIT_LIST_HEAD(&x->bydst); 192 INIT_LIST_HEAD(&x->byspi); 193 init_timer(&x->timer); 194 x->timer.function = xfrm_timer_handler; 195 x->timer.data = (unsigned long)x; 196 x->curlft.add_time = (unsigned long)xtime.tv_sec; 197 x->lft.soft_byte_limit = XFRM_INF; 198 x->lft.soft_packet_limit = XFRM_INF; 199 x->lft.hard_byte_limit = XFRM_INF; 200 x->lft.hard_packet_limit = XFRM_INF; 201 spin_lock_init(&x->lock); 202 } 203 return x; 204 } 205 EXPORT_SYMBOL(xfrm_state_alloc); 206 207 void __xfrm_state_destroy(struct xfrm_state *x) 208 { 209 BUG_TRAP(x->km.state == XFRM_STATE_DEAD); 210 211 spin_lock_bh(&xfrm_state_gc_lock); 212 list_add(&x->bydst, &xfrm_state_gc_list); 213 spin_unlock_bh(&xfrm_state_gc_lock); 214 schedule_work(&xfrm_state_gc_work); 215 } 216 EXPORT_SYMBOL(__xfrm_state_destroy); 217 218 static void __xfrm_state_delete(struct xfrm_state *x) 219 { 220 if (x->km.state != XFRM_STATE_DEAD) { 221 x->km.state = XFRM_STATE_DEAD; 222 spin_lock(&xfrm_state_lock); 223 list_del(&x->bydst); 224 atomic_dec(&x->refcnt); 225 if (x->id.spi) { 226 list_del(&x->byspi); 227 atomic_dec(&x->refcnt); 228 } 229 spin_unlock(&xfrm_state_lock); 230 if (del_timer(&x->timer)) 231 atomic_dec(&x->refcnt); 232 233 /* The number two in this test is the reference 234 * mentioned in the comment below plus the reference 235 * our caller holds. A larger value means that 236 * there are DSTs attached to this xfrm_state. 237 */ 238 if (atomic_read(&x->refcnt) > 2) { 239 xfrm_state_gc_flush_bundles = 1; 240 schedule_work(&xfrm_state_gc_work); 241 } 242 243 /* All xfrm_state objects are created by xfrm_state_alloc. 244 * The xfrm_state_alloc call gives a reference, and that 245 * is what we are dropping here. 246 */ 247 atomic_dec(&x->refcnt); 248 } 249 } 250 251 void xfrm_state_delete(struct xfrm_state *x) 252 { 253 spin_lock_bh(&x->lock); 254 __xfrm_state_delete(x); 255 spin_unlock_bh(&x->lock); 256 } 257 EXPORT_SYMBOL(xfrm_state_delete); 258 259 void xfrm_state_flush(u8 proto) 260 { 261 int i; 262 struct xfrm_state *x; 263 264 spin_lock_bh(&xfrm_state_lock); 265 for (i = 0; i < XFRM_DST_HSIZE; i++) { 266 restart: 267 list_for_each_entry(x, xfrm_state_bydst+i, bydst) { 268 if (!xfrm_state_kern(x) && 269 (proto == IPSEC_PROTO_ANY || x->id.proto == proto)) { 270 xfrm_state_hold(x); 271 spin_unlock_bh(&xfrm_state_lock); 272 273 xfrm_state_delete(x); 274 xfrm_state_put(x); 275 276 spin_lock_bh(&xfrm_state_lock); 277 goto restart; 278 } 279 } 280 } 281 spin_unlock_bh(&xfrm_state_lock); 282 wake_up(&km_waitq); 283 } 284 EXPORT_SYMBOL(xfrm_state_flush); 285 286 static int 287 xfrm_init_tempsel(struct xfrm_state *x, struct flowi *fl, 288 struct xfrm_tmpl *tmpl, 289 xfrm_address_t *daddr, xfrm_address_t *saddr, 290 unsigned short family) 291 { 292 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family); 293 if (!afinfo) 294 return -1; 295 afinfo->init_tempsel(x, fl, tmpl, daddr, saddr); 296 xfrm_state_put_afinfo(afinfo); 297 return 0; 298 } 299 300 struct xfrm_state * 301 xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, 302 struct flowi *fl, struct xfrm_tmpl *tmpl, 303 struct xfrm_policy *pol, int *err, 304 unsigned short family) 305 { 306 unsigned h = xfrm_dst_hash(daddr, family); 307 struct xfrm_state *x, *x0; 308 int acquire_in_progress = 0; 309 int error = 0; 310 struct xfrm_state *best = NULL; 311 struct xfrm_state_afinfo *afinfo; 312 313 afinfo = xfrm_state_get_afinfo(family); 314 if (afinfo == NULL) { 315 *err = -EAFNOSUPPORT; 316 return NULL; 317 } 318 319 spin_lock_bh(&xfrm_state_lock); 320 list_for_each_entry(x, xfrm_state_bydst+h, bydst) { 321 if (x->props.family == family && 322 x->props.reqid == tmpl->reqid && 323 xfrm_state_addr_check(x, daddr, saddr, family) && 324 tmpl->mode == x->props.mode && 325 tmpl->id.proto == x->id.proto && 326 (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) { 327 /* Resolution logic: 328 1. There is a valid state with matching selector. 329 Done. 330 2. Valid state with inappropriate selector. Skip. 331 332 Entering area of "sysdeps". 333 334 3. If state is not valid, selector is temporary, 335 it selects only session which triggered 336 previous resolution. Key manager will do 337 something to install a state with proper 338 selector. 339 */ 340 if (x->km.state == XFRM_STATE_VALID) { 341 if (!xfrm_selector_match(&x->sel, fl, family)) 342 continue; 343 if (!best || 344 best->km.dying > x->km.dying || 345 (best->km.dying == x->km.dying && 346 best->curlft.add_time < x->curlft.add_time)) 347 best = x; 348 } else if (x->km.state == XFRM_STATE_ACQ) { 349 acquire_in_progress = 1; 350 } else if (x->km.state == XFRM_STATE_ERROR || 351 x->km.state == XFRM_STATE_EXPIRED) { 352 if (xfrm_selector_match(&x->sel, fl, family)) 353 error = -ESRCH; 354 } 355 } 356 } 357 358 x = best; 359 if (!x && !error && !acquire_in_progress) { 360 x0 = afinfo->state_lookup(&tmpl->id.daddr, tmpl->id.spi, tmpl->id.proto); 361 if (x0 != NULL) { 362 xfrm_state_put(x0); 363 error = -EEXIST; 364 goto out; 365 } 366 x = xfrm_state_alloc(); 367 if (x == NULL) { 368 error = -ENOMEM; 369 goto out; 370 } 371 /* Initialize temporary selector matching only 372 * to current session. */ 373 xfrm_init_tempsel(x, fl, tmpl, daddr, saddr, family); 374 375 if (km_query(x, tmpl, pol) == 0) { 376 x->km.state = XFRM_STATE_ACQ; 377 list_add_tail(&x->bydst, xfrm_state_bydst+h); 378 xfrm_state_hold(x); 379 if (x->id.spi) { 380 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, family); 381 list_add(&x->byspi, xfrm_state_byspi+h); 382 xfrm_state_hold(x); 383 } 384 x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES; 385 xfrm_state_hold(x); 386 x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ; 387 add_timer(&x->timer); 388 } else { 389 x->km.state = XFRM_STATE_DEAD; 390 xfrm_state_put(x); 391 x = NULL; 392 error = -ESRCH; 393 } 394 } 395 out: 396 if (x) 397 xfrm_state_hold(x); 398 else 399 *err = acquire_in_progress ? -EAGAIN : error; 400 spin_unlock_bh(&xfrm_state_lock); 401 xfrm_state_put_afinfo(afinfo); 402 return x; 403 } 404 405 static void __xfrm_state_insert(struct xfrm_state *x) 406 { 407 unsigned h = xfrm_dst_hash(&x->id.daddr, x->props.family); 408 409 list_add(&x->bydst, xfrm_state_bydst+h); 410 xfrm_state_hold(x); 411 412 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, x->props.family); 413 414 list_add(&x->byspi, xfrm_state_byspi+h); 415 xfrm_state_hold(x); 416 417 if (!mod_timer(&x->timer, jiffies + HZ)) 418 xfrm_state_hold(x); 419 420 wake_up(&km_waitq); 421 } 422 423 void xfrm_state_insert(struct xfrm_state *x) 424 { 425 spin_lock_bh(&xfrm_state_lock); 426 __xfrm_state_insert(x); 427 spin_unlock_bh(&xfrm_state_lock); 428 } 429 EXPORT_SYMBOL(xfrm_state_insert); 430 431 static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq); 432 433 int xfrm_state_add(struct xfrm_state *x) 434 { 435 struct xfrm_state_afinfo *afinfo; 436 struct xfrm_state *x1; 437 int family; 438 int err; 439 440 family = x->props.family; 441 afinfo = xfrm_state_get_afinfo(family); 442 if (unlikely(afinfo == NULL)) 443 return -EAFNOSUPPORT; 444 445 spin_lock_bh(&xfrm_state_lock); 446 447 x1 = afinfo->state_lookup(&x->id.daddr, x->id.spi, x->id.proto); 448 if (x1) { 449 xfrm_state_put(x1); 450 x1 = NULL; 451 err = -EEXIST; 452 goto out; 453 } 454 455 if (x->km.seq) { 456 x1 = __xfrm_find_acq_byseq(x->km.seq); 457 if (x1 && xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family)) { 458 xfrm_state_put(x1); 459 x1 = NULL; 460 } 461 } 462 463 if (!x1) 464 x1 = afinfo->find_acq( 465 x->props.mode, x->props.reqid, x->id.proto, 466 &x->id.daddr, &x->props.saddr, 0); 467 468 __xfrm_state_insert(x); 469 err = 0; 470 471 out: 472 spin_unlock_bh(&xfrm_state_lock); 473 xfrm_state_put_afinfo(afinfo); 474 475 if (x1) { 476 xfrm_state_delete(x1); 477 xfrm_state_put(x1); 478 } 479 480 return err; 481 } 482 EXPORT_SYMBOL(xfrm_state_add); 483 484 int xfrm_state_update(struct xfrm_state *x) 485 { 486 struct xfrm_state_afinfo *afinfo; 487 struct xfrm_state *x1; 488 int err; 489 490 afinfo = xfrm_state_get_afinfo(x->props.family); 491 if (unlikely(afinfo == NULL)) 492 return -EAFNOSUPPORT; 493 494 spin_lock_bh(&xfrm_state_lock); 495 x1 = afinfo->state_lookup(&x->id.daddr, x->id.spi, x->id.proto); 496 497 err = -ESRCH; 498 if (!x1) 499 goto out; 500 501 if (xfrm_state_kern(x1)) { 502 xfrm_state_put(x1); 503 err = -EEXIST; 504 goto out; 505 } 506 507 if (x1->km.state == XFRM_STATE_ACQ) { 508 __xfrm_state_insert(x); 509 x = NULL; 510 } 511 err = 0; 512 513 out: 514 spin_unlock_bh(&xfrm_state_lock); 515 xfrm_state_put_afinfo(afinfo); 516 517 if (err) 518 return err; 519 520 if (!x) { 521 xfrm_state_delete(x1); 522 xfrm_state_put(x1); 523 return 0; 524 } 525 526 err = -EINVAL; 527 spin_lock_bh(&x1->lock); 528 if (likely(x1->km.state == XFRM_STATE_VALID)) { 529 if (x->encap && x1->encap) 530 memcpy(x1->encap, x->encap, sizeof(*x1->encap)); 531 memcpy(&x1->lft, &x->lft, sizeof(x1->lft)); 532 x1->km.dying = 0; 533 534 if (!mod_timer(&x1->timer, jiffies + HZ)) 535 xfrm_state_hold(x1); 536 if (x1->curlft.use_time) 537 xfrm_state_check_expire(x1); 538 539 err = 0; 540 } 541 spin_unlock_bh(&x1->lock); 542 543 xfrm_state_put(x1); 544 545 return err; 546 } 547 EXPORT_SYMBOL(xfrm_state_update); 548 549 int xfrm_state_check_expire(struct xfrm_state *x) 550 { 551 if (!x->curlft.use_time) 552 x->curlft.use_time = (unsigned long)xtime.tv_sec; 553 554 if (x->km.state != XFRM_STATE_VALID) 555 return -EINVAL; 556 557 if (x->curlft.bytes >= x->lft.hard_byte_limit || 558 x->curlft.packets >= x->lft.hard_packet_limit) { 559 km_state_expired(x, 1); 560 if (!mod_timer(&x->timer, jiffies + XFRM_ACQ_EXPIRES*HZ)) 561 xfrm_state_hold(x); 562 return -EINVAL; 563 } 564 565 if (!x->km.dying && 566 (x->curlft.bytes >= x->lft.soft_byte_limit || 567 x->curlft.packets >= x->lft.soft_packet_limit)) 568 km_state_expired(x, 0); 569 return 0; 570 } 571 EXPORT_SYMBOL(xfrm_state_check_expire); 572 573 static int xfrm_state_check_space(struct xfrm_state *x, struct sk_buff *skb) 574 { 575 int nhead = x->props.header_len + LL_RESERVED_SPACE(skb->dst->dev) 576 - skb_headroom(skb); 577 578 if (nhead > 0) 579 return pskb_expand_head(skb, nhead, 0, GFP_ATOMIC); 580 581 /* Check tail too... */ 582 return 0; 583 } 584 585 int xfrm_state_check(struct xfrm_state *x, struct sk_buff *skb) 586 { 587 int err = xfrm_state_check_expire(x); 588 if (err < 0) 589 goto err; 590 err = xfrm_state_check_space(x, skb); 591 err: 592 return err; 593 } 594 EXPORT_SYMBOL(xfrm_state_check); 595 596 struct xfrm_state * 597 xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto, 598 unsigned short family) 599 { 600 struct xfrm_state *x; 601 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family); 602 if (!afinfo) 603 return NULL; 604 605 spin_lock_bh(&xfrm_state_lock); 606 x = afinfo->state_lookup(daddr, spi, proto); 607 spin_unlock_bh(&xfrm_state_lock); 608 xfrm_state_put_afinfo(afinfo); 609 return x; 610 } 611 EXPORT_SYMBOL(xfrm_state_lookup); 612 613 struct xfrm_state * 614 xfrm_find_acq(u8 mode, u32 reqid, u8 proto, 615 xfrm_address_t *daddr, xfrm_address_t *saddr, 616 int create, unsigned short family) 617 { 618 struct xfrm_state *x; 619 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family); 620 if (!afinfo) 621 return NULL; 622 623 spin_lock_bh(&xfrm_state_lock); 624 x = afinfo->find_acq(mode, reqid, proto, daddr, saddr, create); 625 spin_unlock_bh(&xfrm_state_lock); 626 xfrm_state_put_afinfo(afinfo); 627 return x; 628 } 629 EXPORT_SYMBOL(xfrm_find_acq); 630 631 /* Silly enough, but I'm lazy to build resolution list */ 632 633 static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq) 634 { 635 int i; 636 struct xfrm_state *x; 637 638 for (i = 0; i < XFRM_DST_HSIZE; i++) { 639 list_for_each_entry(x, xfrm_state_bydst+i, bydst) { 640 if (x->km.seq == seq && x->km.state == XFRM_STATE_ACQ) { 641 xfrm_state_hold(x); 642 return x; 643 } 644 } 645 } 646 return NULL; 647 } 648 649 struct xfrm_state *xfrm_find_acq_byseq(u32 seq) 650 { 651 struct xfrm_state *x; 652 653 spin_lock_bh(&xfrm_state_lock); 654 x = __xfrm_find_acq_byseq(seq); 655 spin_unlock_bh(&xfrm_state_lock); 656 return x; 657 } 658 EXPORT_SYMBOL(xfrm_find_acq_byseq); 659 660 u32 xfrm_get_acqseq(void) 661 { 662 u32 res; 663 static u32 acqseq; 664 static DEFINE_SPINLOCK(acqseq_lock); 665 666 spin_lock_bh(&acqseq_lock); 667 res = (++acqseq ? : ++acqseq); 668 spin_unlock_bh(&acqseq_lock); 669 return res; 670 } 671 EXPORT_SYMBOL(xfrm_get_acqseq); 672 673 void 674 xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi) 675 { 676 u32 h; 677 struct xfrm_state *x0; 678 679 if (x->id.spi) 680 return; 681 682 if (minspi == maxspi) { 683 x0 = xfrm_state_lookup(&x->id.daddr, minspi, x->id.proto, x->props.family); 684 if (x0) { 685 xfrm_state_put(x0); 686 return; 687 } 688 x->id.spi = minspi; 689 } else { 690 u32 spi = 0; 691 minspi = ntohl(minspi); 692 maxspi = ntohl(maxspi); 693 for (h=0; h<maxspi-minspi+1; h++) { 694 spi = minspi + net_random()%(maxspi-minspi+1); 695 x0 = xfrm_state_lookup(&x->id.daddr, htonl(spi), x->id.proto, x->props.family); 696 if (x0 == NULL) { 697 x->id.spi = htonl(spi); 698 break; 699 } 700 xfrm_state_put(x0); 701 } 702 } 703 if (x->id.spi) { 704 spin_lock_bh(&xfrm_state_lock); 705 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, x->props.family); 706 list_add(&x->byspi, xfrm_state_byspi+h); 707 xfrm_state_hold(x); 708 spin_unlock_bh(&xfrm_state_lock); 709 wake_up(&km_waitq); 710 } 711 } 712 EXPORT_SYMBOL(xfrm_alloc_spi); 713 714 int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*), 715 void *data) 716 { 717 int i; 718 struct xfrm_state *x; 719 int count = 0; 720 int err = 0; 721 722 spin_lock_bh(&xfrm_state_lock); 723 for (i = 0; i < XFRM_DST_HSIZE; i++) { 724 list_for_each_entry(x, xfrm_state_bydst+i, bydst) { 725 if (proto == IPSEC_PROTO_ANY || x->id.proto == proto) 726 count++; 727 } 728 } 729 if (count == 0) { 730 err = -ENOENT; 731 goto out; 732 } 733 734 for (i = 0; i < XFRM_DST_HSIZE; i++) { 735 list_for_each_entry(x, xfrm_state_bydst+i, bydst) { 736 if (proto != IPSEC_PROTO_ANY && x->id.proto != proto) 737 continue; 738 err = func(x, --count, data); 739 if (err) 740 goto out; 741 } 742 } 743 out: 744 spin_unlock_bh(&xfrm_state_lock); 745 return err; 746 } 747 EXPORT_SYMBOL(xfrm_state_walk); 748 749 int xfrm_replay_check(struct xfrm_state *x, u32 seq) 750 { 751 u32 diff; 752 753 seq = ntohl(seq); 754 755 if (unlikely(seq == 0)) 756 return -EINVAL; 757 758 if (likely(seq > x->replay.seq)) 759 return 0; 760 761 diff = x->replay.seq - seq; 762 if (diff >= x->props.replay_window) { 763 x->stats.replay_window++; 764 return -EINVAL; 765 } 766 767 if (x->replay.bitmap & (1U << diff)) { 768 x->stats.replay++; 769 return -EINVAL; 770 } 771 return 0; 772 } 773 EXPORT_SYMBOL(xfrm_replay_check); 774 775 void xfrm_replay_advance(struct xfrm_state *x, u32 seq) 776 { 777 u32 diff; 778 779 seq = ntohl(seq); 780 781 if (seq > x->replay.seq) { 782 diff = seq - x->replay.seq; 783 if (diff < x->props.replay_window) 784 x->replay.bitmap = ((x->replay.bitmap) << diff) | 1; 785 else 786 x->replay.bitmap = 1; 787 x->replay.seq = seq; 788 } else { 789 diff = x->replay.seq - seq; 790 x->replay.bitmap |= (1U << diff); 791 } 792 } 793 EXPORT_SYMBOL(xfrm_replay_advance); 794 795 static struct list_head xfrm_km_list = LIST_HEAD_INIT(xfrm_km_list); 796 static DEFINE_RWLOCK(xfrm_km_lock); 797 798 static void km_state_expired(struct xfrm_state *x, int hard) 799 { 800 struct xfrm_mgr *km; 801 802 if (hard) 803 x->km.state = XFRM_STATE_EXPIRED; 804 else 805 x->km.dying = 1; 806 807 read_lock(&xfrm_km_lock); 808 list_for_each_entry(km, &xfrm_km_list, list) 809 km->notify(x, hard); 810 read_unlock(&xfrm_km_lock); 811 812 if (hard) 813 wake_up(&km_waitq); 814 } 815 816 static int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol) 817 { 818 int err = -EINVAL; 819 struct xfrm_mgr *km; 820 821 read_lock(&xfrm_km_lock); 822 list_for_each_entry(km, &xfrm_km_list, list) { 823 err = km->acquire(x, t, pol, XFRM_POLICY_OUT); 824 if (!err) 825 break; 826 } 827 read_unlock(&xfrm_km_lock); 828 return err; 829 } 830 831 int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, u16 sport) 832 { 833 int err = -EINVAL; 834 struct xfrm_mgr *km; 835 836 read_lock(&xfrm_km_lock); 837 list_for_each_entry(km, &xfrm_km_list, list) { 838 if (km->new_mapping) 839 err = km->new_mapping(x, ipaddr, sport); 840 if (!err) 841 break; 842 } 843 read_unlock(&xfrm_km_lock); 844 return err; 845 } 846 EXPORT_SYMBOL(km_new_mapping); 847 848 void km_policy_expired(struct xfrm_policy *pol, int dir, int hard) 849 { 850 struct xfrm_mgr *km; 851 852 read_lock(&xfrm_km_lock); 853 list_for_each_entry(km, &xfrm_km_list, list) 854 if (km->notify_policy) 855 km->notify_policy(pol, dir, hard); 856 read_unlock(&xfrm_km_lock); 857 858 if (hard) 859 wake_up(&km_waitq); 860 } 861 862 int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen) 863 { 864 int err; 865 u8 *data; 866 struct xfrm_mgr *km; 867 struct xfrm_policy *pol = NULL; 868 869 if (optlen <= 0 || optlen > PAGE_SIZE) 870 return -EMSGSIZE; 871 872 data = kmalloc(optlen, GFP_KERNEL); 873 if (!data) 874 return -ENOMEM; 875 876 err = -EFAULT; 877 if (copy_from_user(data, optval, optlen)) 878 goto out; 879 880 err = -EINVAL; 881 read_lock(&xfrm_km_lock); 882 list_for_each_entry(km, &xfrm_km_list, list) { 883 pol = km->compile_policy(sk->sk_family, optname, data, 884 optlen, &err); 885 if (err >= 0) 886 break; 887 } 888 read_unlock(&xfrm_km_lock); 889 890 if (err >= 0) { 891 xfrm_sk_policy_insert(sk, err, pol); 892 xfrm_pol_put(pol); 893 err = 0; 894 } 895 896 out: 897 kfree(data); 898 return err; 899 } 900 EXPORT_SYMBOL(xfrm_user_policy); 901 902 int xfrm_register_km(struct xfrm_mgr *km) 903 { 904 write_lock_bh(&xfrm_km_lock); 905 list_add_tail(&km->list, &xfrm_km_list); 906 write_unlock_bh(&xfrm_km_lock); 907 return 0; 908 } 909 EXPORT_SYMBOL(xfrm_register_km); 910 911 int xfrm_unregister_km(struct xfrm_mgr *km) 912 { 913 write_lock_bh(&xfrm_km_lock); 914 list_del(&km->list); 915 write_unlock_bh(&xfrm_km_lock); 916 return 0; 917 } 918 EXPORT_SYMBOL(xfrm_unregister_km); 919 920 int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo) 921 { 922 int err = 0; 923 if (unlikely(afinfo == NULL)) 924 return -EINVAL; 925 if (unlikely(afinfo->family >= NPROTO)) 926 return -EAFNOSUPPORT; 927 write_lock(&xfrm_state_afinfo_lock); 928 if (unlikely(xfrm_state_afinfo[afinfo->family] != NULL)) 929 err = -ENOBUFS; 930 else { 931 afinfo->state_bydst = xfrm_state_bydst; 932 afinfo->state_byspi = xfrm_state_byspi; 933 xfrm_state_afinfo[afinfo->family] = afinfo; 934 } 935 write_unlock(&xfrm_state_afinfo_lock); 936 return err; 937 } 938 EXPORT_SYMBOL(xfrm_state_register_afinfo); 939 940 int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo) 941 { 942 int err = 0; 943 if (unlikely(afinfo == NULL)) 944 return -EINVAL; 945 if (unlikely(afinfo->family >= NPROTO)) 946 return -EAFNOSUPPORT; 947 write_lock(&xfrm_state_afinfo_lock); 948 if (likely(xfrm_state_afinfo[afinfo->family] != NULL)) { 949 if (unlikely(xfrm_state_afinfo[afinfo->family] != afinfo)) 950 err = -EINVAL; 951 else { 952 xfrm_state_afinfo[afinfo->family] = NULL; 953 afinfo->state_byspi = NULL; 954 afinfo->state_bydst = NULL; 955 } 956 } 957 write_unlock(&xfrm_state_afinfo_lock); 958 return err; 959 } 960 EXPORT_SYMBOL(xfrm_state_unregister_afinfo); 961 962 static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family) 963 { 964 struct xfrm_state_afinfo *afinfo; 965 if (unlikely(family >= NPROTO)) 966 return NULL; 967 read_lock(&xfrm_state_afinfo_lock); 968 afinfo = xfrm_state_afinfo[family]; 969 if (likely(afinfo != NULL)) 970 read_lock(&afinfo->lock); 971 read_unlock(&xfrm_state_afinfo_lock); 972 return afinfo; 973 } 974 975 static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo) 976 { 977 if (unlikely(afinfo == NULL)) 978 return; 979 read_unlock(&afinfo->lock); 980 } 981 982 /* Temporarily located here until net/xfrm/xfrm_tunnel.c is created */ 983 void xfrm_state_delete_tunnel(struct xfrm_state *x) 984 { 985 if (x->tunnel) { 986 struct xfrm_state *t = x->tunnel; 987 988 if (atomic_read(&t->tunnel_users) == 2) 989 xfrm_state_delete(t); 990 atomic_dec(&t->tunnel_users); 991 xfrm_state_put(t); 992 x->tunnel = NULL; 993 } 994 } 995 EXPORT_SYMBOL(xfrm_state_delete_tunnel); 996 997 int xfrm_state_mtu(struct xfrm_state *x, int mtu) 998 { 999 int res = mtu; 1000 1001 res -= x->props.header_len; 1002 1003 for (;;) { 1004 int m = res; 1005 1006 if (m < 68) 1007 return 68; 1008 1009 spin_lock_bh(&x->lock); 1010 if (x->km.state == XFRM_STATE_VALID && 1011 x->type && x->type->get_max_size) 1012 m = x->type->get_max_size(x, m); 1013 else 1014 m += x->props.header_len; 1015 spin_unlock_bh(&x->lock); 1016 1017 if (m <= mtu) 1018 break; 1019 res -= (m - mtu); 1020 } 1021 1022 return res; 1023 } 1024 1025 EXPORT_SYMBOL(xfrm_state_mtu); 1026 1027 void __init xfrm_state_init(void) 1028 { 1029 int i; 1030 1031 for (i=0; i<XFRM_DST_HSIZE; i++) { 1032 INIT_LIST_HEAD(&xfrm_state_bydst[i]); 1033 INIT_LIST_HEAD(&xfrm_state_byspi[i]); 1034 } 1035 INIT_WORK(&xfrm_state_gc_work, xfrm_state_gc_task, NULL); 1036 } 1037 1038