X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fiface-socket.c;h=82fbe564ce59c5168eb3bc6f0e11c624122c46fe;hb=c511e8f97709ee70d678421902dc640bb7168ee6;hp=89b0f80138204393d6934286aeca34dfa7c19c4d;hpb=95908965b5963c53a40e9eae8ad0307a2bc27434;p=palacios.releases.git diff --git a/linux_module/iface-socket.c b/linux_module/iface-socket.c index 89b0f80..82fbe56 100644 --- a/linux_module/iface-socket.c +++ b/linux_module/iface-socket.c @@ -1,7 +1,7 @@ - /* - * Palacios Socket Interface Implementation - * (c) Lei Xia 2010 - */ +/* + * Palacios Socket Interface Implementation + * (c) Lei Xia 2010 + */ #include @@ -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; } @@ -457,7 +477,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;