Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Jul 2008 12:09:24 GMT
From:      Rui Paulo <rpaulo@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 145064 for review
Message-ID:  <200807111209.m6BC9OcW036972@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200807111209.m6BC9OcW036972>