* [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 --
2006-03-31 13:56 [PATCH] vnet-module Robert Valentan
2006-03-31 14:43 ` Mike Wray
2006-03-31 15:05 ` Robert Valentan
-- strict thread matches above, loose matches on Subject: below --
2007-06-06 18:18 [Patch] vnet-module 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.