On Fri, Sep 30, 2016 at 11:55:48PM +0200, Alexandr Nedvedicky wrote:
> The patch makes PF to send 'challenge ACK' for SYN packet, which matches
> session in established state.

regress/sys/net/pf_forward has found a bug in your code.  Looks
like the route-to feature was affected.  By splitting the if
expression and keeping the return (PF_DROP) in the outer block,
much more packets than before were dropped.

> -             if (((pd->hdr.tcp->th_flags & (TH_SYN|TH_ACK)) == TH_SYN) &&
> -                 dst->state >= TCPS_FIN_WAIT_2 &&
> -                 src->state >= TCPS_FIN_WAIT_2) {
> +             if ((pd->hdr.tcp->th_flags & (TH_SYN|TH_ACK)) == TH_SYN) {
> +
> +                     if (dst->state >= TCPS_FIN_WAIT_2 &&
> +                         src->state >= TCPS_FIN_WAIT_2) {
...
> +                     } else if (dst->state >= TCPS_ESTABLISHED &&
> +                         src->state >= TCPS_ESTABLISHED) {
...

>                       }
...
>                       return (PF_DROP);
>               }

With this follow up fix it passes and is OK bluhm@.

diff --git a/net/pf.c b/net/pf.c
index f65bc4e..1a862df 100644
--- a/net/pf.c
+++ b/net/pf.c
@@ -4682,6 +4682,7 @@ pf_test_state(struct pf_pdesc *pd, struct pf_state 
**state, u_short *reason)
                                pf_remove_state(*state);
                                *state = NULL;
                                pd->m->m_pkthdr.pf.inp = inp;
+                               return (PF_DROP);
                        } else if (dst->state >= TCPS_ESTABLISHED &&
                            src->state >= TCPS_ESTABLISHED) {
                                 /*
@@ -4693,8 +4694,8 @@ pf_test_state(struct pf_pdesc *pd, struct pf_state 
**state, u_short *reason)
                                 * to get in sync again.
                                  */
                                 pf_send_challenge_ack(pd, *state, src, dst);
+                               return (PF_DROP);
                        }
-                       return (PF_DROP);
                }
 
                if ((*state)->state_flags & PFSTATE_SLOPPY) {

Reply via email to