diff options
Diffstat (limited to 'sys/netpfil/pf/pf.c')
-rw-r--r-- | sys/netpfil/pf/pf.c | 234 |
1 files changed, 116 insertions, 118 deletions
diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c index 3bf7e0e2077c..ef86d70db760 100644 --- a/sys/netpfil/pf/pf.c +++ b/sys/netpfil/pf/pf.c @@ -350,11 +350,11 @@ static int pf_create_state(struct pf_krule *, struct pf_krule *, struct pf_krule_slist *, struct pf_udp_mapping *); static int pf_state_key_addr_setup(struct pf_pdesc *, struct pf_state_key_cmp *, int); -static int pf_tcp_track_full(struct pf_kstate **, +static int pf_tcp_track_full(struct pf_kstate *, struct pf_pdesc *, u_short *, int *, struct pf_state_peer *, struct pf_state_peer *, u_int8_t, u_int8_t); -static int pf_tcp_track_sloppy(struct pf_kstate **, +static int pf_tcp_track_sloppy(struct pf_kstate *, struct pf_pdesc *, u_short *, struct pf_state_peer *, struct pf_state_peer *, u_int8_t, u_int8_t); @@ -1864,7 +1864,7 @@ pf_find_state_byid(uint64_t id, uint32_t creatorid) pf_counter_u64_add(&V_pf_status.fcounters[FCNT_STATE_SEARCH], 1); - ih = &V_pf_idhash[(be64toh(id) % (V_pf_hashmask + 1))]; + ih = &V_pf_idhash[PF_IDHASHID(id)]; PF_HASHROW_LOCK(ih); LIST_FOREACH(s, &ih->states, entry) @@ -2266,7 +2266,7 @@ pf_icmp_mapping(struct pf_pdesc *pd, u_int8_t type, *icmp_dir = PF_IN; *virtual_type = type; *virtual_id = 0; - HTONS(*virtual_type); + *virtual_type = htons(*virtual_type); return (1); /* These types match to another state */ /* @@ -2333,7 +2333,7 @@ pf_icmp_mapping(struct pf_pdesc *pd, u_int8_t type, *icmp_dir = PF_IN; *virtual_type = type; *virtual_id = 0; - HTONS(*virtual_type); + *virtual_type = htons(*virtual_type); return (1); /* These types match to another state */ /* * All remaining ICMP6 types get their own states, @@ -2350,7 +2350,7 @@ pf_icmp_mapping(struct pf_pdesc *pd, u_int8_t type, default: unhandled_af(pd->af); } - HTONS(*virtual_type); + *virtual_type = htons(*virtual_type); return (0); /* These types match to their own state */ } @@ -4101,7 +4101,7 @@ pf_build_tcp(const struct pf_krule *r, sa_family_t af, opt = (char *)(th + 1); opt[0] = TCPOPT_MAXSEG; opt[1] = 4; - HTONS(mss); + mss = htons(mss); memcpy((opt + 2), &mss, 2); } @@ -4527,10 +4527,7 @@ pf_match(u_int8_t op, u_int32_t a1, u_int32_t a2, u_int32_t p) int pf_match_port(u_int8_t op, u_int16_t a1, u_int16_t a2, u_int16_t p) { - NTOHS(a1); - NTOHS(a2); - NTOHS(p); - return (pf_match(op, a1, a2, p)); + return (pf_match(op, ntohs(a1), ntohs(a2), ntohs(p))); } static int @@ -5034,7 +5031,7 @@ pf_get_mss(struct pf_pdesc *pd) break; case TCPOPT_MAXSEG: memcpy(&mss, (opt + 2), 2); - NTOHS(mss); + mss = ntohs(mss); /* FALLTHROUGH */ default: optlen = opt[1]; @@ -6103,7 +6100,6 @@ pf_create_state(struct pf_krule *r, struct pf_krule *nr, struct pf_krule *a, memcpy(&s->match_rules, match_rules, sizeof(s->match_rules)); memcpy(&s->act, &pd->act, sizeof(struct pf_rule_actions)); - STATE_INC_COUNTERS(s); if (r->allow_opts) s->state_flags |= PFSTATE_ALLOWOPTS; if (r->rule_flag & PFRULE_STATESLOPPY) @@ -6227,6 +6223,8 @@ pf_create_state(struct pf_krule *r, struct pf_krule *nr, struct pf_krule *a, } else *sm = s; + STATE_INC_COUNTERS(s); + /* * Lock order is important: first state, then source node. */ @@ -6302,7 +6300,6 @@ drop: if (s != NULL) { pf_src_tree_remove_state(s); s->timeout = PFTM_UNLINKED; - STATE_DEC_COUNTERS(s); pf_free_state(s); } @@ -6422,7 +6419,7 @@ pf_translate(struct pf_pdesc *pd, struct pf_addr *saddr, u_int16_t sport, } static int -pf_tcp_track_full(struct pf_kstate **state, struct pf_pdesc *pd, +pf_tcp_track_full(struct pf_kstate *state, struct pf_pdesc *pd, u_short *reason, int *copyback, struct pf_state_peer *src, struct pf_state_peer *dst, u_int8_t psrc, u_int8_t pdst) { @@ -6448,7 +6445,7 @@ pf_tcp_track_full(struct pf_kstate **state, struct pf_pdesc *pd, if (src->seqlo == 0) { /* First packet from this end. Set its state */ - if (((*state)->state_flags & PFSTATE_SCRUB_TCP || dst->scrub) && + if ((state->state_flags & PFSTATE_SCRUB_TCP || dst->scrub) && src->scrub == NULL) { if (pf_normalize_tcp_init(pd, th, src, dst)) { REASON_SET(reason, PFRES_MEMORY); @@ -6498,7 +6495,7 @@ pf_tcp_track_full(struct pf_kstate **state, struct pf_pdesc *pd, src->seqlo = seq; if (src->state < TCPS_SYN_SENT) - pf_set_protostate(*state, psrc, TCPS_SYN_SENT); + pf_set_protostate(state, psrc, TCPS_SYN_SENT); /* * May need to slide the window (seqhi may have been set by @@ -6582,7 +6579,7 @@ pf_tcp_track_full(struct pf_kstate **state, struct pf_pdesc *pd, if (dst->scrub || src->scrub) { if (pf_normalize_tcp_stateful(pd, reason, th, - *state, src, dst, copyback)) + state, src, dst, copyback)) return (PF_DROP); } @@ -6599,43 +6596,43 @@ pf_tcp_track_full(struct pf_kstate **state, struct pf_pdesc *pd, /* update states */ if (tcp_get_flags(th) & TH_SYN) if (src->state < TCPS_SYN_SENT) - pf_set_protostate(*state, psrc, TCPS_SYN_SENT); + pf_set_protostate(state, psrc, TCPS_SYN_SENT); if (tcp_get_flags(th) & TH_FIN) if (src->state < TCPS_CLOSING) - pf_set_protostate(*state, psrc, TCPS_CLOSING); + pf_set_protostate(state, psrc, TCPS_CLOSING); if (tcp_get_flags(th) & TH_ACK) { if (dst->state == TCPS_SYN_SENT) { - pf_set_protostate(*state, pdst, + pf_set_protostate(state, pdst, TCPS_ESTABLISHED); if (src->state == TCPS_ESTABLISHED && - (*state)->sns[PF_SN_LIMIT] != NULL && - pf_src_connlimit(*state)) { + state->sns[PF_SN_LIMIT] != NULL && + pf_src_connlimit(state)) { REASON_SET(reason, PFRES_SRCLIMIT); return (PF_DROP); } } else if (dst->state == TCPS_CLOSING) - pf_set_protostate(*state, pdst, + pf_set_protostate(state, pdst, TCPS_FIN_WAIT_2); } if (tcp_get_flags(th) & TH_RST) - pf_set_protostate(*state, PF_PEER_BOTH, TCPS_TIME_WAIT); + pf_set_protostate(state, PF_PEER_BOTH, TCPS_TIME_WAIT); /* update expire time */ - (*state)->expire = pf_get_uptime(); + state->expire = pf_get_uptime(); if (src->state >= TCPS_FIN_WAIT_2 && dst->state >= TCPS_FIN_WAIT_2) - (*state)->timeout = PFTM_TCP_CLOSED; + state->timeout = PFTM_TCP_CLOSED; else if (src->state >= TCPS_CLOSING && dst->state >= TCPS_CLOSING) - (*state)->timeout = PFTM_TCP_FIN_WAIT; + state->timeout = PFTM_TCP_FIN_WAIT; else if (src->state < TCPS_ESTABLISHED || dst->state < TCPS_ESTABLISHED) - (*state)->timeout = PFTM_TCP_OPENING; + state->timeout = PFTM_TCP_OPENING; else if (src->state >= TCPS_CLOSING || dst->state >= TCPS_CLOSING) - (*state)->timeout = PFTM_TCP_CLOSING; + state->timeout = PFTM_TCP_CLOSING; else - (*state)->timeout = PFTM_TCP_ESTABLISHED; + state->timeout = PFTM_TCP_ESTABLISHED; /* Fall through to PASS packet */ @@ -6670,19 +6667,19 @@ pf_tcp_track_full(struct pf_kstate **state, struct pf_pdesc *pd, if (V_pf_status.debug >= PF_DEBUG_MISC) { printf("pf: loose state match: "); - pf_print_state(*state); + pf_print_state(state); pf_print_flags(tcp_get_flags(th)); printf(" seq=%u (%u) ack=%u len=%u ackskew=%d " "pkts=%llu:%llu dir=%s,%s\n", seq, orig_seq, ack, - pd->p_len, ackskew, (unsigned long long)(*state)->packets[0], - (unsigned long long)(*state)->packets[1], + pd->p_len, ackskew, (unsigned long long)state->packets[0], + (unsigned long long)state->packets[1], pd->dir == PF_IN ? "in" : "out", - pd->dir == (*state)->direction ? "fwd" : "rev"); + pd->dir == state->direction ? "fwd" : "rev"); } if (dst->scrub || src->scrub) { if (pf_normalize_tcp_stateful(pd, reason, th, - *state, src, dst, copyback)) + state, src, dst, copyback)) return (PF_DROP); } @@ -6703,37 +6700,37 @@ pf_tcp_track_full(struct pf_kstate **state, struct pf_pdesc *pd, if (tcp_get_flags(th) & TH_FIN) if (src->state < TCPS_CLOSING) - pf_set_protostate(*state, psrc, TCPS_CLOSING); + pf_set_protostate(state, psrc, TCPS_CLOSING); if (tcp_get_flags(th) & TH_RST) - pf_set_protostate(*state, PF_PEER_BOTH, TCPS_TIME_WAIT); + pf_set_protostate(state, PF_PEER_BOTH, TCPS_TIME_WAIT); /* Fall through to PASS packet */ } else { - if ((*state)->dst.state == TCPS_SYN_SENT && - (*state)->src.state == TCPS_SYN_SENT) { + if (state->dst.state == TCPS_SYN_SENT && + state->src.state == TCPS_SYN_SENT) { /* Send RST for state mismatches during handshake */ if (!(tcp_get_flags(th) & TH_RST)) - pf_send_tcp((*state)->rule, pd->af, + pf_send_tcp(state->rule, pd->af, pd->dst, pd->src, th->th_dport, th->th_sport, ntohl(th->th_ack), 0, TH_RST, 0, 0, - (*state)->rule->return_ttl, M_SKIP_FIREWALL, - 0, 0, (*state)->act.rtableid); + state->rule->return_ttl, M_SKIP_FIREWALL, + 0, 0, state->act.rtableid); src->seqlo = 0; src->seqhi = 1; src->max_win = 1; } else if (V_pf_status.debug >= PF_DEBUG_MISC) { printf("pf: BAD state: "); - pf_print_state(*state); + pf_print_state(state); pf_print_flags(tcp_get_flags(th)); printf(" seq=%u (%u) ack=%u len=%u ackskew=%d " "pkts=%llu:%llu dir=%s,%s\n", seq, orig_seq, ack, pd->p_len, ackskew, - (unsigned long long)(*state)->packets[0], - (unsigned long long)(*state)->packets[1], + (unsigned long long)state->packets[0], + (unsigned long long)state->packets[1], pd->dir == PF_IN ? "in" : "out", - pd->dir == (*state)->direction ? "fwd" : "rev"); + pd->dir == state->direction ? "fwd" : "rev"); printf("pf: State failure on: %c %c %c %c | %c %c\n", SEQ_GEQ(src->seqhi, data_end) ? ' ' : '1', SEQ_GEQ(seq, src->seqlo - (dst->max_win << dws)) ? @@ -6751,7 +6748,7 @@ pf_tcp_track_full(struct pf_kstate **state, struct pf_pdesc *pd, } static int -pf_tcp_track_sloppy(struct pf_kstate **state, struct pf_pdesc *pd, +pf_tcp_track_sloppy(struct pf_kstate *state, struct pf_pdesc *pd, u_short *reason, struct pf_state_peer *src, struct pf_state_peer *dst, u_int8_t psrc, u_int8_t pdst) { @@ -6759,21 +6756,21 @@ pf_tcp_track_sloppy(struct pf_kstate **state, struct pf_pdesc *pd, if (tcp_get_flags(th) & TH_SYN) if (src->state < TCPS_SYN_SENT) - pf_set_protostate(*state, psrc, TCPS_SYN_SENT); + pf_set_protostate(state, psrc, TCPS_SYN_SENT); if (tcp_get_flags(th) & TH_FIN) if (src->state < TCPS_CLOSING) - pf_set_protostate(*state, psrc, TCPS_CLOSING); + pf_set_protostate(state, psrc, TCPS_CLOSING); if (tcp_get_flags(th) & TH_ACK) { if (dst->state == TCPS_SYN_SENT) { - pf_set_protostate(*state, pdst, TCPS_ESTABLISHED); + pf_set_protostate(state, pdst, TCPS_ESTABLISHED); if (src->state == TCPS_ESTABLISHED && - (*state)->sns[PF_SN_LIMIT] != NULL && - pf_src_connlimit(*state)) { + state->sns[PF_SN_LIMIT] != NULL && + pf_src_connlimit(state)) { REASON_SET(reason, PFRES_SRCLIMIT); return (PF_DROP); } } else if (dst->state == TCPS_CLOSING) { - pf_set_protostate(*state, pdst, TCPS_FIN_WAIT_2); + pf_set_protostate(state, pdst, TCPS_FIN_WAIT_2); } else if (src->state == TCPS_SYN_SENT && dst->state < TCPS_SYN_SENT) { /* @@ -6782,11 +6779,11 @@ pf_tcp_track_sloppy(struct pf_kstate **state, struct pf_pdesc *pd, * the initial SYN without ever seeing a packet from * the destination, set the connection to established. */ - pf_set_protostate(*state, PF_PEER_BOTH, + pf_set_protostate(state, PF_PEER_BOTH, TCPS_ESTABLISHED); dst->state = src->state = TCPS_ESTABLISHED; - if ((*state)->sns[PF_SN_LIMIT] != NULL && - pf_src_connlimit(*state)) { + if (state->sns[PF_SN_LIMIT] != NULL && + pf_src_connlimit(state)) { REASON_SET(reason, PFRES_SRCLIMIT); return (PF_DROP); } @@ -6798,117 +6795,117 @@ pf_tcp_track_sloppy(struct pf_kstate **state, struct pf_pdesc *pd, * don't see the full bidirectional FIN/ACK+ACK * handshake. */ - pf_set_protostate(*state, pdst, TCPS_CLOSING); + pf_set_protostate(state, pdst, TCPS_CLOSING); } } if (tcp_get_flags(th) & TH_RST) - pf_set_protostate(*state, PF_PEER_BOTH, TCPS_TIME_WAIT); + pf_set_protostate(state, PF_PEER_BOTH, TCPS_TIME_WAIT); /* update expire time */ - (*state)->expire = pf_get_uptime(); + state->expire = pf_get_uptime(); if (src->state >= TCPS_FIN_WAIT_2 && dst->state >= TCPS_FIN_WAIT_2) - (*state)->timeout = PFTM_TCP_CLOSED; + state->timeout = PFTM_TCP_CLOSED; else if (src->state >= TCPS_CLOSING && dst->state >= TCPS_CLOSING) - (*state)->timeout = PFTM_TCP_FIN_WAIT; + state->timeout = PFTM_TCP_FIN_WAIT; else if (src->state < TCPS_ESTABLISHED || dst->state < TCPS_ESTABLISHED) - (*state)->timeout = PFTM_TCP_OPENING; + state->timeout = PFTM_TCP_OPENING; else if (src->state >= TCPS_CLOSING || dst->state >= TCPS_CLOSING) - (*state)->timeout = PFTM_TCP_CLOSING; + state->timeout = PFTM_TCP_CLOSING; else - (*state)->timeout = PFTM_TCP_ESTABLISHED; + state->timeout = PFTM_TCP_ESTABLISHED; return (PF_PASS); } static int -pf_synproxy(struct pf_pdesc *pd, struct pf_kstate **state, u_short *reason) +pf_synproxy(struct pf_pdesc *pd, struct pf_kstate *state, u_short *reason) { - struct pf_state_key *sk = (*state)->key[pd->didx]; + struct pf_state_key *sk = state->key[pd->didx]; struct tcphdr *th = &pd->hdr.tcp; - if ((*state)->src.state == PF_TCPS_PROXY_SRC) { - if (pd->dir != (*state)->direction) { + if (state->src.state == PF_TCPS_PROXY_SRC) { + if (pd->dir != state->direction) { REASON_SET(reason, PFRES_SYNPROXY); return (PF_SYNPROXY_DROP); } if (tcp_get_flags(th) & TH_SYN) { - if (ntohl(th->th_seq) != (*state)->src.seqlo) { + if (ntohl(th->th_seq) != state->src.seqlo) { REASON_SET(reason, PFRES_SYNPROXY); return (PF_DROP); } - pf_send_tcp((*state)->rule, pd->af, pd->dst, + pf_send_tcp(state->rule, pd->af, pd->dst, pd->src, th->th_dport, th->th_sport, - (*state)->src.seqhi, ntohl(th->th_seq) + 1, - TH_SYN|TH_ACK, 0, (*state)->src.mss, 0, - M_SKIP_FIREWALL, 0, 0, (*state)->act.rtableid); + state->src.seqhi, ntohl(th->th_seq) + 1, + TH_SYN|TH_ACK, 0, state->src.mss, 0, + M_SKIP_FIREWALL, 0, 0, state->act.rtableid); REASON_SET(reason, PFRES_SYNPROXY); return (PF_SYNPROXY_DROP); } else if ((tcp_get_flags(th) & (TH_ACK|TH_RST|TH_FIN)) != TH_ACK || - (ntohl(th->th_ack) != (*state)->src.seqhi + 1) || - (ntohl(th->th_seq) != (*state)->src.seqlo + 1)) { + (ntohl(th->th_ack) != state->src.seqhi + 1) || + (ntohl(th->th_seq) != state->src.seqlo + 1)) { REASON_SET(reason, PFRES_SYNPROXY); return (PF_DROP); - } else if ((*state)->sns[PF_SN_LIMIT] != NULL && - pf_src_connlimit(*state)) { + } else if (state->sns[PF_SN_LIMIT] != NULL && + pf_src_connlimit(state)) { REASON_SET(reason, PFRES_SRCLIMIT); return (PF_DROP); } else - pf_set_protostate(*state, PF_PEER_SRC, + pf_set_protostate(state, PF_PEER_SRC, PF_TCPS_PROXY_DST); } - if ((*state)->src.state == PF_TCPS_PROXY_DST) { - if (pd->dir == (*state)->direction) { + if (state->src.state == PF_TCPS_PROXY_DST) { + if (pd->dir == state->direction) { if (((tcp_get_flags(th) & (TH_SYN|TH_ACK)) != TH_ACK) || - (ntohl(th->th_ack) != (*state)->src.seqhi + 1) || - (ntohl(th->th_seq) != (*state)->src.seqlo + 1)) { + (ntohl(th->th_ack) != state->src.seqhi + 1) || + (ntohl(th->th_seq) != state->src.seqlo + 1)) { REASON_SET(reason, PFRES_SYNPROXY); return (PF_DROP); } - (*state)->src.max_win = MAX(ntohs(th->th_win), 1); - if ((*state)->dst.seqhi == 1) - (*state)->dst.seqhi = htonl(arc4random()); - pf_send_tcp((*state)->rule, pd->af, + state->src.max_win = MAX(ntohs(th->th_win), 1); + if (state->dst.seqhi == 1) + state->dst.seqhi = htonl(arc4random()); + pf_send_tcp(state->rule, pd->af, &sk->addr[pd->sidx], &sk->addr[pd->didx], sk->port[pd->sidx], sk->port[pd->didx], - (*state)->dst.seqhi, 0, TH_SYN, 0, - (*state)->src.mss, 0, - (*state)->orig_kif->pfik_ifp == V_loif ? M_LOOP : 0, - (*state)->tag, 0, (*state)->act.rtableid); + state->dst.seqhi, 0, TH_SYN, 0, + state->src.mss, 0, + state->orig_kif->pfik_ifp == V_loif ? M_LOOP : 0, + state->tag, 0, state->act.rtableid); REASON_SET(reason, PFRES_SYNPROXY); return (PF_SYNPROXY_DROP); } else if (((tcp_get_flags(th) & (TH_SYN|TH_ACK)) != (TH_SYN|TH_ACK)) || - (ntohl(th->th_ack) != (*state)->dst.seqhi + 1)) { + (ntohl(th->th_ack) != state->dst.seqhi + 1)) { REASON_SET(reason, PFRES_SYNPROXY); return (PF_DROP); } else { - (*state)->dst.max_win = MAX(ntohs(th->th_win), 1); - (*state)->dst.seqlo = ntohl(th->th_seq); - pf_send_tcp((*state)->rule, pd->af, pd->dst, + state->dst.max_win = MAX(ntohs(th->th_win), 1); + state->dst.seqlo = ntohl(th->th_seq); + pf_send_tcp(state->rule, pd->af, pd->dst, pd->src, th->th_dport, th->th_sport, ntohl(th->th_ack), ntohl(th->th_seq) + 1, - TH_ACK, (*state)->src.max_win, 0, 0, 0, - (*state)->tag, 0, (*state)->act.rtableid); - pf_send_tcp((*state)->rule, pd->af, + TH_ACK, state->src.max_win, 0, 0, 0, + state->tag, 0, state->act.rtableid); + pf_send_tcp(state->rule, pd->af, &sk->addr[pd->sidx], &sk->addr[pd->didx], sk->port[pd->sidx], sk->port[pd->didx], - (*state)->src.seqhi + 1, (*state)->src.seqlo + 1, - TH_ACK, (*state)->dst.max_win, 0, 0, - M_SKIP_FIREWALL, 0, 0, (*state)->act.rtableid); - (*state)->src.seqdiff = (*state)->dst.seqhi - - (*state)->src.seqlo; - (*state)->dst.seqdiff = (*state)->src.seqhi - - (*state)->dst.seqlo; - (*state)->src.seqhi = (*state)->src.seqlo + - (*state)->dst.max_win; - (*state)->dst.seqhi = (*state)->dst.seqlo + - (*state)->src.max_win; - (*state)->src.wscale = (*state)->dst.wscale = 0; - pf_set_protostate(*state, PF_PEER_BOTH, + state->src.seqhi + 1, state->src.seqlo + 1, + TH_ACK, state->dst.max_win, 0, 0, + M_SKIP_FIREWALL, 0, 0, state->act.rtableid); + state->src.seqdiff = state->dst.seqhi - + state->src.seqlo; + state->dst.seqdiff = state->src.seqhi - + state->dst.seqlo; + state->src.seqhi = state->src.seqlo + + state->dst.max_win; + state->dst.seqhi = state->dst.seqlo + + state->src.max_win; + state->src.wscale = state->dst.wscale = 0; + pf_set_protostate(state, PF_PEER_BOTH, TCPS_ESTABLISHED); REASON_SET(reason, PFRES_SYNPROXY); return (PF_SYNPROXY_DROP); @@ -6967,7 +6964,7 @@ pf_test_state(struct pf_kstate **state, struct pf_pdesc *pd, u_short *reason) case IPPROTO_TCP: { struct tcphdr *th = &pd->hdr.tcp; - if ((action = pf_synproxy(pd, state, reason)) != PF_PASS) + if ((action = pf_synproxy(pd, *state, reason)) != PF_PASS) return (action); if ((*state)->src.state >= TCPS_FIN_WAIT_2 && (*state)->dst.state >= TCPS_FIN_WAIT_2 && @@ -6987,13 +6984,13 @@ pf_test_state(struct pf_kstate **state, struct pf_pdesc *pd, u_short *reason) return (PF_DROP); } if ((*state)->state_flags & PFSTATE_SLOPPY) { - if (pf_tcp_track_sloppy(state, pd, reason, src, dst, + if (pf_tcp_track_sloppy(*state, pd, reason, src, dst, psrc, pdst) == PF_DROP) return (PF_DROP); } else { int ret; - ret = pf_tcp_track_full(state, pd, reason, + ret = pf_tcp_track_full(*state, pd, reason, ©back, src, dst, psrc, pdst); if (ret == PF_DROP) return (PF_DROP); @@ -8001,7 +7998,8 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd, nk = (*state)->key[pd->didx]; #if defined(INET) && defined(INET6) - int afto, sidx, didx; + int afto, sidx, didx; + u_int16_t dummy_cksum = 0; afto = pd->af != nk->af; @@ -8026,10 +8024,10 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd, nk->af)) return (PF_DROP); pf_change_ap(pd->m, pd2.src, &th.th_sport, - pd->ip_sum, &th.th_sum, &nk->addr[pd2.sidx], + pd->ip_sum, &dummy_cksum, &nk->addr[pd2.sidx], nk->port[sidx], 1, pd->af, nk->af); pf_change_ap(pd->m, pd2.dst, &th.th_dport, - pd->ip_sum, &th.th_sum, &nk->addr[pd2.didx], + pd->ip_sum, &dummy_cksum, &nk->addr[pd2.didx], nk->port[didx], 1, pd->af, nk->af); m_copyback(pd2.m, pd2.off, 8, (c_caddr_t)&th); PF_ACPY(&pd->nsaddr, &nk->addr[pd2.sidx], @@ -10416,7 +10414,7 @@ pf_test(sa_family_t af, int dir, int pflags, struct ifnet *ifp, struct mbuf **m0 s->src.seqhi = ntohl(pd.hdr.tcp.th_ack) - 1; s->src.seqlo = ntohl(pd.hdr.tcp.th_seq) - 1; pf_set_protostate(s, PF_PEER_SRC, PF_TCPS_PROXY_DST); - action = pf_synproxy(&pd, &s, &reason); + action = pf_synproxy(&pd, s, &reason); break; } else { action = pf_test_rule(&r, &s, &pd, |