Module Name:    src
Committed By:   pooka
Date:           Tue Jan 26 17:52:21 UTC 2010

Modified Files:
        src/sys/rump/net/rumptest: Makefile rumptest_net.c

Log Message:
support bpf from sockin too (i.e. DLT_NULL/AF_UNSPEC)


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/rump/net/rumptest/Makefile
cvs rdiff -u -r1.16 -r1.17 src/sys/rump/net/rumptest/rumptest_net.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/rump/net/rumptest/Makefile
diff -u src/sys/rump/net/rumptest/Makefile:1.9 src/sys/rump/net/rumptest/Makefile:1.10
--- src/sys/rump/net/rumptest/Makefile:1.9	Mon Jan 25 22:26:19 2010
+++ src/sys/rump/net/rumptest/Makefile	Tue Jan 26 17:52:21 2010
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.9 2010/01/25 22:26:19 pooka Exp $
+#	$NetBSD: Makefile,v 1.10 2010/01/26 17:52:21 pooka Exp $
 #
 
 PROG=	rumptest_net
@@ -9,13 +9,14 @@
 LDADD=	-lrump -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_virtif \
 	-lrumpuser -lpthread
 CPPFLAGS+=	-DFULL_NETWORK_STACK
+
+# use protocol families provided by host kernel sockets
+#LDADD=	-lrump -lrumpnet -lrumpnet_sockin -lrumpuser -lpthread
+
 # for loading bpf module
 LDADD+=	-lrumpvfs
 
-# uncomment for bpf support
+# uncomment for bpf support (there's kmod support too, though)
 #LDADD+= 	-lrumpdev_bpf -lrumpdev -lrumpvfs
 
-# use protocol families provided by host kernel sockets
-#LDADD=	-lrump -lrumpnet -lrumpnet_sockin -lrumpuser -lpthread
-
 .include <bsd.prog.mk>

Index: src/sys/rump/net/rumptest/rumptest_net.c
diff -u src/sys/rump/net/rumptest/rumptest_net.c:1.16 src/sys/rump/net/rumptest/rumptest_net.c:1.17
--- src/sys/rump/net/rumptest/rumptest_net.c:1.16	Mon Jan 25 22:25:38 2010
+++ src/sys/rump/net/rumptest/rumptest_net.c	Tue Jan 26 17:52:21 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumptest_net.c,v 1.16 2010/01/25 22:25:38 pooka Exp $	*/
+/*	$NetBSD: rumptest_net.c,v 1.17 2010/01/26 17:52:21 pooka Exp $	*/
 
 /*
  * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
@@ -55,11 +55,19 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <vis.h>
 
 #define DEST_ADDR "204.152.190.12"	/* www.NetBSD.org */
 #define DEST_PORT 80			/* take a wild guess */
 
 static in_addr_t youraddr;
+static in_addr_t myaddr;
+
+#ifdef FULL_NETWORK_STACK
+#define IFNAME "virt0" /* XXX: hardcoded */
+#else
+#define IFNAME "sockin0"
+#endif
 
 #ifdef FULL_NETWORK_STACK
 /*
@@ -80,9 +88,6 @@
 #define MYBCAST "10.181.181.255"
 #define MYMASK "255.255.255.0"
 #define MYGW "10.181.181.1"
-#define IFNAME "virt0" /* XXX: hardcoded */
-
-static in_addr_t myaddr;
 
 static void
 configure_interface(void)
@@ -181,6 +186,71 @@
 		err(1, "routing incomplete");
 	rump_sys_close(s);
 }
+#endif /* FULL_NETWORK_STACK */
+
+static void
+dump_ether(uint8_t *data, size_t caplen)
+{
+	char fmt[64];
+	struct ether_header *ehdr;
+	struct ip *ip;
+	struct tcphdr *tcph;
+
+	ehdr = (void *)data;
+	switch (ntohs(ehdr->ether_type)) {
+	case ETHERTYPE_ARP:
+		printf("ARP\n");
+		break;
+	case ETHERTYPE_IP:
+		printf("IP, ");
+		ip = (void *)((uint8_t *)ehdr + sizeof(*ehdr));
+		printf("version %d, proto ", ip->ip_v);
+		if (ip->ip_p == IPPROTO_TCP)
+			printf("TCP");
+		else if (ip->ip_p == IPPROTO_UDP)
+			printf("UDP");
+		else
+			printf("unknown");
+		printf("\n");
+
+		/*
+		 * if it's the droids we're looking for,
+		 * print segment contents.
+		 */
+		if (ip->ip_src.s_addr != youraddr ||
+		    ip->ip_dst.s_addr != myaddr ||
+		    ip->ip_p != IPPROTO_TCP)
+			break;
+		tcph = (void *)((uint8_t *)ip + (ip->ip_hl<<2));
+		if (ntohs(tcph->th_sport) != 80)
+			break;
+
+		printf("requested data:\n");
+		sprintf(fmt, "%%%ds\n",
+		    ntohs(ip->ip_len) - (ip->ip_hl<<2));
+		printf(fmt, (char *)tcph + (tcph->th_off<<2));
+
+		break;
+	case ETHERTYPE_IPV6:
+		printf("IPv6\n");
+		break;
+	default:
+		printf("unknown type 0x%04x\n",
+		    ntohs(ehdr->ether_type));
+		break;
+	}
+}
+
+/* in luck we trust (i.e. true story on how an os works) */
+static void
+dump_nodlt(uint8_t *data, size_t caplen)
+{
+	char buf[32768];
+
+	/* +4 = skip AF */
+	strvisx(buf, (const char *)data+4, caplen-4, 0);
+	printf("%s\n", buf);
+}
 
 static void
 dobpfread(void)
@@ -191,7 +261,8 @@
 	void *buf;
 	struct ifreq ifr;
 	int bpfd, modfd;
-	u_int bpflen, x;
+	u_int bpflen, x, dlt;
+	ssize_t n;
 
 	bpfd = rump_sys_open("/dev/bpf", O_RDWR);
 
@@ -249,13 +320,10 @@
 	if (rump_sys_ioctl(bpfd, BIOCIMMEDIATE, &x) == -1)
 		err(1, "BIOCIMMEDIATE");
 
-
+	if (rump_sys_ioctl(bpfd, BIOCGDLT, &dlt) == -1)
+		err(1, "BIOCGDLT");
+	
 	for (;;) {
-		char fmt[64];
-		struct ether_header *ehdr;
-		struct ip *ip;
-		struct tcphdr *tcph;
-		ssize_t n;
 
 		memset(buf, 0, bpflen);
 		n = rump_sys_read(bpfd, buf, bpflen);
@@ -268,57 +336,21 @@
 
 		bhdr = buf;
 		while (bhdr->bh_caplen) {
+			uint8_t *data;
+
 			printf("got packet, caplen %d\n", bhdr->bh_caplen);
-			ehdr = (void *)((uint8_t *)bhdr + bhdr->bh_hdrlen);
-			switch (ntohs(ehdr->ether_type)) {
-			case ETHERTYPE_ARP:
-				printf("ARP\n");
-				break;
-			case ETHERTYPE_IP:
-				printf("IP, ");
-				ip = (void *)((uint8_t *)ehdr + sizeof(*ehdr));
-				printf("version %d, proto ", ip->ip_v);
-				if (ip->ip_p == IPPROTO_TCP)
-					printf("TCP");
-				else if (ip->ip_p == IPPROTO_UDP)
-					printf("UDP");
-				else
-					printf("unknown");
-				printf("\n");
-
-				/*
-				 * if it's the droids we're looking for,
-				 * print segment contents.
-				 */
-				if (ip->ip_src.s_addr != youraddr ||
-				    ip->ip_dst.s_addr != myaddr ||
-				    ip->ip_p != IPPROTO_TCP)
-					break;
-				tcph = (void *)((uint8_t *)ip + (ip->ip_hl<<2));
-				if (ntohs(tcph->th_sport) != 80)
-					break;
-
-				printf("requested data:\n");
-				sprintf(fmt, "%%%ds\n",
-				    ntohs(ip->ip_len) - (ip->ip_hl<<2));
-				printf(fmt, (char *)tcph + (tcph->th_off<<2));
-
-				break;
-			case ETHERTYPE_IPV6:
-				printf("IPv6\n");
-				break;
-			default:
-				printf("unknown type 0x%04x\n",
-				    ntohs(ehdr->ether_type));
-				break;
-			}
+			data = (void *)((uint8_t *)bhdr + bhdr->bh_hdrlen);
+
+			if (dlt == DLT_NULL)
+				dump_nodlt(data, bhdr->bh_caplen);
+			else
+				dump_ether(data, bhdr->bh_caplen);
 
 			bhdr = (void *)((uint8_t *)bhdr +
 			    BPF_WORDALIGN(bhdr->bh_hdrlen + bhdr->bh_caplen));
 		}
 	}
 }
-#endif /* FULL_NETWORK_STACK */
 
 static void
 printstats(void)
@@ -390,10 +422,8 @@
 		err(1, "wrote only %zd vs. %zu\n",
 		    n, strlen(buf));
 
-#ifdef FULL_NETWORK_STACK
 	if (argc > 1)
 		dobpfread();
-#endif
 
 	/* wait for mbufs to accumulate.  hacky, but serves purpose.  */
 	sleep(1);

Reply via email to