Revision: 479
          http://vde.svn.sourceforge.net/vde/?rev=479&view=rev
Author:   rd235
Date:     2011-03-25 18:08:57 +0000 (Fri, 25 Mar 2011)

Log Message:
-----------
Step one towards a new management of packetq: data_fd are now connected sockets

Modified Paths:
--------------
    branches/rd235/vde-2/src/vde_switch/datasock.c
    branches/rd235/vde-2/src/vde_switch/packetq.c
    branches/rd235/vde-2/src/vde_switch/packetq.h
    branches/rd235/vde-2/src/vde_switch/port.c
    branches/rd235/vde-2/src/vde_switch/port.h
    branches/rd235/vde-2/src/vde_switch/tuntap.c

Modified: branches/rd235/vde-2/src/vde_switch/datasock.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/datasock.c      2011-03-16 21:30:55 UTC 
(rev 478)
+++ branches/rd235/vde-2/src/vde_switch/datasock.c      2011-03-25 18:08:57 UTC 
(rev 479)
@@ -83,12 +83,11 @@
        struct request_v3 v3;
 };
 
-static int send_datasock(int fd, int ctl_fd, void *packet, int len, void 
*data, int port)
+static int send_datasock(int fd_ctl, int fd_data, void *packet, int len, int 
port)
 {
        int n;
-       struct sockaddr *dst=(struct sockaddr *)data;
 
-       n = len - sendto(fd, packet, len, 0, dst, sizeof(struct sockaddr_un));
+       n = len - send(fd_data, packet, len, 0);
        if(n){
                int rv=errno;
 #ifndef VDE_PQ
@@ -102,85 +101,23 @@
        return 0;
 }
 
-static void closeport(int fd, int portno)
-{
-       if (fd>0) 
-               remove_fd(fd);
-}
-
-static int newport(int fd, int portno, uid_t user)
-{
-       int data_fd;
-       struct sockaddr_un sun;
-#ifdef VDE_DARWIN
-       int sockbufsize = DATA_BUF_SIZE;
-       int optsize = sizeof(sockbufsize);
-#endif
-       
-       if((data_fd = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0){
-               printlog(LOG_ERR,"socket: %s",strerror(errno));
-               return -1;
-       }
-       if(fcntl(data_fd, F_SETFL, O_NONBLOCK) < 0){
-               printlog(LOG_ERR,"Setting O_NONBLOCK on data fd 
%s",strerror(errno));
-               return -1;
-       }
-
-#ifdef VDE_DARWIN
-       if(setsockopt(data_fd, SOL_SOCKET, SO_SNDBUF, &sockbufsize, optsize) < 
0)
-               printlog(LOG_WARNING, "Warning: setting send buffer size on 
data fd %d to %d failed, expect packet loss: %s",
-                               data_fd, sockbufsize, strerror(errno));
-       if(setsockopt(data_fd, SOL_SOCKET, SO_RCVBUF, &sockbufsize, optsize) < 
0)
-               printlog(LOG_WARNING, "Warning: setting send buffer size on 
data fd %d to %d failed, expect packet loss: %s",
-                               data_fd, sockbufsize, strerror(errno));
-#endif
-       
-       sun.sun_family = AF_UNIX;
-       snprintf(sun.sun_path,sizeof(sun.sun_path),"%s/%03d",ctl_socket,portno);
-       if ((unlink(sun.sun_path) < 0 && errno != ENOENT) ||
-                       bind(data_fd, (struct sockaddr *) &sun, sizeof(sun)) < 
0){
-               printlog(LOG_ERR,"Binding to data socket %s",strerror(errno));
-               close_ep(portno-1,fd);
-               return -1;
-       }
-       if (geteuid() != 0)
-               user = -1;
-       if (user != -1)
-               chmod(sun.sun_path,mode & 0700);
-       else
-               chmod(sun.sun_path,mode);
-       if(chown(sun.sun_path,user,grp_owner) < 0) {
-               printlog(LOG_ERR, "chown: %s", strerror(errno));
-               unlink(sun.sun_path);
-               close_ep(portno-1,fd);
-               return -1;
-       }
-
-       add_fd(data_fd,data_type,portno);
-
-       return data_fd;
-}
-
-static void *memdup(void *src,int size)
-{
-       void *dst=malloc(size);
-       if (dst != NULL) 
-               memcpy(dst,src,size);
-       return dst;
-}
-
 #define GETFILEOWNER(PATH) ({\
                struct stat s; \
                (stat((PATH),&s)?-1:s.st_uid); \
                })
 
-static int new_port_v1_v3(int fd, int type_port,
+static int new_port_v1_v3(int fd_ctl, int type_port,
                struct sockaddr_un *sun_out)
 {
-       int n, port;
+       int n, portno;
        enum request_type type = type_port & 0xff;
        int port_request=type_port >> 8;
        uid_t user=-1;
+       int fd_data;
+#ifdef VDE_DARWIN
+       int sockbufsize = DATA_BUF_SIZE;
+       int optsize = sizeof(sockbufsize);
+#endif
        struct sockaddr_un sun_in;
        switch(type){
                case REQ_NEW_PORT0:
@@ -189,31 +126,81 @@
                case REQ_NEW_CONTROL:
                        if (sun_out->sun_path[0] != 0) { //not for unnamed 
sockets
                                if (access(sun_out->sun_path,R_OK | W_OK) != 0) 
{ //socket error
-                                       remove_fd(fd);
+                                       remove_fd(fd_ctl);
                                        return -1;
                                }
                                user=GETFILEOWNER(sun_out->sun_path);
                        }
-                       port = setup_ep(port_request, fd, 
memdup(sun_out,sizeof(struct sockaddr_un)), user, &modfun); 
-                       if(port<0) {
-                               remove_fd(fd); 
+
+                       if((fd_data = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0){
+                               printlog(LOG_ERR,"socket: %s",strerror(errno));
+                               remove_fd(fd_ctl);
                                return -1;
                        }
+                       if(fcntl(fd_data, F_SETFL, O_NONBLOCK) < 0){
+                               printlog(LOG_ERR,"Setting O_NONBLOCK on data fd 
%s",strerror(errno));
+                               close(fd_data);
+                               remove_fd(fd_ctl);
+                               return -1;
+                       }
+
+#ifdef VDE_DARWIN
+                       if(setsockopt(fd_data, SOL_SOCKET, SO_SNDBUF, 
&sockbufsize, optsize) < 0)
+                               printlog(LOG_WARNING, "Warning: setting send 
buffer size on data fd %d to %d failed, expect packet loss: %s",
+                                               fd_data, sockbufsize, 
strerror(errno));
+                       if(setsockopt(fd_data, SOL_SOCKET, SO_RCVBUF, 
&sockbufsize, optsize) < 0)
+                               printlog(LOG_WARNING, "Warning: setting send 
buffer size on data fd %d to %d failed, expect packet loss: %s",
+                                               fd_data, sockbufsize, 
strerror(errno));
+#endif
+
+                       if (connect(fd_data, (struct sockaddr *) sun_out, 
sizeof(struct sockaddr_un)) < 0) {
+                               printlog(LOG_ERR,"Connecting to client data 
socket %s",strerror(errno));
+                               close(fd_data);
+                               remove_fd(fd_ctl);
+                               return -1;
+                       }
+
+                       portno = setup_ep(port_request, fd_ctl, fd_data, user, 
&modfun); 
+                       add_fd(fd_data,data_type,portno);
+                       if(portno<0) {
+                               close_ep(portno,fd_ctl);
+                               return -1;
+                       }
                        sun_in.sun_family = AF_UNIX;
-                       
snprintf(sun_in.sun_path,sizeof(sun_in.sun_path),"%s/%03d",ctl_socket,port);
-                       n = write(fd, &sun_in, sizeof(sun_in));
+                       
snprintf(sun_in.sun_path,sizeof(sun_in.sun_path),"%s/%03d.%d",ctl_socket,portno,fd_data);
+
+                       if ((unlink(sun_in.sun_path) < 0 && errno != ENOENT) ||
+                                       bind(fd_data, (struct sockaddr *) 
&sun_in, sizeof(struct sockaddr_un)) < 0){
+                               printlog(LOG_ERR,"Binding to data socket 
%s",strerror(errno));
+                               close_ep(portno,fd_ctl);
+                               return -1;
+                       }
+                       if (geteuid() != 0)
+                               user = -1;
+                       if (user != -1)
+                               chmod(sun_in.sun_path,mode & 0700);
+                       else
+                               chmod(sun_in.sun_path,mode);
+                       if(chown(sun_in.sun_path,user,grp_owner) < 0) {
+                               printlog(LOG_ERR, "chown: %s", strerror(errno));
+                               unlink(sun_in.sun_path);
+                               close_ep(portno,fd_ctl);
+                               return -1;
+                       }
+
+                       n = write(fd_ctl, &sun_in, sizeof(sun_in));
                        if(n != sizeof(sun_in)){
                                printlog(LOG_WARNING,"Sending data socket name 
%s",strerror(errno));
-                               close_ep(port,fd);
+                               close_ep(portno,fd_ctl);
                                return -1;
                        }
                        if (type==REQ_NEW_PORT0)
                                setmgmtperm(sun_in.sun_path);
-                       return port;
+                       return portno;
                        break;
                default:
                        printlog(LOG_WARNING,"Bad request type : %d", type);
-                       remove_fd(fd); 
+                       remove_fd(fd_ctl); 
                        return -1;
        }
 }
@@ -222,11 +209,9 @@
 {
        if (type == data_type) {
                struct bipacket packet;
-               struct sockaddr sock;
                int len;
-               socklen_t socklen = sizeof(sock);
 
-               len=recvfrom(fd, &(packet.p), sizeof(struct packet),0, &sock, 
&socklen);
+               len=recv(fd, &(packet.p), sizeof(struct packet),0);
                if(len < 0){
                        if (errno == EAGAIN || errno == EWOULDBLOCK) return;
                        printlog(LOG_WARNING,"Reading  data: 
%s",strerror(errno));
@@ -292,11 +277,12 @@
                        printlog(LOG_WARNING,"accept %s",strerror(errno));
                        return;
                }
-               if(fcntl(new, F_SETFL, O_NONBLOCK) < 0){
+               /*
+                       if(fcntl(new, F_SETFL, O_NONBLOCK) < 0){
                        printlog(LOG_WARNING,"fcntl - setting O_NONBLOCK 
%s",strerror(errno));
                        close(new);
                        return;
-               }
+               }*/
 
                add_fd(new,wd_type,-1);
        }
@@ -327,7 +313,7 @@
                else printlog(LOG_WARNING,"Cleanup not removing files");
        } else {
                if (type == data_type && arg>=0) {
-                       
snprintf(clun.sun_path,sizeof(clun.sun_path),"%s/%03d",ctl_socket,arg);
+                       
snprintf(clun.sun_path,sizeof(clun.sun_path),"%s/%03d.%d",ctl_socket,arg,fd);
                        unlink(clun.sun_path);
                }
                close(fd);
@@ -499,10 +485,10 @@
        {"ds/showinfo","","show ds info",showinfo,NOARG|WITHFILE},
 };
 
-static void delep (int fd, void* data, void *descr)
+static void delep (int fd_ctl, int fd_data, void *descr)
 {
-       if (fd>=0) remove_fd(fd);
-       if (data) free(data);
+       if (fd_data>=0) remove_fd(fd_data);
+       if (fd_ctl>=0) remove_fd(fd_ctl);
        if (descr) free(descr);
 }
 
@@ -517,9 +503,7 @@
        swmi.handle_input=handle_input;
        swmi.cleanup=cleanup;
        modfun.sender=send_datasock;
-       modfun.newport=newport;
        modfun.delep=delep;
-       modfun.delport=closeport;
        ADDCL(cl);
        add_swm(&swmi);
 }

Modified: branches/rd235/vde-2/src/vde_switch/packetq.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/packetq.c       2011-03-16 21:30:55 UTC 
(rev 478)
+++ branches/rd235/vde-2/src/vde_switch/packetq.c       2011-03-25 18:08:57 UTC 
(rev 479)
@@ -54,12 +54,11 @@
 static int countq;
 
 struct packetqq {
-       int (*sender)(int fd, int fd_ctl, void *packet, int len, void *data, 
int port);
-       int fd; 
+       int (*sender)(int fd_ctl, int fd_data, void *packet, int len, int port);
        int fd_ctl; 
+       int fd_data; 
        void *packet; 
        int len; 
-       void *data; 
        int port;
        int times;
        struct packetqq *next;
@@ -73,8 +72,8 @@
 static struct timeval last_try;
 #endif
 
-void packetq_add(int (*sender)(int fd, int fd_ctl, void *packet, int len, void 
*data, int port),
-               int fd, int fd_ctl, void *packet, int len, void *data, int port)
+void packetq_add(int (*sender)(int fd_ctl, int fd_data, void *packet, int len, 
int port),
+               int fd_ctl, int fd_data, void *packet, int len, int port)
 {
        if (countq < MAXQLEN) {
                struct packetqq *new=malloc(sizeof(struct packetqq));
@@ -82,12 +81,11 @@
                if (new != NULL && packetcopy != NULL && len > 0) {
                        countq++;
                        new->sender=sender;
-                       new->fd=fd;
                        new->fd_ctl=fd_ctl;
+                       new->fd_data=fd_data;
                        memcpy(packetcopy,packet,len);
                        new->packet=packetcopy;
                        new->len=len;
-                       new->data=data;
                        new->port=port;
                        new->times=TIMES;
                        new->next=NULL;
@@ -119,9 +117,9 @@
 static struct packetqq *packetq_scantry(struct packetqq *h,struct packetqq 
**t,fd_set *fds)
 {
        if (h != NULL) {
-               int sendrv=!(FD_ISSET(h->fd,fds));
+               int sendrv=!(FD_ISSET(h->fd_data,fds));
                h->times--;
-               if ((sendrv && 
(sendrv=h->sender(h->fd,h->fd_ctl,h->packet,h->len,h->data,h->port)) == 0)   
/*send OK*/
+               if ((sendrv && 
(sendrv=h->sender(h->fd_ctl,h->fd_data,h->packet,h->len,h->port)) == 0)   
/*send OK*/
                                || h->times<=0) { /*or max number of attempts 
reached*/
                        struct packetqq *next;
                        next=h->next;
@@ -130,7 +128,7 @@
                        free(h);
                        return packetq_scantry(next,t,fds);
                } else {
-                       FD_SET(h->fd,fds);
+                       FD_SET(h->fd_data,fds);
                        h->next=packetq_scantry(h->next,t,fds);
                        if (h->next == NULL) *t=h;
                        return h;
@@ -182,17 +180,17 @@
        }
 }
 
-static struct packetqq *packetq_scandelfd(int fd,struct packetqq *h,struct 
packetqq **t)
+static struct packetqq *packetq_scandelfd(int fd_data,struct packetqq 
*h,struct packetqq **t)
 {
        if (h != NULL) {
-               if (fd == h->fd) {
+               if (fd_data == h->fd_data) {
                        struct packetqq *next=h->next;
                        countq--;
                        free(h->packet);
                        free(h);
-                       return packetq_scandelfd(fd,next,t);
+                       return packetq_scandelfd(fd_data,next,t);
                } else {
-                       h->next=packetq_scandelfd(fd,h->next,t);
+                       h->next=packetq_scandelfd(fd_data,h->next,t);
                        if (h->next == NULL) *t=h;
                        return h;
                }
@@ -200,9 +198,9 @@
                return NULL;
 }
 
-void packetq_delfd(int fd)
+void packetq_delfd(int fd_data)
 {
-       pqh=packetq_scandelfd(fd,pqh,&pqt);
+       pqh=packetq_scandelfd(fd_data,pqh,&pqt);
        if (pqh == NULL)
 #ifdef VDE_PQ_PPOLL
                packetq_timeout = NULL;

Modified: branches/rd235/vde-2/src/vde_switch/packetq.h
===================================================================
--- branches/rd235/vde-2/src/vde_switch/packetq.h       2011-03-16 21:30:55 UTC 
(rev 478)
+++ branches/rd235/vde-2/src/vde_switch/packetq.h       2011-03-25 18:08:57 UTC 
(rev 479)
@@ -15,8 +15,8 @@
 extern int packetq_timeout;
 #endif
 
-void packetq_add(int (*sender)(int fd, int fd_ctl, void *packet, int len, void 
*data, int port),
-               int fd, int fd_ctl, void *packet, int len, void *data, int 
port);
+void packetq_add(int (*sender)(int fd_ctl, int fd_data, void *packet, int len, 
int port),
+               int fd, int fd_ctl, void *packet, int len, int port);
 
 void packetq_try(void);
 

Modified: branches/rd235/vde-2/src/vde_switch/port.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/port.c  2011-03-16 21:30:55 UTC (rev 
478)
+++ branches/rd235/vde-2/src/vde_switch/port.c  2011-03-25 18:08:57 UTC (rev 
479)
@@ -80,7 +80,7 @@
 struct endpoint {
        int port;
        int fd_ctl;
-       void *data;
+       int fd_data;
        char *descr;
        struct endpoint *next;
 };
@@ -88,11 +88,10 @@
 #define NOTINPOOL 0x8000
 
 struct port {
-       int fd_data;
        struct endpoint *ep;
        int flag;
        /* sender is already inside ms, but it needs one more memaccess */
-       int (*sender)(int fd, int fd_ctl, void *packet, int len, void *data, 
int port);
+       int (*sender)(int fd_ctl, int fd_data, void *packet, int len, int port);
        struct mod_support *ms;
        int vlanuntag;
        uid_t user;
@@ -148,7 +147,6 @@
                                EVENTOUT(DBGPORTNEW,i);
 
                                portv[i]=port;
-                               port->fd_data=-1;
                                port->ep=NULL;
                                port->user=port->group=port->curuser=-1;
 #ifdef FSTP
@@ -185,32 +183,9 @@
 }
 
 /* 1 if user belongs to the group, 0 otherwise) */
-#if 0
-/* getgrouplist is a nonstandard call */
 static int user_belongs_to_group(uid_t uid, gid_t gid)
 {
        struct passwd *pw=getpwuid(uid);
-       int found=0;
-       if (pw != NULL) {
-               int gsize=8;
-               int scan;
-               gid_t *grouplist=NULL;
-               do {
-                       grouplist=realloc(grouplist, gsize*sizeof(gid_t));
-               } while (grouplist != NULL && 
getgrouplist(pw->pw_name,pw->pw_gid,grouplist,&gsize) < 0);
-               if (grouplist != NULL) {
-                       for (scan=0;scan<gsize && !found;scan++)
-                               if (grouplist[scan]==gid)
-                                       found=1;
-                       free(grouplist);
-               }
-       }
-       return found;
-}
-#endif
-static int user_belongs_to_group(uid_t uid, gid_t gid)
-{
-       struct passwd *pw=getpwuid(uid);
        if (pw == NULL) 
                return 0;
        else {
@@ -259,8 +234,7 @@
 /* initialize a port structure with control=fd, given data+data_len and sender
  * function; 
  * and then add it to the g_fdsdata array at index i. */
-int setup_ep(int portno, int fd_ctl,
-               void *data,
+int setup_ep(int portno, int fd_ctl, int fd_data,
                uid_t user,
                struct mod_support *modfun)
 {
@@ -269,11 +243,9 @@
 
        if ((portno = alloc_port(portno)) >= 0) {
                port=portv[portno];     
-               if (port->fd_data < 0 && checkport_ac(port,user)==0) {
-                       port->fd_data=modfun->newport(fd_ctl,portno,user);
+               if (port->ep == NULL && checkport_ac(port,user)==0)
                        port->curuser=user;
-               }
-               if (port->fd_data >= 0 && port->curuser == user &&
+               if (port->curuser == user &&
                                (ep=malloc(sizeof(struct endpoint))) != NULL) {
                        DBGOUT(DBGEPNEW,"Port %02d FD %2d", portno,fd_ctl);
                        EVENTOUT(DBGEPNEW,portno,fd_ctl);
@@ -281,7 +253,7 @@
                        port->sender=modfun->sender;
                        ep->port=portno;
                        ep->fd_ctl=fd_ctl;
-                       ep->data=data;
+                       ep->fd_data=fd_data;
                        ep->descr=NULL;
                        if(port->ep == NULL) {/* WAS INACTIVE */
                                register int i;
@@ -308,9 +280,7 @@
                        return portno;
                }
                else {
-                       if (port->fd_data < 0)
-                               errno=EPERM;
-                       else if (port->curuser != user)
+                       if (port->curuser != user)
                                errno=EADDRINUSE;
                        else 
                                errno=ENOMEM;
@@ -347,8 +317,11 @@
                        DBGOUT(DBGEPDEL,"Port %02d FD %2d",this->port,fd_ctl);
                        EVENTOUT(DBGEPDEL,this->port,fd_ctl);
                        *pep=this->next;
+#ifdef VDE_PQ
+                       packetq_delfd(this->fd_data);
+#endif
                        if (portv[this->port]->ms->delep)
-                               
portv[this->port]->ms->delep(this->fd_ctl,this->data,this->descr);
+                               
portv[this->port]->ms->delep(this->fd_ctl,this->fd_data,this->descr);
                        free(this);
                        return 0;
                } else
@@ -367,12 +340,9 @@
                                DBGOUT(DBGPORTDEL,"%02d",portno);
                                EVENTOUT(DBGPORTDEL,portno);
                                hash_delete_port(portno);
-#ifdef VDE_PQ
-                               packetq_delfd(port->fd_data);
-#endif
-                               if (portv[portno]->ms->delport)
+                               /*if (portv[portno]->ms->delport)
                                        
portv[portno]->ms->delport(port->fd_data,portno);
-                               port->fd_data=-1;
+                               port->fd_data=-1;*/
                                port->ms=NULL;
                                port->sender=NULL;
                                port->curuser=-1;
@@ -423,8 +393,8 @@
         struct endpoint *ep; \
         SEND_COUNTER_UPD(Port,LEN); \
         for (ep=Port->ep; ep != NULL; ep=ep->next) \
-        if (Port->ms->sender(Port->fd_data, ep->fd_ctl, (PACKET), (LEN), 
ep->data, ep->port)) \
-        packetq_add(Port->ms->sender,Port->fd_data, ep->fd_ctl, (PACKET), 
(LEN), ep->data, ep->port); \
+        if (Port->ms->sender(ep->fd_ctl, ep->fd_data, (PACKET), (LEN), 
ep->port)) \
+        packetq_add(Port->ms->sender,ep->fd_ctl, ep->fd_data, (PACKET), (LEN), 
ep->port); \
         } \
         })
 #else
@@ -435,7 +405,7 @@
         struct endpoint *ep; \
         SEND_COUNTER_UPD(Port,LEN); \
         for (ep=Port->ep; ep != NULL; ep=ep->next) \
-        Port->ms->sender(Port->fd_data, ep->fd_ctl, (PACKET), (LEN), ep->data, 
ep->port); \
+        Port->ms->sender(ep->fd_ctl, ep->fd_data, (PACKET), (LEN), ep->port); \
         } \
         })
 #endif

Modified: branches/rd235/vde-2/src/vde_switch/port.h
===================================================================
--- branches/rd235/vde-2/src/vde_switch/port.h  2011-03-16 21:30:55 UTC (rev 
478)
+++ branches/rd235/vde-2/src/vde_switch/port.h  2011-03-25 18:08:57 UTC (rev 
479)
@@ -37,14 +37,14 @@
 
 struct mod_support {
        char *modname;
-       int (*sender)(int fd, int fd_ctl, void *packet, int len, void *data, 
int port);
-       int (*newport)(int fd_ctl,int portno,uid_t user);
-       void (*delep)(int fd, void* data, void *descr);
-       void (*delport)(int fd,int portno);
+       int (*sender)(int fd_ctl, int fd_data, void *packet, int len, int port);
+//     int (*newport)(int fd_ctl,int portno,uid_t user);
+       void (*delep)(int fd_ctl, int fd_data, void *descr);
+//     void (*delport)(int fd,int portno);
 };
 
 extern int setup_ep(int portno, int fd_ctl,
-               void *data,
+               int fd_data,
                uid_t user,
                struct mod_support *modfun);
 

Modified: branches/rd235/vde-2/src/vde_switch/tuntap.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/tuntap.c        2011-03-16 21:30:55 UTC 
(rev 478)
+++ branches/rd235/vde-2/src/vde_switch/tuntap.c        2011-03-25 18:08:57 UTC 
(rev 479)
@@ -52,11 +52,11 @@
 
 struct init_tap *hinit_tap=NULL;
 
-static int send_tap(int fd, int ctl_fd, void *packet, int len, void *unused, 
int port)
+static int send_tap(int fd_ctl, int fd_data, void *packet, int len, int port)
 {
        int n;
 
-       n = len - write(ctl_fd, packet, len);
+       n = len - write(fd_ctl, packet, len);
        if(n){
                int rv=errno;
 #ifndef VDE_PQ
@@ -71,12 +71,6 @@
        return 0;
 }
 
-static void closeport(int fd, int portno)
-{
-         if (fd>0)
-                           remove_fd(fd);
-}
-
 static void handle_input(unsigned char type,int fd,int revents,int *arg)
 {
        struct bipacket packet;
@@ -175,6 +169,11 @@
                close(fd);
                return(-1);
        }
+#ifdef VDE_PQ
+       /* tuntap should be "fast", but if there is a packetq we can manage
+                a tuntap which is "not fast enough" */
+       fcntl(fd, F_SETFL, O_NONBLOCK);
+#endif
        return(fd);
 }
 #endif
@@ -209,17 +208,12 @@
 }
 #endif
 
-static int newport(int fd, int portno, uid_t user)
-{
-       return fd;
-}
-
 static int newtap(char *dev)
 {
        int tap_fd;
        tap_fd = open_tap(dev);
        if (tap_fd>0) {
-               int portno=setup_ep(0,tap_fd,NULL,-1,&modfun);
+               int portno=setup_ep(0,tap_fd,tap_fd,-1,&modfun);
                if (portno >= 0) {
                        setup_description(portno,tap_fd,dev);
                        add_fd(tap_fd,tap_type,portno);
@@ -243,8 +237,10 @@
        }
 }
 
-static void delep (int fd, void* data, void *descr)
+static void delep (int fd_ctl, int fd_data, void *descr)
 {
+       if (fd_ctl>=0)
+               remove_fd(fd_ctl);
        if (descr) free(descr);
 }
 
@@ -259,9 +255,7 @@
        swmi.handle_input=handle_input;
        swmi.cleanup=cleanup;
        modfun.sender=send_tap;
-       modfun.newport=newport;
        modfun.delep=delep;
-       modfun.delport=closeport;
        add_swm(&swmi);
 }
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software 
be a part of the solution? Download the Intel(R) Manageability Checker 
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
vde-users mailing list
vde-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/vde-users

Reply via email to