PERFORCE change 142812 for review
Rui Paulo
rpaulo at FreeBSD.org
Tue Jun 3 14:24:51 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=142812
Change 142812 by rpaulo at rpaulo_epsilon on 2008/06/03 14:24:24
Complete pcap file dumping.
Affected files ...
.. //depot/projects/soc2008/rpaulo-tcpad/dumper.c#2 edit
.. //depot/projects/soc2008/rpaulo-tcpad/dumper.h#2 edit
.. //depot/projects/soc2008/rpaulo-tcpad/handler.c#5 edit
.. //depot/projects/soc2008/rpaulo-tcpad/main.c#5 edit
.. //depot/projects/soc2008/rpaulo-tcpad/tcpad.h#5 edit
Differences ...
==== //depot/projects/soc2008/rpaulo-tcpad/dumper.c#2 (text+ko) ====
@@ -23,9 +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/dumper.c#1 $
+ * $P4: //depot/projects/soc2008/rpaulo-tcpad/dumper.c#2 $
*/
+#include <string.h>
+#include <stdlib.h>
#include <sys/queue.h>
#include <pcap.h>
@@ -35,28 +37,29 @@
* Adds a packet to a pool of packets pertinent to this connection.
*/
void
-dumper_addpkt(struct dumppkth *head, struct pcap_pkthdr *ph, unsigned char *headers)
+dumper_addpkt(struct dumppkth *head, const struct pcap_pkthdr *ph,
+ const unsigned char *headers)
{
struct dumppkt *dp;
dp = malloc(sizeof(*dp));
- memcpy(&dp.pheader, ph, sizeof(dp.pheader));
- memcpy(&dp.headers, headers, sizeof(dp.headers));
+ memcpy(&dp->pheader, ph, sizeof(struct pcap_pkthdr));
+ memcpy(&dp->headers, headers, 127); /* XXX */
/* XXX: honour the size of this list */
- TAILQ_INSERT_TAIL(dhead, dp, entries);
+ TAILQ_INSERT_TAIL(head, dp, entries);
}
/**
* An error occured. Dump the packet list to a file.
*/
void
-dumper_error(pcap_t *p, const char *path, struct dumppkt *head)
+dumper_error(pcap_t *p, const char *path, struct dumppkth *head)
{
pcap_dumper_t *pd;
struct dumppkt *dp;
pd = pcap_dump_open(p, path);
TAILQ_FOREACH(dp, head, entries)
- pcap_dump(pd, dp->pheader, dp->headers);
+ pcap_dump(pd, &dp->pheader, dp->headers);
pcap_dump_close(pd);
}
==== //depot/projects/soc2008/rpaulo-tcpad/dumper.h#2 (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#1 $
+ * $P4: //depot/projects/soc2008/rpaulo-tcpad/dumper.h#2 $
*/
#ifndef _DUMPER_H_
@@ -34,13 +34,14 @@
struct dumppkt {
TAILQ_ENTRY(dumppkt) entries;
struct pcap_pkthdr pheader;
- unsigned char headers[50]; /* Enough for IP/IPv6 + TCP */
+ unsigned char headers[128]; /* Enough for IP/IPv6 + TCP */
};
TAILQ_HEAD(dumppkth, entry);
-void
-dumper_addpkt(struct dumppkth *head, struct pcap_pkthdr *ph,
- unsigned char *headers);
+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);
+
#endif /* _DUMPER_H_ */
==== //depot/projects/soc2008/rpaulo-tcpad/handler.c#5 (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#4 $
+ * $P4: //depot/projects/soc2008/rpaulo-tcpad/handler.c#5 $
*/
#include <stdio.h>
@@ -92,7 +92,7 @@
LIST_INSERT_HEAD(&chead, cp, entries);
print_packet(bytes, linkhlen);
TAILQ_INIT(&cp->pktshead);
- dumper_addpkt(ph, bytes);
+ dumper_addpkt(&cp->pktshead, ph, bytes);
} else if ((tcp->th_flags & TH_FLAGS) == (TH_SYN|TH_ACK)) {
if (cp) {
DPRINTF("connection already being tracked!\n");
@@ -112,9 +112,12 @@
DPRINTF("%s\n",inet_ntoa(cp->dv4addr));
LIST_INSERT_HEAD(&chead, cp, entries);
print_packet(bytes, linkhlen);
+ TAILQ_INIT(&cp->pktshead);
+ dumper_addpkt(&cp->pktshead, ph, bytes);
} else if ((tcp->th_flags & TH_FLAGS) == TH_ACK) {
if (cp) {
+ dumper_addpkt(&cp->pktshead, ph, bytes);
if (cp->tcpstate == TCPS_SYN_SENT ||
cp->tcpstate == TCPS_SYN_RECEIVED) {
cp->tcpstate = TCPS_ESTABLISHED;
@@ -130,11 +133,13 @@
}
} else if ((tcp->th_flags & TH_FLAGS) == (TH_FIN|TH_ACK)) {
if (cp) {
+ dumper_addpkt(&cp->pktshead, ph, bytes);
if (cp->tcpstate == TCPS_ESTABLISHED) {
cp->tcpstate = TCPS_FIN_WAIT_1;
rcp->tcpstate = TCPS_CLOSE_WAIT;
DPRINTF("fin_wait_1\n");
print_packet(bytes, linkhlen);
+ dumper_error(p, "test.cap", &cp->pktshead);
}
}
} else if ((tcp->th_flags & TH_FLAGS) == (TH_RST|TH_ACK)) {
==== //depot/projects/soc2008/rpaulo-tcpad/main.c#5 (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/main.c#4 $
+ * $P4: //depot/projects/soc2008/rpaulo-tcpad/main.c#5 $
*/
#include <err.h>
@@ -33,6 +33,7 @@
#include <pcap.h>
#include <sys/queue.h>
+#include "dumper.h"
#include "tcpad.h"
#include "device.h"
#include "linkhdr.h"
@@ -55,7 +56,6 @@
int ch;
char *interface;
char errbuf[PCAP_ERRBUF_SIZE];
- pcap_t *p;
struct bpf_program fp;
char filter[] = "ip proto \\tcp";
int linkhlen;
==== //depot/projects/soc2008/rpaulo-tcpad/tcpad.h#5 (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#4 $
+ * $P4: //depot/projects/soc2008/rpaulo-tcpad/tcpad.h#5 $
*/
#ifndef _TCPAD_H_
@@ -31,6 +31,8 @@
#include <netinet/in.h>
+pcap_t *p;
+
typedef struct _conn_t {
LIST_ENTRY(_conn_t) entries;
struct in_addr sv4addr;
More information about the p4-projects
mailing list