Revision: 483
http://vde.svn.sourceforge.net/vde/?rev=483&view=rev
Author: rd235
Date: 2011-03-28 10:05:45 +0000 (Mon, 28 Mar 2011)
Log Message:
-----------
step three: new queueing discipline. Packets get sent as soon as possible,
pollout on connected sockets wakes up the queue
Modified Paths:
--------------
branches/rd235/vde-2/include/vde.h
branches/rd235/vde-2/src/vde_switch/consmgmt.c
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
branches/rd235/vde-2/src/vde_switch/vde_switch.c
Modified: branches/rd235/vde-2/include/vde.h
===================================================================
--- branches/rd235/vde-2/include/vde.h 2011-03-27 21:04:28 UTC (rev 482)
+++ branches/rd235/vde-2/include/vde.h 2011-03-28 10:05:45 UTC (rev 483)
@@ -18,12 +18,6 @@
#define DO_SYSLOG
#define VDE_IP_LOG
-/*
- * Enable the new packet queueing. Experimental but recommended
- * (expecially with Darwin and other BSDs)
- */
-#define VDE_PQ
-#define VDE_PQ_PPOLL
-#define VDE_PQ_DYNAMIC
+#define VDE_PQ2
#endif
Modified: branches/rd235/vde-2/src/vde_switch/consmgmt.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/consmgmt.c 2011-03-27 21:04:28 UTC
(rev 482)
+++ branches/rd235/vde-2/src/vde_switch/consmgmt.c 2011-03-28 10:05:45 UTC
(rev 483)
@@ -648,7 +648,6 @@
qtime());
if (mgmt_socket)
printoutc(fd,"mgmt %s perm 0%03o",mgmt_socket,mgmt_mode);
- printoutc(fd,"unsent_pktq_len %d",packetq_count());
return 0;
}
Modified: branches/rd235/vde-2/src/vde_switch/datasock.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/datasock.c 2011-03-27 21:04:28 UTC
(rev 482)
+++ branches/rd235/vde-2/src/vde_switch/datasock.c 2011-03-28 10:05:45 UTC
(rev 483)
@@ -85,18 +85,13 @@
static int send_datasock(int fd_ctl, int fd_data, void *packet, int len, int
port)
{
- int n;
-
- n = len - send(fd_data, packet, len, 0);
- if(n){
+ if (send(fd_data, packet, len, 0) < 0) {
int rv=errno;
-#ifndef VDE_PQ
- if(errno != EAGAIN && errno != EWOULDBLOCK)
printlog(LOG_WARNING,"send_sockaddr port %d: %s",port,strerror(errno));
-#endif
- if (n>len)
- return -rv;
+ if(rv != EAGAIN && rv != EWOULDBLOCK)
+ printlog(LOG_WARNING,"send_sockaddr port %d:
%s",port,strerror(errno));
else
- return n;
+ rv=EWOULDBLOCK;
+ return -rv;
}
return 0;
}
@@ -209,18 +204,24 @@
{
struct endpoint *ep=arg;
if (type == data_type) {
- struct bipacket packet;
- int len;
+#ifdef VDE_PQ2
+ if (revents & POLLOUT)
+ handle_out_packet(ep);
+#endif
+ if (revents & POLLIN) {
+ struct bipacket packet;
+ int len;
- 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));
+ 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));
+ }
+ else if(len == 0)
+ printlog(LOG_WARNING,"EOF data port:
%s",strerror(errno));
+ else if(len >= ETH_HEADER_SIZE)
+ handle_in_packet(ep, &(packet.p), len);
}
- else if(len == 0)
- printlog(LOG_WARNING,"EOF data port:
%s",strerror(errno));
- else if(len >= ETH_HEADER_SIZE)
- handle_in_packet(ep, &(packet.p), len);
}
else if (type == wd_type) {
char reqbuf[REQBUFLEN+1];
Modified: branches/rd235/vde-2/src/vde_switch/packetq.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/packetq.c 2011-03-27 21:04:28 UTC
(rev 482)
+++ branches/rd235/vde-2/src/vde_switch/packetq.c 2011-03-28 10:05:45 UTC
(rev 483)
@@ -1,8 +1,7 @@
/*
* packetq - packet queue management. try to send packets several times before
discarding.
- * Copyright 2005,...,2011 Renzo Davoli
+ * Copyright 2011 Renzo Davoli
* Licensed under the GPLv2
- * 2011 Thanks to Simone Abbakus for the idea of dynamic delay
*/
#include <stdlib.h>
@@ -21,196 +20,84 @@
#include "consmgmt.h"
-#define TIMES 10
-#define MAXQLEN 4192
+#ifdef VDE_PQ2
-#ifdef VDE_PQ
-#include "packetq.h"
-#include <time.h>
+struct packetbuf {
+ short len;
+ short count;
+};
-#ifdef VDE_PQ_PPOLL
-
-#ifdef CLOCK_MONOTONIC_RAW
-#define CLOCK_TYPE CLOCK_MONOTONIC_RAW
-#else
-#define CLOCK_TYPE CLOCK_MONOTONIC
-#endif
-struct timespec *packetq_timeout;
-static struct timespec packetq_timeout_value;
-#ifdef VDE_PQ_DYNAMIC
-#define TIMEOUT_MAX 10000000 //Upper bound 10ms
-#define TIMEOUT_MIN 1000000 //Lower bound 1ms
-#define TIMEOUT_MEAN ((TIMEOUT_MAX + TIMEOUT_MIN) / 2)
-#define TIMEOUT_STEP ((TIMEOUT_MAX - TIMEOUT_MIN) / MAXQLEN)
-#else
-#define TIMEOUT_NS 5000000
-#endif
-#else
-
-int packetq_timeout= -1;
-#define TIMEOUT 5
-#endif
-
-static int countq;
-
-struct packetqq {
- 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;
- int times;
- struct packetqq *next;
+struct vdepq {
+ struct packetbuf *vdepq_pb;
+ struct vdepq *vdepq_next;
};
-static struct packetqq *pqh=NULL;
-static struct packetqq *pqt=NULL;
-#ifdef VDE_PQ_PPOLL
-static struct timespec last_try;
-#else
-static struct timeval last_try;
-#endif
-
-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)
+int vdepq_add(struct vdepq **tail, void *packet, int len, void **tmp)
{
- if (countq < MAXQLEN) {
- struct packetqq *new=malloc(sizeof(struct packetqq));
- void *packetcopy=malloc(len);
- if (new != NULL && packetcopy != NULL && len > 0) {
- countq++;
- new->sender=sender;
- new->fd_ctl=fd_ctl;
- new->fd_data=fd_data;
- memcpy(packetcopy,packet,len);
- new->packet=packetcopy;
- new->len=len;
- new->port=port;
- new->times=TIMES;
- new->next=NULL;
- if (pqh==NULL) {
-#ifdef VDE_PQ_PPOLL
- clock_gettime(CLOCK_TYPE,&last_try);
-#ifdef VDE_PQ_DYNAMIC
- packetq_timeout_value.tv_nsec=TIMEOUT_MEAN;
-#else
- packetq_timeout_value.tv_nsec=TIMEOUT_NS;
-#endif
- packetq_timeout=&packetq_timeout_value;
-#else
- gettimeofday(&last_try,NULL);
- packetq_timeout=TIMEOUT;
-#endif
- pqh=pqt=new;
- } else {
- pqt->next=new;
- pqt=new;
- }
- } else {
- if (new != NULL) free(new);
- if (packetcopy != NULL) free(packetcopy);
+ struct packetbuf *packetbuftmp = *tmp;
+ struct vdepq *newelem;
+ if ((newelem = malloc(sizeof(struct vdepq))) == NULL)
+ return 0;
+ if (packetbuftmp == NULL) {
+ if ((*tmp = packetbuftmp = malloc (sizeof(struct
packetbuf)+len))==NULL) {
+ free(newelem);
+ return 0;
}
+ packetbuftmp->len=len;
+ packetbuftmp->count=0;
+ memcpy(((void *)(packetbuftmp+1)),packet,len);
}
+ newelem->vdepq_pb=packetbuftmp;
+ (packetbuftmp->count)++;
+ //printf("add %p count %d len %d/%d
\n",newelem,packetbuftmp->count,len,packetbuftmp->len);
+ if (*tail == NULL)
+ *tail=newelem->vdepq_next=newelem;
+ else {
+ newelem->vdepq_next=(*tail)->vdepq_next;
+ (*tail)->vdepq_next=newelem;
+ *tail=newelem;
+ }
+ return 1;
}
-static struct packetqq *packetq_scantry(struct packetqq *h,struct packetqq
**t,fd_set *fds)
-{
- if (h != NULL) {
- int sendrv=!(FD_ISSET(h->fd_data,fds));
- h->times--;
- 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;
- countq--;
- free(h->packet);
- free(h);
- return packetq_scantry(next,t,fds);
- } else {
- FD_SET(h->fd_data,fds);
- h->next=packetq_scantry(h->next,t,fds);
- if (h->next == NULL) *t=h;
- return h;
- }
- } else
- return NULL;
-}
+#define PACKETBUFDEL(X) \
+ ({ if (--((X)->count) == 0) \
+ free(X);\
+ })
-void packetq_try(void)
+void vdepq_del(struct vdepq **tail)
{
- if (pqh != NULL) {
-#ifdef VDE_PQ_PPOLL
- struct timespec this_try;
- long remaining_nsecs;
- clock_gettime(CLOCK_TYPE,&this_try);
- /* TIMEOUT should never exceed 2.1 secs! */
- remaining_nsecs = packetq_timeout_value.tv_nsec -
((this_try.tv_sec-last_try.tv_sec) * 1000000000 +
(this_try.tv_nsec-last_try.tv_nsec));
- if (remaining_nsecs <= 0) {
- fd_set fds;
- FD_ZERO(&fds);
- pqh=packetq_scantry(pqh,&pqt,&fds);
- if (pqh != NULL) {
- clock_gettime(CLOCK_TYPE,&last_try);
-#ifdef VDE_PQ_DYNAMIC
- packetq_timeout_value.tv_nsec = TIMEOUT_MAX -
TIMEOUT_STEP * countq;
-#else
- packetq_timeout_value.tv_nsec = TIMEOUT_NS;
-#endif
- } else
- packetq_timeout = NULL;
- } else
- packetq_timeout_value.tv_nsec = remaining_nsecs;
-#else
- struct timeval this_try;
- gettimeofday(&this_try,NULL);
- packetq_timeout=TIMEOUT - ((this_try.tv_sec-last_try.tv_sec) *
1000 +
- (this_try.tv_usec-last_try.tv_usec) / 1000);
- if (packetq_timeout <= 0) {
- fd_set fds;
- FD_ZERO(&fds);
- pqh=packetq_scantry(pqh,&pqt,&fds);
- if (pqh != NULL) {
- gettimeofday(&last_try,NULL);
- packetq_timeout=TIMEOUT;
- } else
- packetq_timeout = -1;
- }
-#endif
+ while (*tail != NULL) {
+ struct vdepq *first=(*tail)->vdepq_next;
+ //printf("kill one %p %p\n",first,*tail);
+ PACKETBUFDEL(first->vdepq_pb);
+ if (first == (*tail))
+ *tail=NULL;
+ else
+ (*tail)->vdepq_next=first->vdepq_next;
+ free(first);
}
}
-static struct packetqq *packetq_scandelfd(int fd_data,struct packetqq
*h,struct packetqq **t)
-{
- if (h != NULL) {
- if (fd_data == h->fd_data) {
- struct packetqq *next=h->next;
- countq--;
- free(h->packet);
- free(h);
- return packetq_scandelfd(fd_data,next,t);
- } else {
- h->next=packetq_scandelfd(fd_data,h->next,t);
- if (h->next == NULL) *t=h;
- return h;
- }
- } else
- return NULL;
+int vdepq_try(struct vdepq **tail, void *ep,
+ int (*sendfun)(void *ep, void *packet, int len)) {
+ int sent=0;
+ while (*tail != NULL) {
+ struct vdepq *first = (*tail)->vdepq_next;
+ //printf("trysend %p len %d\n",first,first->vdepq_pb->len);
+ if (sendfun(ep, (void *)(first->vdepq_pb + 1),
first->vdepq_pb->len) == -EWOULDBLOCK)
+ break;
+ else {
+ PACKETBUFDEL(first->vdepq_pb);
+ if (first == (*tail))
+ *tail=NULL;
+ else
+ (*tail)->vdepq_next=first->vdepq_next;
+ free(first);
+ sent++;
+ }
+ }
+ return sent;
}
-void packetq_delfd(int fd_data)
-{
- pqh=packetq_scandelfd(fd_data,pqh,&pqt);
- if (pqh == NULL)
-#ifdef VDE_PQ_PPOLL
- packetq_timeout = NULL;
-#else
- packetq_timeout = -1;
#endif
-}
-
-int packetq_count()
-{
- return countq;
-}
-#endif
Modified: branches/rd235/vde-2/src/vde_switch/packetq.h
===================================================================
--- branches/rd235/vde-2/src/vde_switch/packetq.h 2011-03-27 21:04:28 UTC
(rev 482)
+++ branches/rd235/vde-2/src/vde_switch/packetq.h 2011-03-28 10:05:45 UTC
(rev 483)
@@ -4,24 +4,19 @@
* Licensed under the GPLv2
*/
-#ifdef VDE_PQ
+#ifdef VDE_PQ2
#ifndef _PACKETQ_H
#define _PACKETQ_H
-#include <time.h>
-#ifdef VDE_PQ_PPOLL
-extern struct timespec *packetq_timeout;
-#else
-extern int packetq_timeout;
-#endif
+struct vdepq;
+struct endpoint;
-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);
+int vdepq_add(struct vdepq **tail, void *packet, int len, void *tmp);
-void packetq_try(void);
+void vdepq_del(struct vdepq **tail);
-void packetq_delfd(int fd);
+int vdepq_try(struct vdepq **tail, struct endpoint *ep,
+ int (*sendfun)(struct endpoint *ep, void *packet, int len));
-int packetq_count();
#endif
#endif
Modified: branches/rd235/vde-2/src/vde_switch/port.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/port.c 2011-03-27 21:04:28 UTC (rev
482)
+++ branches/rd235/vde-2/src/vde_switch/port.c 2011-03-28 10:05:45 UTC (rev
483)
@@ -31,9 +31,7 @@
#include "bitarray.h"
#include "fstp.h"
-#ifdef VDE_PQ
#include "packetq.h"
-#endif
static int pflag=0;
static int numports;
@@ -82,6 +80,11 @@
int fd_ctl;
int fd_data;
char *descr;
+#ifdef VDE_PQ2
+ struct vdepq *vdepq;
+ int vdepq_count;
+ int vdepq_max;
+#endif
struct endpoint *next;
};
@@ -252,6 +255,11 @@
ep->fd_ctl=fd_ctl;
ep->fd_data=fd_data;
ep->descr=NULL;
+#ifdef VDE_PQ2
+ ep->vdepq=NULL;
+ ep->vdepq_count=0;
+ ep->vdepq_max=128;
+#endif
if(port->ep == NULL) {/* WAS INACTIVE */
register int i;
/* copy all the vlan defs to the active vlan
defs */
@@ -310,8 +318,8 @@
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);
+#ifdef VDE_PQ2
+ vdepq_del(&(this->vdepq));
#endif
if (portv[this->port]->ms->delep)
portv[this->port]->ms->delep(this->fd_ctl,this->fd_data,this->descr);
@@ -380,28 +388,32 @@
#define SEND_COUNTER_UPD(Port,LEN)
#endif
-#ifdef VDE_PQ
-#define SEND_PACKET_PORT(PORT,PORTNO,PACKET,LEN) \
+#ifndef VDE_PQ2
+#define SEND_PACKET_PORT(PORT,PORTNO,PACKET,LEN,TMPBUF) \
({\
struct port *Port=(PORT); \
if (PACKETFILTER(PKTFILTOUT,(PORTNO),(PACKET), (LEN))) {\
struct endpoint *ep; \
SEND_COUNTER_UPD(Port,LEN); \
for (ep=Port->ep; ep != NULL; ep=ep->next) \
- 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); \
+ Port->ms->sender(ep->fd_ctl, ep->fd_data, (PACKET), (LEN), ep->port); \
} \
})
#else
-#define SEND_PACKET_PORT(PORT,PORTNO,PACKET,LEN) \
+#define SEND_PACKET_PORT(PORT,PORTNO,PACKET,LEN,TMPBUF) \
({\
struct port *Port=(PORT); \
if (PACKETFILTER(PKTFILTOUT,(PORTNO),(PACKET), (LEN))) {\
struct endpoint *ep; \
SEND_COUNTER_UPD(Port,LEN); \
for (ep=Port->ep; ep != NULL; ep=ep->next) \
- Port->ms->sender(ep->fd_ctl, ep->fd_data, (PACKET), (LEN), ep->port); \
+ if (ep->vdepq_count || \
+ Port->ms->sender(ep->fd_ctl, ep->fd_data, (PACKET), (LEN),
ep->port) == -EWOULDBLOCK) {\
+ if (ep->vdepq_count < ep->vdepq_max) \
+ ep->vdepq_count += vdepq_add(&(ep->vdepq), (PACKET), (LEN), TMPBUF); \
+ if (ep->vdepq_count == 1) mainloop_pollmask_set(ep->fd_data, POLLOUT);\
} \
+ } \
})
#endif
@@ -410,14 +422,16 @@
/* functions for FSTP */
void port_send_packet(int portno, void *packet, int len)
{
- SEND_PACKET_PORT(portv[portno],portno,packet,len);
+ void *tmpbuf=NULL;
+ SEND_PACKET_PORT(portv[portno],portno,packet,len,&tmpbuf);
}
void portset_send_packet(bitarray portset, void *packet, int len)
{
register int i;
+ void *tmpbuf=NULL;
ba_FORALL(portset,numports,
- SEND_PACKET_PORT(portv[i],i,packet,len), i);
+ SEND_PACKET_PORT(portv[i],i,packet,len,&tmpbuf), i);
}
@@ -503,6 +517,22 @@
(struct packet *)((char *)(P)-4); })
+#ifdef VDE_PQ2
+static int trysendfun(struct endpoint *ep, void *packet, int len)
+{
+ int port=ep->port;
+ return portv[port]->ms->sender(ep->fd_ctl, ep->fd_data, packet, len,
port);
+}
+
+void handle_out_packet(struct endpoint *ep)
+{
+ //printf("handle_out_packet %d\n",ep->vdepq_count);
+ ep->vdepq_count -= vdepq_try(&(ep->vdepq),ep,trysendfun);
+ if (ep->vdepq_count == 0)
+ mainloop_pollmask_del(ep->fd_data, POLLOUT);
+}
+#endif
+
void handle_in_packet(struct endpoint *ep, struct packet *packet, int len)
{
int tarport;
@@ -517,9 +547,10 @@
#endif
if (pflag & HUB_TAG) { /* this is a HUB */
register int i;
+ void *tmpbuf=NULL;
for(i = 1; i < numports; i++)
if((i != port) && (portv[i] != NULL))
- SEND_PACKET_PORT(portv[i],i,packet,len);
+
SEND_PACKET_PORT(portv[i],i,packet,len,&tmpbuf);
} else { /* This is a switch, not a HUB! */
if (packet->header.proto[0] == 0x81 &&
packet->header.proto[1] == 0x00) {
tagged=1;
@@ -560,18 +591,22 @@
* of the same tag-ness, then transform it to
the other tag-ness for the others*/
if (tagged) {
register int i;
+ void *tmpbuft=NULL;
+ void *tmpbufu=NULL;
ba_FORALL(vlant[vlan].bctag,numports,
- ({if (i != port)
SEND_PACKET_PORT(portv[i],i,packet,len);}),i);
+ ({if (i != port)
SEND_PACKET_PORT(portv[i],i,packet,len,&tmpbuft);}),i);
packet=TAG2UNTAG(packet,len);
ba_FORALL(vlant[vlan].bcuntag,numports,
- ({if (i != port)
SEND_PACKET_PORT(portv[i],i,packet,len);}),i);
+ ({if (i != port)
SEND_PACKET_PORT(portv[i],i,packet,len,&tmpbufu);}),i);
} else { /* untagged */
register int i;
+ void *tmpbufu=NULL;
+ void *tmpbuft=NULL;
ba_FORALL(vlant[vlan].bcuntag,numports,
- ({if (i != port)
SEND_PACKET_PORT(portv[i],i,packet,len);}),i);
+ ({if (i != port)
SEND_PACKET_PORT(portv[i],i,packet,len,&tmpbufu);}),i);
packet=UNTAG2TAG(packet,vlan,len);
ba_FORALL(vlant[vlan].bctag,numports,
- ({if (i != port)
SEND_PACKET_PORT(portv[i],i,packet,len);}),i);
+ ({if (i != port)
SEND_PACKET_PORT(portv[i],i,packet,len,&tmpbuft);}),i);
}
}
else {
@@ -580,18 +615,20 @@
if (tarport==port)
return; /*do not loop!*/
if (tagged) {
+ void *tmpbuf=NULL;
if (portv[tarport]->vlanuntag==vlan) {
/* TAG->UNTAG */
packet = TAG2UNTAG(packet,len);
-
SEND_PACKET_PORT(portv[tarport],tarport,packet,len);
+
SEND_PACKET_PORT(portv[tarport],tarport,packet,len,&tmpbuf);
} else {
/* TAG->TAG */
-
SEND_PACKET_PORT(portv[tarport],tarport,packet,len);
+
SEND_PACKET_PORT(portv[tarport],tarport,packet,len,&tmpbuf);
}
} else {
+ void *tmpbuf=NULL;
if (portv[tarport]->vlanuntag==vlan) {
/* UNTAG->UNTAG */
-
SEND_PACKET_PORT(portv[tarport],tarport,packet,len);
+
SEND_PACKET_PORT(portv[tarport],tarport,packet,len,&tmpbuf);
} else {
/* UNTAG->TAG */
packet =
UNTAG2TAG(packet,vlan,len);
-
SEND_PACKET_PORT(portv[tarport],tarport,packet,len);
+
SEND_PACKET_PORT(portv[tarport],tarport,packet,len,&tmpbuf);
}
}
} /* if(BROADCAST) */
@@ -830,9 +867,13 @@
printoutc(fd," IN: pkts %10lld bytes
%20lld",portv[i]->pktsin,portv[i]->bytesin);
printoutc(fd," OUT: pkts %10lld bytes
%20lld",portv[i]->pktsout,portv[i]->bytesout);
#endif
- for (ep=portv[i]->ep; ep != NULL; ep=ep->next)
+ for (ep=portv[i]->ep; ep != NULL; ep=ep->next) {
printoutc(fd," -- endpoint ID %04d module %-12s:
%s",ep->fd_ctl,
portv[i]->ms->modname,(ep->descr)?ep->descr:"no endpoint description");
+#ifdef VDE_PQ2
+ printoutc(fd," unsent packets: %d max
%d",ep->vdepq_count,ep->vdepq_max);
+#endif
+ }
return 0;
} else
return ENXIO;
Modified: branches/rd235/vde-2/src/vde_switch/port.h
===================================================================
--- branches/rd235/vde-2/src/vde_switch/port.h 2011-03-27 21:04:28 UTC (rev
482)
+++ branches/rd235/vde-2/src/vde_switch/port.h 2011-03-28 10:05:45 UTC (rev
483)
@@ -54,6 +54,10 @@
extern int close_ep(struct endpoint *ep);
+#ifdef VDE_PQ2
+extern void handle_out_packet(struct endpoint *ep);
+#endif
+
extern void handle_in_packet(struct endpoint *ep, struct packet *packet, int
len);
extern bitarray validvlan;
Modified: branches/rd235/vde-2/src/vde_switch/tuntap.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/tuntap.c 2011-03-27 21:04:28 UTC
(rev 482)
+++ branches/rd235/vde-2/src/vde_switch/tuntap.c 2011-03-28 10:05:45 UTC
(rev 483)
@@ -57,39 +57,41 @@
int n;
n = len - write(fd_ctl, packet, len);
- if(n){
+ if(n > len){
int rv=errno;
-#ifndef VDE_PQ
- if(errno != EAGAIN && errno != EWOULDBLOCK)
+ if(rv != EAGAIN && rv != EWOULDBLOCK)
printlog(LOG_WARNING,"send_tap port %d:
%s",port,strerror(errno));
-#endif
- if (n > len)
- return -rv;
else
- return n;
+ rv=EWOULDBLOCK;
+ return -rv;
}
- return 0;
+ return n;
}
static void handle_io(unsigned char type,int fd,int revents,void *private_data)
{
struct endpoint *ep=private_data;
- struct bipacket packet;
- int len=read(fd, &(packet.p), sizeof(struct packet));
+#ifdef VDE_PQ2
+ if (revents & POLLOUT)
+ handle_out_packet(ep);
+#endif
+ if (revents & POLLIN) {
+ struct bipacket packet;
+ int len=read(fd, &(packet.p), sizeof(struct packet));
- if(len < 0){
- if(errno != EAGAIN && errno != EWOULDBLOCK)
- printlog(LOG_WARNING,"Reading tap data:
%s",strerror(errno));
+ if(len < 0){
+ if(errno != EAGAIN && errno != EWOULDBLOCK)
+ printlog(LOG_WARNING,"Reading tap data:
%s",strerror(errno));
+ }
+ else if(len == 0) {
+ if(errno != EAGAIN && errno != EWOULDBLOCK)
+ printlog(LOG_WARNING,"EOF tap data port:
%s",strerror(errno));
+ /* close tap! */
+ } else if (len >= ETH_HEADER_SIZE)
+ handle_in_packet(ep, &(packet.p), len);
}
- else if(len == 0) {
- if(errno != EAGAIN && errno != EWOULDBLOCK)
- printlog(LOG_WARNING,"EOF tap data port:
%s",strerror(errno));
- /* close tap! */
- } else if (len >= ETH_HEADER_SIZE)
- handle_in_packet(ep, &(packet.p), len);
}
-
static void cleanup(unsigned char type,int fd,void *private_data)
{
if (fd >= 0)
@@ -170,11 +172,9 @@
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
Modified: branches/rd235/vde-2/src/vde_switch/vde_switch.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/vde_switch.c 2011-03-27 21:04:28 UTC
(rev 482)
+++ branches/rd235/vde-2/src/vde_switch/vde_switch.c 2011-03-28 10:05:45 UTC
(rev 483)
@@ -32,10 +32,7 @@
#include <vde.h>
#include <vdecommon.h>
-#ifdef VDE_PQ
-#include "packetq.h"
#include <poll.h>
-#endif
static struct swmodule *swmh;
@@ -236,21 +233,25 @@
short mainloop_pollmask_get(int fd)
{
+ if (fds[fdperm[fd]].fd != fd) printf("PERMUTATION ERROR %d
%d\n",fds[fdperm[fd]].fd,fd);
return fds[fdperm[fd]].events;
}
void mainloop_pollmask_add(int fd, short events)
{
+ if (fds[fdperm[fd]].fd != fd) printf("PERMUTATION ERROR %d
%d\n",fds[fdperm[fd]].fd,fd);
fds[fdperm[fd]].events |= events;
}
void mainloop_pollmask_del(int fd, short events)
{
+ if (fds[fdperm[fd]].fd != fd) printf("PERMUTATION ERROR %d
%d\n",fds[fdperm[fd]].fd,fd);
fds[fdperm[fd]].events &= ~events;
}
void mainloop_pollmask_set(int fd, short events)
{
+ if (fds[fdperm[fd]].fd != fd) printf("PERMUTATION ERROR %d
%d\n",fds[fdperm[fd]].fd,fd);
fds[fdperm[fd]].events = events;
}
@@ -259,15 +260,7 @@
time_t now;
register int n,i;
while(1) {
-#ifdef VDE_PQ
-#ifdef VDE_PQ_PPOLL
- n=ppoll(fds,nfds,packetq_timeout,NULL);
-#else
- n=poll(fds,nfds,packetq_timeout);
-#endif
-#else
n=poll(fds,nfds,-1);
-#endif
now=qtime();
if(n < 0){
if(errno != EINTR)
@@ -300,10 +293,6 @@
}
#endif
}
-#ifdef VDE_PQ
- if (packetq_timeout > 0)
- packetq_try();
-#endif
}
}
}
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/vde-users