Date: Thu, 10 Jul 2003 14:10:15 -0400 From: kw3wong@engmail.uwaterloo.ca To: Luigi Rizzo <rizzo@icir.org> Cc: dsze@engmail.uwaterloo.ca Subject: Re: Question about bridging code Message-ID: <1057860615.3f0dac07e1418@www.nexusmail.uwaterloo.ca> In-Reply-To: <20030709195455.A24039@xorpc.icir.org> References: <1057778632.3f0c6bc8af474@www.nexusmail.uwaterloo.ca> <20030709195455.A24039@xorpc.icir.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi Luigi,
Thanks for response, the vmnet/tap stuff sounds like neat stuff. After reading
the description of tap (from the vtun site), the system seems to make a lot of
sense. However, I'm not sure how vmnet comes into play here - what purpose does
it serve, shouldn't I just be able to read from the /dev/tap0 and bridge
between tap0 and fxp0?
I tried writing a simple program to use tap. Basically, I have the bridge setup
as such
net.link.ether.bridge_cfg: fxp0:0,tap0:0 tap1:1 bge0:1
And I ran this quick test program that I wrote:
#include <sys/types.h> // ssize_t
#include <sys/socket.h> // ::socket
#include <netinet/in_systm.h> // n_long
#include <netinet/in.h> // IPPROTO_DIVERT, struct sockaddr_in
#include <netinet/ip.h> // IP_MAXPACKET
#include <netinet/tcp.h> // struct tcphdr
#include <fcntl.h> // ::fcntl
#include <err.h> // ::err
#include <errno.h> // errno
#include <stdio.h> // ::printf
#include <string.h> // ::bcopy
#include <unistd.h> // ::close
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
/** main
*/
int main()
{
int nFDRight;
int nFDLeft;
unsigned char kpucInPacket[IP_MAXPACKET];
nFDRight = open("/dev/tap0", O_RDWR);
if (nFDRight < 0)
::err(errno, "open");
nFDLeft = open("/dev/tap1", O_RDWR);
if (nFDLeft < 0)
::err(errno, "open");
fd_set masterReadSocks;
fd_set currentReadSocks;
FD_ZERO(&masterReadSocks);
FD_SET(nFDRight,&masterReadSocks);
FD_SET(nFDLeft, &masterReadSocks);
int nMaxFD = MAX(nFDRight, nFDLeft);
while (true)
{
::bcopy(&masterReadSocks, ¤tReadSocks, sizeof(fd_set));
int nSelectValue =
select(nMaxFD + 1,
¤tReadSocks,
NULL,
NULL,
NULL);
printf("Unblocked on select\n");
if (nSelectValue == -1)
{
/* Signal interrupted, just continue
*/
if (errno == EINTR)
continue;
::err(errno, "select");
}
if (FD_ISSET(nFDRight, ¤tReadSocks))
{
int nReadSize = read(nFDRight, kpucInPacket, sizeof(kpucInPacket));
if (nReadSize < 0)
err(errno, "read");
if (write(nFDLeft, kpucInPacket, nReadSize) < 0)
err(errno, "write");
}
if (FD_ISSET(nFDLeft, ¤tReadSocks))
{
int nReadSize = read(nFDLeft, kpucInPacket, sizeof(kpucInPacket));
if (nReadSize < 0)
err(errno, "read");
if (write(nFDRight, kpucInPacket, nReadSize) < 0)
err(errno, "write");
}
}
close(nFDLeft);
close(nFDRight);
}
Unfortunately, it doesn't work, it only gets a read event when I make changes
to the tap interface via ifconfig. I guess I don't fully understand how
the /dev/tapN interface works, can you (or anybody who also know) point out
what I'm doing wrong? Thanks again!
Bernie
----------------------------------------
This mail sent through www.mywaterloo.ca
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1057860615.3f0dac07e1418>
