PERFORCE change 145064 for review
Rui Paulo
rpaulo at FreeBSD.org
Fri Jul 11 12:09:26 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=145064
Change 145064 by rpaulo at 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));
More information about the p4-projects
mailing list