From fdec47121e5d3997c3ee40d6d42ee9762ac42391 Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Fri, 31 Jan 2020 20:29:32 +0900 Subject: [PATCH] Implement several of the syscalls of the socket interface --- kernel/core/cxnet.c | 121 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 111 insertions(+), 10 deletions(-) diff --git a/kernel/core/cxnet.c b/kernel/core/cxnet.c index 36ab322..e352c19 100644 --- a/kernel/core/cxnet.c +++ b/kernel/core/cxnet.c @@ -10,6 +10,7 @@ #include #include "socket.h" #include +#include int sys_socket(int domain, int type, int protocol) { @@ -62,32 +63,132 @@ int sys_close(int procfd) return(ret_val); } -int sys_sendto(int sockfd, const void *buf, size_t len, int flags, +int sys_sendto(int procfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) { - return(-ENOSYS); + process_t *cproc; + int sockfd; + int ret_val; + + cproc = process_get_current(); + ret_val = -EFAULT; + + if(cproc) { + sockfd = process_flookup(cproc, procfd); + + if(sockfd < 0) { + ret_val = sockfd; + } else { +#if 0 + struct mbuf *m; + + m = mbuf_alloc(); + + if(m) { + /* FIXME: implement sosend() function and call it from here */ + ret_val = -ENOSYS; + } else { + ret_val = -ENOMEM; + } +#endif + } + } + + return(ret_val); } -int sys_recvfrom(int sockfd, void *buf, size_t len, int flags, +int sys_recvfrom(int procfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen) { - return(-ENOSYS); + process_t *cproc; + int sockfd; + int ret_val; + + cproc = process_get_current(); + ret_val = -EFAULT; + + if(cproc) { + sockfd = process_flookup(cproc, procfd); + + if(sockfd < 0) { + ret_val = sockfd; + } else { + /* FIXME: Implement sorecv() function and call it from here */ + ret_val = -ENOSYS; + } + } + + return(ret_val); } -int sys_connect(int sockfd, const struct sockaddr *addr, +int sys_connect(int procfd, const struct sockaddr *addr, socklen_t addrlen) { - return(-ENOSYS); + process_t *cproc; + int sockfd; + int ret_val; + + cproc = process_get_current(); + ret_val = -EFAULT; + + if(cproc) { + sockfd = process_flookup(cproc, procfd); + + if(sockfd < 0) { + ret_val = sockfd; + } else { + /* FIXME: Implement soconnect() */ + ret_val = -ENOSYS; + } + } + + return(ret_val); } -int sys_listen(int sockfd, int backlog) +int sys_listen(int procfd, int backlog) { - return(-ENOSYS); + process_t *cproc; + int sockfd; + int ret_val; + + cproc = process_get_current(); + ret_val = -EFAULT; + + if(cproc) { + sockfd = process_flookup(cproc, procfd); + + if(sockfd < 0) { + ret_val = sockfd; + } else { + /* FIXME: Implement solisten() */ + ret_val = -ENOSYS; + } + } + + return(ret_val); } -int sys_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) +int sys_accept(int procfd, struct sockaddr *addr, socklen_t *addrlen) { - return(-ENOSYS); + process_t *cproc; + int sockfd; + int ret_val; + + cproc = process_get_current(); + ret_val = -EFAULT; + + if(cproc) { + sockfd = process_flookup(cproc, procfd); + + if(sockfd < 0) { + ret_val = sockfd; + } else { + /* FIXME: Implement soaccept() */ + ret_val = -ENOSYS; + } + } + + return(ret_val); } int sys_setsockopt(int procfd, int level, int optname, -- 2.47.3