All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] vnet-module
@ 2006-03-31 13:56 Robert Valentan
  2006-03-31 14:43 ` Mike Wray
  0 siblings, 1 reply; 4+ messages in thread
From: Robert Valentan @ 2006-03-31 13:56 UTC (permalink / raw)
  To: xen-devel; +Cc: mike.wray

[-- Attachment #1: Type: text/plain, Size: 578 bytes --]

patch_vnet_1
   Replacing the socketcall with direct calling the needed
   functions (my patch from 28.3)

patch_vnet_2
   Modify the module-parameter for kernel 2.6.* (the old one
   will not compile with the actual kernel 2.6.16)
   Exporting the default-values of the parameters in /sys/module

patch_vnet_3
   Some "extentions" to error-messages to identify the position
   in the code.
   I had searched a bug, but it was a wrong vnet-id ;-/
   A hint for docu: using "123459" as vnet-id has not 4 digits
   and will be punished with errors  ;-)


-- 
wbr
Robert Valentan


[-- Attachment #2: patch_vnet_1 --]
[-- Type: text/plain, Size: 8727 bytes --]

diff -r 2604abf98ede tools/vnet/vnet-module/varp_socket.c
--- a/tools/vnet/vnet-module/varp_socket.c	Tue Mar 28 09:09:44 2006
+++ b/tools/vnet/vnet-module/varp_socket.c	Tue Mar 28 17:10:53 2006
@@ -16,6 +16,9 @@
  * 59 Temple Place, suite 330, Boston, MA 02111-1307 USA
  *
  */
+
+static int errno;
+
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/version.h>
@@ -36,7 +39,6 @@
 
 /* Get macros needed to define system calls as functions in the kernel. */
 #define __KERNEL_SYSCALLS__
-static int errno;
 #include <linux/unistd.h>
 
 #define MODULE_NAME "VARP"
@@ -75,110 +77,254 @@
  * The parts we need anyway.
  */
 
-/* Define the socketcall() syscall.
- * Multiplexes all the socket-related calls.
- *
- * @param call socket call id
- * @param args arguments (upto 6)
- * @return call-dependent value
- */
-static inline _syscall2(int, socketcall,
-                        int, call,
-                        unsigned long *, args)
+/* the following code is copied from linux-kernel/net/socket.c
+ * As replacement of the __NR_socketcall, which exists not in x86_64 and
+ * same other systems.
+ * An alternate will be an export of the copied-functions in net/socket.c
+ */ 
+#define MAX_SOCK_ADDR 128
 
 int socket(int family, int type, int protocol){
-    unsigned long args[6];
-    
-    args[0] = (unsigned long)family;
-    args[1] = (unsigned long)type;
-    args[2] = (unsigned long)protocol;
-    return socketcall(SYS_SOCKET, args);
+
+	int retval;
+	struct socket *sock;
+	retval = sock_create(family, type, protocol, &sock);
+	if (retval < 0)
+		goto out;
+
+	retval = sock_map_fd(sock);
+	if (retval < 0)
+		goto out_release;
+
+out:
+	/* It may be already another descriptor 8) Not kernel problem. */
+	return retval;
+
+out_release:
+	sock_release(sock);
+	return retval;
 }
 
 int bind(int fd, struct sockaddr *umyaddr, int addrlen){
-    unsigned long args[6];
-    
-    args[0] = (unsigned long)fd;
-    args[1] = (unsigned long)umyaddr;
-    args[2] = (unsigned long)addrlen;
-    return socketcall(SYS_BIND, args);
+
+	struct socket *sock;
+	char address[MAX_SOCK_ADDR];
+	int err;
+
+	if((sock = sockfd_lookup(fd,&err))!=NULL)
+	{
+		if((err=move_addr_to_kernel(umyaddr,addrlen,address))>=0) {
+			err = security_socket_bind(sock, (struct sockaddr *)address, addrlen);
+			if (err) {
+				sockfd_put(sock);
+				return err;
+			}
+			err = sock->ops->bind(sock, (struct sockaddr *)address, addrlen);
+		}
+		sockfd_put(sock);
+	}			
+	return err;
 }
 
 int connect(int fd, struct sockaddr *uservaddr, int addrlen){
-    unsigned long args[6];
-    
-    args[0] = (unsigned long)fd;
-    args[1] = (unsigned long)uservaddr;
-    args[2] = (unsigned long)addrlen;
-    return socketcall(SYS_CONNECT, args);
+
+	struct socket *sock;
+	char address[MAX_SOCK_ADDR];
+	int err;
+
+	sock = sockfd_lookup(fd, &err);
+	if (!sock)
+		goto out;
+	err = move_addr_to_kernel(uservaddr, addrlen, address);
+	if (err < 0)
+		goto out_put;
+
+	err = security_socket_connect(sock, (struct sockaddr *)address, addrlen);
+	if (err)
+		goto out_put;
+
+	err = sock->ops->connect(sock, (struct sockaddr *) address, addrlen,
+				 sock->file->f_flags);
+out_put:
+	sockfd_put(sock);
+out:
+	return err;
 }
 
 int sendto(int fd, void * buff, size_t len,
            unsigned flags, struct sockaddr *addr,
            int addr_len){
-    unsigned long args[6];
-    
-    args[0] = (unsigned long)fd;
-    args[1] = (unsigned long)buff;
-    args[2] = (unsigned long)len;
-    args[3] = (unsigned long)flags;
-    args[4] = (unsigned long)addr;
-    args[5] = (unsigned long)addr_len;
-    return socketcall(SYS_SENDTO, args);
+
+	struct socket *sock;
+	char address[MAX_SOCK_ADDR];
+	int err;
+	struct msghdr msg;
+	struct iovec iov;
+	
+	sock = sockfd_lookup(fd, &err);
+	if (!sock)
+		goto out;
+	iov.iov_base=buff;
+	iov.iov_len=len;
+	msg.msg_name=NULL;
+	msg.msg_iov=&iov;
+	msg.msg_iovlen=1;
+	msg.msg_control=NULL;
+	msg.msg_controllen=0;
+	msg.msg_namelen=0;
+	if(addr)
+	{
+		err = move_addr_to_kernel(addr, addr_len, address);
+		if (err < 0)
+			goto out_put;
+		msg.msg_name=address;
+		msg.msg_namelen=addr_len;
+	}
+	if (sock->file->f_flags & O_NONBLOCK)
+		flags |= MSG_DONTWAIT;
+	msg.msg_flags = flags;
+	err = sock_sendmsg(sock, &msg, len);
+
+out_put:		
+	sockfd_put(sock);
+out:
+	return err;
 }
 
 int recvfrom(int fd, void * ubuf, size_t size,
              unsigned flags, struct sockaddr *addr,
              int *addr_len){
-    unsigned long args[6];
-    
-    args[0] = (unsigned long)fd;
-    args[1] = (unsigned long)ubuf;
-    args[2] = (unsigned long)size;
-    args[3] = (unsigned long)flags;
-    args[4] = (unsigned long)addr;
-    args[5] = (unsigned long)addr_len;
-    return socketcall(SYS_RECVFROM, args);
+
+	struct socket *sock;
+	struct iovec iov;
+	struct msghdr msg;
+	char address[MAX_SOCK_ADDR];
+	int err,err2;
+
+	sock = sockfd_lookup(fd, &err);
+	if (!sock)
+		goto out;
+
+	msg.msg_control=NULL;
+	msg.msg_controllen=0;
+	msg.msg_iovlen=1;
+	msg.msg_iov=&iov;
+	iov.iov_len=size;
+	iov.iov_base=ubuf;
+	msg.msg_name=address;
+	msg.msg_namelen=MAX_SOCK_ADDR;
+	if (sock->file->f_flags & O_NONBLOCK)
+		flags |= MSG_DONTWAIT;
+	err=sock_recvmsg(sock, &msg, size, flags);
+
+	if(err >= 0 && addr != NULL)
+	{
+		err2=move_addr_to_user(address, msg.msg_namelen, addr, addr_len);
+		if(err2<0)
+			err=err2;
+	}
+	sockfd_put(sock);			
+out:
+	return err;
 }
 
 int setsockopt(int fd, int level, int optname, void *optval, int optlen){
-    unsigned long args[6];
-    
-    args[0] = (unsigned long)fd;
-    args[1] = (unsigned long)level;
-    args[2] = (unsigned long)optname;
-    args[3] = (unsigned long)optval;
-    args[4] = (unsigned long)optlen;
-    return socketcall(SYS_SETSOCKOPT, args);
-}
-
+
+	int err;
+	struct socket *sock;
+
+	if (optlen < 0)
+		return -EINVAL;
+			
+	if ((sock = sockfd_lookup(fd, &err))!=NULL)
+	{
+		err = security_socket_setsockopt(sock,level,optname);
+		if (err) {
+			sockfd_put(sock);
+			return err;
+		}
+
+		if (level == SOL_SOCKET)
+			err=sock_setsockopt(sock,level,optname,optval,optlen);
+		else
+			err=sock->ops->setsockopt(sock, level, optname, optval, optlen);
+		sockfd_put(sock);
+	}
+	return err;
+}
+
+/*  not possible, because sock_getsockopt is not exported ...
 int getsockopt(int fd, int level, int optname, void *optval, int *optlen){
-    unsigned long args[6];
-    
-    args[0] = (unsigned long)fd;
-    args[1] = (unsigned long)level;
-    args[2] = (unsigned long)optname;
-    args[3] = (unsigned long)optval;
-    args[4] = (unsigned long)optlen;
-    return socketcall(SYS_GETSOCKOPT, args);
-}
+
+	int err;
+	struct socket *sock;
+
+	if ((sock = sockfd_lookup(fd, &err))!=NULL)
+	{
+		err = security_socket_getsockopt(sock, level, optname);
+		if (err) {
+			sockfd_put(sock);
+			return err;
+		}
+
+		if (level == SOL_SOCKET)
+			err=sock_getsockopt(sock,level,optname,optval,optlen);
+		else
+			err=sock->ops->getsockopt(sock, level, optname, optval, optlen);
+		sockfd_put(sock);
+	}
+	return err;
+}
+*/
 
 int shutdown(int fd, int how){
-    unsigned long args[6];
-    
-    args[0] = (unsigned long)fd;
-    args[1] = (unsigned long)how;
-    return socketcall(SYS_SHUTDOWN, args);
+
+	int err;
+	struct socket *sock;
+
+	if ((sock = sockfd_lookup(fd, &err))!=NULL)
+	{
+		err = security_socket_shutdown(sock, how);
+		if (err) {
+			sockfd_put(sock);
+			return err;
+		}
+				
+		err=sock->ops->shutdown(sock, how);
+		sockfd_put(sock);
+	}
+	return err;
 }
 
 int getsockname(int fd, struct sockaddr *usockaddr, int *usockaddr_len){
-    unsigned long args[6];
-    
-    args[0] = (unsigned long)fd;
-    args[1] = (unsigned long)usockaddr;
-    args[2] = (unsigned long)usockaddr_len;
-    return socketcall(SYS_GETSOCKNAME, args);
-}
+
+	struct socket *sock;
+	char address[MAX_SOCK_ADDR];
+	int len, err;
+	
+	sock = sockfd_lookup(fd, &err);
+	if (!sock)
+		goto out;
+
+	err = security_socket_getsockname(sock);
+	if (err)
+		goto out_put;
+
+	err = sock->ops->getname(sock, (struct sockaddr *)address, &len, 0);
+	if (err)
+		goto out_put;
+	err = move_addr_to_user(address, len, usockaddr, usockaddr_len);
+
+out_put:
+	sockfd_put(sock);
+out:
+	return err;
+}
+
+/**
+ * End of copy from net/socket.c
+ */
+
 
 /*============================================================================*/
 /** Socket flags. */
@@ -577,7 +723,7 @@
     int err = 0;
     mm_segment_t oldfs;
 
-    dprintf("> mcaddr=%u.%u.%u.%u port=%u\n", NIPQUAD(mcaddr), ntohs(port));
+    iprintf("> mcaddr=%u.%u.%u.%u port=%u\n", NIPQUAD(mcaddr), ntohs(port));
     oldfs = change_fs(KERNEL_DS);
     err = varp_mcast_open(mcaddr, port, &varp_mcast_sock);
     if(err < 0 ) goto exit;

[-- Attachment #3: patch_vnet_2 --]
[-- Type: text/plain, Size: 3553 bytes --]

diff -r 89b98811ce56 tools/vnet/vnet-module/if_varp.h
--- a/tools/vnet/vnet-module/if_varp.h	Fri Mar 31 13:29:05 2006
+++ b/tools/vnet/vnet-module/if_varp.h	Fri Mar 31 15:39:27 2006
@@ -97,7 +97,7 @@
 
 
 /** Default address for varp/vnet broadcasts: 224.10.0.1 */
-#define VARP_MCAST_ADDR     0xe00a0001
+#define VARP_MCAST_ADDR     "224.10.0.1"
 
 /** UDP port to use for varp protocol. */
 #define VARP_PORT           1798
diff -r 89b98811ce56 tools/vnet/vnet-module/tunnel.h
--- a/tools/vnet/vnet-module/tunnel.h	Fri Mar 31 13:29:05 2006
+++ b/tools/vnet/vnet-module/tunnel.h	Fri Mar 31 15:39:27 2006
@@ -74,7 +74,7 @@
  *
  * @param tunnel tunnel (may be null)
  */
-static inline void Tunnel_decref(struct Tunnel *tunnel){
+static void Tunnel_decref(struct Tunnel *tunnel){
     if(!tunnel) return;
     if(atomic_dec_and_test(&tunnel->refcount)){
         tunnel->type->close(tunnel);
diff -r 89b98811ce56 tools/vnet/vnet-module/varp.c
--- a/tools/vnet/vnet-module/varp.c	Fri Mar 31 13:29:05 2006
+++ b/tools/vnet/vnet-module/varp.c	Fri Mar 31 15:39:27 2006
@@ -200,7 +200,8 @@
 /** UDP port (network order). */
 u16 varp_port = 0;
 
-char *varp_device = "xen-br0";
+#define VARP_DEVICE_DEFAULT "xen-br0"
+char *varp_device = NULL;
 
 #define VarpTable_read_lock(vtable, flags)    \
   do{ read_lock_irqsave(&(vtable)->lock, (flags)); } while(0)
@@ -262,8 +263,9 @@
 int varp_ucast_addr(uint32_t *addr)
 {
     int err = -ENODEV;
-    const char *devices[] = { varp_device, "eth0", "eth1", "eth2", NULL };
+    char *devices[] = { varp_device, "eth0", "eth1", "eth2", NULL };
     const char **p;
+
     for(p = devices; err && *p; p++){
         err = device_ucast_addr(*p, addr);
     }
@@ -1485,12 +1487,14 @@
 static void varp_init_mcast_addr(char *s){
     unsigned long v = 0;
 
-    dprintf("> %s\n", s);
+    dprintf("> mcast_addr init=%s\n", s);
     if(s && (get_inet_addr(s, &v) >= 0)){
-        varp_mcast_addr = (u32)v;
+        varp_mcaddr = s;
     } else {
-        varp_mcast_addr = htonl(VARP_MCAST_ADDR);
-    }
+        varp_mcaddr = VARP_MCAST_ADDR;
+        get_inet_addr(varp_mcaddr, &v);
+    }
+    varp_mcast_addr = (u32)v;
 }
 
 /** Initialize the varp cache.
@@ -1510,9 +1514,12 @@
     varp_init_mcast_addr(varp_mcaddr);
     varp_port = htons(VARP_PORT);
 
+    if (varp_device == NULL)
+       varp_device = VARP_DEVICE_DEFAULT;
+
     err = varp_open(varp_mcast_addr, varp_port);
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< varp_init err=%d\n", err);
     return err;
 }
 
@@ -1529,8 +1536,10 @@
     dprintf("<\n");
 }
 
-MODULE_PARM(varp_mcaddr, "s");
+#ifdef __KERNEL__
+module_param_named(mcaddr, varp_mcaddr, charp, 0444);
 MODULE_PARM_DESC(varp_mcaddr, "VARP multicast address");
 
-MODULE_PARM(varp_device, "s");
+module_param_named(device, varp_device, charp, 0444);
 MODULE_PARM_DESC(varp_device, "VARP network device");
+#endif
diff -r 89b98811ce56 tools/vnet/vnet-module/vnet.c
--- a/tools/vnet/vnet-module/vnet.c	Fri Mar 31 13:29:05 2006
+++ b/tools/vnet/vnet-module/vnet.c	Fri Mar 31 15:39:27 2006
@@ -657,6 +657,9 @@
 
     if(vnet_encaps && !strcmp(vnet_encaps, "udp")){
         etherip_in_udp = 1;
+        vnet_encaps = "etherip";
+    } else {
+        vnet_encaps = "udp";
     }
     dprintf(">\n");
     err = random_module_init();
@@ -691,7 +694,7 @@
 module_exit(vnet_module_exit);
 MODULE_LICENSE("GPL");
 
-MODULE_PARM(vnet_encaps, "s");
+module_param_named(encaps, vnet_encaps, charp, 0444);
 MODULE_PARM_DESC(vnet_encaps, "Vnet encapsulation: etherip or udp.");
 
 #endif

[-- Attachment #4: patch_vnet_3 --]
[-- Type: text/plain, Size: 11403 bytes --]

diff -r 18eecf71f690 tools/vnet/vnet-module/esp.c
--- a/tools/vnet/vnet-module/esp.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/esp.c	Fri Mar 31 15:42:56 2006
@@ -281,7 +281,7 @@
     }
     skb_trim_tail(skb, icv_n);
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< esp_check_icv err=%d\n", err);
     return err;
 }
 
@@ -384,7 +384,7 @@
     }
     err = Tunnel_send(tunnel, skb);
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< esp_sa_send err=%d\n", err);
     return err;
 }
 
@@ -487,7 +487,7 @@
         }
         err = 1;
     }
-    dprintf("< skb=%p err=%d\n", skb, err);
+    dprintf("< esp_sa_recv skb=%p err=%d\n", skb, err);
     return err;
 }
 
@@ -627,7 +627,7 @@
     crypto_cipher_setkey(esp->cipher.tfm, esp->cipher.key, esp->cipher.key_n);
     err = 0;
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< esp_cipher_int err=%d\n", err);
     return err;
 }
 
@@ -674,7 +674,7 @@
         goto exit;
     }
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< esp_digest_init err=%d\n", err);
     return err;
 }
 
@@ -704,7 +704,7 @@
     if(err){
         if(esp) esp_fini(esp);
     }
-    dprintf("< err=%d\n", err);
+    dprintf("< esp_sa_init err=%d\n", err);
     return err;
 }
 
@@ -793,7 +793,7 @@
         kfree_skb(skb);
         err = 0;
     }
-    dprintf("< err=%d\n", err);
+    dprintf("< esp_protocol_recv err=%d\n", err);
     return err;
 }
 
@@ -884,7 +884,7 @@
     }
     esp_protocol_add();
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< esp_module_init err=%d\n", err);
     return err;
 }
 
diff -r 18eecf71f690 tools/vnet/vnet-module/etherip.c
--- a/tools/vnet/vnet-module/etherip.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/etherip.c	Fri Mar 31 15:42:56 2006
@@ -198,7 +198,7 @@
     skb = NULL;
   exit:
     if(err && skb){
-        wprintf("< err=%d\n", err);
+        wprintf("< etherip_tunnel_send err=%d\n", err);
         kfree_skb(skb);
     }
     return err;
@@ -347,7 +347,7 @@
     err = vnet_skb_recv(skb, vinfo);
   exit:
     if(vinfo) Vnet_decref(vinfo);
-    dprintf("< skb=%p err=%d\n", skb, err);
+    dprintf("< etherip_protocol_recv skb=%p err=%d\n", skb, err);
     return err;
 }
 
diff -r 18eecf71f690 tools/vnet/vnet-module/sa.c
--- a/tools/vnet/vnet-module/sa.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/sa.c	Fri Mar 31 15:42:56 2006
@@ -365,7 +365,7 @@
     if(err && entries){
         sa_table_delete(state);
     }
-    dprintf("< err=%d\n", err);
+    dprintf("< sa_table_add err=%d\n", err);
     return err;
 }
 
@@ -441,7 +441,7 @@
     if(err) goto exit;
     sa_table_delete(existing);
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< sa_table_replace err=%d\n", err);
     return err;
 }
 
@@ -524,7 +524,7 @@
         state = NULL;
     }
     *statep = state;
-    dprintf("< err=%d\n", err);
+    dprintf("< SAState_create err=%d\n", err);
     return err;
 }
 
@@ -587,7 +587,7 @@
     }
 
     err = sa_set(&info, 0, sa);
-    dprintf("< err=%d\n", err);
+    dprintf("< sa_create err=%d\n", err);
     return err;
 }
 
@@ -625,7 +625,7 @@
     } else {
         SAState_decref(state);
     }
-    dprintf("< err=%d\n", err);
+    dprintf("< sa_set err=%d\n", err);
     return err;
 }
 
@@ -691,7 +691,7 @@
 static int sa_tunnel_open(Tunnel *tunnel){
     int err = 0;
     //dprintf(">\n");
-    //dprintf("< err=%d\n", err);
+    //dprintf("< sa_tunnel_open err=%d\n", err);
     return err;
 }
 
diff -r 18eecf71f690 tools/vnet/vnet-module/skb_context.c
--- a/tools/vnet/vnet-module/skb_context.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/skb_context.c	Fri Mar 31 15:42:56 2006
@@ -73,7 +73,7 @@
     context->next = *val;
     *val = context;
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< SkbContext_push err=%d\n", err);
     return err;
 }
 
@@ -85,7 +85,7 @@
 
     //err = SkbContext_push(&ctxt, vnet, addr, protocol, data, free_fn); //todo fixme
     //SKB_CONTEXT(skb) = ctxt;//todo fixme
-    dprintf("< err=%d\n", err);
+    dprintf("< skb_push_context err=%d\n", err);
     return err;
 }
                                        
diff -r 18eecf71f690 tools/vnet/vnet-module/skb_util.c
--- a/tools/vnet/vnet-module/skb_util.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/skb_util.c	Fri Mar 31 15:42:56 2006
@@ -133,7 +133,7 @@
             skb_headroom(*pskb), head_n,
             skb_tailroom(*pskb), tail_n);
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< skb_make_room err=%d\n", err);
     return err;
 }
 
@@ -374,7 +374,7 @@
     }
   exit:
     if(!err) *sg_n = sg_i;
-    if(len) wprintf("> len=%d\n", len);
+    if(len) wprintf("> sbk_scatterlist len=%d\n", len);
     if(len) BUG();
     if(err) dprintf("< err=%d sg_n=%d\n", err, *sg_n);
     return err;
diff -r 18eecf71f690 tools/vnet/vnet-module/tunnel.c
--- a/tools/vnet/vnet-module/tunnel.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/tunnel.c	Fri Mar 31 15:42:56 2006
@@ -95,12 +95,12 @@
         tunnel = NULL;
     }
     *val = tunnel;
-    dprintf("< err=%d\n", err);
+    dprintf("< tunnel_create err=%d\n", err);
     return err;
 }
 
 void TunnelStats_update(TunnelStats *stats, int len, int err){
-    dprintf(">len=%d  err=%d\n", len, err);
+    dprintf("> TunnelStats_update len=%d  err=%d\n", len, err);
     if(err){
         stats->dropped_bytes += len;
         stats->dropped_packets++;
@@ -139,7 +139,7 @@
     tunnel_table->key_hash_fn = tunnel_table_key_hash_fn;
     tunnel_table->key_equal_fn = tunnel_table_key_equal_fn;
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< Tunnel_init(): err=%d\n", err);
     return err;
 }
     
@@ -213,7 +213,7 @@
         err = -ENOMEM;
     }
     tunnel_write_unlock(flags);
-    dprintf("< err=%d\n", err);
+    dprintf("< Tunnel_add err=%d\n", err);
     return err;
 }
 
@@ -244,7 +244,7 @@
     } else {
         err = skb_xmit(skb);
     }
-    dprintf("< err=%d\n", err);
+    dprintf("< Tunnel_send err=%d\n", err);
     return err;
 }
 
diff -r 18eecf71f690 tools/vnet/vnet-module/varp.c
--- a/tools/vnet/vnet-module/varp.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/varp.c	Fri Mar 31 15:42:56 2006
@@ -512,7 +512,7 @@
 
   exit:
     if(err && skbout) kfree_skb(skbout);
-    dprintf("< err=%d\n", err);
+    dprintf("< varp_send err=%d\n", err);
     return err;
 }
 
@@ -1002,7 +1002,7 @@
     VarpEntry_unlock(ventry, flags);
     err = vnet_tunnel_send(&vnet, &addr, skb);
     VarpEntry_lock(ventry, flags);
-    dprintf("< err=%d\n", err);
+    dprintf("< VarpEntry_send err=%d\n", err);
     return err;
 }
 
@@ -1050,7 +1050,7 @@
     } else {
         err = VarpEntry_send(ventry, skb);
     }
-    dprintf("< err=%d\n", err);
+    dprintf("< VarpEntry_resolve err=%d\n", err);
     return err;
 }
 
@@ -1143,7 +1143,7 @@
     //}
   exit:
     VarpEntry_unlock(ventry, flags);
-    dprintf("< err=%d\n", err);
+    dprintf("< VarpEntry_update err=%d\n", err);
     return err;
 }
     
@@ -1180,7 +1180,7 @@
     err = VarpEntry_update(ventry, addr, state, flags);
     VarpEntry_decref(ventry);
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< VarpTable_update err=%d\n", err);
     return err;
 }
 
@@ -1297,7 +1297,7 @@
     varp_send(VARP_OP_ANNOUNCE, skb->dev, skb, vnet, vmac);
     vif_decref(vif);
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< varp_handle_request err=%d\n", err);
     return err;
 }
 
@@ -1316,7 +1316,7 @@
     }
     err = varp_send(VARP_OP_ANNOUNCE, dev, NULL, &vif->vnet, &vif->vmac);
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< varp_announce_vif err=%d\n", err);
     return err;
 }
 
@@ -1335,7 +1335,7 @@
                            &varph->vnet, &varph->vmac, &varph->addr,
                            VARP_STATE_REACHABLE, 
                            (VARP_UPDATE_CREATE | VARP_UPDATE_QUEUE));
-    dprintf("< err=%d\n", err);
+    dprintf("< varp_handle_announce err=%d\n", err);
     return err;
 }
 
@@ -1419,7 +1419,7 @@
         break;
     }
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< varp_handle_message err=%d\n", err);
     return err;
 }
 
@@ -1462,7 +1462,7 @@
         }
     }
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< varp_output err=%d\n", err);
     return err;
 }
 
diff -r 18eecf71f690 tools/vnet/vnet-module/varp_socket.c
--- a/tools/vnet/vnet-module/varp_socket.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/varp_socket.c	Fri Mar 31 15:42:56 2006
@@ -507,7 +507,7 @@
     }
   exit:
     *val = (err ? -1 : sock);
-    if(err) eprintf("> err=%d errno=%d\n", err, errno);
+    if(err) eprintf("> create_socket err=%d errno=%d\n", err, errno);
     return err;
 }
 
@@ -538,7 +538,7 @@
         shutdown(sock, 2);
     }
     *val = (err ? -1 : sock);
-    dprintf("< err=%d val=%d\n", err, *val);
+    dprintf("< varp_mcast_open err=%d val=%d\n", err, *val);
     return err;
 }
 
@@ -554,7 +554,7 @@
     int flags = (VSOCK_BIND | VSOCK_REUSE);
     dprintf(">\n");
     err = create_socket(SOCK_DGRAM, addr, port, flags, val);
-    dprintf("< err=%d val=%d\n", err, *val);
+    dprintf("< varp_ucast_open err=%d val=%d\n", err, *val);
     return err;
 }
 
@@ -733,7 +733,7 @@
     sock_set_callback(varp_mcast_sock);
   exit:
     set_fs(oldfs);
-    dprintf("< err=%d\n", err);
+    dprintf("< varp_socket_open err=%d\n", err);
     return err;
 }	
 
@@ -792,7 +792,7 @@
     sock_remove_wait_queue(varp_mcast_sock, &mcast_wait);
     varp_sockets_close();
     if(err){
-        eprintf("%s< err=%d\n", __FUNCTION__, err);
+        eprintf("%s< varp_main err=%d\n", __FUNCTION__, err);
     }
     varp_thread_err = err;
     atomic_set(&varp_state, VARP_STATE_EXITED);
@@ -842,7 +842,7 @@
 #endif
   exit:
     if(err){
-        wprintf("> err=%d\n", err);
-    }
-    return err;
-}
+        wprintf("> varp_open err=%d\n", err);
+    }
+    return err;
+}
diff -r 18eecf71f690 tools/vnet/vnet-module/vnet.c
--- a/tools/vnet/vnet-module/vnet.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/vnet.c	Fri Mar 31 15:42:56 2006
@@ -448,7 +448,7 @@
     }
 #endif
   exit:
-    dprintf("< err=%d\n", err);
+    dprintf("< _skb_xmit err=%d\n", err);
     return err;
 }
 
@@ -486,7 +486,7 @@
         vif_update(vnet, (Vmac*)eth_hdr(skb)->h_source);
         err = varp_output(skb, vnet);
     }
-    //dprintf("< err=%d\n", err);
+    //dprintf("< vnet_skb_send err=%d\n", err);
     return err;
 }
 
diff -r 18eecf71f690 tools/vnet/vnet-module/vnet_eval.c
--- a/tools/vnet/vnet-module/vnet_eval.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/vnet_eval.c	Fri Mar 31 15:42:56 2006
@@ -354,7 +354,7 @@
             break;
         }
     }
-    iprintf("< err=%d\n", err);
+    iprintf("< vnet_eval_defs err=%d\n", err);
     return err;
 }
 
diff -r 18eecf71f690 tools/vnet/vnet-module/vnet_ioctl.c
--- a/tools/vnet/vnet-module/vnet_ioctl.c	Fri Mar 31 13:39:42 2006
+++ b/tools/vnet/vnet-module/vnet_ioctl.c	Fri Mar 31 15:42:56 2006
@@ -247,7 +247,7 @@
   exit:
     Parser_free(parser);
     file->private_data = NULL;
-    dprintf("< err=%d\n", err);
+    dprintf("< proc_policy_release err=%d\n", err);
     return err;
 }
 
@@ -301,7 +301,7 @@
     int err = 0;
     IOStream *io = file->private_data;
     if(io) IOStream_close(io);
-    dprintf("< err=%d\n", err);
+    dprintf("< proc_io_release_fn err=%d\n", err);
     return err;
 }
 

[-- Attachment #5: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] vnet-module
  2006-03-31 13:56 [PATCH] vnet-module Robert Valentan
@ 2006-03-31 14:43 ` Mike Wray
  2006-03-31 15:05   ` Robert Valentan
  0 siblings, 1 reply; 4+ messages in thread
From: Mike Wray @ 2006-03-31 14:43 UTC (permalink / raw)
  To: Robert Valentan; +Cc: mike.wray, xen-devel

Robert Valentan wrote:
> patch_vnet_1
>   Replacing the socketcall with direct calling the needed
>   functions (my patch from 28.3)

I don't like the idea of pasting all this code copied from elsewhere in
the kernel.
If the problem is that __ARCH_WANT_SYS_SOCKETCALL is not defined, so
there is no socketcall, then a better solution needs to be found.

In the worst case a copy of the relevant bits of socket.c defining socketcall
in a separate file with an #ifndef __ARCH_WANT_SYS_SOCKETCALL round it.

> 
> patch_vnet_2
>   Modify the module-parameter for kernel 2.6.* (the old one
>   will not compile with the actual kernel 2.6.16)
>   Exporting the default-values of the parameters in /sys/module
> 
> patch_vnet_3
>   Some "extentions" to error-messages to identify the position
>   in the code.
>   I had searched a bug, but it was a wrong vnet-id ;-/
>   A hint for docu: using "123459" as vnet-id has not 4 digits
>   and will be punished with errors  ;-)

The changes to the print functions are not needed - the debug macros
in the code already include the function name. All you need to do
is #define DEBUG 1. Check libxutil/debug.h. for the definitions.

Mike

> 
> 
> 
> ------------------------------------------------------------------------
> 
> diff -r 2604abf98ede tools/vnet/vnet-module/varp_socket.c
> --- a/tools/vnet/vnet-module/varp_socket.c	Tue Mar 28 09:09:44 2006
> +++ b/tools/vnet/vnet-module/varp_socket.c	Tue Mar 28 17:10:53 2006
> @@ -16,6 +16,9 @@
>   * 59 Temple Place, suite 330, Boston, MA 02111-1307 USA
>   *
>   */
> +
> +static int errno;
> +
>  #include <linux/kernel.h>
>  #include <linux/types.h>
>  #include <linux/version.h>
> @@ -36,7 +39,6 @@
>  
>  /* Get macros needed to define system calls as functions in the kernel. */
>  #define __KERNEL_SYSCALLS__
> -static int errno;
>  #include <linux/unistd.h>
>  
>  #define MODULE_NAME "VARP"
> @@ -75,110 +77,254 @@
>   * The parts we need anyway.
>   */
>  
> -/* Define the socketcall() syscall.
> - * Multiplexes all the socket-related calls.
> - *
> - * @param call socket call id
> - * @param args arguments (upto 6)
> - * @return call-dependent value
> - */
> -static inline _syscall2(int, socketcall,
> -                        int, call,
> -                        unsigned long *, args)
> +/* the following code is copied from linux-kernel/net/socket.c
> + * As replacement of the __NR_socketcall, which exists not in x86_64 and
> + * same other systems.
> + * An alternate will be an export of the copied-functions in net/socket.c
> + */ 
> +#define MAX_SOCK_ADDR 128
>  
>  int socket(int family, int type, int protocol){
> -    unsigned long args[6];
> -    
> -    args[0] = (unsigned long)family;
> -    args[1] = (unsigned long)type;
> -    args[2] = (unsigned long)protocol;
> -    return socketcall(SYS_SOCKET, args);
> +
> +	int retval;
> +	struct socket *sock;
> +	retval = sock_create(family, type, protocol, &sock);
> +	if (retval < 0)
> +		goto out;
> +
> +	retval = sock_map_fd(sock);
> +	if (retval < 0)
> +		goto out_release;
> +
> +out:
> +	/* It may be already another descriptor 8) Not kernel problem. */
> +	return retval;
> +
> +out_release:
> +	sock_release(sock);
> +	return retval;
>  }
>  
>  int bind(int fd, struct sockaddr *umyaddr, int addrlen){
> -    unsigned long args[6];
> -    
> -    args[0] = (unsigned long)fd;
> -    args[1] = (unsigned long)umyaddr;
> -    args[2] = (unsigned long)addrlen;
> -    return socketcall(SYS_BIND, args);
> +
> +	struct socket *sock;
> +	char address[MAX_SOCK_ADDR];
> +	int err;
> +
> +	if((sock = sockfd_lookup(fd,&err))!=NULL)
> +	{
> +		if((err=move_addr_to_kernel(umyaddr,addrlen,address))>=0) {
> +			err = security_socket_bind(sock, (struct sockaddr *)address, addrlen);
> +			if (err) {
> +				sockfd_put(sock);
> +				return err;
> +			}
> +			err = sock->ops->bind(sock, (struct sockaddr *)address, addrlen);
> +		}
> +		sockfd_put(sock);
> +	}			
> +	return err;
>  }
>  
>  int connect(int fd, struct sockaddr *uservaddr, int addrlen){
> -    unsigned long args[6];
> -    
> -    args[0] = (unsigned long)fd;
> -    args[1] = (unsigned long)uservaddr;
> -    args[2] = (unsigned long)addrlen;
> -    return socketcall(SYS_CONNECT, args);
> +
> +	struct socket *sock;
> +	char address[MAX_SOCK_ADDR];
> +	int err;
> +
> +	sock = sockfd_lookup(fd, &err);
> +	if (!sock)
> +		goto out;
> +	err = move_addr_to_kernel(uservaddr, addrlen, address);
> +	if (err < 0)
> +		goto out_put;
> +
> +	err = security_socket_connect(sock, (struct sockaddr *)address, addrlen);
> +	if (err)
> +		goto out_put;
> +
> +	err = sock->ops->connect(sock, (struct sockaddr *) address, addrlen,
> +				 sock->file->f_flags);
> +out_put:
> +	sockfd_put(sock);
> +out:
> +	return err;
>  }
>  
>  int sendto(int fd, void * buff, size_t len,
>             unsigned flags, struct sockaddr *addr,
>             int addr_len){
> -    unsigned long args[6];
> -    
> -    args[0] = (unsigned long)fd;
> -    args[1] = (unsigned long)buff;
> -    args[2] = (unsigned long)len;
> -    args[3] = (unsigned long)flags;
> -    args[4] = (unsigned long)addr;
> -    args[5] = (unsigned long)addr_len;
> -    return socketcall(SYS_SENDTO, args);
> +
> +	struct socket *sock;
> +	char address[MAX_SOCK_ADDR];
> +	int err;
> +	struct msghdr msg;
> +	struct iovec iov;
> +	
> +	sock = sockfd_lookup(fd, &err);
> +	if (!sock)
> +		goto out;
> +	iov.iov_base=buff;
> +	iov.iov_len=len;
> +	msg.msg_name=NULL;
> +	msg.msg_iov=&iov;
> +	msg.msg_iovlen=1;
> +	msg.msg_control=NULL;
> +	msg.msg_controllen=0;
> +	msg.msg_namelen=0;
> +	if(addr)
> +	{
> +		err = move_addr_to_kernel(addr, addr_len, address);
> +		if (err < 0)
> +			goto out_put;
> +		msg.msg_name=address;
> +		msg.msg_namelen=addr_len;
> +	}
> +	if (sock->file->f_flags & O_NONBLOCK)
> +		flags |= MSG_DONTWAIT;
> +	msg.msg_flags = flags;
> +	err = sock_sendmsg(sock, &msg, len);
> +
> +out_put:		
> +	sockfd_put(sock);
> +out:
> +	return err;
>  }
>  
>  int recvfrom(int fd, void * ubuf, size_t size,
>               unsigned flags, struct sockaddr *addr,
>               int *addr_len){
> -    unsigned long args[6];
> -    
> -    args[0] = (unsigned long)fd;
> -    args[1] = (unsigned long)ubuf;
> -    args[2] = (unsigned long)size;
> -    args[3] = (unsigned long)flags;
> -    args[4] = (unsigned long)addr;
> -    args[5] = (unsigned long)addr_len;
> -    return socketcall(SYS_RECVFROM, args);
> +
> +	struct socket *sock;
> +	struct iovec iov;
> +	struct msghdr msg;
> +	char address[MAX_SOCK_ADDR];
> +	int err,err2;
> +
> +	sock = sockfd_lookup(fd, &err);
> +	if (!sock)
> +		goto out;
> +
> +	msg.msg_control=NULL;
> +	msg.msg_controllen=0;
> +	msg.msg_iovlen=1;
> +	msg.msg_iov=&iov;
> +	iov.iov_len=size;
> +	iov.iov_base=ubuf;
> +	msg.msg_name=address;
> +	msg.msg_namelen=MAX_SOCK_ADDR;
> +	if (sock->file->f_flags & O_NONBLOCK)
> +		flags |= MSG_DONTWAIT;
> +	err=sock_recvmsg(sock, &msg, size, flags);
> +
> +	if(err >= 0 && addr != NULL)
> +	{
> +		err2=move_addr_to_user(address, msg.msg_namelen, addr, addr_len);
> +		if(err2<0)
> +			err=err2;
> +	}
> +	sockfd_put(sock);			
> +out:
> +	return err;
>  }
>  
>  int setsockopt(int fd, int level, int optname, void *optval, int optlen){
> -    unsigned long args[6];
> -    
> -    args[0] = (unsigned long)fd;
> -    args[1] = (unsigned long)level;
> -    args[2] = (unsigned long)optname;
> -    args[3] = (unsigned long)optval;
> -    args[4] = (unsigned long)optlen;
> -    return socketcall(SYS_SETSOCKOPT, args);
> -}
> -
> +
> +	int err;
> +	struct socket *sock;
> +
> +	if (optlen < 0)
> +		return -EINVAL;
> +			
> +	if ((sock = sockfd_lookup(fd, &err))!=NULL)
> +	{
> +		err = security_socket_setsockopt(sock,level,optname);
> +		if (err) {
> +			sockfd_put(sock);
> +			return err;
> +		}
> +
> +		if (level == SOL_SOCKET)
> +			err=sock_setsockopt(sock,level,optname,optval,optlen);
> +		else
> +			err=sock->ops->setsockopt(sock, level, optname, optval, optlen);
> +		sockfd_put(sock);
> +	}
> +	return err;
> +}
> +
> +/*  not possible, because sock_getsockopt is not exported ...
>  int getsockopt(int fd, int level, int optname, void *optval, int *optlen){
> -    unsigned long args[6];
> -    
> -    args[0] = (unsigned long)fd;
> -    args[1] = (unsigned long)level;
> -    args[2] = (unsigned long)optname;
> -    args[3] = (unsigned long)optval;
> -    args[4] = (unsigned long)optlen;
> -    return socketcall(SYS_GETSOCKOPT, args);
> -}
> +
> +	int err;
> +	struct socket *sock;
> +
> +	if ((sock = sockfd_lookup(fd, &err))!=NULL)
> +	{
> +		err = security_socket_getsockopt(sock, level, optname);
> +		if (err) {
> +			sockfd_put(sock);
> +			return err;
> +		}
> +
> +		if (level == SOL_SOCKET)
> +			err=sock_getsockopt(sock,level,optname,optval,optlen);
> +		else
> +			err=sock->ops->getsockopt(sock, level, optname, optval, optlen);
> +		sockfd_put(sock);
> +	}
> +	return err;
> +}
> +*/
>  
>  int shutdown(int fd, int how){
> -    unsigned long args[6];
> -    
> -    args[0] = (unsigned long)fd;
> -    args[1] = (unsigned long)how;
> -    return socketcall(SYS_SHUTDOWN, args);
> +
> +	int err;
> +	struct socket *sock;
> +
> +	if ((sock = sockfd_lookup(fd, &err))!=NULL)
> +	{
> +		err = security_socket_shutdown(sock, how);
> +		if (err) {
> +			sockfd_put(sock);
> +			return err;
> +		}
> +				
> +		err=sock->ops->shutdown(sock, how);
> +		sockfd_put(sock);
> +	}
> +	return err;
>  }
>  
>  int getsockname(int fd, struct sockaddr *usockaddr, int *usockaddr_len){
> -    unsigned long args[6];
> -    
> -    args[0] = (unsigned long)fd;
> -    args[1] = (unsigned long)usockaddr;
> -    args[2] = (unsigned long)usockaddr_len;
> -    return socketcall(SYS_GETSOCKNAME, args);
> -}
> +
> +	struct socket *sock;
> +	char address[MAX_SOCK_ADDR];
> +	int len, err;
> +	
> +	sock = sockfd_lookup(fd, &err);
> +	if (!sock)
> +		goto out;
> +
> +	err = security_socket_getsockname(sock);
> +	if (err)
> +		goto out_put;
> +
> +	err = sock->ops->getname(sock, (struct sockaddr *)address, &len, 0);
> +	if (err)
> +		goto out_put;
> +	err = move_addr_to_user(address, len, usockaddr, usockaddr_len);
> +
> +out_put:
> +	sockfd_put(sock);
> +out:
> +	return err;
> +}
> +
> +/**
> + * End of copy from net/socket.c
> + */
> +
>  
>  /*============================================================================*/
>  /** Socket flags. */
> @@ -577,7 +723,7 @@
>      int err = 0;
>      mm_segment_t oldfs;
>  
> -    dprintf("> mcaddr=%u.%u.%u.%u port=%u\n", NIPQUAD(mcaddr), ntohs(port));
> +    iprintf("> mcaddr=%u.%u.%u.%u port=%u\n", NIPQUAD(mcaddr), ntohs(port));
>      oldfs = change_fs(KERNEL_DS);
>      err = varp_mcast_open(mcaddr, port, &varp_mcast_sock);
>      if(err < 0 ) goto exit;
> 
> 
> ------------------------------------------------------------------------
> 
> diff -r 89b98811ce56 tools/vnet/vnet-module/if_varp.h
> --- a/tools/vnet/vnet-module/if_varp.h	Fri Mar 31 13:29:05 2006
> +++ b/tools/vnet/vnet-module/if_varp.h	Fri Mar 31 15:39:27 2006
> @@ -97,7 +97,7 @@
>  
>  
>  /** Default address for varp/vnet broadcasts: 224.10.0.1 */
> -#define VARP_MCAST_ADDR     0xe00a0001
> +#define VARP_MCAST_ADDR     "224.10.0.1"
>  
>  /** UDP port to use for varp protocol. */
>  #define VARP_PORT           1798
> diff -r 89b98811ce56 tools/vnet/vnet-module/tunnel.h
> --- a/tools/vnet/vnet-module/tunnel.h	Fri Mar 31 13:29:05 2006
> +++ b/tools/vnet/vnet-module/tunnel.h	Fri Mar 31 15:39:27 2006
> @@ -74,7 +74,7 @@
>   *
>   * @param tunnel tunnel (may be null)
>   */
> -static inline void Tunnel_decref(struct Tunnel *tunnel){
> +static void Tunnel_decref(struct Tunnel *tunnel){
>      if(!tunnel) return;
>      if(atomic_dec_and_test(&tunnel->refcount)){
>          tunnel->type->close(tunnel);
> diff -r 89b98811ce56 tools/vnet/vnet-module/varp.c
> --- a/tools/vnet/vnet-module/varp.c	Fri Mar 31 13:29:05 2006
> +++ b/tools/vnet/vnet-module/varp.c	Fri Mar 31 15:39:27 2006
> @@ -200,7 +200,8 @@
>  /** UDP port (network order). */
>  u16 varp_port = 0;
>  
> -char *varp_device = "xen-br0";
> +#define VARP_DEVICE_DEFAULT "xen-br0"
> +char *varp_device = NULL;
>  
>  #define VarpTable_read_lock(vtable, flags)    \
>    do{ read_lock_irqsave(&(vtable)->lock, (flags)); } while(0)
> @@ -262,8 +263,9 @@
>  int varp_ucast_addr(uint32_t *addr)
>  {
>      int err = -ENODEV;
> -    const char *devices[] = { varp_device, "eth0", "eth1", "eth2", NULL };
> +    char *devices[] = { varp_device, "eth0", "eth1", "eth2", NULL };
>      const char **p;
> +
>      for(p = devices; err && *p; p++){
>          err = device_ucast_addr(*p, addr);
>      }
> @@ -1485,12 +1487,14 @@
>  static void varp_init_mcast_addr(char *s){
>      unsigned long v = 0;
>  
> -    dprintf("> %s\n", s);
> +    dprintf("> mcast_addr init=%s\n", s);
>      if(s && (get_inet_addr(s, &v) >= 0)){
> -        varp_mcast_addr = (u32)v;
> +        varp_mcaddr = s;
>      } else {
> -        varp_mcast_addr = htonl(VARP_MCAST_ADDR);
> -    }
> +        varp_mcaddr = VARP_MCAST_ADDR;
> +        get_inet_addr(varp_mcaddr, &v);
> +    }
> +    varp_mcast_addr = (u32)v;
>  }
>  
>  /** Initialize the varp cache.
> @@ -1510,9 +1514,12 @@
>      varp_init_mcast_addr(varp_mcaddr);
>      varp_port = htons(VARP_PORT);
>  
> +    if (varp_device == NULL)
> +       varp_device = VARP_DEVICE_DEFAULT;
> +
>      err = varp_open(varp_mcast_addr, varp_port);
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< varp_init err=%d\n", err);
>      return err;
>  }
>  
> @@ -1529,8 +1536,10 @@
>      dprintf("<\n");
>  }
>  
> -MODULE_PARM(varp_mcaddr, "s");
> +#ifdef __KERNEL__
> +module_param_named(mcaddr, varp_mcaddr, charp, 0444);
>  MODULE_PARM_DESC(varp_mcaddr, "VARP multicast address");
>  
> -MODULE_PARM(varp_device, "s");
> +module_param_named(device, varp_device, charp, 0444);
>  MODULE_PARM_DESC(varp_device, "VARP network device");
> +#endif
> diff -r 89b98811ce56 tools/vnet/vnet-module/vnet.c
> --- a/tools/vnet/vnet-module/vnet.c	Fri Mar 31 13:29:05 2006
> +++ b/tools/vnet/vnet-module/vnet.c	Fri Mar 31 15:39:27 2006
> @@ -657,6 +657,9 @@
>  
>      if(vnet_encaps && !strcmp(vnet_encaps, "udp")){
>          etherip_in_udp = 1;
> +        vnet_encaps = "etherip";
> +    } else {
> +        vnet_encaps = "udp";
>      }
>      dprintf(">\n");
>      err = random_module_init();
> @@ -691,7 +694,7 @@
>  module_exit(vnet_module_exit);
>  MODULE_LICENSE("GPL");
>  
> -MODULE_PARM(vnet_encaps, "s");
> +module_param_named(encaps, vnet_encaps, charp, 0444);
>  MODULE_PARM_DESC(vnet_encaps, "Vnet encapsulation: etherip or udp.");
>  
>  #endif
> 
> 
> ------------------------------------------------------------------------
> 
> diff -r 18eecf71f690 tools/vnet/vnet-module/esp.c
> --- a/tools/vnet/vnet-module/esp.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/esp.c	Fri Mar 31 15:42:56 2006
> @@ -281,7 +281,7 @@
>      }
>      skb_trim_tail(skb, icv_n);
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< esp_check_icv err=%d\n", err);
>      return err;
>  }
>  
> @@ -384,7 +384,7 @@
>      }
>      err = Tunnel_send(tunnel, skb);
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< esp_sa_send err=%d\n", err);
>      return err;
>  }
>  
> @@ -487,7 +487,7 @@
>          }
>          err = 1;
>      }
> -    dprintf("< skb=%p err=%d\n", skb, err);
> +    dprintf("< esp_sa_recv skb=%p err=%d\n", skb, err);
>      return err;
>  }
>  
> @@ -627,7 +627,7 @@
>      crypto_cipher_setkey(esp->cipher.tfm, esp->cipher.key, esp->cipher.key_n);
>      err = 0;
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< esp_cipher_int err=%d\n", err);
>      return err;
>  }
>  
> @@ -674,7 +674,7 @@
>          goto exit;
>      }
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< esp_digest_init err=%d\n", err);
>      return err;
>  }
>  
> @@ -704,7 +704,7 @@
>      if(err){
>          if(esp) esp_fini(esp);
>      }
> -    dprintf("< err=%d\n", err);
> +    dprintf("< esp_sa_init err=%d\n", err);
>      return err;
>  }
>  
> @@ -793,7 +793,7 @@
>          kfree_skb(skb);
>          err = 0;
>      }
> -    dprintf("< err=%d\n", err);
> +    dprintf("< esp_protocol_recv err=%d\n", err);
>      return err;
>  }
>  
> @@ -884,7 +884,7 @@
>      }
>      esp_protocol_add();
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< esp_module_init err=%d\n", err);
>      return err;
>  }
>  
> diff -r 18eecf71f690 tools/vnet/vnet-module/etherip.c
> --- a/tools/vnet/vnet-module/etherip.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/etherip.c	Fri Mar 31 15:42:56 2006
> @@ -198,7 +198,7 @@
>      skb = NULL;
>    exit:
>      if(err && skb){
> -        wprintf("< err=%d\n", err);
> +        wprintf("< etherip_tunnel_send err=%d\n", err);
>          kfree_skb(skb);
>      }
>      return err;
> @@ -347,7 +347,7 @@
>      err = vnet_skb_recv(skb, vinfo);
>    exit:
>      if(vinfo) Vnet_decref(vinfo);
> -    dprintf("< skb=%p err=%d\n", skb, err);
> +    dprintf("< etherip_protocol_recv skb=%p err=%d\n", skb, err);
>      return err;
>  }
>  
> diff -r 18eecf71f690 tools/vnet/vnet-module/sa.c
> --- a/tools/vnet/vnet-module/sa.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/sa.c	Fri Mar 31 15:42:56 2006
> @@ -365,7 +365,7 @@
>      if(err && entries){
>          sa_table_delete(state);
>      }
> -    dprintf("< err=%d\n", err);
> +    dprintf("< sa_table_add err=%d\n", err);
>      return err;
>  }
>  
> @@ -441,7 +441,7 @@
>      if(err) goto exit;
>      sa_table_delete(existing);
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< sa_table_replace err=%d\n", err);
>      return err;
>  }
>  
> @@ -524,7 +524,7 @@
>          state = NULL;
>      }
>      *statep = state;
> -    dprintf("< err=%d\n", err);
> +    dprintf("< SAState_create err=%d\n", err);
>      return err;
>  }
>  
> @@ -587,7 +587,7 @@
>      }
>  
>      err = sa_set(&info, 0, sa);
> -    dprintf("< err=%d\n", err);
> +    dprintf("< sa_create err=%d\n", err);
>      return err;
>  }
>  
> @@ -625,7 +625,7 @@
>      } else {
>          SAState_decref(state);
>      }
> -    dprintf("< err=%d\n", err);
> +    dprintf("< sa_set err=%d\n", err);
>      return err;
>  }
>  
> @@ -691,7 +691,7 @@
>  static int sa_tunnel_open(Tunnel *tunnel){
>      int err = 0;
>      //dprintf(">\n");
> -    //dprintf("< err=%d\n", err);
> +    //dprintf("< sa_tunnel_open err=%d\n", err);
>      return err;
>  }
>  
> diff -r 18eecf71f690 tools/vnet/vnet-module/skb_context.c
> --- a/tools/vnet/vnet-module/skb_context.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/skb_context.c	Fri Mar 31 15:42:56 2006
> @@ -73,7 +73,7 @@
>      context->next = *val;
>      *val = context;
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< SkbContext_push err=%d\n", err);
>      return err;
>  }
>  
> @@ -85,7 +85,7 @@
>  
>      //err = SkbContext_push(&ctxt, vnet, addr, protocol, data, free_fn); //todo fixme
>      //SKB_CONTEXT(skb) = ctxt;//todo fixme
> -    dprintf("< err=%d\n", err);
> +    dprintf("< skb_push_context err=%d\n", err);
>      return err;
>  }
>                                         
> diff -r 18eecf71f690 tools/vnet/vnet-module/skb_util.c
> --- a/tools/vnet/vnet-module/skb_util.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/skb_util.c	Fri Mar 31 15:42:56 2006
> @@ -133,7 +133,7 @@
>              skb_headroom(*pskb), head_n,
>              skb_tailroom(*pskb), tail_n);
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< skb_make_room err=%d\n", err);
>      return err;
>  }
>  
> @@ -374,7 +374,7 @@
>      }
>    exit:
>      if(!err) *sg_n = sg_i;
> -    if(len) wprintf("> len=%d\n", len);
> +    if(len) wprintf("> sbk_scatterlist len=%d\n", len);
>      if(len) BUG();
>      if(err) dprintf("< err=%d sg_n=%d\n", err, *sg_n);
>      return err;
> diff -r 18eecf71f690 tools/vnet/vnet-module/tunnel.c
> --- a/tools/vnet/vnet-module/tunnel.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/tunnel.c	Fri Mar 31 15:42:56 2006
> @@ -95,12 +95,12 @@
>          tunnel = NULL;
>      }
>      *val = tunnel;
> -    dprintf("< err=%d\n", err);
> +    dprintf("< tunnel_create err=%d\n", err);
>      return err;
>  }
>  
>  void TunnelStats_update(TunnelStats *stats, int len, int err){
> -    dprintf(">len=%d  err=%d\n", len, err);
> +    dprintf("> TunnelStats_update len=%d  err=%d\n", len, err);
>      if(err){
>          stats->dropped_bytes += len;
>          stats->dropped_packets++;
> @@ -139,7 +139,7 @@
>      tunnel_table->key_hash_fn = tunnel_table_key_hash_fn;
>      tunnel_table->key_equal_fn = tunnel_table_key_equal_fn;
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< Tunnel_init(): err=%d\n", err);
>      return err;
>  }
>      
> @@ -213,7 +213,7 @@
>          err = -ENOMEM;
>      }
>      tunnel_write_unlock(flags);
> -    dprintf("< err=%d\n", err);
> +    dprintf("< Tunnel_add err=%d\n", err);
>      return err;
>  }
>  
> @@ -244,7 +244,7 @@
>      } else {
>          err = skb_xmit(skb);
>      }
> -    dprintf("< err=%d\n", err);
> +    dprintf("< Tunnel_send err=%d\n", err);
>      return err;
>  }
>  
> diff -r 18eecf71f690 tools/vnet/vnet-module/varp.c
> --- a/tools/vnet/vnet-module/varp.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/varp.c	Fri Mar 31 15:42:56 2006
> @@ -512,7 +512,7 @@
>  
>    exit:
>      if(err && skbout) kfree_skb(skbout);
> -    dprintf("< err=%d\n", err);
> +    dprintf("< varp_send err=%d\n", err);
>      return err;
>  }
>  
> @@ -1002,7 +1002,7 @@
>      VarpEntry_unlock(ventry, flags);
>      err = vnet_tunnel_send(&vnet, &addr, skb);
>      VarpEntry_lock(ventry, flags);
> -    dprintf("< err=%d\n", err);
> +    dprintf("< VarpEntry_send err=%d\n", err);
>      return err;
>  }
>  
> @@ -1050,7 +1050,7 @@
>      } else {
>          err = VarpEntry_send(ventry, skb);
>      }
> -    dprintf("< err=%d\n", err);
> +    dprintf("< VarpEntry_resolve err=%d\n", err);
>      return err;
>  }
>  
> @@ -1143,7 +1143,7 @@
>      //}
>    exit:
>      VarpEntry_unlock(ventry, flags);
> -    dprintf("< err=%d\n", err);
> +    dprintf("< VarpEntry_update err=%d\n", err);
>      return err;
>  }
>      
> @@ -1180,7 +1180,7 @@
>      err = VarpEntry_update(ventry, addr, state, flags);
>      VarpEntry_decref(ventry);
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< VarpTable_update err=%d\n", err);
>      return err;
>  }
>  
> @@ -1297,7 +1297,7 @@
>      varp_send(VARP_OP_ANNOUNCE, skb->dev, skb, vnet, vmac);
>      vif_decref(vif);
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< varp_handle_request err=%d\n", err);
>      return err;
>  }
>  
> @@ -1316,7 +1316,7 @@
>      }
>      err = varp_send(VARP_OP_ANNOUNCE, dev, NULL, &vif->vnet, &vif->vmac);
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< varp_announce_vif err=%d\n", err);
>      return err;
>  }
>  
> @@ -1335,7 +1335,7 @@
>                             &varph->vnet, &varph->vmac, &varph->addr,
>                             VARP_STATE_REACHABLE, 
>                             (VARP_UPDATE_CREATE | VARP_UPDATE_QUEUE));
> -    dprintf("< err=%d\n", err);
> +    dprintf("< varp_handle_announce err=%d\n", err);
>      return err;
>  }
>  
> @@ -1419,7 +1419,7 @@
>          break;
>      }
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< varp_handle_message err=%d\n", err);
>      return err;
>  }
>  
> @@ -1462,7 +1462,7 @@
>          }
>      }
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< varp_output err=%d\n", err);
>      return err;
>  }
>  
> diff -r 18eecf71f690 tools/vnet/vnet-module/varp_socket.c
> --- a/tools/vnet/vnet-module/varp_socket.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/varp_socket.c	Fri Mar 31 15:42:56 2006
> @@ -507,7 +507,7 @@
>      }
>    exit:
>      *val = (err ? -1 : sock);
> -    if(err) eprintf("> err=%d errno=%d\n", err, errno);
> +    if(err) eprintf("> create_socket err=%d errno=%d\n", err, errno);
>      return err;
>  }
>  
> @@ -538,7 +538,7 @@
>          shutdown(sock, 2);
>      }
>      *val = (err ? -1 : sock);
> -    dprintf("< err=%d val=%d\n", err, *val);
> +    dprintf("< varp_mcast_open err=%d val=%d\n", err, *val);
>      return err;
>  }
>  
> @@ -554,7 +554,7 @@
>      int flags = (VSOCK_BIND | VSOCK_REUSE);
>      dprintf(">\n");
>      err = create_socket(SOCK_DGRAM, addr, port, flags, val);
> -    dprintf("< err=%d val=%d\n", err, *val);
> +    dprintf("< varp_ucast_open err=%d val=%d\n", err, *val);
>      return err;
>  }
>  
> @@ -733,7 +733,7 @@
>      sock_set_callback(varp_mcast_sock);
>    exit:
>      set_fs(oldfs);
> -    dprintf("< err=%d\n", err);
> +    dprintf("< varp_socket_open err=%d\n", err);
>      return err;
>  }	
>  
> @@ -792,7 +792,7 @@
>      sock_remove_wait_queue(varp_mcast_sock, &mcast_wait);
>      varp_sockets_close();
>      if(err){
> -        eprintf("%s< err=%d\n", __FUNCTION__, err);
> +        eprintf("%s< varp_main err=%d\n", __FUNCTION__, err);
>      }
>      varp_thread_err = err;
>      atomic_set(&varp_state, VARP_STATE_EXITED);
> @@ -842,7 +842,7 @@
>  #endif
>    exit:
>      if(err){
> -        wprintf("> err=%d\n", err);
> -    }
> -    return err;
> -}
> +        wprintf("> varp_open err=%d\n", err);
> +    }
> +    return err;
> +}
> diff -r 18eecf71f690 tools/vnet/vnet-module/vnet.c
> --- a/tools/vnet/vnet-module/vnet.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/vnet.c	Fri Mar 31 15:42:56 2006
> @@ -448,7 +448,7 @@
>      }
>  #endif
>    exit:
> -    dprintf("< err=%d\n", err);
> +    dprintf("< _skb_xmit err=%d\n", err);
>      return err;
>  }
>  
> @@ -486,7 +486,7 @@
>          vif_update(vnet, (Vmac*)eth_hdr(skb)->h_source);
>          err = varp_output(skb, vnet);
>      }
> -    //dprintf("< err=%d\n", err);
> +    //dprintf("< vnet_skb_send err=%d\n", err);
>      return err;
>  }
>  
> diff -r 18eecf71f690 tools/vnet/vnet-module/vnet_eval.c
> --- a/tools/vnet/vnet-module/vnet_eval.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/vnet_eval.c	Fri Mar 31 15:42:56 2006
> @@ -354,7 +354,7 @@
>              break;
>          }
>      }
> -    iprintf("< err=%d\n", err);
> +    iprintf("< vnet_eval_defs err=%d\n", err);
>      return err;
>  }
>  
> diff -r 18eecf71f690 tools/vnet/vnet-module/vnet_ioctl.c
> --- a/tools/vnet/vnet-module/vnet_ioctl.c	Fri Mar 31 13:39:42 2006
> +++ b/tools/vnet/vnet-module/vnet_ioctl.c	Fri Mar 31 15:42:56 2006
> @@ -247,7 +247,7 @@
>    exit:
>      Parser_free(parser);
>      file->private_data = NULL;
> -    dprintf("< err=%d\n", err);
> +    dprintf("< proc_policy_release err=%d\n", err);
>      return err;
>  }
>  
> @@ -301,7 +301,7 @@
>      int err = 0;
>      IOStream *io = file->private_data;
>      if(io) IOStream_close(io);
> -    dprintf("< err=%d\n", err);
> +    dprintf("< proc_io_release_fn err=%d\n", err);
>      return err;
>  }
>  
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] vnet-module
  2006-03-31 14:43 ` Mike Wray
@ 2006-03-31 15:05   ` Robert Valentan
  0 siblings, 0 replies; 4+ messages in thread
From: Robert Valentan @ 2006-03-31 15:05 UTC (permalink / raw)
  To: Mike Wray; +Cc: xen-devel

Mike Wray schrieb:
> Robert Valentan wrote:
> 
>> patch_vnet_1
>>   Replacing the socketcall with direct calling the needed
>>   functions (my patch from 28.3)
> 
> 
> I don't like the idea of pasting all this code copied from elsewhere in
> the kernel.
> If the problem is that __ARCH_WANT_SYS_SOCKETCALL is not defined, so
> there is no socketcall, then a better solution needs to be found.

x86_64 definies __ARCH_WANT_SYS_SOCKETCALL, but has no entry-point for
it. A better solution will be an export of the needed functions in
net/socket.c ...  But where to get it ?

> In the worst case a copy of the relevant bits of socket.c defining 
> socketcall
> in a separate file with an #ifndef __ARCH_WANT_SYS_SOCKETCALL round it.

I havn't take a separate file, because my solution will also work for
the other systems. If you want a separate file, i will modify my patch,
but we need a permanent include, or need to use "__NR_socketcall"..

>> patch_vnet_2
>>   Modify the module-parameter for kernel 2.6.* (the old one
>>   will not compile with the actual kernel 2.6.16)
>>   Exporting the default-values of the parameters in /sys/module
>>
>> patch_vnet_3
>>   Some "extentions" to error-messages to identify the position
>>   in the code.
>>   I had searched a bug, but it was a wrong vnet-id ;-/
>>   A hint for docu: using "123459" as vnet-id has not 4 digits
>>   and will be punished with errors  ;-)
> 
> The changes to the print functions are not needed - the debug macros
> in the code already include the function name. All you need to do
> is #define DEBUG 1. Check libxutil/debug.h. for the definitions.

Ohh..  thank you for the hint ;-/

-- 
wbr
Robert Valentan

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Patch] vnet-module
@ 2007-06-06 18:18 Robert Valentan
  0 siblings, 0 replies; 4+ messages in thread
From: Robert Valentan @ 2007-06-06 18:18 UTC (permalink / raw)
  To: xen-devel

[-- Attachment #1: Type: text/plain, Size: 788 bytes --]

Hallo!

The attached patch repair the vnet-module (patch base is
xen-3.1.0)

 - moves the "skb_pull" function from kernel to skb_util.c
   because pulling in the data will rise a "BUG_ON" in the
   kernel.

 - the skb_buff is not always possible to modify.
   (vnet_forward.c and etherip.c) The code now work's..
   I think with no or less time-penalty.


Info for kernel-option CONFIG_BRIDGE_NETFILTER :
There is a race-condition in the code (nf_iterate), which will
kill the kernel. With hyperthreading and vnet over 2 Server
a scp will kill it in less 1 (one) second. Blocking hyperthreading
the same will work less then 30 seconds. Dropping the bridge-
netfilter code, no error's in 3 hours....


Signed-off-by: Robert Valentan <R.Valentan@solid-soft.at>

-- 
regards
Robert Valentan

[-- Attachment #2: vnet_module.patch --]
[-- Type: text/x-patch, Size: 7252 bytes --]

diff -r c0b0974fb055 tools/vnet/vnet-module/esp.c
--- a/tools/vnet/vnet-module/esp.c	Fri May 18 15:59:32 2007
+++ b/tools/vnet/vnet-module/esp.c	Wed Jun  6 19:46:53 2007
@@ -341,12 +341,12 @@
         dprintf("> ETH header pull...\n");
         memmove(skb->data, skb->mac.raw, ETH_HLEN);
         skb->mac.raw = skb->data; 
-        __skb_pull(skb, ETH_HLEN);
+        skb_pull_vn(skb, ETH_HLEN);
     }
     dprintf("> IP header pull...\n");
     memmove(skb->data, skb->nh.raw, ip_n);
     skb->nh.raw = skb->data;
-    __skb_pull(skb, ip_n);
+    skb_pull_vn(skb, ip_n);
     esph = (void*)skb->data;
     // Add spi and sequence number.
     esph->spi = sa->ident.spi;
@@ -457,7 +457,7 @@
     // Move skb->data back to ethernet header.
     // Do in 2 moves to ensure offsets are +ve,
     // since args to skb_pull/skb_push are unsigned.
-    __skb_pull(skb, head_n);
+    skb_pull_vn(skb, head_n);
     __skb_push(skb, skb->data - skb->mac.raw);
     // After this esph is invalid.
     esph = NULL;
@@ -763,7 +763,7 @@
     dprintf(">\n");
 #ifdef DEBUG
     dprintf("> recv skb=\n"); 
-    skb_print_bits(skb, 0, skb->len);
+    skb_print_bits("", skb, 0, skb->len);
 #endif
     ip_n = (skb->nh.iph->ihl << 2);
     if(skb->data == skb->mac.raw){
@@ -773,7 +773,7 @@
             err = -EINVAL;
             goto exit;
         }
-        skb_pull(skb, eth_n + ip_n);
+        skb_pull_vn(skb, eth_n + ip_n);
     }
     addr = skb->nh.iph->daddr;
     err = esp_skb_header(skb, &esph);
diff -r c0b0974fb055 tools/vnet/vnet-module/etherip.c
--- a/tools/vnet/vnet-module/etherip.c	Fri May 18 15:59:32 2007
+++ b/tools/vnet/vnet-module/etherip.c	Wed Jun  6 19:46:53 2007
@@ -270,6 +270,7 @@
     u32 saddr, daddr;
     char vnetbuf[VNET_ID_BUF];
     struct ethhdr *eth;
+    struct sk_buff *newskb;
 
     dprintf(">\n");
     saddr = skb->nh.iph->saddr;
@@ -293,7 +294,7 @@
             err = -EINVAL;
             goto exit;
         }
-        skb_pull(skb, pull_n);
+        skb_pull_vn(skb, pull_n);
     }
     // Assume skb->data points at etherip header.
     etheriph = (void*)skb->data;
@@ -318,7 +319,18 @@
         goto exit;
     }
     // Point at the headers in the contained ethernet frame.
-    skb->mac.raw = skb_pull(skb, etherip_n);
+    skb->mac.raw = skb_pull_vn(skb, etherip_n);
+
+    newskb = alloc_skb(skb->len, GFP_ATOMIC);
+    if (!newskb) {
+        wprintf("> alloc new sk_buff failed \n");
+        goto exit;
+    }
+    newskb->mac.raw = skb_put(newskb, skb->len);
+    skb_copy_bits(skb, 0, newskb->data, skb->len);
+    kfree_skb(skb);
+    skb = newskb;
+
     eth = eth_hdr(skb);
 
     // Simulate the logic from eth_type_trans()
@@ -340,27 +352,12 @@
     
     // Assuming a standard Ethernet frame.
     // Should check for protocol? Support ETH_P_8021Q too.
-    skb->nh.raw = skb_pull(skb, ETH_HLEN);
-
-#ifdef __KERNEL__
-    // Fix IP options, checksum, skb dst, netfilter state.
-    memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
-    if (skb->ip_summed == CHECKSUM_HW){
-        skb->ip_summed = CHECKSUM_NONE;
-    }
-    dst_release(skb->dst);
-    skb->dst = NULL;
-    nf_reset(skb);
-#ifdef CONFIG_BRIDGE_NETFILTER
-    if(skb->nf_bridge){
-        // Stop the eth header being clobbered by nf_bridge_maybe_copy_header().
-        _nf_bridge_save_header(skb);
-    }
-#endif
-#endif // __KERNEL__
-
-    dprintf("> Unpacked srcaddr=" IPFMT " vnet=%s srcmac=" MACFMT " dstmac=" MACFMT "\n",
+    skb->nh.raw = skb_pull_vn(skb, ETH_HLEN);
+    skb->h.raw = newskb->nh.raw + sizeof(struct iphdr);
+
+    dprintf("> Unpacked srcaddr=" IPFMT " dstaddr=" IPFMT " vnet=%s srcmac=" MACFMT " dstmac=" MACFMT "\n",
             NIPQUAD(skb->nh.iph->saddr),
+            NIPQUAD(skb->nh.iph->daddr),
             VnetId_ntoa(&vnet, vnetbuf),
             MAC6TUPLE(eth->h_source),
             MAC6TUPLE(eth->h_dest));
diff -r c0b0974fb055 tools/vnet/vnet-module/skb_util.h
--- a/tools/vnet/vnet-module/skb_util.h	Fri May 18 15:59:32 2007
+++ b/tools/vnet/vnet-module/skb_util.h	Wed Jun  6 19:46:53 2007
@@ -66,6 +66,21 @@
 }
 
 #endif
+
+/*
+ * It's a copy from {kernel}/include/linux/skbuff.h func '__skb_pull' and 'skb_pull'
+ * to aviodthe BUG_ON when pulling into the data (getting forwarded ip-frames)
+ */
+static inline unsigned char *__skb_pull_vn(struct sk_buff *skb, unsigned int len)
+{
+        skb->len -= len;
+        //BUG_ON(skb->len < skb->data_len);
+        return skb->data += len;
+}
+static inline unsigned char *skb_pull_vn(struct sk_buff *skb, unsigned int len)
+{
+        return unlikely(len > skb->len) ? NULL : __skb_pull_vn(skb, len);
+}
 
 
 #ifdef __KERNEL__
diff -r c0b0974fb055 tools/vnet/vnet-module/varp.c
--- a/tools/vnet/vnet-module/varp.c	Fri May 18 15:59:32 2007
+++ b/tools/vnet/vnet-module/varp.c	Wed Jun  6 19:46:53 2007
@@ -1365,7 +1365,7 @@
             goto exit;
         }
     }
-    varph = (void*)skb_pull(skb, sizeof(struct udphdr));
+    varph = (void*)skb_pull_vn(skb, sizeof(struct udphdr));
     if(skb->len < sizeof(struct VnetMsgHdr)){
         wprintf("> Varp msg too short: %d < %d\n", skb->len, sizeof(struct VnetMsgHdr));
         goto exit;
@@ -1378,11 +1378,11 @@
         }
         break;
     case VUDP_ID: // Etherip-in-udp packet.
-        skb_pull(skb, sizeof(struct VnetMsgHdr));
+        skb_pull_vn(skb, sizeof(struct VnetMsgHdr));
         err = etherip_protocol_recv(skb);
         goto exit;
     case VFWD_ID: // Forwarded.
-        skb_pull(skb, sizeof(struct VnetMsgHdr));
+        skb_pull_vn(skb, sizeof(struct VnetMsgHdr));
         err = vnet_forward_recv(skb);
         goto exit;
     default:
diff -r c0b0974fb055 tools/vnet/vnet-module/vnet_forward.c
--- a/tools/vnet/vnet-module/vnet_forward.c	Fri May 18 15:59:32 2007
+++ b/tools/vnet/vnet-module/vnet_forward.c	Wed Jun  6 19:46:53 2007
@@ -186,7 +186,7 @@
     printk("\nWrapped packet:\n");
     print_iphdr(__FUNCTION__, skb);
     print_udphdr(__FUNCTION__, skb);
-    skb_print_bits(__FUNCTION__, skb, 0, 0 * skb->len);
+    skb_print_bits(__FUNCTION__, skb, 0, skb->len);
 #endif
 
     err = _skb_xmit(skb, saddr);
@@ -304,7 +304,7 @@
     peer->rx_packets++;
     skb->mac.raw = NULL;
     skb->nh.raw = skb->data;
-    skb->h.raw = (void*)(skb->nh.iph + 1);
+    skb->h.raw = skb->data + sizeof(struct iphdr);
     if(!skb->nh.iph->saddr){
         skb->nh.iph->saddr = addr.u.ip4.s_addr;
     }
@@ -328,12 +328,17 @@
 
     // Handle (a copy of) it ourselves, because
     // if it is looped-back by xmit it will be ignored.
-    //recvskb = skb_clone(skb, GFP_ATOMIC);
-    recvskb = pskb_copy(skb, GFP_ATOMIC);
+    recvskb = alloc_skb(skb->len, GFP_ATOMIC);
     if(recvskb){
+        recvskb->protocol = htons(ETH_P_IP);
+
+        recvskb->nh.raw = skb_put(recvskb, skb->len);
+        recvskb->h.raw = recvskb->data + sizeof(struct iphdr); 
+        skb_copy_bits(skb, 0, recvskb->data, skb->len);
+        
         // Data points at the unwrapped iphdr, but varp_handle_message()
         // expects it to point at the udphdr, so pull.
-        skb_pull(recvskb, sizeof(struct iphdr));
+        skb_pull_vn(recvskb, sizeof(struct iphdr));
         if(varp_handle_message(recvskb) <= 0){
             kfree_skb(recvskb);
         }

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2007-06-06 18:18 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-06-06 18:18 [Patch] vnet-module Robert Valentan
  -- strict thread matches above, loose matches on Subject: below --
2006-03-31 13:56 [PATCH] vnet-module Robert Valentan
2006-03-31 14:43 ` Mike Wray
2006-03-31 15:05   ` Robert Valentan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.