From: Jack Lange Date: Wed, 8 Jun 2011 20:43:33 +0000 (-0500) Subject: ported socket interface to extension framework X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=5a47f41dd0d9d8706b172da4b1d154d90c1617e4;p=palacios.git ported socket interface to extension framework --- diff --git a/linux_module/palacios-dev.c b/linux_module/palacios-dev.c index 3899a2c..829c461 100644 --- a/linux_module/palacios-dev.c +++ b/linux_module/palacios-dev.c @@ -22,7 +22,6 @@ #include "palacios-mm.h" #include "palacios-vm.h" #include "palacios-serial.h" -#include "palacios-socket.h" #include "palacios-vnet.h" #include "palacios-packet.h" @@ -134,7 +133,6 @@ static long v3_dev_ioctl(struct file * filp, INIT_LIST_HEAD(&(guest->exts)); - INIT_LIST_HEAD(&(guest->sockets)); #ifdef V3_CONFIG_HOST_DEVICE INIT_LIST_HEAD(&(guest->hostdev.devs)); #endif @@ -266,9 +264,6 @@ static int __init v3_init(void) { #endif -#ifdef V3_CONFIG_SOCKET - palacios_socket_init(); -#endif #ifdef V3_CONFIG_PACKET palacios_init_packet(NULL); @@ -326,16 +321,6 @@ static void __exit v3_exit(void) { - - -#ifdef V3_CONFIG_SOCKET - palacios_socket_deinit(); -#endif - -#ifdef V3_CONFIG_PACKET - palacios_deinit_packet(NULL); -#endif - #ifdef V3_CONFIG_VNET palacios_vnet_deinit(); #endif diff --git a/linux_module/palacios-socket.c b/linux_module/palacios-socket.c index 8d17d8f..9cf8236 100644 --- a/linux_module/palacios-socket.c +++ b/linux_module/palacios-socket.c @@ -32,6 +32,7 @@ #include #include "palacios.h" +#include "linux-exts.h" struct palacios_socket { @@ -43,19 +44,32 @@ struct palacios_socket { static struct list_head global_sockets; + +// currently just the list of created sockets +struct vm_socket_state { + struct list_head socket_list; +}; + + //ignore the arguments given here currently static void * -palacios_tcp_socket( - const int bufsize, - const int nodelay, - const int nonblocking, - void * private_data -) -{ +palacios_tcp_socket(const int bufsize, const int nodelay, + const int nonblocking, void * private_data) { struct v3_guest * guest = (struct v3_guest *)private_data; struct palacios_socket * sock = NULL; + struct vm_socket_state * vm_state = NULL; int err; + if (guest != NULL) { + vm_state = get_vm_ext_data(guest, "SOCKET_INTERFACE"); + + if (vm_state == NULL) { + printk("ERROR: Could not locate vm socket state for extension SOCKET_INTERFACE\n"); + return NULL; + } + } + + sock = kmalloc(sizeof(struct palacios_socket), GFP_KERNEL); memset(sock, 0, sizeof(struct palacios_socket)); @@ -71,7 +85,7 @@ palacios_tcp_socket( if (guest == NULL) { list_add(&(sock->sock_node), &global_sockets); } else { - list_add(&(sock->sock_node), &(guest->sockets)); + list_add(&(sock->sock_node), &(vm_state->socket_list)); } return sock; @@ -87,8 +101,19 @@ palacios_udp_socket( { struct v3_guest * guest = (struct v3_guest *)private_data; struct palacios_socket * sock = NULL; + struct vm_socket_state * vm_state = NULL; int err; + if (guest != NULL) { + vm_state = get_vm_ext_data(guest, "SOCKET_INTERFACE"); + + if (vm_state == NULL) { + printk("ERROR: Could not locate vm socket state for extension SOCKET_INTERFACE\n"); + return NULL; + } + } + + sock = kmalloc(sizeof(struct palacios_socket), GFP_KERNEL); memset(sock, 0, sizeof(struct palacios_socket)); @@ -105,7 +130,7 @@ palacios_udp_socket( if (guest == NULL) { list_add(&(sock->sock_node), &global_sockets); } else { - list_add(&(sock->sock_node), &(guest->sockets)); + list_add(&(sock->sock_node), &(vm_state->socket_list)); } return sock; @@ -160,21 +185,27 @@ palacios_listen( return sock->sock->ops->listen(sock->sock, backlog); } -static void * -palacios_accept( - const void * sock_ptr, - unsigned int * remote_ip, - unsigned int * port -) -{ +static void * palacios_accept(const void * sock_ptr, unsigned int * remote_ip, unsigned int * port) { + struct palacios_socket * sock = (struct palacios_socket *)sock_ptr; struct palacios_socket * newsock = NULL; + struct vm_socket_state * vm_state = NULL; int err; if (sock == NULL) { return NULL; } + if (sock->guest != NULL) { + vm_state = get_vm_ext_data(sock->guest, "SOCKET_INTERFACE"); + + if (vm_state == NULL) { + printk("ERROR: Could not locate vm socket state for extension SOCKET_INTERFACE\n"); + return NULL; + } + } + + newsock = kmalloc(sizeof(struct palacios_socket), GFP_KERNEL); err = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &(newsock->sock)); @@ -202,7 +233,7 @@ palacios_accept( if (sock->guest == NULL) { list_add(&(newsock->sock_node), &global_sockets); } else { - list_add(&(newsock->sock_node), &(sock->guest->sockets)); + list_add(&(newsock->sock_node), &(vm_state->socket_list)); } return newsock; @@ -413,7 +444,7 @@ palacios_recvfrom_ip( return err; } -struct v3_socket_hooks palacios_sock_hooks = { +static struct v3_socket_hooks palacios_sock_hooks = { .tcp_socket = palacios_tcp_socket, .udp_socket = palacios_udp_socket, .close = palacios_close, @@ -431,15 +462,25 @@ struct v3_socket_hooks palacios_sock_hooks = { .recvfrom_ip = palacios_recvfrom_ip, }; -int palacios_socket_init( void ) { +static int socket_init( void ) { V3_Init_Sockets(&palacios_sock_hooks); INIT_LIST_HEAD(&global_sockets); return 0; } -void palacios_socket_deinit( void ) { +static int socket_deinit( void ) { if (!list_empty(&(global_sockets))) { printk("Error removing module with open sockets\n"); } } + +static struct linux_ext socket_ext = { + .name "SOCKET_INTERFACE", + .init = socket_init, + .deinit = socket_deinit, + .guest_init = NULL, + .guest_deinit = NULL +}; + +register_extension(&socket_ext); diff --git a/linux_module/palacios-socket.h b/linux_module/palacios-socket.h deleted file mode 100644 index 394802e..0000000 --- a/linux_module/palacios-socket.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Palacios VM Raw Packet interface - * (c) Lei Xia, 2010 - */ - -#ifndef __PALACIOS_SOCKET_H__ -#define __PALACIOS_SOCKET_H__ - -int palacios_socket_init(void); -int palacios_socket_deinit(void); - -#endif diff --git a/linux_module/palacios-vm.c b/linux_module/palacios-vm.c index 2d12374..8be10c9 100644 --- a/linux_module/palacios-vm.c +++ b/linux_module/palacios-vm.c @@ -249,9 +249,6 @@ int start_palacios_vm(void * arg) { return -1; } - // init linux extensions - - printk("Creating VM device: Major %d, Minor %d\n", MAJOR(guest->vm_dev), MINOR(guest->vm_dev)); diff --git a/linux_module/palacios.h b/linux_module/palacios.h index 7122a01..28207ec 100644 --- a/linux_module/palacios.h +++ b/linux_module/palacios.h @@ -67,9 +67,6 @@ struct v3_guest { struct rb_root vm_ctrls; struct list_head exts; - struct list_head streams; - struct list_head sockets; - #ifdef V3_CONFIG_GRAPHICS_CONSOLE struct palacios_graphics_console graphics_console;