diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c --- a/sys/netpfil/pf/pf.c +++ b/sys/netpfil/pf/pf.c @@ -412,28 +412,6 @@ return (PF_PASS); \ } while (0) -static struct pfi_kkif * -BOUND_IFACE(struct pf_krule *r, struct pfi_kkif *k, struct pf_pdesc *pd) -{ - /* Floating unless otherwise specified. */ - if (! (r->rule_flag & PFRULE_IFBOUND)) - return (V_pfi_all); - - /* Don't overrule the interface for states created on incoming packets. */ - if (pd->dir == PF_IN) - return (k); - - /* No route-to, so don't overrrule. */ - if (r->rt != PF_ROUTETO) - return (k); - - if (r->rpool.cur == NULL) - return (k); - - /* Bind to the route-to interface. */ - return (r->rpool.cur->kif); -} - #define STATE_INC_COUNTERS(s) \ do { \ struct pf_krule_item *mrm; \ @@ -1509,8 +1487,8 @@ } int -pf_state_insert(struct pfi_kkif *kif, struct pfi_kkif *orig_kif, - struct pf_state_key *skw, struct pf_state_key *sks, struct pf_kstate *s) +pf_state_insert(struct pf_state_key *skw, struct pf_state_key *sks, + struct pf_kstate *s) { struct pf_idhash *ih; struct pf_kstate *cur; @@ -1524,9 +1502,6 @@ ("%s: skw not pristine", __func__)); KASSERT(s->refs == 0, ("%s: state not pristine", __func__)); - s->kif = kif; - s->orig_kif = orig_kif; - if (s->id == 0 && s->creatorid == 0) { s->id = alloc_unr64(&V_pf_stateid); s->id = htobe64(s->id); @@ -4963,12 +4938,21 @@ s->timeout = PFTM_OTHER_FIRST_PACKET; } + s->kif = kif; + s->orig_kif = kif; + if (r->rt) { /* pf_map_addr increases the reason counters */ if ((reason = pf_map_addr(pd->af, r, pd->src, &s->rt_addr, &s->rt_kif, NULL, &sn)) != 0) goto csfailed; s->rt = r->rt; + if (r->rt == PF_ROUTETO && pd->dir == PF_OUT) + s->kif = s->rt_kif; + } + + if (!(r->rule_flag & PFRULE_IFBOUND) { + s->kif = V_pfi_all; } s->creation = s->expire = pf_get_uptime(); @@ -5018,8 +5002,7 @@ __func__, nr, sk, nk)); /* Swap sk/nk for PF_OUT. */ - if (pf_state_insert(BOUND_IFACE(r, kif, pd), kif, - (pd->dir == PF_IN) ? sk : nk, + if (pf_state_insert((pd->dir == PF_IN) ? sk : nk, (pd->dir == PF_IN) ? nk : sk, s)) { REASON_SET(&reason, PFRES_STATEINS); goto drop;