From ef3c976cc0028a636bdb99a81716257454d0898b Mon Sep 17 00:00:00 2001 From: "root (spook.local)" Date: Sun, 20 Mar 2011 17:26:19 +0200 Subject: [PATCH] raw: Extract sock_list in a file --- src/raw/Makefile | 4 +- src/raw/swift_list.c | 146 +++++++++++++++++++++++++++++++++++++++++++ src/raw/swift_list.h | 66 +++++++++++++++++++ src/raw/swift_raw.c | 143 +----------------------------------------- 4 files changed, 216 insertions(+), 143 deletions(-) create mode 100644 src/raw/swift_list.c create mode 100644 src/raw/swift_list.h diff --git a/src/raw/Makefile b/src/raw/Makefile index dfc61d0..7454f60 100644 --- a/src/raw/Makefile +++ b/src/raw/Makefile @@ -4,12 +4,14 @@ CFLAGS = -Wall -g all: swift_raw_simple_test -swift_raw_simple_test: swift_raw_simple_test.o swift_raw.o +swift_raw_simple_test: swift_raw_simple_test.o swift_raw.o swift_list.o swift_raw_simple_test.o: swift_raw_simple_test.c swift_raw.h util.h swift_raw.o: swift_raw.c swift_raw.h +swift_list.o: swift_list.c swift_list.h + clean: -rm -f *~ -rm -f *.o diff --git a/src/raw/swift_list.c b/src/raw/swift_list.c new file mode 100644 index 0000000..c177366 --- /dev/null +++ b/src/raw/swift_list.c @@ -0,0 +1,146 @@ +/* + * swift implementation of syscall API + * + * Simulates the classic socket syscalls (socket, bind, send, recv). + * Implementation uses raw sockets (AF_INET, SOCK_RAW). + * + * Subsequently, implementation is to be ported into kernel space and + * the interface is going to be offered by the Linux syscall API. + * + * Heavily inspired by GLIBC's + * (/usr/include/sys/socket.h). + * + * 2011, Razvan Deaconescu, razvan.deaconescu@cs.pub.ro + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "swift_types.h" +#include "swift_list.h" +/* + * Add new socket to list. Called by sw_socket "syscall". + */ + +struct sock_list *list_add_socket(int s) +{ + struct sock_list *ptr = malloc(sizeof(*ptr)); + if (ptr == NULL) + return NULL; + + ptr->next = &sock_list_head; + ptr->prev = sock_list_head.prev; + sock_list_head.prev->next = ptr; + sock_list_head.prev = ptr; + ptr->s = s; + + return ptr; +} + +/* + * Bind socket to given address. Called by sw_bind "syscall". + */ + +struct sock_list *list_update_socket_address(int s, __CONST_SOCKADDR_ARG addr) +{ + struct sock_list *ptr; + + for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) + if (ptr->s == s) { + memcpy(&ptr->addr, addr, sizeof(ptr->addr)); + return ptr; + } + + return NULL; +} + +/* + * Get list element containing socket s. Called by sw_send* "syscalls". + */ + +struct sock_list *list_elem_from_socket(int s) +{ + struct sock_list *ptr; + + for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) + if (ptr->s == s) + return ptr; + + return NULL; +} + +/* + * Get list element containing address addr. Called by sw_bind "syscall". + */ + +struct sock_list *list_elem_from_address(__CONST_SOCKADDR_ARG addr) +{ + struct sock_list *ptr; + + for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) { + if (ptr->bind_state == STATE_NOTBOUND) + continue; + if (memcmp(&ptr->addr, addr, sizeof(addr)) == 0) + return ptr; + } + + return NULL; +} + +/* + * Unlink socket from list. Called by list_remove_socket. + */ +static struct sock_list *list_unlink_socket(int s) +{ + struct sock_list *ptr; + + for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) + if (ptr->s == s) { + ptr->next->prev = ptr->prev; + ptr->prev->next = ptr->next; + ptr->next = ptr; + ptr->prev = ptr; + return ptr; + } + + return NULL; +} + +/* + * Remove socket from list. Called by sw_close "syscall". + */ + +int list_remove_socket(int s) +{ + struct sock_list *ptr; + + ptr = list_unlink_socket(s); + if (ptr == NULL) + return -1; + + free(ptr); + return 0; +} + +/* + * Check if a socket is bound. + */ +int list_socket_is_bound(int s) +{ + struct sock_list *ptr; + + for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) + if (ptr->s == s) { + if (ptr->bind_state == STATE_BOUND) + return 1; + break; + } + + return 0; +} diff --git a/src/raw/swift_list.h b/src/raw/swift_list.h new file mode 100644 index 0000000..c6da104 --- /dev/null +++ b/src/raw/swift_list.h @@ -0,0 +1,66 @@ +#ifndef __SOCK_LIST + +#define __SOCK_LIST + +enum sock_rw_state { + STATE_NO_SHUT, + STATE_SHUT_RD, + STATE_SHUT_WR, + STATE_SHUT_RDWR +}; + +enum sock_bind_state { + STATE_NOTBOUND, + STATE_BOUND +}; + +/* socket management structure */ +struct sock_list { + int s; + struct sockaddr_sw addr; + enum sock_rw_state rw_state; + enum sock_bind_state bind_state; + struct sock_list *next; + struct sock_list *prev; +}; + +static struct sock_list sock_list_head = { + .next = &sock_list_head, + .prev = &sock_list_head +}; + +/* + * Add new socket to list. Called by sw_socket "syscall". + */ +struct sock_list *list_add_socket(int s); + +/* + * Bind socket to given address. Called by sw_bind "syscall". + */ + +struct sock_list *list_update_socket_address(int s, __CONST_SOCKADDR_ARG addr); + +/* + * Get list element containing socket s. Called by sw_send* "syscalls". + */ + +struct sock_list *list_elem_from_socket(int s); + +/* + * Get list element containing address addr. Called by sw_bind "syscall". + */ + +struct sock_list *list_elem_from_address(__CONST_SOCKADDR_ARG addr); + +/* + * Remove socket from list. Called by sw_close "syscall". + */ + +int list_remove_socket(int s); + +/* + * Check if a socket is bound. + */ +int list_socket_is_bound(int s); + +#endif diff --git a/src/raw/swift_raw.c b/src/raw/swift_raw.c index 55510a2..def68bb 100644 --- a/src/raw/swift_raw.c +++ b/src/raw/swift_raw.c @@ -24,148 +24,7 @@ #include "swift_types.h" #include "swift_raw.h" - -enum sock_rw_state { - STATE_NO_SHUT, - STATE_SHUT_RD, - STATE_SHUT_WR, - STATE_SHUT_RDWR -}; - -enum sock_bind_state { - STATE_NOTBOUND, - STATE_BOUND -}; - -/* socket management structure */ -struct sock_list { - int s; - struct sockaddr_sw addr; - enum sock_rw_state rw_state; - enum sock_bind_state bind_state; - struct sock_list *next; - struct sock_list *prev; -}; - -static struct sock_list sock_list_head = { - .next = &sock_list_head, - .prev = &sock_list_head -}; - -/* - * Add new socket to list. Called by sw_socket "syscall". - */ - -static struct sock_list *list_add_socket(int s) -{ - struct sock_list *ptr = malloc(sizeof(*ptr)); - if (ptr == NULL) - return NULL; - - ptr->next = &sock_list_head; - ptr->prev = sock_list_head.prev; - sock_list_head.prev->next = ptr; - sock_list_head.prev = ptr; - ptr->s = s; - - return ptr; -} - -/* - * Bind socket to given address. Called by sw_bind "syscall". - */ - -static struct sock_list *list_update_socket_address(int s, __CONST_SOCKADDR_ARG addr) -{ - struct sock_list *ptr; - - for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) - if (ptr->s == s) { - memcpy(&ptr->addr, addr, sizeof(ptr->addr)); - return ptr; - } - - return NULL; -} - -/* - * Get list element containing socket s. Called by sw_send* "syscalls". - */ - -static struct sock_list *list_elem_from_socket(int s) -{ - struct sock_list *ptr; - - for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) - if (ptr->s == s) - return ptr; - - return NULL; -} - -/* - * Get list element containing address addr. Called by sw_bind "syscall". - */ - -static struct sock_list *list_elem_from_address(__CONST_SOCKADDR_ARG addr) -{ - struct sock_list *ptr; - - for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) { - if (ptr->bind_state == STATE_NOTBOUND) - continue; - if (memcmp(&ptr->addr, addr, sizeof(addr)) == 0) - return ptr; - } - - return NULL; -} - -static struct sock_list *list_unlink_socket(int s) -{ - struct sock_list *ptr; - - for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) - if (ptr->s == s) { - ptr->next->prev = ptr->prev; - ptr->prev->next = ptr->next; - ptr->next = ptr; - ptr->prev = ptr; - return ptr; - } - - return NULL; -} - -/* - * Remove socket from list. Called by sw_close "syscall". - */ - -static int list_remove_socket(int s) -{ - struct sock_list *ptr; - - ptr = list_unlink_socket(s); - if (ptr == NULL) - return -1; - - free(ptr); - return 0; -} - -static int list_socket_is_bound(int s) -{ - struct sock_list *ptr; - - for (ptr = sock_list_head.next; ptr != &sock_list_head; ptr = ptr->next) - if (ptr->s == s) { - if (ptr->bind_state == STATE_BOUND) - return 1; - break; - } - - return 0; -} +#include "swift_list.h" /* * Create a new socket of type TYPE in domain DOMAIN, using -- 2.20.1