VDE is a user-mode ethernet simulation. It's quite useful for

hooking together multiple qemu instances into a single virtual
network without needing root access.  It can also be used for
tunneling or other network simulation tasks.

PR:		ports/76874
Submitted by:	Craig Boston <craig@yekse.gank.org>
This commit is contained in:
Sergey Matveychuk 2005-03-11 13:51:32 +00:00
parent 2186979471
commit 032fc7a937
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=130884
47 changed files with 2293 additions and 0 deletions

View file

@ -798,6 +798,7 @@
SUBDIR += v6eval SUBDIR += v6eval
SUBDIR += valknut SUBDIR += valknut
SUBDIR += vchat SUBDIR += vchat
SUBDIR += vde
SUBDIR += verlihub SUBDIR += verlihub
SUBDIR += verlihub-plugins SUBDIR += verlihub-plugins
SUBDIR += vicq SUBDIR += vicq

29
net/vde/Makefile Normal file
View file

@ -0,0 +1,29 @@
# New ports collection makefile for: vde
# Date created: 30 Janurary 2005
# Whom: Craig Boston <craig@yekse.gank.org>
#
# $FreeBSD$
#
PORTNAME= vde
PORTVERSION= 1.5.7
CATEGORIES= net
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= vde
EXTRACT_SUFX= .tgz
MAINTAINER= craig@yekse.gank.org
COMMENT= User-mode virtual ethernet infrastructure
USE_GMAKE= yes
USE_GETOPT_LONG=yes
INSTALLS_SHLIB= yes
.include <bsd.port.pre.mk>
CFLAGS+= ${CPPFLAGS}
MAKE_ENV+= LDFLAGS="${LDFLAGS}"
MAN1= dpipe.1 slirpvde.1 vdetaplib.1 vdeq.1 vde_plug.1 vde_switch.1
.include <bsd.port.post.mk>

2
net/vde/distinfo Normal file
View file

@ -0,0 +1,2 @@
MD5 (vde-1.5.7.tgz) = f89a958a6997114b46abd66c00e217c8
SIZE (vde-1.5.7.tgz) = 139314

View file

@ -0,0 +1,40 @@
--- Makefile Sat Jan 29 15:02:08 2005
+++ Makefile Sun Jan 30 13:46:59 2005
@@ -1,14 +1,15 @@
-TUNTAP = $(shell [ -e /usr/include/linux/if_tun.h ] && echo -DTUNTAP)
+TUNTAP = $(shell [ -e /usr/include/net/if_tun.h ] && echo -DTUNTAP)
OBJSSW = hash.o port.o vde_switch.o tuntap.o
BINSW = vde_switch
BIN = $(BINSW) dpipe vde_plug
#CFLAGS = -g -Wall $(TUNTAP) -DINFO -O3
-CFLAGS = -Wall $(TUNTAP) -O3
+CFLAGS += -Wall $(TUNTAP) -O
-BIN_DIR ?= /usr/local/bin
-LIB_DIR ?= /usr/local/lib
-MAN_DIR ?= /usr/local/man
+PREFIX ?= /usr/local
+BIN_DIR ?= $(PREFIX)/bin
+LIB_DIR ?= $(PREFIX)/lib
+MAN_DIR ?= $(PREFIX)/man
ifneq ($(TUNTAP),)
OBJS += tuntap.o
@@ -30,13 +31,13 @@
vde_switch.o: vde_switch.c vde.h switch.h hash.h port.h tuntap.h
$(BINSW) : $(OBJSSW)
- $(CC) $(CFLAGS) -o $(BINSW) $(OBJSSW)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $(BINSW) $(OBJSSW)
dpipe: dpipe.o
- $(CC) $(CFLAGS) -o dpipe dpipe.o
+ $(CC) $(CFLAGS) $(LDFLAGS) -o dpipe dpipe.o
vde_plug: vde_plug.o
- $(CC) $(CFLAGS) -o vde_plug vde_plug.o
+ $(CC) $(CFLAGS) $(LDFLAGS) -o vde_plug vde_plug.o
clean :
rm -f $(BIN) *.o *~

View file

@ -0,0 +1,23 @@
--- hash.c Sat Jan 29 15:02:08 2005
+++ hash.c Sat Jan 29 15:08:18 2005
@@ -14,7 +14,11 @@
#include <syslog.h>
#include <sys/types.h>
#include <sys/time.h>
+#ifdef __FreeBSD__
+#include <signal.h>
+#else
#include <sys/signal.h>
+#endif
#include "switch.h"
#include "hash.h"
@@ -129,7 +133,7 @@
printf("Hash: %d Addr: %02x:%02x:%02x:%02x:%02x:%02x to port: %s "
"age %ld secs\n", calc_hash(e->dst),
e->dst[0], e->dst[1], e->dst[2], e->dst[3], e->dst[4], e->dst[5],
- (*p->port_id)(e->port), (int) p->now - e->last_seen);
+ (*p->port_id)(e->port), (long) p->now - e->last_seen);
}
void print_hash(char *(*port_id)(void *))

View file

@ -0,0 +1,34 @@
--- port.c Sat Jan 29 15:02:08 2005
+++ port.c Sun Jan 30 11:36:03 2005
@@ -10,6 +10,9 @@
#include <syslog.h>
#include <sys/socket.h>
#include <sys/un.h>
+#ifdef __FreeBSD__
+#include <string.h>
+#endif
#include "switch.h"
#include "hash.h"
#include "port.h"
@@ -316,10 +319,19 @@
port=p->data;
//if(match_sock(p->control, fd, p->data, p->data_len, &data)) break;
if(p->data_len == sizeof(struct sock_data) &&
- !(memcmp(&(port->sock), &mine->sock, sizeof(mine->sock)))) break;
+#ifdef __FreeBSD__
+ port->sock.sun_family == mine->sock.sun_family &&
+ !(strcmp(port->sock.sun_path, mine->sock.sun_path)))
+#else
+ !(memcmp(&(port->sock), &mine->sock, sizeof(mine->sock))))
+#endif
+ break;
}
}
- handle_direct_data(p,hub,&packet,len);
+ if (i < g_nfds)
+ handle_direct_data(p,hub,&packet,len);
+ else
+ printlog(LOG_WARNING, "No port associated with descriptor %d", fd);
return 0;
}

View file

@ -0,0 +1,8 @@
--- qemu/Makefile Sat Jan 29 15:02:08 2005
+++ qemu/Makefile Sun Jan 30 12:59:52 2005
@@ -1,4 +1,4 @@
-ALL: vdeq
+all: vdeq
vdeq.o: vdeq.c ../vde.h

View file

@ -0,0 +1,103 @@
--- qemu/vdeq.c Sat Jan 29 15:02:08 2005
+++ qemu/vdeq.c Sun Jan 30 13:31:46 2005
@@ -7,14 +7,20 @@
#include <signal.h>
#include <errno.h>
#include <unistd.h>
+#ifndef __FreeBSD__
#include <stdint.h>
+#endif
#include <libgen.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/uio.h>
#include <sys/poll.h>
+#ifdef __FreeBSD__
+#include <string.h>
+#include <sys/time.h>
#include "../vde.h"
+#endif
#define SWITCH_MAGIC 0xfeedface
#define BUFSIZE 2048
@@ -29,6 +35,15 @@
struct sockaddr_un sock;
};
+#ifdef __FreeBSD__
+static char *data_socket = NULL;
+
+static void cleanup()
+{
+ if(data_socket != NULL)
+ unlink(data_socket);
+}
+#endif
static int send_fd(char *name, int fddata, struct sockaddr_un *datasock, int intno, int group)
{
@@ -37,6 +52,9 @@
int fdctl;
struct sockaddr_un sock;
+#ifdef __FreeBSD__
+ struct timeval tv;
+#endif
if((fdctl = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
perror("socket");
@@ -56,7 +74,14 @@
req.sock.sun_family=AF_UNIX;
memset(req.sock.sun_path, 0, sizeof(req.sock.sun_path));
+#ifdef __FreeBSD__
+ gettimeofday(&tv, NULL);
+ snprintf(req.sock.sun_path, sizeof(req.sock.sun_path), "%s.%i.%li",
+ VDEDATSOCK, pid, tv.tv_usec);
+ data_socket = strdup(req.sock.sun_path);
+#else
sprintf(&req.sock.sun_path[1], "%5d-%2d", pid, intno);
+#endif
if(bind(fddata, (struct sockaddr *) &req.sock, sizeof(req.sock)) < 0){
perror("bind");
@@ -111,20 +136,23 @@
static void leave()
{
fprintf(stderr,"qemu exited: %s quits\n", vdeqname);
+#ifdef __FreeBSD__
+ cleanup(0, NULL);
+#endif
exit(0);
}
int main(int argc, char **argv)
{
int *fddata;
- char *argsock,**sockname;
+ char *argsock = NULL,**sockname;
struct sockaddr_un *dataout,datain;
int datainsize;
int result;
int group=0;
int *connected_fd;
register ssize_t nx;
- int args;
+ int args = 0;
int newargc;
char **newargv;
typedef int pair[2];
@@ -154,10 +182,10 @@
)) {
usage();
} else if (argc > args+1 &&
- (strcmp(argv[args],"-vdesock")==0) ||
+ ((strcmp(argv[args],"-vdesock")==0) ||
(strcmp(argv[args],"-sock")==0) ||
(strcmp(argv[args],"-unix")==0) ||
- (strcmp(argv[args],"-s")==0)
+ (strcmp(argv[args],"-s")==0))
){
argsock=argv[args+1];
args+=2;

View file

@ -0,0 +1,20 @@
--- slirpvde/Makefile Sat Jan 29 15:02:08 2005
+++ slirpvde/Makefile Sun Jan 30 14:02:57 2005
@@ -3,7 +3,7 @@
tcp_timer.o udp.o \
bootp.o
-CFLAGS=-I. -DVDE
+CFLAGS+=-I. -DVDE
all: libslirp.a slirpvde
@@ -34,7 +34,7 @@
udp.o: udp.c ip_icmp.h
slirpvde: slirpvde.o libslirp.a
- $(CC) -o slirpvde slirpvde.o libslirp.a
+ $(CC) $(LDFLAGS) -o slirpvde slirpvde.o libslirp.a
clean:
rm -rf *.o slirpvde libslirp.a

View file

@ -0,0 +1,34 @@
--- slirpvde/ip.h Sat Jan 29 15:02:08 2005
+++ slirpvde/ip.h Sun Jan 30 14:00:32 2005
@@ -37,6 +37,31 @@
#ifndef _IP_H_
#define _IP_H_
+#ifdef __FreeBSD__
+#include <sys/endian.h>
+
+#if !defined(__BYTE_ORDER)
+#if defined(_BYTE_ORDER)
+#define __BYTE_ORDER _BYTE_ORDER
+#elif defined(BYTE_ORDER)
+#define __BYTE_ORDER BYTE_ORDER
+#else
+#error BYTE_ORDER not defined
+#endif
+#endif /* !defined(__BYTE_ORDER) */
+
+#if !defined(__BIG_ENDIAN)
+#if defined(_BIG_ENDIAN)
+#define __BIG_ENDIAN _BIG_ENDIAN
+#elif defined(BIG_ENDIAN)
+#define __BIG_ENDIAN BIG_ENDIAN
+#else
+#error BIG_ENDIAN not defined
+#endif
+#endif /* !defined(__BIG_ENDIAN) */
+
+#endif /* __FreeBSD__ */
+
#if __BYTE_ORDER == __BIG_ENDIAN
# ifndef NTOHL
# define NTOHL(d)

View file

@ -0,0 +1,14 @@
--- slirpvde/libslirp.h Sat Jan 29 15:02:08 2005
+++ slirpvde/libslirp.h Sun Jan 30 13:55:31 2005
@@ -2,7 +2,11 @@
#define _LIBSLIRP_H
#include <sys/select.h>
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#else
#include <stdint.h>
+#endif
void slirp_init(char *network);

View file

@ -0,0 +1,33 @@
--- slirpvde/slirp_config.h Sat Jan 29 15:02:08 2005
+++ slirpvde/slirp_config.h Sat Jan 29 15:15:18 2005
@@ -61,10 +61,18 @@
#define HAVE_STDLIB_H
/* Define if you have sys/ioctl.h */
+#ifdef __FreeBSD__
+#define HAVE_SYS_IOCTL_H
+#else
#undef HAVE_SYS_IOCTL_H
+#endif
/* Define if you have sys/filio.h */
+#ifdef __FreeBSD__
+#define HAVE_SYS_FILIO_H
+#else
#undef HAVE_SYS_FILIO_H
+#endif
/* Define if you have strerror */
#define HAVE_STRERROR
@@ -162,7 +170,11 @@
#define HAVE_MEMMOVE
/* Define if you have <termios.h> */
+#ifdef __FreeBSD__
+#define HAVE_TERMIOS_H
+#else
#undef HAVE_TERMIOS_H
+#endif
/* Define if you have gethostid */
#undef HAVE_GETHOSTID

View file

@ -0,0 +1,95 @@
--- slirpvde/slirpvde.c Sat Jan 29 15:02:08 2005
+++ slirpvde/slirpvde.c Sun Jan 30 14:24:33 2005
@@ -7,7 +7,9 @@
#include <signal.h>
#include <errno.h>
#include <unistd.h>
+#ifndef __FreeBSD__
#include <stdint.h>
+#endif
#include <libgen.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -16,6 +18,10 @@
#include <sys/poll.h>
#include <libslirp.h>
#include <getopt.h>
+#ifdef __FreeBSD__
+#include <string.h>
+#include <sys/time.h>
+#endif
#define SWITCH_MAGIC 0xfeedface
#define BUFSIZE 2048
@@ -32,6 +38,25 @@
struct sockaddr_un sock;
};
+#ifdef __FreeBSD__
+#include "../vde.h"
+static char *data_socket = NULL;
+
+static void cleanup()
+{
+ if(data_socket != NULL)
+ unlink(data_socket);
+}
+
+static void sig_handler(int sig)
+{
+ fprintf(stderr, "Caught signal %d, cleaning up and exiting\n", sig);
+ cleanup(1,NULL);
+ signal(sig, SIG_DFL);
+ kill(getpid(), sig);
+}
+#endif
+
static int send_fd(char *name, int fddata, struct sockaddr_un *datasock, int group)
{
int pid = getpid();
@@ -39,6 +64,9 @@
int fdctl;
struct sockaddr_un sock;
+#ifdef __FreeBSD__
+ struct timeval tv;
+#endif
if((fdctl = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
perror("socket");
@@ -58,7 +86,14 @@
req.sock.sun_family=AF_UNIX;
memset(req.sock.sun_path, 0, sizeof(req.sock.sun_path));
+#ifdef __FreeBSD__
+ gettimeofday(&tv, NULL);
+ snprintf(req.sock.sun_path, sizeof(req.sock.sun_path), "%s.%i.%li",
+ VDEDATSOCK, pid, tv.tv_usec);
+ data_socket = strdup(req.sock.sun_path);
+#else
sprintf(&req.sock.sun_path[1], "%5d", pid);
+#endif
if(bind(fddata, (struct sockaddr *) &req.sock, sizeof(req.sock)) < 0){
perror("bind");
@@ -149,7 +184,6 @@
int group=0;
int connected_fd;
register ssize_t nx;
- register int i;
fd_set rs,ws,xs;
int opt,longindx;
char *netw=NULL;
@@ -175,6 +209,12 @@
exit(1);
}
connected_fd=send_fd(sockname, fddata, &dataout, group);
+#ifdef __FreeBSD__
+ if(signal(SIGINT, sig_handler) < 0) {
+ perror("signal");
+ }
+ signal(SIGPIPE, SIG_IGN); /* FreeBSD 4.x sends SIGPIPE on reset sockets */
+#endif
slirp_init(netw);
for(;;) {

View file

@ -0,0 +1,34 @@
--- slirpvde/tcp.h Sat Jan 29 15:02:08 2005
+++ slirpvde/tcp.h Sun Jan 30 14:00:50 2005
@@ -37,6 +37,31 @@
#ifndef _TCP_H_
#define _TCP_H_
+#ifdef __FreeBSD__
+#include <sys/endian.h>
+
+#if !defined(__BYTE_ORDER)
+#if defined(_BYTE_ORDER)
+#define __BYTE_ORDER _BYTE_ORDER
+#elif defined(BYTE_ORDER)
+#define __BYTE_ORDER BYTE_ORDER
+#else
+#error BYTE_ORDER not defined
+#endif
+#endif /* !defined(__BYTE_ORDER) */
+
+#if !defined(__BIG_ENDIAN)
+#if defined(_BIG_ENDIAN)
+#define __BIG_ENDIAN _BIG_ENDIAN
+#elif defined(BIG_ENDIAN)
+#define __BIG_ENDIAN BIG_ENDIAN
+#else
+#error BIG_ENDIAN not defined
+#endif
+#endif /* !defined(__BIG_ENDIAN) */
+
+#endif /* __FreeBSD__ */
+
typedef u_int32_t tcp_seq;
#define PR_SLOWHZ 2 /* 2 slow timeouts per second (approx) */

View file

@ -0,0 +1,45 @@
--- tuntap.c Sat Jan 29 15:02:08 2005
+++ tuntap.c Sun Jan 30 00:27:23 2005
@@ -11,8 +11,16 @@
#include <unistd.h>
#include <syslog.h>
#include <sys/ioctl.h>
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/socket.h>
+#endif
#include <net/if.h>
+#ifdef __FreeBSD__
+#include <net/if_tun.h>
+#else
#include <linux/if_tun.h>
+#endif
#include "port.h"
#include "switch.h"
@@ -28,13 +36,16 @@
int open_tap(char *dev)
{
+#ifndef __FreeBSD__
struct ifreq ifr;
+#endif
int fd;
- if((fd = open("/dev/net/tun", O_RDWR)) < 0){
- printlog(LOG_ERR,"Failed to open /dev/net/tun %s",strerror(errno));
+ if((fd = open(dev, O_RDWR)) < 0){
+ printlog(LOG_ERR,"Failed to open %s %s", dev, strerror(errno));
return(-1);
}
+#ifndef __FreeBSD__
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name) - 1);
@@ -43,5 +54,6 @@
close(fd);
return(-1);
}
+#endif
return(fd);
}

15
net/vde/files/patch-vde.h Normal file
View file

@ -0,0 +1,15 @@
--- vde.h Sat Jan 29 15:02:08 2005
+++ vde.h Sun Jan 30 11:39:43 2005
@@ -2,6 +2,12 @@
#define VDESTDSOCK "/tmp/vde.ctl"
#endif
+#ifdef __FreeBSD__
+#ifndef VDEDATSOCK
+#define VDEDATSOCK "/tmp/.vde.data"
+#endif
+#endif
+
#define DO_SYSLOG
#define VDE_IP_LOG

View file

@ -0,0 +1,98 @@
--- vde_plug.c Sat Jan 29 15:02:08 2005
+++ vde_plug.c Sun Jan 30 13:52:57 2005
@@ -7,7 +7,9 @@
#include <signal.h>
#include <errno.h>
#include <unistd.h>
+#ifndef __FreeBSD__
#include <stdint.h>
+#endif
#include <getopt.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -15,6 +17,11 @@
#include <sys/uio.h>
#include <sys/poll.h>
#include <sys/utsname.h>
+#ifdef __FreeBSD__
+#include <sys/time.h>
+#include <netinet/in.h>
+#include <string.h>
+#endif
#include "vde.h"
#ifdef VDE_IP_LOG
#define DO_SYSLOG
@@ -47,6 +54,24 @@
static struct passwd *callerpwd;
static char host[256];
+#ifdef __FreeBSD__
+static char *data_socket = NULL;
+
+static void cleanup()
+{
+ if(data_socket != NULL)
+ unlink(data_socket);
+}
+
+static void sig_handler(int sig)
+{
+ fprintf(stderr, "Caught signal %d, cleaning up and exiting\n", sig);
+ cleanup(1,NULL);
+ signal(sig, SIG_DFL);
+ kill(getpid(), sig);
+}
+#endif
+
void write_syslog_entry(char *message)
{
char *ssh_client;
@@ -183,6 +208,9 @@
int fdctl;
struct sockaddr_un sock;
+#ifdef __FreeBSD__
+ struct timeval tv;
+#endif
if((fdctl = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
perror("socket");
@@ -202,7 +230,14 @@
req.sock.sun_family=AF_UNIX;
memset(req.sock.sun_path, 0, sizeof(req.sock.sun_path));
+#ifdef __FreeBSD__
+ gettimeofday(&tv, NULL);
+ snprintf(req.sock.sun_path, sizeof(req.sock.sun_path), "%s.%i.%li",
+ VDEDATSOCK, pid, tv.tv_usec);
+ data_socket = strdup(req.sock.sun_path);
+#else
sprintf(&req.sock.sun_path[1], "%5d", pid);
+#endif
if(bind(fddata, (struct sockaddr *) &req.sock, sizeof(req.sock)) < 0){
perror("bind");
@@ -309,6 +344,10 @@
int connected_fd;
register ssize_t nx;
+#ifdef __FreeBSD__
+ atexit(cleanup);
+#endif
+
uname(&me);
if (argv[0][0] == '-')
netusage(); //implies exit
@@ -383,6 +422,12 @@
}
connected_fd=send_fd(sockname, fddata, &dataout, group);
pollv[1].fd=fddata;
+
+#ifdef __FreeBSD__
+ if(signal(SIGINT, sig_handler) < 0) {
+ perror("signal");
+ }
+#endif
for(;;) {
result=poll(pollv,2,-1);

View file

@ -0,0 +1,80 @@
--- vde_switch.c Sat Jan 29 15:02:08 2005
+++ vde_switch.c Sun Jan 30 13:33:00 2005
@@ -8,7 +8,9 @@
#include <stdlib.h>
#include <signal.h>
#include <fcntl.h>
+#ifndef __FreeBSD__
#include <stdint.h>
+#endif
#include <getopt.h>
#include <sys/socket.h>
#include <sys/un.h>
@@ -17,7 +19,11 @@
#include <unistd.h>
#include <syslog.h>
#include <libgen.h>
+#ifdef __FreeBSD__
+#include <string.h>
+#else
#include <endian.h>
+#endif
#include "vde.h"
#include "switch.h"
#include "port.h"
@@ -95,6 +101,13 @@
}
}
+#ifdef __FreeBSD__
+static void cleanupwrapper()
+{
+ cleanup(0, NULL);
+}
+#endif
+
void **g_fdsdata = NULL;
int g_nfds = 0;
int g_minfds = 0;
@@ -276,19 +289,27 @@
void bind_data_socket(int fd, struct sockaddr_un *sun)
{
+ struct timeval tv;
+
+ sun->sun_family = AF_UNIX;
+#ifdef __FreeBSD__
+ gettimeofday(&tv, NULL);
+ snprintf(sun->sun_path, sizeof(sun->sun_path), "%s.%i.%li",
+ VDEDATSOCK, getpid(), tv.tv_usec);
+ data_socket = strdup(sun->sun_path);
+#else
struct {
char zero;
int pid;
int usecs;
} name;
- struct timeval tv;
name.zero = 0;
name.pid = getpid();
gettimeofday(&tv, NULL);
name.usecs = tv.tv_usec;
- sun->sun_family = AF_UNIX;
memcpy(sun->sun_path, &name, sizeof(name));
+#endif
if(bind(fd, (struct sockaddr *) sun, sizeof(*sun)) < 0){
printlog(LOG_ERR,"Binding to data socket %s",strerror(errno));
exit(1);
@@ -338,7 +359,11 @@
int tap_fd = -1;
#endif
+#ifdef __FreeBSD__
+ atexit(cleanupwrapper);
+#else
on_exit(cleanup, NULL);
+#endif
prog = argv[0];
/* option parsing */
{

View file

@ -0,0 +1,11 @@
--- vdetaplib/Makefile Sat Jan 29 15:02:08 2005
+++ vdetaplib/Makefile Sun Jan 30 12:21:39 2005
@@ -9,7 +9,7 @@
all: vdetap libvdetap.so
libvdetap.so: libvdetap.a
- $(LD) -E -o $@ -L./ -ldl -shared -export-dynamic -Bdynamic \
+ $(LD) -E -o $@ -L./ -shared -export-dynamic -Bdynamic \
--whole-archive libvdetap.a
libvdetap.a: libvdetap.o

View file

@ -0,0 +1,260 @@
--- vdetaplib/libvdetap.c Sat Jan 29 15:02:08 2005
+++ vdetaplib/libvdetap.c Sun Jan 30 13:29:07 2005
@@ -5,26 +5,39 @@
#include <sys/socket.h>
#include <sys/syscall.h>
#include <sys/stat.h>
+#include <limits.h>
+#include <dlfcn.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
-#define __USE_LARGEFILE64
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
-#include <linux/ioctl.h>
-#include <linux/if.h>
-#include <linux/if_tun.h>
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <net/if_tun.h>
-#define TUNTAPPATH "/dev/net/tun"
+#define TUNTAPPATH "/dev/tap"
#define VDETAPEXEC "vdetap"
#define VDEALLTAP "VDEALLTAP"
#define MAX 10
+#if defined(RTLD_NEXT)
+#define REAL_LIBC RTLD_NEXT
+#else
+#define REAL_LIBC ((void *) -1L)
+#endif
+
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__bsdi__)
+typedef unsigned long request_t;
+#else
+typedef int request_t;
+#endif
+
int tapfd[2] = {-1,-1};
static int tapcount=0;
-static int tuncount=0;
static struct pidlist {
pid_t pid;
@@ -39,11 +52,6 @@
return rv;
}
-static void plfree (struct pidlist *el) {
- el->next=flh;
- flh=el;
-}
-
static int addpid(int pid) {
struct pidlist *plp;
if ((plp=plmalloc ()) != NULL) {
@@ -74,105 +82,41 @@
}
}
- int
-native_open(const char *pathname, int flags, mode_t data)
-{
- return (syscall(SYS_open, pathname, flags, data));
-}
-
- int
-native_ioctl(int fd, unsigned long int command, char *data)
-{
- return (syscall(SYS_ioctl, fd, command, data));
-}
-
-
int open(const char *path, int flags, ...)
{
- static char buf[PATH_MAX];
+ static int (*func) (const char *, int, mode_t) = NULL;
+ char *vdesock;
+ int pid;
va_list ap;
mode_t data;
- va_start(ap, flags);
- data = va_arg(ap, mode_t);
- va_end(ap);
-
- if (strcmp(path,TUNTAPPATH)==0 && tapfd[0] == -1) {
- if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0) {
- return tapfd[0];
- }
- else
- return -1;
-
- } else
- return native_open(path, flags, data);
-}
-
-int open64(const char *path, int flags, ...)
-{
- static char buf[PATH_MAX];
- va_list ap;
- mode_t data;
+ if (!func)
+ func = (int (*) (const char *, int, mode_t))
+ dlsym (REAL_LIBC, "open");
va_start(ap, flags);
- data = va_arg(ap, mode_t);
+ data = va_arg(ap, int);
va_end(ap);
if (strcmp(path,TUNTAPPATH)==0 && tapfd[0] == -1) {
if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0) {
- return tapfd[0];
- }
- else
- return -1;
-
- } else
- return native_open(path, flags | O_LARGEFILE, data);
-}
-
-int ioctl(int fd, unsigned long int command, ...)
-{
- va_list ap;
- char *data;
- char *vdesock;
- int pid;
-
- va_start(ap, command);
- data = va_arg(ap, char *);
- va_end(ap);
-
- if (fd == tapfd[0]) {
- if (command == TUNSETIFF) {
- struct ifreq *ifr = (struct ifreq *) data;
char num[5];
char name[10];
-
- ifr->ifr_name[IFNAMSIZ-1] = '\0';
- if (ifr->ifr_name[0] == 0) {
- if (ifr->ifr_flags & IFF_TAP)
- sprintf(name,"tap%d",tapcount++);
- else
- sprintf(name,"tun%d",tuncount++);
- strncpy(ifr->ifr_name,name,IFNAMSIZ);
- }
- else if (strchr(ifr->ifr_name, '%') != NULL) {
- sprintf(name,ifr->ifr_name,tapcount++);
- strncpy(ifr->ifr_name,name,IFNAMSIZ);
- }
- if (ifr->ifr_flags & IFF_TAP &&
- ((vdesock=getenv(ifr->ifr_name)) != NULL)
- ||(vdesock=getenv(VDEALLTAP)) != NULL){
+ sprintf(name,"tap%d",tapcount++);
+ if (((vdesock=getenv(name)) != NULL)
+ ||(vdesock=getenv(VDEALLTAP)) != NULL){
if ((pid=fork()) < 0) {
close(tapfd[1]);
errno=EINVAL;
return -1;
} else if (pid > 0) { /*father*/
- if(pid=addpid(pid) < 0) {
+ if((pid=addpid(pid)) < 0) {
close(tapfd[0]);
close(tapfd[1]);
return -1;
} else {
close(tapfd[1]);
- return 0;
+ return tapfd[0];
}
} else { /*son*/
plh=NULL;
@@ -181,34 +125,53 @@
execlp(VDETAPEXEC,"-",num,vdesock,(char *) 0);
}
}
- else /*roll back to the native tuntap*/
- {
- int newfd;
- int saverrno;
- int resultioctl;
- close(tapfd[1]);
- if ((newfd=native_open(TUNTAPPATH, O_RDWR, 0)) < 0) {
- saverrno=errno;
- close(tapfd[0]);
- errno=saverrno;
- return -1;
- } else
- {
- resultioctl=native_ioctl(fd, command, data);
- if (resultioctl < 0) {
- saverrno=errno;
- close(tapfd[0]);
- errno=saverrno;
- return -1;
- } else {
- dup2(newfd,tapfd[0]);
- return resultioctl;
- }
- }
- }
- } else
- return 0;
+ return tapfd[0];
+ }
+ else
+ return -1;
+
} else
- return (native_ioctl(fd, command, data));
+ return (*func)(path, flags, data);
+}
+
+int ioctl(int fd, unsigned long int command, ...)
+{
+ static int (*func) (int, request_t, void *) = NULL;
+ int dummy;
+ va_list ap;
+ char *data;
+ struct ifstat *ifs;
+
+ if (!func)
+ func = (int (*) (int, request_t, void *))
+ dlsym (REAL_LIBC, "ioctl");
+
+ va_start(ap, command);
+ data = va_arg(ap, char *);
+ va_end(ap);
+
+ if (fd == tapfd[0]) {
+ switch(command) {
+ case SIOCSIFFLAGS:
+ case SIOCADDMULTI:
+ case SIOCDELMULTI:
+ break;
+
+ case SIOCGIFSTATUS:
+ ifs = (struct ifstat *)data;
+ dummy = strlen(ifs->ascii);
+ if(plh && dummy < sizeof(ifs->ascii))
+ snprintf(ifs->ascii + dummy,
+ sizeof(ifs->ascii) - dummy,
+ "\tOpened by PID %d\n",
+ plh[0].pid);
+ break;
+
+ default:
+ return (*func) (fd, command, data);
+ }
+ }
+
+ return (*func) (fd, command, data);
}

View file

@ -0,0 +1,46 @@
--- vdetaplib/test.c Sat Jan 29 15:02:08 2005
+++ vdetaplib/test.c Sun Jan 30 12:27:35 2005
@@ -6,35 +6,28 @@
#include <errno.h>
#include <string.h>
#include <unistd.h>
+#include <sys/types.h>
#include <sys/ioctl.h>
+#include <sys/socket.h>
#include <net/if.h>
-#include <linux/if_tun.h>
+#include <net/if_tun.h>
static int tun_alloc(char *dev)
{
- struct ifreq ifr;
+ struct ifstat ifs;
int fd, err;
- if( (fd = open("/dev/net/tun", O_RDWR)) < 0 )
+ if( (fd = open("/dev/tap", O_RDWR)) < 0 )
return (-1);
- memset(&ifr, 0, sizeof(ifr));
+ memset(&ifs, 0, sizeof(ifs));
- /* Flags: IFF_TUN - TUN device (no Ethernet headers)
- * IFF_TAP - TAP device
- *
- * IFF_NO_PI - Do not provide packet information
- */
- ifr.ifr_flags = IFF_TAP;
- if( *dev )
- strncpy(ifr.ifr_name, dev, IFNAMSIZ);
-
- if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){
+ if( (err = ioctl(fd, SIOCGIFSTATUS, (void *) &ifs)) < 0 ){
close(fd);
return err;
}
printf("ioctl returns\n");
- strcpy(dev, ifr.ifr_name);
+ puts(ifs.ascii);
printf("ioctl idev\n");
return fd;
}

View file

@ -0,0 +1,107 @@
--- vdetaplib/vdetap.c Sat Jan 29 15:02:08 2005
+++ vdetaplib/vdetap.c Sun Jan 30 14:05:26 2005
@@ -2,11 +2,25 @@
* Reseased under the GPLv2 */
#include <stdio.h>
+#ifndef __FreeBSD__
#include <stdint.h>
+#endif
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>
+#else
#include <sys/select.h>
+#endif
#include <sys/poll.h>
#include <sys/socket.h>
#include <sys/un.h>
+#ifdef __FreeBSD__
+#include "../vde.h"
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#endif
#define SWITCH_MAGIC 0xfeedface
#define BUFSIZE 2048
@@ -21,6 +35,23 @@
static unsigned char bufin[BUFSIZE];
+#ifdef __FreeBSD__
+static char *data_socket = NULL;
+
+static void cleanup()
+{
+ if(data_socket != NULL)
+ unlink(data_socket);
+}
+
+static void sig_handler(int sig)
+{
+ cleanup(1, NULL);
+ signal(sig, SIG_DFL);
+ kill(getpid(), sig);
+}
+#endif
+
static int send_fd(char *name, int fddata, struct sockaddr_un *datasock, int intno, int group)
{
int pid = getpid();
@@ -28,6 +59,9 @@
int fdctl;
struct sockaddr_un sock;
+#ifdef __FreeBSD__
+ struct timeval tv;
+#endif
if((fdctl = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
perror("socket");
@@ -47,7 +81,14 @@
req.sock.sun_family=AF_UNIX;
memset(req.sock.sun_path, 0, sizeof(req.sock.sun_path));
+#ifdef __FreeBSD__
+ gettimeofday(&tv, NULL);
+ snprintf(req.sock.sun_path, sizeof(req.sock.sun_path), "%s.%i.%li",
+ VDEDATSOCK, pid, tv.tv_usec);
+ data_socket = strdup(req.sock.sun_path);
+#else
sprintf(&req.sock.sun_path[1], "%5d-%2d", pid, intno);
+#endif
if(bind(fddata, (struct sockaddr *) &req.sock, sizeof(req.sock)) < 0){
perror("bind");
@@ -69,7 +110,7 @@
static struct pollfd pollv[]={{0,POLLIN|POLLHUP,0},{0,POLLIN|POLLHUP,0}};
-main(int argc,char *argv[])
+int main(int argc,char *argv[])
{
int fd,fddata;
struct sockaddr_un dataout,datain;
@@ -96,6 +137,12 @@
send_fd(argv[2],fddata,&dataout,0,0);
pollv[0].fd=fd;
pollv[1].fd=fddata;
+
+#ifdef __FreeBSD__
+ if(signal(SIGINT, sig_handler) < 0) {
+ perror("signal");
+ }
+#endif
for(;;) {
result=poll(pollv,2,-1);
if (pollv[0].revents & POLLHUP || pollv[1].revents & POLLHUP)
@@ -113,5 +160,7 @@
write(fd,bufin,nx);
}
}
+ cleanup(0, NULL);
+ return 0;
}

7
net/vde/pkg-descr Normal file
View file

@ -0,0 +1,7 @@
Virtual Distributed Ethernet is a user-mode virtual network (layer
2) infrastructure. It can be used for network simulations, joining
multiple qemu instances together in a shared virtual network, or
tunneling over the Internet. Physical hosts can be joined to the
virtual network by means of the tap(4) driver.
WWW: http://vde.sourceforge.net/

8
net/vde/pkg-plist Normal file
View file

@ -0,0 +1,8 @@
bin/dpipe
bin/slirpvde
bin/vde_plug
bin/vde_switch
bin/vdeq
bin/vdeqemu
bin/vdetap
lib/libvdetap.so

29
net/vde2/Makefile Normal file
View file

@ -0,0 +1,29 @@
# New ports collection makefile for: vde
# Date created: 30 Janurary 2005
# Whom: Craig Boston <craig@yekse.gank.org>
#
# $FreeBSD$
#
PORTNAME= vde
PORTVERSION= 1.5.7
CATEGORIES= net
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= vde
EXTRACT_SUFX= .tgz
MAINTAINER= craig@yekse.gank.org
COMMENT= User-mode virtual ethernet infrastructure
USE_GMAKE= yes
USE_GETOPT_LONG=yes
INSTALLS_SHLIB= yes
.include <bsd.port.pre.mk>
CFLAGS+= ${CPPFLAGS}
MAKE_ENV+= LDFLAGS="${LDFLAGS}"
MAN1= dpipe.1 slirpvde.1 vdetaplib.1 vdeq.1 vde_plug.1 vde_switch.1
.include <bsd.port.post.mk>

2
net/vde2/distinfo Normal file
View file

@ -0,0 +1,2 @@
MD5 (vde-1.5.7.tgz) = f89a958a6997114b46abd66c00e217c8
SIZE (vde-1.5.7.tgz) = 139314

View file

@ -0,0 +1,40 @@
--- Makefile Sat Jan 29 15:02:08 2005
+++ Makefile Sun Jan 30 13:46:59 2005
@@ -1,14 +1,15 @@
-TUNTAP = $(shell [ -e /usr/include/linux/if_tun.h ] && echo -DTUNTAP)
+TUNTAP = $(shell [ -e /usr/include/net/if_tun.h ] && echo -DTUNTAP)
OBJSSW = hash.o port.o vde_switch.o tuntap.o
BINSW = vde_switch
BIN = $(BINSW) dpipe vde_plug
#CFLAGS = -g -Wall $(TUNTAP) -DINFO -O3
-CFLAGS = -Wall $(TUNTAP) -O3
+CFLAGS += -Wall $(TUNTAP) -O
-BIN_DIR ?= /usr/local/bin
-LIB_DIR ?= /usr/local/lib
-MAN_DIR ?= /usr/local/man
+PREFIX ?= /usr/local
+BIN_DIR ?= $(PREFIX)/bin
+LIB_DIR ?= $(PREFIX)/lib
+MAN_DIR ?= $(PREFIX)/man
ifneq ($(TUNTAP),)
OBJS += tuntap.o
@@ -30,13 +31,13 @@
vde_switch.o: vde_switch.c vde.h switch.h hash.h port.h tuntap.h
$(BINSW) : $(OBJSSW)
- $(CC) $(CFLAGS) -o $(BINSW) $(OBJSSW)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $(BINSW) $(OBJSSW)
dpipe: dpipe.o
- $(CC) $(CFLAGS) -o dpipe dpipe.o
+ $(CC) $(CFLAGS) $(LDFLAGS) -o dpipe dpipe.o
vde_plug: vde_plug.o
- $(CC) $(CFLAGS) -o vde_plug vde_plug.o
+ $(CC) $(CFLAGS) $(LDFLAGS) -o vde_plug vde_plug.o
clean :
rm -f $(BIN) *.o *~

View file

@ -0,0 +1,23 @@
--- hash.c Sat Jan 29 15:02:08 2005
+++ hash.c Sat Jan 29 15:08:18 2005
@@ -14,7 +14,11 @@
#include <syslog.h>
#include <sys/types.h>
#include <sys/time.h>
+#ifdef __FreeBSD__
+#include <signal.h>
+#else
#include <sys/signal.h>
+#endif
#include "switch.h"
#include "hash.h"
@@ -129,7 +133,7 @@
printf("Hash: %d Addr: %02x:%02x:%02x:%02x:%02x:%02x to port: %s "
"age %ld secs\n", calc_hash(e->dst),
e->dst[0], e->dst[1], e->dst[2], e->dst[3], e->dst[4], e->dst[5],
- (*p->port_id)(e->port), (int) p->now - e->last_seen);
+ (*p->port_id)(e->port), (long) p->now - e->last_seen);
}
void print_hash(char *(*port_id)(void *))

View file

@ -0,0 +1,34 @@
--- port.c Sat Jan 29 15:02:08 2005
+++ port.c Sun Jan 30 11:36:03 2005
@@ -10,6 +10,9 @@
#include <syslog.h>
#include <sys/socket.h>
#include <sys/un.h>
+#ifdef __FreeBSD__
+#include <string.h>
+#endif
#include "switch.h"
#include "hash.h"
#include "port.h"
@@ -316,10 +319,19 @@
port=p->data;
//if(match_sock(p->control, fd, p->data, p->data_len, &data)) break;
if(p->data_len == sizeof(struct sock_data) &&
- !(memcmp(&(port->sock), &mine->sock, sizeof(mine->sock)))) break;
+#ifdef __FreeBSD__
+ port->sock.sun_family == mine->sock.sun_family &&
+ !(strcmp(port->sock.sun_path, mine->sock.sun_path)))
+#else
+ !(memcmp(&(port->sock), &mine->sock, sizeof(mine->sock))))
+#endif
+ break;
}
}
- handle_direct_data(p,hub,&packet,len);
+ if (i < g_nfds)
+ handle_direct_data(p,hub,&packet,len);
+ else
+ printlog(LOG_WARNING, "No port associated with descriptor %d", fd);
return 0;
}

View file

@ -0,0 +1,8 @@
--- qemu/Makefile Sat Jan 29 15:02:08 2005
+++ qemu/Makefile Sun Jan 30 12:59:52 2005
@@ -1,4 +1,4 @@
-ALL: vdeq
+all: vdeq
vdeq.o: vdeq.c ../vde.h

View file

@ -0,0 +1,103 @@
--- qemu/vdeq.c Sat Jan 29 15:02:08 2005
+++ qemu/vdeq.c Sun Jan 30 13:31:46 2005
@@ -7,14 +7,20 @@
#include <signal.h>
#include <errno.h>
#include <unistd.h>
+#ifndef __FreeBSD__
#include <stdint.h>
+#endif
#include <libgen.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/uio.h>
#include <sys/poll.h>
+#ifdef __FreeBSD__
+#include <string.h>
+#include <sys/time.h>
#include "../vde.h"
+#endif
#define SWITCH_MAGIC 0xfeedface
#define BUFSIZE 2048
@@ -29,6 +35,15 @@
struct sockaddr_un sock;
};
+#ifdef __FreeBSD__
+static char *data_socket = NULL;
+
+static void cleanup()
+{
+ if(data_socket != NULL)
+ unlink(data_socket);
+}
+#endif
static int send_fd(char *name, int fddata, struct sockaddr_un *datasock, int intno, int group)
{
@@ -37,6 +52,9 @@
int fdctl;
struct sockaddr_un sock;
+#ifdef __FreeBSD__
+ struct timeval tv;
+#endif
if((fdctl = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
perror("socket");
@@ -56,7 +74,14 @@
req.sock.sun_family=AF_UNIX;
memset(req.sock.sun_path, 0, sizeof(req.sock.sun_path));
+#ifdef __FreeBSD__
+ gettimeofday(&tv, NULL);
+ snprintf(req.sock.sun_path, sizeof(req.sock.sun_path), "%s.%i.%li",
+ VDEDATSOCK, pid, tv.tv_usec);
+ data_socket = strdup(req.sock.sun_path);
+#else
sprintf(&req.sock.sun_path[1], "%5d-%2d", pid, intno);
+#endif
if(bind(fddata, (struct sockaddr *) &req.sock, sizeof(req.sock)) < 0){
perror("bind");
@@ -111,20 +136,23 @@
static void leave()
{
fprintf(stderr,"qemu exited: %s quits\n", vdeqname);
+#ifdef __FreeBSD__
+ cleanup(0, NULL);
+#endif
exit(0);
}
int main(int argc, char **argv)
{
int *fddata;
- char *argsock,**sockname;
+ char *argsock = NULL,**sockname;
struct sockaddr_un *dataout,datain;
int datainsize;
int result;
int group=0;
int *connected_fd;
register ssize_t nx;
- int args;
+ int args = 0;
int newargc;
char **newargv;
typedef int pair[2];
@@ -154,10 +182,10 @@
)) {
usage();
} else if (argc > args+1 &&
- (strcmp(argv[args],"-vdesock")==0) ||
+ ((strcmp(argv[args],"-vdesock")==0) ||
(strcmp(argv[args],"-sock")==0) ||
(strcmp(argv[args],"-unix")==0) ||
- (strcmp(argv[args],"-s")==0)
+ (strcmp(argv[args],"-s")==0))
){
argsock=argv[args+1];
args+=2;

View file

@ -0,0 +1,20 @@
--- slirpvde/Makefile Sat Jan 29 15:02:08 2005
+++ slirpvde/Makefile Sun Jan 30 14:02:57 2005
@@ -3,7 +3,7 @@
tcp_timer.o udp.o \
bootp.o
-CFLAGS=-I. -DVDE
+CFLAGS+=-I. -DVDE
all: libslirp.a slirpvde
@@ -34,7 +34,7 @@
udp.o: udp.c ip_icmp.h
slirpvde: slirpvde.o libslirp.a
- $(CC) -o slirpvde slirpvde.o libslirp.a
+ $(CC) $(LDFLAGS) -o slirpvde slirpvde.o libslirp.a
clean:
rm -rf *.o slirpvde libslirp.a

View file

@ -0,0 +1,34 @@
--- slirpvde/ip.h Sat Jan 29 15:02:08 2005
+++ slirpvde/ip.h Sun Jan 30 14:00:32 2005
@@ -37,6 +37,31 @@
#ifndef _IP_H_
#define _IP_H_
+#ifdef __FreeBSD__
+#include <sys/endian.h>
+
+#if !defined(__BYTE_ORDER)
+#if defined(_BYTE_ORDER)
+#define __BYTE_ORDER _BYTE_ORDER
+#elif defined(BYTE_ORDER)
+#define __BYTE_ORDER BYTE_ORDER
+#else
+#error BYTE_ORDER not defined
+#endif
+#endif /* !defined(__BYTE_ORDER) */
+
+#if !defined(__BIG_ENDIAN)
+#if defined(_BIG_ENDIAN)
+#define __BIG_ENDIAN _BIG_ENDIAN
+#elif defined(BIG_ENDIAN)
+#define __BIG_ENDIAN BIG_ENDIAN
+#else
+#error BIG_ENDIAN not defined
+#endif
+#endif /* !defined(__BIG_ENDIAN) */
+
+#endif /* __FreeBSD__ */
+
#if __BYTE_ORDER == __BIG_ENDIAN
# ifndef NTOHL
# define NTOHL(d)

View file

@ -0,0 +1,14 @@
--- slirpvde/libslirp.h Sat Jan 29 15:02:08 2005
+++ slirpvde/libslirp.h Sun Jan 30 13:55:31 2005
@@ -2,7 +2,11 @@
#define _LIBSLIRP_H
#include <sys/select.h>
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#else
#include <stdint.h>
+#endif
void slirp_init(char *network);

View file

@ -0,0 +1,33 @@
--- slirpvde/slirp_config.h Sat Jan 29 15:02:08 2005
+++ slirpvde/slirp_config.h Sat Jan 29 15:15:18 2005
@@ -61,10 +61,18 @@
#define HAVE_STDLIB_H
/* Define if you have sys/ioctl.h */
+#ifdef __FreeBSD__
+#define HAVE_SYS_IOCTL_H
+#else
#undef HAVE_SYS_IOCTL_H
+#endif
/* Define if you have sys/filio.h */
+#ifdef __FreeBSD__
+#define HAVE_SYS_FILIO_H
+#else
#undef HAVE_SYS_FILIO_H
+#endif
/* Define if you have strerror */
#define HAVE_STRERROR
@@ -162,7 +170,11 @@
#define HAVE_MEMMOVE
/* Define if you have <termios.h> */
+#ifdef __FreeBSD__
+#define HAVE_TERMIOS_H
+#else
#undef HAVE_TERMIOS_H
+#endif
/* Define if you have gethostid */
#undef HAVE_GETHOSTID

View file

@ -0,0 +1,95 @@
--- slirpvde/slirpvde.c Sat Jan 29 15:02:08 2005
+++ slirpvde/slirpvde.c Sun Jan 30 14:24:33 2005
@@ -7,7 +7,9 @@
#include <signal.h>
#include <errno.h>
#include <unistd.h>
+#ifndef __FreeBSD__
#include <stdint.h>
+#endif
#include <libgen.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -16,6 +18,10 @@
#include <sys/poll.h>
#include <libslirp.h>
#include <getopt.h>
+#ifdef __FreeBSD__
+#include <string.h>
+#include <sys/time.h>
+#endif
#define SWITCH_MAGIC 0xfeedface
#define BUFSIZE 2048
@@ -32,6 +38,25 @@
struct sockaddr_un sock;
};
+#ifdef __FreeBSD__
+#include "../vde.h"
+static char *data_socket = NULL;
+
+static void cleanup()
+{
+ if(data_socket != NULL)
+ unlink(data_socket);
+}
+
+static void sig_handler(int sig)
+{
+ fprintf(stderr, "Caught signal %d, cleaning up and exiting\n", sig);
+ cleanup(1,NULL);
+ signal(sig, SIG_DFL);
+ kill(getpid(), sig);
+}
+#endif
+
static int send_fd(char *name, int fddata, struct sockaddr_un *datasock, int group)
{
int pid = getpid();
@@ -39,6 +64,9 @@
int fdctl;
struct sockaddr_un sock;
+#ifdef __FreeBSD__
+ struct timeval tv;
+#endif
if((fdctl = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
perror("socket");
@@ -58,7 +86,14 @@
req.sock.sun_family=AF_UNIX;
memset(req.sock.sun_path, 0, sizeof(req.sock.sun_path));
+#ifdef __FreeBSD__
+ gettimeofday(&tv, NULL);
+ snprintf(req.sock.sun_path, sizeof(req.sock.sun_path), "%s.%i.%li",
+ VDEDATSOCK, pid, tv.tv_usec);
+ data_socket = strdup(req.sock.sun_path);
+#else
sprintf(&req.sock.sun_path[1], "%5d", pid);
+#endif
if(bind(fddata, (struct sockaddr *) &req.sock, sizeof(req.sock)) < 0){
perror("bind");
@@ -149,7 +184,6 @@
int group=0;
int connected_fd;
register ssize_t nx;
- register int i;
fd_set rs,ws,xs;
int opt,longindx;
char *netw=NULL;
@@ -175,6 +209,12 @@
exit(1);
}
connected_fd=send_fd(sockname, fddata, &dataout, group);
+#ifdef __FreeBSD__
+ if(signal(SIGINT, sig_handler) < 0) {
+ perror("signal");
+ }
+ signal(SIGPIPE, SIG_IGN); /* FreeBSD 4.x sends SIGPIPE on reset sockets */
+#endif
slirp_init(netw);
for(;;) {

View file

@ -0,0 +1,34 @@
--- slirpvde/tcp.h Sat Jan 29 15:02:08 2005
+++ slirpvde/tcp.h Sun Jan 30 14:00:50 2005
@@ -37,6 +37,31 @@
#ifndef _TCP_H_
#define _TCP_H_
+#ifdef __FreeBSD__
+#include <sys/endian.h>
+
+#if !defined(__BYTE_ORDER)
+#if defined(_BYTE_ORDER)
+#define __BYTE_ORDER _BYTE_ORDER
+#elif defined(BYTE_ORDER)
+#define __BYTE_ORDER BYTE_ORDER
+#else
+#error BYTE_ORDER not defined
+#endif
+#endif /* !defined(__BYTE_ORDER) */
+
+#if !defined(__BIG_ENDIAN)
+#if defined(_BIG_ENDIAN)
+#define __BIG_ENDIAN _BIG_ENDIAN
+#elif defined(BIG_ENDIAN)
+#define __BIG_ENDIAN BIG_ENDIAN
+#else
+#error BIG_ENDIAN not defined
+#endif
+#endif /* !defined(__BIG_ENDIAN) */
+
+#endif /* __FreeBSD__ */
+
typedef u_int32_t tcp_seq;
#define PR_SLOWHZ 2 /* 2 slow timeouts per second (approx) */

View file

@ -0,0 +1,45 @@
--- tuntap.c Sat Jan 29 15:02:08 2005
+++ tuntap.c Sun Jan 30 00:27:23 2005
@@ -11,8 +11,16 @@
#include <unistd.h>
#include <syslog.h>
#include <sys/ioctl.h>
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/socket.h>
+#endif
#include <net/if.h>
+#ifdef __FreeBSD__
+#include <net/if_tun.h>
+#else
#include <linux/if_tun.h>
+#endif
#include "port.h"
#include "switch.h"
@@ -28,13 +36,16 @@
int open_tap(char *dev)
{
+#ifndef __FreeBSD__
struct ifreq ifr;
+#endif
int fd;
- if((fd = open("/dev/net/tun", O_RDWR)) < 0){
- printlog(LOG_ERR,"Failed to open /dev/net/tun %s",strerror(errno));
+ if((fd = open(dev, O_RDWR)) < 0){
+ printlog(LOG_ERR,"Failed to open %s %s", dev, strerror(errno));
return(-1);
}
+#ifndef __FreeBSD__
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name) - 1);
@@ -43,5 +54,6 @@
close(fd);
return(-1);
}
+#endif
return(fd);
}

View file

@ -0,0 +1,15 @@
--- vde.h Sat Jan 29 15:02:08 2005
+++ vde.h Sun Jan 30 11:39:43 2005
@@ -2,6 +2,12 @@
#define VDESTDSOCK "/tmp/vde.ctl"
#endif
+#ifdef __FreeBSD__
+#ifndef VDEDATSOCK
+#define VDEDATSOCK "/tmp/.vde.data"
+#endif
+#endif
+
#define DO_SYSLOG
#define VDE_IP_LOG

View file

@ -0,0 +1,98 @@
--- vde_plug.c Sat Jan 29 15:02:08 2005
+++ vde_plug.c Sun Jan 30 13:52:57 2005
@@ -7,7 +7,9 @@
#include <signal.h>
#include <errno.h>
#include <unistd.h>
+#ifndef __FreeBSD__
#include <stdint.h>
+#endif
#include <getopt.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -15,6 +17,11 @@
#include <sys/uio.h>
#include <sys/poll.h>
#include <sys/utsname.h>
+#ifdef __FreeBSD__
+#include <sys/time.h>
+#include <netinet/in.h>
+#include <string.h>
+#endif
#include "vde.h"
#ifdef VDE_IP_LOG
#define DO_SYSLOG
@@ -47,6 +54,24 @@
static struct passwd *callerpwd;
static char host[256];
+#ifdef __FreeBSD__
+static char *data_socket = NULL;
+
+static void cleanup()
+{
+ if(data_socket != NULL)
+ unlink(data_socket);
+}
+
+static void sig_handler(int sig)
+{
+ fprintf(stderr, "Caught signal %d, cleaning up and exiting\n", sig);
+ cleanup(1,NULL);
+ signal(sig, SIG_DFL);
+ kill(getpid(), sig);
+}
+#endif
+
void write_syslog_entry(char *message)
{
char *ssh_client;
@@ -183,6 +208,9 @@
int fdctl;
struct sockaddr_un sock;
+#ifdef __FreeBSD__
+ struct timeval tv;
+#endif
if((fdctl = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
perror("socket");
@@ -202,7 +230,14 @@
req.sock.sun_family=AF_UNIX;
memset(req.sock.sun_path, 0, sizeof(req.sock.sun_path));
+#ifdef __FreeBSD__
+ gettimeofday(&tv, NULL);
+ snprintf(req.sock.sun_path, sizeof(req.sock.sun_path), "%s.%i.%li",
+ VDEDATSOCK, pid, tv.tv_usec);
+ data_socket = strdup(req.sock.sun_path);
+#else
sprintf(&req.sock.sun_path[1], "%5d", pid);
+#endif
if(bind(fddata, (struct sockaddr *) &req.sock, sizeof(req.sock)) < 0){
perror("bind");
@@ -309,6 +344,10 @@
int connected_fd;
register ssize_t nx;
+#ifdef __FreeBSD__
+ atexit(cleanup);
+#endif
+
uname(&me);
if (argv[0][0] == '-')
netusage(); //implies exit
@@ -383,6 +422,12 @@
}
connected_fd=send_fd(sockname, fddata, &dataout, group);
pollv[1].fd=fddata;
+
+#ifdef __FreeBSD__
+ if(signal(SIGINT, sig_handler) < 0) {
+ perror("signal");
+ }
+#endif
for(;;) {
result=poll(pollv,2,-1);

View file

@ -0,0 +1,80 @@
--- vde_switch.c Sat Jan 29 15:02:08 2005
+++ vde_switch.c Sun Jan 30 13:33:00 2005
@@ -8,7 +8,9 @@
#include <stdlib.h>
#include <signal.h>
#include <fcntl.h>
+#ifndef __FreeBSD__
#include <stdint.h>
+#endif
#include <getopt.h>
#include <sys/socket.h>
#include <sys/un.h>
@@ -17,7 +19,11 @@
#include <unistd.h>
#include <syslog.h>
#include <libgen.h>
+#ifdef __FreeBSD__
+#include <string.h>
+#else
#include <endian.h>
+#endif
#include "vde.h"
#include "switch.h"
#include "port.h"
@@ -95,6 +101,13 @@
}
}
+#ifdef __FreeBSD__
+static void cleanupwrapper()
+{
+ cleanup(0, NULL);
+}
+#endif
+
void **g_fdsdata = NULL;
int g_nfds = 0;
int g_minfds = 0;
@@ -276,19 +289,27 @@
void bind_data_socket(int fd, struct sockaddr_un *sun)
{
+ struct timeval tv;
+
+ sun->sun_family = AF_UNIX;
+#ifdef __FreeBSD__
+ gettimeofday(&tv, NULL);
+ snprintf(sun->sun_path, sizeof(sun->sun_path), "%s.%i.%li",
+ VDEDATSOCK, getpid(), tv.tv_usec);
+ data_socket = strdup(sun->sun_path);
+#else
struct {
char zero;
int pid;
int usecs;
} name;
- struct timeval tv;
name.zero = 0;
name.pid = getpid();
gettimeofday(&tv, NULL);
name.usecs = tv.tv_usec;
- sun->sun_family = AF_UNIX;
memcpy(sun->sun_path, &name, sizeof(name));
+#endif
if(bind(fd, (struct sockaddr *) sun, sizeof(*sun)) < 0){
printlog(LOG_ERR,"Binding to data socket %s",strerror(errno));
exit(1);
@@ -338,7 +359,11 @@
int tap_fd = -1;
#endif
+#ifdef __FreeBSD__
+ atexit(cleanupwrapper);
+#else
on_exit(cleanup, NULL);
+#endif
prog = argv[0];
/* option parsing */
{

View file

@ -0,0 +1,11 @@
--- vdetaplib/Makefile Sat Jan 29 15:02:08 2005
+++ vdetaplib/Makefile Sun Jan 30 12:21:39 2005
@@ -9,7 +9,7 @@
all: vdetap libvdetap.so
libvdetap.so: libvdetap.a
- $(LD) -E -o $@ -L./ -ldl -shared -export-dynamic -Bdynamic \
+ $(LD) -E -o $@ -L./ -shared -export-dynamic -Bdynamic \
--whole-archive libvdetap.a
libvdetap.a: libvdetap.o

View file

@ -0,0 +1,260 @@
--- vdetaplib/libvdetap.c Sat Jan 29 15:02:08 2005
+++ vdetaplib/libvdetap.c Sun Jan 30 13:29:07 2005
@@ -5,26 +5,39 @@
#include <sys/socket.h>
#include <sys/syscall.h>
#include <sys/stat.h>
+#include <limits.h>
+#include <dlfcn.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
-#define __USE_LARGEFILE64
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
-#include <linux/ioctl.h>
-#include <linux/if.h>
-#include <linux/if_tun.h>
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <net/if_tun.h>
-#define TUNTAPPATH "/dev/net/tun"
+#define TUNTAPPATH "/dev/tap"
#define VDETAPEXEC "vdetap"
#define VDEALLTAP "VDEALLTAP"
#define MAX 10
+#if defined(RTLD_NEXT)
+#define REAL_LIBC RTLD_NEXT
+#else
+#define REAL_LIBC ((void *) -1L)
+#endif
+
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__bsdi__)
+typedef unsigned long request_t;
+#else
+typedef int request_t;
+#endif
+
int tapfd[2] = {-1,-1};
static int tapcount=0;
-static int tuncount=0;
static struct pidlist {
pid_t pid;
@@ -39,11 +52,6 @@
return rv;
}
-static void plfree (struct pidlist *el) {
- el->next=flh;
- flh=el;
-}
-
static int addpid(int pid) {
struct pidlist *plp;
if ((plp=plmalloc ()) != NULL) {
@@ -74,105 +82,41 @@
}
}
- int
-native_open(const char *pathname, int flags, mode_t data)
-{
- return (syscall(SYS_open, pathname, flags, data));
-}
-
- int
-native_ioctl(int fd, unsigned long int command, char *data)
-{
- return (syscall(SYS_ioctl, fd, command, data));
-}
-
-
int open(const char *path, int flags, ...)
{
- static char buf[PATH_MAX];
+ static int (*func) (const char *, int, mode_t) = NULL;
+ char *vdesock;
+ int pid;
va_list ap;
mode_t data;
- va_start(ap, flags);
- data = va_arg(ap, mode_t);
- va_end(ap);
-
- if (strcmp(path,TUNTAPPATH)==0 && tapfd[0] == -1) {
- if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0) {
- return tapfd[0];
- }
- else
- return -1;
-
- } else
- return native_open(path, flags, data);
-}
-
-int open64(const char *path, int flags, ...)
-{
- static char buf[PATH_MAX];
- va_list ap;
- mode_t data;
+ if (!func)
+ func = (int (*) (const char *, int, mode_t))
+ dlsym (REAL_LIBC, "open");
va_start(ap, flags);
- data = va_arg(ap, mode_t);
+ data = va_arg(ap, int);
va_end(ap);
if (strcmp(path,TUNTAPPATH)==0 && tapfd[0] == -1) {
if (socketpair(PF_UNIX, SOCK_DGRAM, 0,tapfd) == 0) {
- return tapfd[0];
- }
- else
- return -1;
-
- } else
- return native_open(path, flags | O_LARGEFILE, data);
-}
-
-int ioctl(int fd, unsigned long int command, ...)
-{
- va_list ap;
- char *data;
- char *vdesock;
- int pid;
-
- va_start(ap, command);
- data = va_arg(ap, char *);
- va_end(ap);
-
- if (fd == tapfd[0]) {
- if (command == TUNSETIFF) {
- struct ifreq *ifr = (struct ifreq *) data;
char num[5];
char name[10];
-
- ifr->ifr_name[IFNAMSIZ-1] = '\0';
- if (ifr->ifr_name[0] == 0) {
- if (ifr->ifr_flags & IFF_TAP)
- sprintf(name,"tap%d",tapcount++);
- else
- sprintf(name,"tun%d",tuncount++);
- strncpy(ifr->ifr_name,name,IFNAMSIZ);
- }
- else if (strchr(ifr->ifr_name, '%') != NULL) {
- sprintf(name,ifr->ifr_name,tapcount++);
- strncpy(ifr->ifr_name,name,IFNAMSIZ);
- }
- if (ifr->ifr_flags & IFF_TAP &&
- ((vdesock=getenv(ifr->ifr_name)) != NULL)
- ||(vdesock=getenv(VDEALLTAP)) != NULL){
+ sprintf(name,"tap%d",tapcount++);
+ if (((vdesock=getenv(name)) != NULL)
+ ||(vdesock=getenv(VDEALLTAP)) != NULL){
if ((pid=fork()) < 0) {
close(tapfd[1]);
errno=EINVAL;
return -1;
} else if (pid > 0) { /*father*/
- if(pid=addpid(pid) < 0) {
+ if((pid=addpid(pid)) < 0) {
close(tapfd[0]);
close(tapfd[1]);
return -1;
} else {
close(tapfd[1]);
- return 0;
+ return tapfd[0];
}
} else { /*son*/
plh=NULL;
@@ -181,34 +125,53 @@
execlp(VDETAPEXEC,"-",num,vdesock,(char *) 0);
}
}
- else /*roll back to the native tuntap*/
- {
- int newfd;
- int saverrno;
- int resultioctl;
- close(tapfd[1]);
- if ((newfd=native_open(TUNTAPPATH, O_RDWR, 0)) < 0) {
- saverrno=errno;
- close(tapfd[0]);
- errno=saverrno;
- return -1;
- } else
- {
- resultioctl=native_ioctl(fd, command, data);
- if (resultioctl < 0) {
- saverrno=errno;
- close(tapfd[0]);
- errno=saverrno;
- return -1;
- } else {
- dup2(newfd,tapfd[0]);
- return resultioctl;
- }
- }
- }
- } else
- return 0;
+ return tapfd[0];
+ }
+ else
+ return -1;
+
} else
- return (native_ioctl(fd, command, data));
+ return (*func)(path, flags, data);
+}
+
+int ioctl(int fd, unsigned long int command, ...)
+{
+ static int (*func) (int, request_t, void *) = NULL;
+ int dummy;
+ va_list ap;
+ char *data;
+ struct ifstat *ifs;
+
+ if (!func)
+ func = (int (*) (int, request_t, void *))
+ dlsym (REAL_LIBC, "ioctl");
+
+ va_start(ap, command);
+ data = va_arg(ap, char *);
+ va_end(ap);
+
+ if (fd == tapfd[0]) {
+ switch(command) {
+ case SIOCSIFFLAGS:
+ case SIOCADDMULTI:
+ case SIOCDELMULTI:
+ break;
+
+ case SIOCGIFSTATUS:
+ ifs = (struct ifstat *)data;
+ dummy = strlen(ifs->ascii);
+ if(plh && dummy < sizeof(ifs->ascii))
+ snprintf(ifs->ascii + dummy,
+ sizeof(ifs->ascii) - dummy,
+ "\tOpened by PID %d\n",
+ plh[0].pid);
+ break;
+
+ default:
+ return (*func) (fd, command, data);
+ }
+ }
+
+ return (*func) (fd, command, data);
}

View file

@ -0,0 +1,46 @@
--- vdetaplib/test.c Sat Jan 29 15:02:08 2005
+++ vdetaplib/test.c Sun Jan 30 12:27:35 2005
@@ -6,35 +6,28 @@
#include <errno.h>
#include <string.h>
#include <unistd.h>
+#include <sys/types.h>
#include <sys/ioctl.h>
+#include <sys/socket.h>
#include <net/if.h>
-#include <linux/if_tun.h>
+#include <net/if_tun.h>
static int tun_alloc(char *dev)
{
- struct ifreq ifr;
+ struct ifstat ifs;
int fd, err;
- if( (fd = open("/dev/net/tun", O_RDWR)) < 0 )
+ if( (fd = open("/dev/tap", O_RDWR)) < 0 )
return (-1);
- memset(&ifr, 0, sizeof(ifr));
+ memset(&ifs, 0, sizeof(ifs));
- /* Flags: IFF_TUN - TUN device (no Ethernet headers)
- * IFF_TAP - TAP device
- *
- * IFF_NO_PI - Do not provide packet information
- */
- ifr.ifr_flags = IFF_TAP;
- if( *dev )
- strncpy(ifr.ifr_name, dev, IFNAMSIZ);
-
- if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){
+ if( (err = ioctl(fd, SIOCGIFSTATUS, (void *) &ifs)) < 0 ){
close(fd);
return err;
}
printf("ioctl returns\n");
- strcpy(dev, ifr.ifr_name);
+ puts(ifs.ascii);
printf("ioctl idev\n");
return fd;
}

View file

@ -0,0 +1,107 @@
--- vdetaplib/vdetap.c Sat Jan 29 15:02:08 2005
+++ vdetaplib/vdetap.c Sun Jan 30 14:05:26 2005
@@ -2,11 +2,25 @@
* Reseased under the GPLv2 */
#include <stdio.h>
+#ifndef __FreeBSD__
#include <stdint.h>
+#endif
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>
+#else
#include <sys/select.h>
+#endif
#include <sys/poll.h>
#include <sys/socket.h>
#include <sys/un.h>
+#ifdef __FreeBSD__
+#include "../vde.h"
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#endif
#define SWITCH_MAGIC 0xfeedface
#define BUFSIZE 2048
@@ -21,6 +35,23 @@
static unsigned char bufin[BUFSIZE];
+#ifdef __FreeBSD__
+static char *data_socket = NULL;
+
+static void cleanup()
+{
+ if(data_socket != NULL)
+ unlink(data_socket);
+}
+
+static void sig_handler(int sig)
+{
+ cleanup(1, NULL);
+ signal(sig, SIG_DFL);
+ kill(getpid(), sig);
+}
+#endif
+
static int send_fd(char *name, int fddata, struct sockaddr_un *datasock, int intno, int group)
{
int pid = getpid();
@@ -28,6 +59,9 @@
int fdctl;
struct sockaddr_un sock;
+#ifdef __FreeBSD__
+ struct timeval tv;
+#endif
if((fdctl = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
perror("socket");
@@ -47,7 +81,14 @@
req.sock.sun_family=AF_UNIX;
memset(req.sock.sun_path, 0, sizeof(req.sock.sun_path));
+#ifdef __FreeBSD__
+ gettimeofday(&tv, NULL);
+ snprintf(req.sock.sun_path, sizeof(req.sock.sun_path), "%s.%i.%li",
+ VDEDATSOCK, pid, tv.tv_usec);
+ data_socket = strdup(req.sock.sun_path);
+#else
sprintf(&req.sock.sun_path[1], "%5d-%2d", pid, intno);
+#endif
if(bind(fddata, (struct sockaddr *) &req.sock, sizeof(req.sock)) < 0){
perror("bind");
@@ -69,7 +110,7 @@
static struct pollfd pollv[]={{0,POLLIN|POLLHUP,0},{0,POLLIN|POLLHUP,0}};
-main(int argc,char *argv[])
+int main(int argc,char *argv[])
{
int fd,fddata;
struct sockaddr_un dataout,datain;
@@ -96,6 +137,12 @@
send_fd(argv[2],fddata,&dataout,0,0);
pollv[0].fd=fd;
pollv[1].fd=fddata;
+
+#ifdef __FreeBSD__
+ if(signal(SIGINT, sig_handler) < 0) {
+ perror("signal");
+ }
+#endif
for(;;) {
result=poll(pollv,2,-1);
if (pollv[0].revents & POLLHUP || pollv[1].revents & POLLHUP)
@@ -113,5 +160,7 @@
write(fd,bufin,nx);
}
}
+ cleanup(0, NULL);
+ return 0;
}

7
net/vde2/pkg-descr Normal file
View file

@ -0,0 +1,7 @@
Virtual Distributed Ethernet is a user-mode virtual network (layer
2) infrastructure. It can be used for network simulations, joining
multiple qemu instances together in a shared virtual network, or
tunneling over the Internet. Physical hosts can be joined to the
virtual network by means of the tap(4) driver.
WWW: http://vde.sourceforge.net/

8
net/vde2/pkg-plist Normal file
View file

@ -0,0 +1,8 @@
bin/dpipe
bin/slirpvde
bin/vde_plug
bin/vde_switch
bin/vdeq
bin/vdeqemu
bin/vdetap
lib/libvdetap.so