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);