/* Copyright 2002 Yon Uriarte and Jeff Dike * Licensed under the GPL * This file is part of the original uml_switch code * Modified 2003 Renzo Davoli */ #include #include #include #include #include #include #include #ifdef __FreeBSD__ #include #include #endif #include #ifdef __FreeBSD__ #include #else #include #endif #include "port.h" #include "switch.h" void send_tap(int fd, void *packet, int len, void *unused) { int n; n = write(fd, packet, len); if(n != len){ if(errno != EAGAIN) printlog(LOG_WARNING,"send_tap %s",strerror(errno)); } } int open_tap(char *dev) { #ifndef __FreeBSD__ struct ifreq ifr; #endif int fd; 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); if(ioctl(fd, TUNSETIFF, (void *) &ifr) < 0){ printlog(LOG_ERR,"TUNSETIFF failed %s",strerror(errno)); close(fd); return(-1); } #endif return(fd); }