Revision: 484
          http://vde.svn.sourceforge.net/vde/?rev=484&view=rev
Author:   rd235
Date:     2011-03-28 10:38:48 +0000 (Mon, 28 Mar 2011)

Log Message:
-----------
added configuration options for packet queues

Modified Paths:
--------------
    branches/rd235/vde-2/src/vde_switch/port.c

Modified: branches/rd235/vde-2/src/vde_switch/port.c
===================================================================
--- branches/rd235/vde-2/src/vde_switch/port.c  2011-03-28 10:05:45 UTC (rev 
483)
+++ branches/rd235/vde-2/src/vde_switch/port.c  2011-03-28 10:38:48 UTC (rev 
484)
@@ -35,6 +35,9 @@
 
 static int pflag=0;
 static int numports;
+#ifdef VDE_PQ2
+static int stdqlen=128;
+#endif
 
 static struct port **portv;
 
@@ -258,7 +261,7 @@
 #ifdef VDE_PQ2
                        ep->vdepq=NULL;
                        ep->vdepq_count=0;
-                       ep->vdepq_max=128;
+                       ep->vdepq_max=stdqlen;
 #endif
                        if(port->ep == NULL) {/* WAS INACTIVE */
                                register int i;
@@ -366,6 +369,34 @@
        return close_ep_port_fd(ep->port, ep->fd_ctl);
 }
 
+#ifdef VDE_PQ2
+static int rec_setqlen_ep(struct endpoint *ep, int fd_ctl, int len)
+{
+       struct endpoint *this=ep;
+       if (this != NULL) {
+               if (this->fd_ctl==fd_ctl) {
+                       ep->vdepq_max = len;
+                       return 0;
+               } else
+                       return rec_setqlen_ep(this->next, fd_ctl, len);
+       } else
+               return ENXIO;
+}
+
+static int setqlen_ep_port_fd(int portno, int fd_ctl, int len)
+{
+       if (portno >=0 && portno < numports) {
+               struct port *port=portv[portno];
+               if (port != NULL) {
+                       return rec_setqlen_ep(port->ep, fd_ctl, len);
+               }
+               else
+                       return ENXIO;
+       } else
+               return EINVAL;
+}
+#endif
+
 int portflag(int op,int f)
 {
        int oldflag=pflag;
@@ -389,7 +420,7 @@
 #endif
 
 #ifndef VDE_PQ2
-#define SEND_PACKET_PORT(PORT,PORTNO,PACKET,LEN,TMPBUF) \
+#define SEND_PACKET_PORT(PORT,PORTNO,PACKET,LEN) \
        ({\
         struct port *Port=(PORT); \
         if (PACKETFILTER(PKTFILTOUT,(PORTNO),(PACKET), (LEN))) {\
@@ -422,16 +453,25 @@
 /* functions for FSTP */
 void port_send_packet(int portno, void *packet, int len)
 {
+#ifndef VDE_PQ2
+       SEND_PACKET_PORT(portv[portno],portno,packet,len);
+#else
        void *tmpbuf=NULL;
        SEND_PACKET_PORT(portv[portno],portno,packet,len,&tmpbuf);
+#endif
 }
 
 void portset_send_packet(bitarray portset, void *packet, int len)
 {
        register int i;
+#ifndef VDE_PQ2
+       ba_FORALL(portset,numports,
+                       SEND_PACKET_PORT(portv[i],i,packet,len), i);
+#else
        void *tmpbuf=NULL;
        ba_FORALL(portset,numports,
                        SEND_PACKET_PORT(portv[i],i,packet,len,&tmpbuf), i);
+#endif
 }
 
 
@@ -547,10 +587,16 @@
 #endif
                if (pflag & HUB_TAG) { /* this is a HUB */
                        register int i;
+#ifndef VDE_PQ2
+                       for(i = 1; i < numports; i++)
+                               if((i != port) && (portv[i] != NULL))
+                                       SEND_PACKET_PORT(portv[i],i,packet,len);
+#else
                        void *tmpbuf=NULL;
                        for(i = 1; i < numports; i++)
                                if((i != port) && (portv[i] != NULL))
                                        
SEND_PACKET_PORT(portv[i],i,packet,len,&tmpbuf);
+#endif
                } else { /* This is a switch, not a HUB! */
                        if (packet->header.proto[0] == 0x81 && 
packet->header.proto[1] == 0x00) {
                                tagged=1;
@@ -591,6 +637,13 @@
                                 * of the same tag-ness, then transform it to 
the other tag-ness for the others*/
                                if (tagged) {
                                        register int i;
+#ifndef VDE_PQ2
+                                       ba_FORALL(vlant[vlan].bctag,numports,
+                                                       ({if (i != port) 
SEND_PACKET_PORT(portv[i],i,packet,len);}),i);
+                                       packet=TAG2UNTAG(packet,len);
+                                       ba_FORALL(vlant[vlan].bcuntag,numports,
+                                                       ({if (i != port) 
SEND_PACKET_PORT(portv[i],i,packet,len);}),i);
+#else
                                        void *tmpbuft=NULL;
                                        void *tmpbufu=NULL;
                                        ba_FORALL(vlant[vlan].bctag,numports,
@@ -598,8 +651,16 @@
                                        packet=TAG2UNTAG(packet,len);
                                        ba_FORALL(vlant[vlan].bcuntag,numports,
                                                        ({if (i != port) 
SEND_PACKET_PORT(portv[i],i,packet,len,&tmpbufu);}),i);
+#endif
                                } else { /* untagged */
                                        register int i;
+#ifndef VDE_PQ2
+                                       ba_FORALL(vlant[vlan].bcuntag,numports,
+                                                       ({if (i != port) 
SEND_PACKET_PORT(portv[i],i,packet,len);}),i);
+                                       packet=UNTAG2TAG(packet,vlan,len);
+                                       ba_FORALL(vlant[vlan].bctag,numports,
+                                                       ({if (i != port) 
SEND_PACKET_PORT(portv[i],i,packet,len);}),i);
+#else
                                        void *tmpbufu=NULL;
                                        void *tmpbuft=NULL;
                                        ba_FORALL(vlant[vlan].bcuntag,numports,
@@ -607,6 +668,7 @@
                                        packet=UNTAG2TAG(packet,vlan,len);
                                        ba_FORALL(vlant[vlan].bctag,numports,
                                                        ({if (i != port) 
SEND_PACKET_PORT(portv[i],i,packet,len,&tmpbuft);}),i);
+#endif
                                }
                        }
                        else {
@@ -614,7 +676,24 @@
                                 * any time a port is removed from a vlan, the 
port is flushed from the hash */
                                if (tarport==port)
                                        return; /*do not loop!*/
+#ifndef VDE_PQ2
                                if (tagged) {
+                                       if (portv[tarport]->vlanuntag==vlan) { 
/* TAG->UNTAG */
+                                               packet = TAG2UNTAG(packet,len);
+                                               
SEND_PACKET_PORT(portv[tarport],tarport,packet,len);
+                                       } else {                               
/* TAG->TAG */
+                                               
SEND_PACKET_PORT(portv[tarport],tarport,packet,len);
+                                       }
+                               } else {
+                                       if (portv[tarport]->vlanuntag==vlan) { 
/* UNTAG->UNTAG */
+                                               
SEND_PACKET_PORT(portv[tarport],tarport,packet,len);
+                                       } else {                              
/* UNTAG->TAG */
+                                               packet = 
UNTAG2TAG(packet,vlan,len);
+                                               
SEND_PACKET_PORT(portv[tarport],tarport,packet,len);
+                                       }
+                               }
+#else
+                               if (tagged) {
                                        void *tmpbuf=NULL;
                                        if (portv[tarport]->vlanuntag==vlan) { 
/* TAG->UNTAG */
                                                packet = TAG2UNTAG(packet,len);
@@ -631,6 +710,7 @@
                                                
SEND_PACKET_PORT(portv[tarport],tarport,packet,len,&tmpbuf);
                                        }
                                }
+#endif
                        } /* if(BROADCAST) */
                } /* if(HUB) */
        } /* if(PACKETFILTER) */
@@ -647,6 +727,9 @@
 #else
        printoutc(fd,"counters=false");
 #endif
+#ifdef VDE_PQ2
+       printoutc(fd,"default length of port packet queues: %d",stdqlen);
+#endif
        return 0;
 }
 
@@ -817,6 +900,27 @@
                return close_ep_port_fd(port,id);
 }
 
+#ifdef VDE_PQ2
+static int defqlen(int len)
+{
+       if (len < 0)
+               return EINVAL;
+       else {
+               stdqlen=len;
+               return 0;
+       }
+}
+
+static int epqlen(char *arg)
+{
+       int port,id,len;
+       if (sscanf(arg,"%i %i %i",&port,&id,&len) != 3 || len < 0)
+               return EINVAL;
+       else
+               return setqlen_ep_port_fd(port,id,len);
+}
+#endif
+
 static char *port_getuser(uid_t uid)
 {
        static char buf[6];
@@ -1243,6 +1347,10 @@
        {"port/setuser","N user","access control: set user",portsetuser,STRARG},
        {"port/setgroup","N user","access control: set 
group",portsetgroup,STRARG},
        {"port/epclose","N ID","remove the endpoint port N/id 
ID",epclose,STRARG},
+#ifdef VDE_PQ2
+       {"port/defqlen","LEN","set the default queue length for new 
ports",defqlen,INTARG},
+       {"port/epqlen","N ID LEN","set the lenth of the queue for port N/id 
IP",epqlen,STRARG},
+#endif
 #ifdef PORTCOUNTERS
        {"port/resetcounter","[N]","reset the port (N) 
counters",portresetcounters,STRARG},
 #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
vde-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/vde-users

Reply via email to