From owner-p4-projects@FreeBSD.ORG Fri Jul 11 12:09:25 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5C4FC1065684; Fri, 11 Jul 2008 12:09:25 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1FE55106567E for ; Fri, 11 Jul 2008 12:09:25 +0000 (UTC) (envelope-from rpaulo@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 16A448FC15 for ; Fri, 11 Jul 2008 12:09:25 +0000 (UTC) (envelope-from rpaulo@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m6BC9OrU036974 for ; Fri, 11 Jul 2008 12:09:24 GMT (envelope-from rpaulo@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m6BC9OcW036972 for perforce@freebsd.org; Fri, 11 Jul 2008 12:09:24 GMT (envelope-from rpaulo@FreeBSD.org) Date: Fri, 11 Jul 2008 12:09:24 GMT Message-Id: <200807111209.m6BC9OcW036972@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to rpaulo@FreeBSD.org using -f From: Rui Paulo To: Perforce Change Reviews Cc: Subject: PERFORCE change 145064 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Jul 2008 12:09:26 -0000 http://perforce.freebsd.org/chv.cgi?CH=145064 Change 145064 by rpaulo@rpaulo_epsilon on 2008/07/11 12:08:27 Checkpoint some work. Affected files ... .. //depot/projects/soc2008/rpaulo-tcpad/handler.c#14 edit Differences ... ==== //depot/projects/soc2008/rpaulo-tcpad/handler.c#14 (text+ko) ==== @@ -23,9 +23,10 @@ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * $P4: //depot/projects/soc2008/rpaulo-tcpad/handler.c#13 $ + * $P4: //depot/projects/soc2008/rpaulo-tcpad/handler.c#14 $ */ +#include #include #include #include @@ -72,7 +73,9 @@ if ((tcp->th_flags & TH_FLAGS) == TH_SYN) { if (cp) { - DPRINTF("connection already being tracked!\n"); + dumper_addpkt(cp->pktshead, ph, bytes); + dumper_error(p, cp->pktshead); + dumper_free(cp->pktshead); LIST_REMOVE(cp, entries); free(cp); } @@ -82,11 +85,14 @@ cp->sport = tcp->th_sport; cp->isv6 = 0; cp->iss = tcp->th_seq; + cp->snd_una = cp->iss; + cp->snd_nxt = cp->iss+1; + cp->rcv_wnd = tcp->th_win; memcpy(&cp->sv4addr, &ip->ip_src, sizeof(struct in_addr)); memcpy(&cp->dv4addr, &ip->ip_dst, sizeof(struct in_addr)); DPRINTF("tracking (syn) connection between %s and ", inet_ntoa(cp->sv4addr)); - DPRINTF("%s\n",inet_ntoa(cp->dv4addr)); + (tcp->th_flags & TH_FLAGS) == (TH_PSH|TH_ACK)) DPRINTF("%s\n",inet_ntoa(cp->dv4addr)); LIST_INSERT_HEAD(&tcpchead, cp, entries); /* @@ -103,16 +109,34 @@ return; } if (cp) { - DPRINTF("connection already being tracked!\n"); + dumper_addpkt(cp->pktshead, ph, bytes); + dumper_error(p, cp->pktshead); LIST_REMOVE(cp, entries); + LIST_REMOVE(rcp, entries); free(cp); + free(rcp); + return; + } + + if (SEQ_LT(tcp->th_ack, rcp->snd_nxt)) { + dumper_addpkt(rcp->pktshead, ph, bytes); + dumper_error(p, rcp->pktshead); + LIST_REMOVE(rcp, entries); + free(rcp); + return; } + + cp = malloc(sizeof(*cp)); cp->t_state = TCPS_SYN_RECEIVED; cp->dport = tcp->th_dport; cp->sport = tcp->th_sport; cp->isv6 = 0; - cp->irs = tcp->th_seq; + cp->iss = tcp->th_seq; + cp->irs = rcp->iss; + cp->snd_una = cp->iss; + cp->snd_nxt = cp->iss+1; + rcp->irs = cp->iss; memcpy(&cp->sv4addr, &ip->ip_src, sizeof(struct in_addr)); memcpy(&cp->dv4addr, &ip->ip_dst, sizeof(struct in_addr)); DPRINTF("tracking (syn/ack) connection between %s and ", @@ -120,28 +144,43 @@ DPRINTF("%s\n",inet_ntoa(cp->dv4addr)); LIST_INSERT_HEAD(&tcpchead, cp, entries); - /* rcp->pktshead should have been already malloc'ed and - initted */ + assert(rcp->pktshead != NULL); cp->pktshead = rcp->pktshead; dumper_addpkt(cp->pktshead, ph, bytes); - } else if ((tcp->th_flags & TH_FLAGS) == TH_ACK) { + } else if ((tcp->th_flags & TH_FLAGS) == TH_ACK || + (tcp->th_flags & TH_FLAGS) == (TH_PSH|TH_ACK)) { if (cp == NULL || rcp == NULL) return; dumper_addpkt(cp->pktshead, ph, bytes); - if (cp->t_state == TCPS_SYN_SENT || + if (cp->t_state == TCPS_ESTABLISHED && + rcp->t_state == TCPS_ESTABLISHED) { + if (tcp->th_len == 0 && cp->rcv_win == 0) { + + if (SEQ_LT(tcp->th_ack, cp->snd_una) && + SEQ_LEQ(tcp->th_ack, cp->snd_nxt)) { + + } else { + dumper_error(p, rcp->pktshead); + LIST_REMOVE(rcp, entries); + free(rcp); + return; + } + + } + else if (cp->t_state == TCPS_SYN_SENT || cp->t_state == TCPS_SYN_RECEIVED) { cp->t_state = TCPS_ESTABLISHED; rcp->t_state = TCPS_ESTABLISHED; DPRINTF("established\n"); } - if (cp->t_state == TCPS_ESTABLISHED && + else if (cp->t_state == TCPS_ESTABLISHED && rcp->t_state == TCPS_FIN_WAIT_1) { DPRINTF("first ack\n"); cp->t_state = TCPS_CLOSE_WAIT; rcp->t_state = TCPS_FIN_WAIT_2; } - if (cp->t_state == TCPS_LAST_ACK || + else if (cp->t_state == TCPS_LAST_ACK || cp->t_state == TCPS_CLOSING) { cp->rcp = rcp; rcp->rcp = cp; @@ -169,12 +208,8 @@ } } else if ((tcp->th_flags & TH_FLAGS) == (TH_RST|TH_ACK)) { if (rcp && rcp->t_state == TCPS_SYN_SENT) { - dumper_addpkt(rcp->pktshead, ph, bytes); - - if (SEQ_GEQ(tcp->th_seq, rcp->irs) && - SEQ_LEQ(tcp->th_seq, rcp->irs + rcp->rcv_wnd)) { - + if (SEQ_GEQ(tcp->th_ack, rcp->snd_nxt)) { DPRINTF("stopped tracking connection (rst) between" " %s and ", inet_ntoa(rcp->sv4addr)); DPRINTF("%s\n",inet_ntoa(rcp->dv4addr));