From 79752fb5e0d048f817a3e9a775b4815be6645cbf Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 10 Sep 2026 16:41:21 -0300 Subject: [PATCH] sock: pass protocol to sockets --- kernel-src/include/kernel/raw.h | 12 ++++++++++-- kernel-src/include/kernel/sock.h | 15 ++++++++------- kernel-src/io/net/localsocket.c | 16 ++++++++-------- kernel-src/io/net/socket.c | 7 ++++--- kernel-src/io/net/tcp.c | 2 +- kernel-src/io/net/udp.c | 2 +- kernel-src/sys/syscalls/accept.c | 2 +- kernel-src/sys/syscalls/socket.c | 2 +- kernel-src/sys/syscalls/socketpair.c | 4 ++-- 9 files changed, 36 insertions(+), 26 deletions(-) diff --git a/kernel-src/include/kernel/raw.h b/kernel-src/include/kernel/raw.h index 5f504521..3cb827f5 100644 --- a/kernel-src/include/kernel/raw.h +++ b/kernel-src/include/kernel/raw.h @@ -1,7 +1,15 @@ #ifndef _RAW_H #define _RAW_H -void raw_process(netdev_t *netdev, void *buffer, uint32_t peer); -socket_t *raw_create_socket(void); +typedef struct socket socket_t; + +typedef struct { + uint16_t netdev; // 1-based index that gets transformed into a minor number + uint16_t proto; + uint8_t mac[6]; +} raw_addr_t; + +void raw_process(netdev_t *netdev, void *buffer, mac_t *sender, uint16_t proto, size_t size); +socket_t *raw_create_socket(int protocol); #endif diff --git a/kernel-src/include/kernel/sock.h b/kernel-src/include/kernel/sock.h index 33bba570..2d438ec7 100644 --- a/kernel-src/include/kernel/sock.h +++ b/kernel-src/include/kernel/sock.h @@ -28,6 +28,7 @@ typedef struct { netdev_t *netdev; pollheader_t pollheader; int type; + int protocol; int shutdown; int error; bool nonblocking; @@ -363,13 +364,13 @@ static inline size_t sock_countctrl(sockctrl_t *ctrl, size_t len) { } void localsock_leavebinding(vnode_t *vnode); -int localsock_pair(socket_t **ret1, socket_t **ret2); -int localsock_pair_seqpacket(socket_t **ret1, socket_t **ret2); -socket_t *localsock_createsocket(void); -socket_t *localsock_create_seqpacket_socket(void); -socket_t *udp_createsocket(); -socket_t *tcp_createsocket(); -socket_t *socket_create(int type); +int localsock_pair(socket_t **ret1, socket_t **ret2, int protocol); +int localsock_pair_seqpacket(socket_t **ret1, socket_t **ret2, int protocol); +socket_t *localsock_createsocket(int protocol); +socket_t *localsock_create_seqpacket_socket(int protocol); +socket_t *udp_createsocket(int protocol); +socket_t *tcp_createsocket(int protocol); +socket_t *socket_create(int type, int protocol); int sockfs_newsocket(vnode_t **vnodep, socket_t *socket); void sockfs_init(); diff --git a/kernel-src/io/net/localsocket.c b/kernel-src/io/net/localsocket.c index 285511cd..9375d01c 100644 --- a/kernel-src/io/net/localsocket.c +++ b/kernel-src/io/net/localsocket.c @@ -1132,12 +1132,12 @@ void localsock_leavebinding(vnode_t *vnode) { vnode->socketbinding = NULL; } -int localsock_pair(socket_t **ret1, socket_t **ret2) { - socket_t *socket1 = socket_create(SOCKET_TYPE_LOCAL); +int localsock_pair(socket_t **ret1, socket_t **ret2, int protocol) { + socket_t *socket1 = socket_create(SOCKET_TYPE_LOCAL, protocol); if (socket1 == NULL) return ENOMEM; - socket_t *socket2 = socket_create(SOCKET_TYPE_LOCAL); + socket_t *socket2 = socket_create(SOCKET_TYPE_LOCAL, protocol); if (socket2 == NULL) { localsock_destroy(socket1); return ENOMEM; @@ -1168,8 +1168,8 @@ int localsock_pair(socket_t **ret1, socket_t **ret2) { return 0; } -int localsock_pair_seqpacket(socket_t **ret1, socket_t **ret2) { - int error = localsock_pair(ret1, ret2); +int localsock_pair_seqpacket(socket_t **ret1, socket_t **ret2, int protocol) { + int error = localsock_pair(ret1, ret2, protocol); if (error) return error; @@ -1421,7 +1421,7 @@ static socketops_t socketops = { .setopt = localsock_setopt }; -socket_t *localsock_createsocket(void) { +socket_t *localsock_createsocket(int protocol) { // XXX possibly move this to a slab? localsocket_t *socket = alloc(sizeof(localsocket_t)); if (socket == NULL) @@ -1444,8 +1444,8 @@ socket_t *localsock_createsocket(void) { return (socket_t *)socket; } -socket_t *localsock_create_seqpacket_socket(void) { - localsocket_t *localsocket = (localsocket_t *)localsock_createsocket(); +socket_t *localsock_create_seqpacket_socket(int protocol) { + localsocket_t *localsocket = (localsocket_t *)localsock_createsocket(protocol); if (localsocket == NULL) return NULL; diff --git a/kernel-src/io/net/socket.c b/kernel-src/io/net/socket.c index 13fca2e3..03372f10 100644 --- a/kernel-src/io/net/socket.c +++ b/kernel-src/io/net/socket.c @@ -2,7 +2,7 @@ #include #include -static socket_t *(*createsocket[])() = { +static socket_t *(*createsocket[])(int) = { udp_createsocket, localsock_createsocket, tcp_createsocket, @@ -10,9 +10,9 @@ static socket_t *(*createsocket[])() = { raw_create_socket }; -socket_t *socket_create(int type) { +socket_t *socket_create(int type, int protocol) { __assert(type < sizeof(createsocket) / sizeof(createsocket[0])); - socket_t *socket = createsocket[type](); + socket_t *socket = createsocket[type](protocol); if (socket == NULL) return NULL; @@ -20,6 +20,7 @@ socket_t *socket_create(int type) { socket->state = SOCKET_STATE_UNBOUND; MUTEX_INIT(&socket->mutex); socket->type = type; + socket->protocol = protocol; socket->nonblocking = false; return socket; diff --git a/kernel-src/io/net/tcp.c b/kernel-src/io/net/tcp.c index 42059634..cfb5d0c8 100644 --- a/kernel-src/io/net/tcp.c +++ b/kernel-src/io/net/tcp.c @@ -1973,7 +1973,7 @@ static socketops_t socketops = { .getopt = tcp_getopt }; -socket_t *tcp_createsocket() { +socket_t *tcp_createsocket(int protocol) { tcpsocket_t *socket = alloc(sizeof(tcpsocket_t)); if (socket == NULL) return NULL; diff --git a/kernel-src/io/net/udp.c b/kernel-src/io/net/udp.c index 73a22fcd..c5273ae0 100644 --- a/kernel-src/io/net/udp.c +++ b/kernel-src/io/net/udp.c @@ -382,7 +382,7 @@ static socketops_t socketops = { .connect = udp_connect }; -socket_t *udp_createsocket() { +socket_t *udp_createsocket(int protocol) { // XXX possibly move this to a slab? udpsocket_t *socket = alloc(sizeof(udpsocket_t)); if (socket == NULL) diff --git a/kernel-src/sys/syscalls/accept.c b/kernel-src/sys/syscalls/accept.c index 50480897..a6885017 100644 --- a/kernel-src/sys/syscalls/accept.c +++ b/kernel-src/sys/syscalls/accept.c @@ -28,7 +28,7 @@ syscallret_t syscall_accept(context_t *, int oldfd, abisockaddr_t *abisockaddr, goto cleanup; } - socket_t *client = socket_create(server->type); + socket_t *client = socket_create(server->type, server->protocol); if (client == NULL) { ret.errno = ENOMEM; goto cleanup; diff --git a/kernel-src/sys/syscalls/socket.c b/kernel-src/sys/syscalls/socket.c index 6848c75d..44812a7e 100644 --- a/kernel-src/sys/syscalls/socket.c +++ b/kernel-src/sys/syscalls/socket.c @@ -43,7 +43,7 @@ syscallret_t syscall_socket(context_t *, int domain, int type, int protocol) { return ret; } - socket_t *socket = socket_create(socktype); + socket_t *socket = socket_create(socktype, protocol); if (socket == NULL) { ret.errno = ENOMEM; return ret; diff --git a/kernel-src/sys/syscalls/socketpair.c b/kernel-src/sys/syscalls/socketpair.c index a90f923a..98f85937 100644 --- a/kernel-src/sys/syscalls/socketpair.c +++ b/kernel-src/sys/syscalls/socketpair.c @@ -37,9 +37,9 @@ syscallret_t syscall_socketpair(context_t *, int domain, int type, int protocol) // create pair if (type == SOCK_SEQPACKET) - ret.errno = localsock_pair_seqpacket(&sock1, &sock2); + ret.errno = localsock_pair_seqpacket(&sock1, &sock2, protocol); else - ret.errno = localsock_pair(&sock1, &sock2); + ret.errno = localsock_pair(&sock1, &sock2, protocol); if (ret.errno) return ret;