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 39d18f0..3f85682 100644 (file)
@@ -57,13 +57,20 @@ palacios_tcp_socket(const int bufsize, const int nodelay,
     }
 
 
-    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;
     }
        
@@ -101,13 +108,19 @@ palacios_udp_socket(
     }
 
 
-    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);
     }
 }
 
@@ -193,12 +206,18 @@ static void * palacios_accept(const void * sock_ptr, unsigned int * remote_ip, u
     }
 
 
-    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;