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.


Linux kernel compatability enhancements (through 3.19)
[palacios.git] / linux_module / iface-socket.c
index 979558c..3f85682 100644 (file)
@@ -51,19 +51,26 @@ palacios_tcp_socket(const int bufsize, const int nodelay,
         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");
+            ERROR("ERROR: Could not locate vm socket state for extension SOCKET_INTERFACE\n");
             return NULL;
         }
     }
 
 
-    sock = kmalloc(sizeof(struct palacios_socket), GFP_KERNEL);
+    sock = palacios_alloc(sizeof(struct palacios_socket));
+    
+    if (!sock) { 
+       ERROR("Cannot allocate TCP socket\n");
+       return NULL;
+    }
+
     memset(sock, 0, sizeof(struct palacios_socket));
 
     err = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &(sock->sock));
 
     if (err < 0) {
-       kfree(sock);
+       ERROR("Cannot create TCP socket\n");
+       palacios_free(sock);
        return NULL;
     }
        
@@ -95,19 +102,25 @@ palacios_udp_socket(
         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");
+            ERROR("ERROR: Could not locate vm socket state for extension SOCKET_INTERFACE\n");
             return NULL;
         }
     }
 
 
-    sock = kmalloc(sizeof(struct palacios_socket), GFP_KERNEL);
+    sock = palacios_alloc(sizeof(struct palacios_socket));
+    if (!sock) { 
+       ERROR("Cannot allocate UDP socket\n");
+       return NULL;
+    }
+
     memset(sock, 0, sizeof(struct palacios_socket));
 
     err = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &(sock->sock)) ;
        
     if (err < 0){
-       kfree(sock);
+       ERROR("Cannot create UDP socket\n");
+       palacios_free(sock);
        return NULL;
     }
     
@@ -133,7 +146,7 @@ palacios_close(void * sock_ptr)
        sock->sock->ops->release(sock->sock);
        
        list_del(&(sock->sock_node));
-       kfree(sock);
+       palacios_free(sock);
     }
 }
 
@@ -187,18 +200,24 @@ static void * palacios_accept(const void * sock_ptr, unsigned int * remote_ip, u
         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");
+            ERROR("Could not locate vm socket state for extension SOCKET_INTERFACE\n");
             return NULL;
         }
     }
 
 
-    newsock = kmalloc(sizeof(struct palacios_socket), GFP_KERNEL);
+    newsock = palacios_alloc(sizeof(struct palacios_socket));
+
+    if (!newsock) { 
+       ERROR("Cannot allocate new socket on accept\n");
+       return NULL;
+    }
 
     err = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &(newsock->sock));
 
     if (err < 0) {
-       kfree(newsock);
+       ERROR("Cannot create new socket on accept\n");
+       palacios_free(newsock);
        return NULL;
     }
 
@@ -208,7 +227,8 @@ static void * palacios_accept(const void * sock_ptr, unsigned int * remote_ip, u
     err = newsock->sock->ops->accept(sock->sock, newsock->sock, 0);
 
     if (err < 0){
-       kfree(newsock);
+       ERROR("Cannot accept\n");
+       palacios_free(newsock);
        return NULL;
     }
 
@@ -281,8 +301,12 @@ palacios_send(
        msg.msg_namelen = 0;
        msg.msg_control = NULL;
        msg.msg_controllen = 0;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
        msg.msg_iov = &iov;
        msg.msg_iovlen = 1;
+#else
+       iov_iter_init(&(msg.msg_iter),WRITE,&iov,1,0);
+#endif
 
        iov.iov_base = (char *)buf;
        iov.iov_len = (size_t)len;
@@ -320,8 +344,12 @@ palacios_recv(
        msg.msg_namelen = 0;
        msg.msg_control = NULL;
        msg.msg_controllen = 0;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
        msg.msg_iov = &iov;
        msg.msg_iovlen = 1;
+#else
+       iov_iter_init(&(msg.msg_iter),READ,&iov,1,0);
+#endif
 
        iov.iov_base = (void *)&buf[0];
        iov.iov_len = (size_t)len;
@@ -365,8 +393,12 @@ palacios_sendto_ip(
        msg.msg_namelen = sizeof(struct sockaddr_in);
        msg.msg_control = NULL;
        msg.msg_controllen = 0;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
        msg.msg_iov = &iov;
        msg.msg_iovlen = 1;
+#else
+       iov_iter_init(&(msg.msg_iter),WRITE,&iov,1,0);
+#endif
 
        iov.iov_base = (char *)buf;
        iov.iov_len = (size_t)len;
@@ -394,7 +426,6 @@ palacios_recvfrom_ip(
 {
        struct palacios_socket * sock = (struct palacios_socket *)sock_ptr;
        struct sockaddr_in src;
-       int alen;
        struct msghdr msg;
        mm_segment_t oldfs;
        struct iovec iov;
@@ -407,7 +438,6 @@ palacios_recvfrom_ip(
        src.sin_family = AF_INET;
        src.sin_port = htons(port);
        src.sin_addr.s_addr = htonl(ip_addr);
-       alen = sizeof(src);
 
 
        msg.msg_flags = 0;
@@ -415,8 +445,12 @@ palacios_recvfrom_ip(
        msg.msg_namelen = sizeof(struct sockaddr_in);
        msg.msg_control = NULL;
        msg.msg_controllen = 0;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
        msg.msg_iov = &iov;
        msg.msg_iovlen = 1;
+#else
+       iov_iter_init(&(msg.msg_iter),READ,&iov,1,0);
+#endif
 
        iov.iov_base = (void *)&buf[0];
        iov.iov_len = (size_t)len;
@@ -457,7 +491,7 @@ static int socket_init( void ) {
 
 static int socket_deinit( void ) {
     if (!list_empty(&(global_sockets))) {
-       printk("Error removing module with open sockets\n");
+       ERROR("Error removing module with open sockets\n");
     }
 
     return 0;