Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


ported socket interface to extension framework
Jack Lange [Wed, 8 Jun 2011 20:43:33 +0000 (15:43 -0500)]
linux_module/palacios-dev.c
linux_module/palacios-socket.c
linux_module/palacios-socket.h [deleted file]
linux_module/palacios-vm.c
linux_module/palacios.h

index 3899a2c..829c461 100644 (file)
@@ -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
index 8d17d8f..9cf8236 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/list.h>
 
 #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 (file)
index 394802e..0000000
+++ /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
index 2d12374..8be10c9 100644 (file)
@@ -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));
 
index 7122a01..28207ec 100644 (file)
@@ -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;