PERFORCE change 143801 for review

Rui Paulo rpaulo at FreeBSD.org
Fri Jun 20 00:55:30 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=143801

Change 143801 by rpaulo at rpaulo_epsilon on 2008/06/20 00:55:06

	Lower timer for debugging purposes.
	Add helper module.
	Move find_conn() to helper module.
	Implement dumper_free().
	Add forward pointer to the other side of the connection.
	Implement resource dealocation when timer expires.

Affected files ...

.. //depot/projects/soc2008/rpaulo-tcpad/Makefile#8 edit
.. //depot/projects/soc2008/rpaulo-tcpad/dumper.c#6 edit
.. //depot/projects/soc2008/rpaulo-tcpad/dumper.h#4 edit
.. //depot/projects/soc2008/rpaulo-tcpad/handler.c#12 edit
.. //depot/projects/soc2008/rpaulo-tcpad/helper.c#1 add
.. //depot/projects/soc2008/rpaulo-tcpad/helper.h#1 add
.. //depot/projects/soc2008/rpaulo-tcpad/tcpad.h#8 edit
.. //depot/projects/soc2008/rpaulo-tcpad/timer.c#2 edit

Differences ...

==== //depot/projects/soc2008/rpaulo-tcpad/Makefile#8 (text+ko) ====

@@ -1,7 +1,7 @@
-# $P4: //depot/projects/soc2008/rpaulo-tcpad/Makefile#7 $
+# $P4: //depot/projects/soc2008/rpaulo-tcpad/Makefile#8 $
 
 PROG=tcpad
-SRCS=main.c device.c linkhdr.c handler.c dumper.c timer.c
+SRCS=main.c device.c linkhdr.c handler.c helper.c dumper.c timer.c
 CFLAGS+=-DDEBUG -ggdb
 WARNS=5
 LDADD=-lpcap

==== //depot/projects/soc2008/rpaulo-tcpad/dumper.c#6 (text+ko) ====

@@ -23,14 +23,17 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $P4: //depot/projects/soc2008/rpaulo-tcpad/dumper.c#5 $
+ * $P4: //depot/projects/soc2008/rpaulo-tcpad/dumper.c#6 $
  */
 
+#include <assert.h>
+#include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <sys/queue.h>
 #include <pcap.h>
 
+#include "debug.h"
 #include "dumper.h"
 
 /**
@@ -71,3 +74,23 @@
 	    pcap_dump((u_char *)pd, &dp->pheader, dp->headers);
 	pcap_dump_close(pd);
 }
+
+/**
+ * Free a list of packets and the head.
+ */
+void
+dumper_free(struct dumppkth *head)
+{
+	struct dumppkt *p1, *p2;
+
+	assert(head != NULL);
+
+	DPRINTF("freeing dumppkth struct @ %p\n", head);
+	p1 = TAILQ_FIRST(head);
+	while (p1 != NULL) {
+		p2 = TAILQ_NEXT(p1, entries);
+		free(p1);
+		p1 = p2;
+	}
+	free(head);
+}

==== //depot/projects/soc2008/rpaulo-tcpad/dumper.h#4 (text+ko) ====

@@ -23,7 +23,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $P4: //depot/projects/soc2008/rpaulo-tcpad/dumper.h#3 $
+ * $P4: //depot/projects/soc2008/rpaulo-tcpad/dumper.h#4 $
  */
 
 #ifndef _DUMPER_H_
@@ -41,7 +41,8 @@
 
 void	dumper_addpkt(struct dumppkth *head, const struct pcap_pkthdr *ph,
     const unsigned char *headers);
-void	dumper_error(pcap_t *p, const char *path, struct dumppkth *head);
+void	dumper_error(pcap_t *, const char *path, struct dumppkth *head);
+void	dumper_free(struct dumppkth *head);
 
 
 #endif /* _DUMPER_H_ */

==== //depot/projects/soc2008/rpaulo-tcpad/handler.c#12 (text+ko) ====

@@ -23,7 +23,7 @@
  * 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#11 $
+ * $P4: //depot/projects/soc2008/rpaulo-tcpad/handler.c#12 $
  */
 
 #include <stdio.h>
@@ -43,12 +43,11 @@
 #include "linkhdr.h"
 #include "handler.h"
 #include "dumper.h"
+#include "helper.h"
 #include "tcpad.h"
 #include "debug.h"
 
 
-static struct tcpc 	*find_conn(struct in_addr ipsrc, struct in_addr ipdst,
-    unsigned short sport, unsigned short dport);
 static void		print_packet(const unsigned char *bytes, const int linkhlen);
 
 void
@@ -148,9 +147,10 @@
 		}
 		if (cp->t_state == TCPS_LAST_ACK ||
 		    cp->t_state == TCPS_CLOSING) {
+			cp->rcp = rcp;
+			rcp->rcp = cp;
 			cp->t_state = TCPS_TIME_WAIT;
 			DPRINTF("connection down\n");
-			dumper_error(p, "a.cap", cp->pktshead);
 		}
 	} else if ((tcp->th_flags & TH_FLAGS) == (TH_FIN|TH_ACK)) {
 		if (cp == NULL || rcp == NULL)
@@ -184,22 +184,6 @@
 	}
 }
 
-static struct tcpc *
-find_conn(struct in_addr ipsrc, struct in_addr ipdst, unsigned short
-    sport, unsigned short dport)
-{
-	struct tcpc *cp;
-
-	LIST_FOREACH(cp, &tcpchead, entries) {
-		if (memcmp(&cp->sv4addr, &ipsrc, sizeof(struct in_addr)) == 0 &&
-		    memcmp(&cp->dv4addr, &ipdst, sizeof(struct in_addr)) == 0 &&
-		    cp->sport == sport && cp->dport == dport) {
-			return (cp);
-		}
-	}
-	return (NULL);
-}
-
 static void
 print_packet(const unsigned char *bytes, const int linkhlen)
 {

==== //depot/projects/soc2008/rpaulo-tcpad/tcpad.h#8 (text+ko) ====

@@ -23,7 +23,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $P4: //depot/projects/soc2008/rpaulo-tcpad/tcpad.h#7 $
+ * $P4: //depot/projects/soc2008/rpaulo-tcpad/tcpad.h#8 $
  */
 
 #ifndef _TCPAD_H_
@@ -42,6 +42,7 @@
 	int t_state;		/* TCP FSM state */
 	int isv6;
 	struct dumppkth *pktshead;
+	struct tcpc *rcp;
 };
 
 LIST_HEAD(tcpchead, tcpc) tcpchead;

==== //depot/projects/soc2008/rpaulo-tcpad/timer.c#2 (text+ko) ====

@@ -23,10 +23,11 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $P4: //depot/projects/soc2008/rpaulo-tcpad/timer.c#1 $
+ * $P4: //depot/projects/soc2008/rpaulo-tcpad/timer.c#2 $
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <signal.h>
 #include <pcap.h>
 #include <sys/queue.h>
@@ -36,9 +37,15 @@
 #include "debug.h"
 #include "tcpad.h"
 #include "timer.h"
+#include "helper.h"
+#include "dumper.h"
 
 static void	timer_sigalrm(int sig);
 
+/**
+ * @brief
+ * Timer setup.
+ */
 int
 timer_setup(void)
 {
@@ -51,23 +58,32 @@
 		firstime = 0;
 	}
 
-	itp.it_interval.tv_sec  = 30;
+	itp.it_interval.tv_sec  = 1;
 	itp.it_interval.tv_usec = 0;
-	itp.it_value.tv_sec  = 30;
+	itp.it_value.tv_sec  = 1;
 	itp.it_value.tv_usec = 0;
 
-	printf("%d\n", setitimer(ITIMER_REAL, &itp, NULL));
-	return 0;
+	return (setitimer(ITIMER_REAL, &itp, NULL));
 }
 
+/**
+ * @brief
+ * Signal catching function.
+ */
 static void
 timer_sigalrm(int __unused sig)
 {
-        struct tcpc *cp;
+        struct tcpc *cp, *cp_t;
 
-        LIST_FOREACH(cp, &tcpchead, entries) {
+        LIST_FOREACH_SAFE(cp, &tcpchead, entries, cp_t) {
 		if (cp->t_state == TCPS_TIME_WAIT) {
 			DPRINTF("freeing tcp connection @ %p\n", cp);
+			LIST_REMOVE(cp, entries);
+			if (cp->pktshead)
+				dumper_free(cp->pktshead);
+			cp->pktshead = NULL;
+			cp->rcp->pktshead = NULL;
+			free(cp);
 		}
         }
 


More information about the p4-projects mailing list