MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pfi_dynaddr_setup

Function pfi_dynaddr_setup

freebsd/netpfil/pf/pf_if.c:464–540  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

462}
463
464int
465pfi_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

Callers 2

pf_addr_setupFunction · 0.85
pfioctlFunction · 0.85

Calls 15

mallocFunction · 0.85
pf_kkif_createFunction · 0.85
strcmpFunction · 0.85
pfi_kkif_attachFunction · 0.85
pfi_kkif_refFunction · 0.85
pfi_unmaskFunction · 0.85
snprintfFunction · 0.85
pfr_attach_tableFunction · 0.85
pfi_kkif_updateFunction · 0.85
pfr_detach_tableFunction · 0.85

Tested by

no test coverage detected