| 462 | } |
| 463 | |
| 464 | int |
| 465 | pfi_dynaddr_setup(struct pf_addr_wrap *aw, sa_family_t af) |
| 466 | { |
| 467 | struct epoch_tracker et; |
| 468 | struct pfi_dynaddr *dyn; |
| 469 | char tblname[PF_TABLE_NAME_SIZE]; |
| 470 | struct pf_kruleset *ruleset = NULL; |
| 471 | struct pfi_kkif *kif; |
| 472 | int rv = 0; |
| 473 | |
| 474 | PF_RULES_WASSERT(); |
| 475 | KASSERT(aw->type == PF_ADDR_DYNIFTL, ("%s: type %u", |
| 476 | __func__, aw->type)); |
| 477 | KASSERT(aw->p.dyn == NULL, ("%s: dyn is %p", __func__, aw->p.dyn)); |
| 478 | |
| 479 | if ((dyn = malloc(sizeof(*dyn), PFI_MTYPE, M_NOWAIT | M_ZERO)) == NULL) |
| 480 | return (ENOMEM); |
| 481 | |
| 482 | if ((kif = pf_kkif_create(M_NOWAIT)) == NULL) { |
| 483 | free(dyn, PFI_MTYPE); |
| 484 | return (ENOMEM); |
| 485 | } |
| 486 | |
| 487 | if (!strcmp(aw->v.ifname, "self")) |
| 488 | dyn->pfid_kif = pfi_kkif_attach(kif, IFG_ALL); |
| 489 | else |
| 490 | dyn->pfid_kif = pfi_kkif_attach(kif, aw->v.ifname); |
| 491 | pfi_kkif_ref(dyn->pfid_kif); |
| 492 | |
| 493 | dyn->pfid_net = pfi_unmask(&aw->v.a.mask); |
| 494 | if (af == AF_INET && dyn->pfid_net == 32) |
| 495 | dyn->pfid_net = 128; |
| 496 | strlcpy(tblname, aw->v.ifname, sizeof(tblname)); |
| 497 | if (aw->iflags & PFI_AFLAG_NETWORK) |
| 498 | strlcat(tblname, ":network", sizeof(tblname)); |
| 499 | if (aw->iflags & PFI_AFLAG_BROADCAST) |
| 500 | strlcat(tblname, ":broadcast", sizeof(tblname)); |
| 501 | if (aw->iflags & PFI_AFLAG_PEER) |
| 502 | strlcat(tblname, ":peer", sizeof(tblname)); |
| 503 | if (aw->iflags & PFI_AFLAG_NOALIAS) |
| 504 | strlcat(tblname, ":0", sizeof(tblname)); |
| 505 | if (dyn->pfid_net != 128) |
| 506 | snprintf(tblname + strlen(tblname), |
| 507 | sizeof(tblname) - strlen(tblname), "/%d", dyn->pfid_net); |
| 508 | if ((ruleset = pf_find_or_create_kruleset(PF_RESERVED_ANCHOR)) == NULL) { |
| 509 | rv = ENOMEM; |
| 510 | goto _bad; |
| 511 | } |
| 512 | |
| 513 | if ((dyn->pfid_kt = pfr_attach_table(ruleset, tblname)) == NULL) { |
| 514 | rv = ENOMEM; |
| 515 | goto _bad; |
| 516 | } |
| 517 | |
| 518 | dyn->pfid_kt->pfrkt_flags |= PFR_TFLAG_ACTIVE; |
| 519 | dyn->pfid_iflags = aw->iflags; |
| 520 | dyn->pfid_af = af; |
| 521 |
no test coverage detected