#include #include #include #include #include #include #include #include #include #include #include #define max(a,b) ((a)>(b) ? (a):(b)) int tun_alloc(char *dev) { struct ifreq ifr; int fd, err; if( (fd = open("/dev/net/tun", O_RDWR)) < 0 ) return -1; memset(&ifr, 0, sizeof(ifr)); /* 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 | IFF_NO_PI; if( *dev ) strncpy(ifr.ifr_name, dev, IFNAMSIZ); if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){ close(fd); return err; } strcpy(dev, ifr.ifr_name); return fd; } int main(int argc, char *argv[]) { char dev1[7], dev2[7], buf[1600]; int f1,f2,l,fm; fd_set fds; strcpy(dev1,"tap%d"); strcpy(dev2,"tap%d"); if (((f1 = tun_alloc(dev1)) < 0) || ((f2 = tun_alloc(dev2)) < 0)) { printf("Cannot allocate TAP device\n"); exit(1); } printf("Allocated devices: %s and %s\n", dev1, dev2); fm = max(f1, f2) + 1; /* ioctl(f1, TUNSETNOCSUM, 1); ioctl(f2, TUNSETNOCSUM, 1); */ while(1){ FD_ZERO(&fds); FD_SET(f1, &fds); FD_SET(f2, &fds); select(fm, &fds, NULL, NULL, NULL); if( FD_ISSET(f1, &fds) ) { l = read(f1,buf,sizeof(buf)); printf("Got %i bytes from %s\n", l, dev1); write(f2,buf,l); } if( FD_ISSET(f2, &fds) ) { l = read(f2,buf,sizeof(buf)); printf("Got %i bytes from %s\n", l, dev2); write(f1,buf,l); } } }