Revision: 404
http://vde.svn.sourceforge.net/vde/?rev=404&view=rev
Author: rd235
Date: 2010-04-25 16:00:29 +0000 (Sun, 25 Apr 2010)
Log Message:
-----------
stream encoding of vde links moved from vde_plug to libvdeplug
Modified Paths:
--------------
trunk/vde-2/include/libvdeplug.h
trunk/vde-2/src/lib/libvdeplug.c
trunk/vde-2/src/vde_plug.c
Modified: trunk/vde-2/include/libvdeplug.h
===================================================================
--- trunk/vde-2/include/libvdeplug.h 2010-04-04 08:57:30 UTC (rev 403)
+++ trunk/vde-2/include/libvdeplug.h 2010-04-25 16:00:29 UTC (rev 404)
@@ -62,4 +62,24 @@
int vde_close(VDECONN *conn);
+/* vdestream */
+
+struct vdestream;
+
+typedef struct vdestream VDESTREAM;
+
+#define PACKET_LENGTH_ERROR 1
+
+VDESTREAM *vdestream_open(void *opaque,
+ int fdout,
+ ssize_t (*frecv)(void *opaque, void *buf, size_t count),
+ void (*ferr)(void *opaque, int type, char *format, ...)
+ );
+
+ssize_t vdestream_send(VDESTREAM *vdestream, const void *buf, size_t len);
+
+void vdestream_recv(VDESTREAM *vdestream, unsigned char *buf, size_t len);
+
+void vdestream_close(VDESTREAM *vdestream);
+
#endif
Modified: trunk/vde-2/src/lib/libvdeplug.c
===================================================================
--- trunk/vde-2/src/lib/libvdeplug.c 2010-04-04 08:57:30 UTC (rev 403)
+++ trunk/vde-2/src/lib/libvdeplug.c 2010-04-25 16:00:29 UTC (rev 404)
@@ -67,6 +67,10 @@
#define IPN_SO_DESCR 1
#endif
+#ifndef MIN
+#define MIN(X,Y) (((X)<(Y))?(X):(Y))
+#endif
+
/* Fallback names for the control socket, NULL-terminated array of absolute
* filenames. */
char *fallback_sockname[] = {
@@ -440,3 +444,101 @@
return -1;
}
}
+
+/* vdestream */
+
+#define MAXPACKET 1521
+
+struct vdestream {
+ void *opaque;
+ int fdout;
+ ssize_t (*frecv)(void *opaque, void *buf, size_t count);
+ void (*ferr)(void *opaque, int type, char *format, ...);
+ char fragment[MAXPACKET];
+ char *fragp;
+ unsigned int rnx,remaining;
+};
+
+VDESTREAM *vdestream_open(void *opaque,
+ int fdout,
+ ssize_t (*frecv)(void *opaque, void *buf, size_t count),
+ void (*ferr)(void *opaque, int type, char *format, ...)
+ )
+{
+ VDESTREAM *vdestream;
+ if ((vdestream=calloc(1,sizeof(struct vdestream)))==NULL) {
+ errno=ENOMEM;
+ return NULL;
+ } else {
+ vdestream->opaque=opaque;
+ vdestream->fdout=fdout;
+ vdestream->frecv=frecv;
+ vdestream->ferr=ferr;
+ return vdestream;
+ }
+}
+
+ssize_t vdestream_send(VDESTREAM *vdestream, const void *buf, size_t len)
+{
+ if (len <= MAXPACKET) {
+ unsigned char header[2];
+ struct iovec iov[2]={{header,2},{(void *)buf,len}};
+ header[0]=len >> 8;
+ header[1]=len & 0xff;
+ return writev(vdestream->fdout,iov,2);
+ } else
+ return 0;
+}
+
+void vdestream_recv(VDESTREAM *vdestream, unsigned char *buf, size_t len)
+{
+ //fprintf(stderr,"%s: splitpacket rnx=%d remaining=%d
size=%d\n",myname,rnx,vdestream->remaining,len);
+ if (len==0) return;
+ if (vdestream->rnx>0) {
+ register int amount=MIN(vdestream->remaining,len);
+ //fprintf(stderr,"%s: fragment amount %d\n",myname,amount);
+ memcpy(vdestream->fragp,buf,amount);
+ vdestream->remaining-=amount;
+ vdestream->fragp+=amount;
+ buf+=amount;
+ len-=amount;
+ if (vdestream->remaining==0) {
+ //fprintf(stderr,"%s: delivered defrag
%d\n",myname,vdestream->rnx);
+
vdestream->frecv(vdestream->opaque,vdestream->fragment,vdestream->rnx);
+ vdestream->rnx=0;
+ }
+ }
+ while (len > 0) {
+ vdestream->rnx=(buf[0]<<8)+buf[1];
+ len-=2;
+ //fprintf(stderr,"%s %d: packet %d size %d %x
%x\n",myname,getpid(),vdestream->rnx,len,buf[0],buf[1]);
+ buf+=2;
+ if (vdestream->rnx > MAXPACKET) {
+ if (vdestream->ferr != NULL)
+
vdestream->ferr(vdestream->opaque,PACKET_LENGTH_ERROR,
+ "size %d expected size
%d",len,vdestream->rnx);
+ vdestream->rnx=0;
+ return;
+ }
+ if (vdestream->rnx > len) {
+ //fprintf(stderr,"%s: begin defrag
%d\n",myname,vdestream->rnx);
+ vdestream->fragp=vdestream->fragment;
+ memcpy(vdestream->fragp,buf,len);
+ vdestream->remaining=vdestream->rnx-len;
+ vdestream->fragp+=len;
+ len=0;
+ } else {
+ //fprintf(stderr,"%s: deliver
%d\n",myname,vdestream->rnx);
+ vdestream->frecv(vdestream->opaque,buf,vdestream->rnx);
+ buf+=vdestream->rnx;
+ len-=vdestream->rnx;
+ vdestream->rnx=0;
+ }
+ }
+}
+
+void vdestream_close(VDESTREAM *vdestream)
+{
+ free(vdestream);
+}
+
Modified: trunk/vde-2/src/vde_plug.c
===================================================================
--- trunk/vde-2/src/vde_plug.c 2010-04-04 08:57:30 UTC (rev 403)
+++ trunk/vde-2/src/vde_plug.c 2010-04-25 16:00:29 UTC (rev 404)
@@ -20,6 +20,7 @@
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
+#include <stdarg.h>
#include <config.h>
#include <vde.h>
@@ -39,10 +40,11 @@
#define MIN(X,Y) (((X)<(Y))?(X):(Y))
#endif
-#define BUFSIZE 2048
+#define BUFSIZE 4096
#define ETH_ALEN 6
VDECONN *conn;
+VDESTREAM *vdestream;
struct utsname me;
#define myname me.nodename
@@ -184,69 +186,32 @@
}
#endif
-unsigned char bufin[BUFSIZE];
-
-void splitpacket(const unsigned char *buf,int size,VDECONN *conn)
+void vdeplug_err(void *opaque, int type, char *format,...)
{
- static char fragment[BUFSIZE];
- static char *fragp;
- static unsigned int rnx,remaining;
+ va_list args;
- //fprintf(stderr,"%s: splitpacket rnx=%d remaining=%d
size=%d\n",myname,rnx,remaining,size);
- if (size==0) return;
- if (rnx>0) {
- register int amount=MIN(remaining,size);
- //fprintf(stderr,"%s: fragment amount %d\n",myname,amount);
- memcpy(fragp,buf,amount);
- remaining-=amount;
- fragp+=amount;
- buf+=amount;
- size-=amount;
- if (remaining==0) {
- //fprintf(stderr,"%s: delivered defrag
%d\n",myname,rnx);
- //send(fd,fragment,rnx,0);
-#ifdef VDE_IP_LOG
- if (vde_ip_log)
- vde_ip_check(buf,rnx);
-#endif
- vde_send(conn,fragment,rnx,0);
- rnx=0;
- }
+ if (isatty(STDERR_FILENO)) {
+ fprintf(stderr, "%s: Packet length error",myname);
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
+ fprintf(stderr,"\n");
}
- while (size > 0) {
- rnx=(buf[0]<<8)+buf[1];
- size-=2;
- //fprintf(stderr,"%s %d: packet %d size %d %x
%x\n",myname,getpid(),rnx,size,buf[0],buf[1]);
- buf+=2;
- if (rnx>1521) {
- fprintf(stderr,"%s: Packet length error size %d rnx
%d\n",myname,size,rnx);
- rnx=0;
- return;
- }
- if (rnx > size) {
- //fprintf(stderr,"%s: begin defrag %d\n",myname,rnx);
- fragp=fragment;
- memcpy(fragp,buf,size);
- remaining=rnx-size;
- fragp+=size;
- size=0;
- } else {
- //fprintf(stderr,"%s: deliver %d\n",myname,rnx);
- //send(fd,buf,rnx,0);
+}
+
+ssize_t vdeplug_recv(void *opaque, void *buf, size_t count)
+{
+ VDECONN *conn=opaque;
#ifdef VDE_IP_LOG
- if (vde_ip_log)
- vde_ip_check(buf,rnx);
+ if (vde_ip_log)
+ vde_ip_check(buf,count);
#endif
- vde_send(conn,(char *)buf,rnx,0);
- buf+=rnx;
- size-=rnx;
- rnx=0;
- }
- }
+ return vde_send(conn,(char *)buf,count,0);
}
static void cleanup(void)
{
+ vdestream_close(vdestream);
vde_close(conn);
}
@@ -313,6 +278,8 @@
exit(-1);
}
+unsigned char bufin[BUFSIZE];
+
int main(int argc, char **argv)
{
static char *sockname=NULL;
@@ -407,6 +374,8 @@
if (conn == NULL)
exit(1);
+ vdestream=vdestream_open(conn,STDOUT_FILENO,vdeplug_recv,vdeplug_err);
+
pollv[1].fd=vde_datafd(conn);
pollv[2].fd=vde_ctlfd(conn);
@@ -422,17 +391,15 @@
/*fprintf(stderr,"%s: RECV %d %x %x
\n",myname,nx,bufin[0],bufin[1]);*/
if (nx==0)
break;
- splitpacket(bufin,nx,conn);
+ vdestream_recv(vdestream, bufin, nx);
}
if (pollv[1].revents & POLLIN) {
- nx=vde_recv(conn,(char *)(bufin+2),BUFSIZE-2,0);
+ nx=vde_recv(conn,bufin,BUFSIZE-2,0);
if (nx<0)
perror("vde_plug: recvfrom ");
else
{
- bufin[0]=nx >> 8;
- bufin[1]=nx & 0xff;
- write(STDOUT_FILENO,bufin,nx+2);
+ vdestream_send(vdestream, bufin, nx);
/*fprintf(stderr,"%s: SENT %d %x %x
\n",myname,nx,bufin[0],bufin[1]);*/
}
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
_______________________________________________
vde-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/vde-users