mirror of
https://git.freebsd.org/ports.git
synced 2025-07-18 01:39:16 -04:00
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:
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
|
@ -798,6 +798,7 @@
|
|||
SUBDIR += v6eval
|
||||
SUBDIR += valknut
|
||||
SUBDIR += vchat
|
||||
SUBDIR += vde
|
||||
SUBDIR += verlihub
|
||||
SUBDIR += verlihub-plugins
|
||||
SUBDIR += vicq
|
||||
|
|
29
net/vde/Makefile
Normal file
29
net/vde/Makefile
Normal 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
2
net/vde/distinfo
Normal file
|
@ -0,0 +1,2 @@
|
|||
MD5 (vde-1.5.7.tgz) = f89a958a6997114b46abd66c00e217c8
|
||||
SIZE (vde-1.5.7.tgz) = 139314
|
40
net/vde/files/patch-Makefile
Normal file
40
net/vde/files/patch-Makefile
Normal 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 *~
|
23
net/vde/files/patch-hash.c
Normal file
23
net/vde/files/patch-hash.c
Normal 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 *))
|
34
net/vde/files/patch-port.c
Normal file
34
net/vde/files/patch-port.c
Normal 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;
|
||||
}
|
||||
|
8
net/vde/files/patch-qemu::Makefile
Normal file
8
net/vde/files/patch-qemu::Makefile
Normal 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
|
||||
|
103
net/vde/files/patch-qemu::vdeq.c
Normal file
103
net/vde/files/patch-qemu::vdeq.c
Normal 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;
|
20
net/vde/files/patch-slirpvde::Makefile
Normal file
20
net/vde/files/patch-slirpvde::Makefile
Normal 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
|
34
net/vde/files/patch-slirpvde::ip.h
Normal file
34
net/vde/files/patch-slirpvde::ip.h
Normal 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)
|
14
net/vde/files/patch-slirpvde::libslirp.h
Normal file
14
net/vde/files/patch-slirpvde::libslirp.h
Normal 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);
|
||||
|
33
net/vde/files/patch-slirpvde::slirp_config.h
Normal file
33
net/vde/files/patch-slirpvde::slirp_config.h
Normal 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
|
95
net/vde/files/patch-slirpvde::slirpvde.c
Normal file
95
net/vde/files/patch-slirpvde::slirpvde.c
Normal 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(;;) {
|
34
net/vde/files/patch-slirpvde::tcp.h
Normal file
34
net/vde/files/patch-slirpvde::tcp.h
Normal 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) */
|
45
net/vde/files/patch-tuntap.c
Normal file
45
net/vde/files/patch-tuntap.c
Normal 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
15
net/vde/files/patch-vde.h
Normal 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
|
||||
|
98
net/vde/files/patch-vde_plug.c
Normal file
98
net/vde/files/patch-vde_plug.c
Normal 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);
|
80
net/vde/files/patch-vde_switch.c
Normal file
80
net/vde/files/patch-vde_switch.c
Normal 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 */
|
||||
{
|
11
net/vde/files/patch-vdetaplib::Makefile
Normal file
11
net/vde/files/patch-vdetaplib::Makefile
Normal 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
|
260
net/vde/files/patch-vdetaplib::libvdetap.c
Normal file
260
net/vde/files/patch-vdetaplib::libvdetap.c
Normal 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);
|
||||
}
|
||||
|
46
net/vde/files/patch-vdetaplib::test.c
Normal file
46
net/vde/files/patch-vdetaplib::test.c
Normal 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;
|
||||
}
|
107
net/vde/files/patch-vdetaplib::vdetap.c
Normal file
107
net/vde/files/patch-vdetaplib::vdetap.c
Normal 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
7
net/vde/pkg-descr
Normal 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
8
net/vde/pkg-plist
Normal 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
29
net/vde2/Makefile
Normal 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
2
net/vde2/distinfo
Normal file
|
@ -0,0 +1,2 @@
|
|||
MD5 (vde-1.5.7.tgz) = f89a958a6997114b46abd66c00e217c8
|
||||
SIZE (vde-1.5.7.tgz) = 139314
|
40
net/vde2/files/patch-Makefile
Normal file
40
net/vde2/files/patch-Makefile
Normal 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 *~
|
23
net/vde2/files/patch-hash.c
Normal file
23
net/vde2/files/patch-hash.c
Normal 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 *))
|
34
net/vde2/files/patch-port.c
Normal file
34
net/vde2/files/patch-port.c
Normal 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;
|
||||
}
|
||||
|
8
net/vde2/files/patch-qemu::Makefile
Normal file
8
net/vde2/files/patch-qemu::Makefile
Normal 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
|
||||
|
103
net/vde2/files/patch-qemu::vdeq.c
Normal file
103
net/vde2/files/patch-qemu::vdeq.c
Normal 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;
|
20
net/vde2/files/patch-slirpvde::Makefile
Normal file
20
net/vde2/files/patch-slirpvde::Makefile
Normal 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
|
34
net/vde2/files/patch-slirpvde::ip.h
Normal file
34
net/vde2/files/patch-slirpvde::ip.h
Normal 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)
|
14
net/vde2/files/patch-slirpvde::libslirp.h
Normal file
14
net/vde2/files/patch-slirpvde::libslirp.h
Normal 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);
|
||||
|
33
net/vde2/files/patch-slirpvde::slirp_config.h
Normal file
33
net/vde2/files/patch-slirpvde::slirp_config.h
Normal 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
|
95
net/vde2/files/patch-slirpvde::slirpvde.c
Normal file
95
net/vde2/files/patch-slirpvde::slirpvde.c
Normal 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(;;) {
|
34
net/vde2/files/patch-slirpvde::tcp.h
Normal file
34
net/vde2/files/patch-slirpvde::tcp.h
Normal 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) */
|
45
net/vde2/files/patch-tuntap.c
Normal file
45
net/vde2/files/patch-tuntap.c
Normal 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/vde2/files/patch-vde.h
Normal file
15
net/vde2/files/patch-vde.h
Normal 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
|
||||
|
98
net/vde2/files/patch-vde_plug.c
Normal file
98
net/vde2/files/patch-vde_plug.c
Normal 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);
|
80
net/vde2/files/patch-vde_switch.c
Normal file
80
net/vde2/files/patch-vde_switch.c
Normal 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 */
|
||||
{
|
11
net/vde2/files/patch-vdetaplib::Makefile
Normal file
11
net/vde2/files/patch-vdetaplib::Makefile
Normal 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
|
260
net/vde2/files/patch-vdetaplib::libvdetap.c
Normal file
260
net/vde2/files/patch-vdetaplib::libvdetap.c
Normal 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);
|
||||
}
|
||||
|
46
net/vde2/files/patch-vdetaplib::test.c
Normal file
46
net/vde2/files/patch-vdetaplib::test.c
Normal 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;
|
||||
}
|
107
net/vde2/files/patch-vdetaplib::vdetap.c
Normal file
107
net/vde2/files/patch-vdetaplib::vdetap.c
Normal 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
7
net/vde2/pkg-descr
Normal 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
8
net/vde2/pkg-plist
Normal file
|
@ -0,0 +1,8 @@
|
|||
bin/dpipe
|
||||
bin/slirpvde
|
||||
bin/vde_plug
|
||||
bin/vde_switch
|
||||
bin/vdeq
|
||||
bin/vdeqemu
|
||||
bin/vdetap
|
||||
lib/libvdetap.so
|
Loading…
Add table
Reference in a new issue