Porting PicoTCP WIP
This commit is contained in:
84
kernel/syscall/ipcnetsock.c
Normal file
84
kernel/syscall/ipcnetsock.c
Normal file
@ -0,0 +1,84 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include "syscall.h"
|
||||
#include "spinlock/spinlock.h"
|
||||
#include "ipc/netsock/netsock.h"
|
||||
#include "util/util.h"
|
||||
#include "errors.h"
|
||||
|
||||
int32_t SYSCALL3(sys_ipc_netsockmake, net1, proto1, port1) {
|
||||
uint16_t net = net1;
|
||||
uint16_t proto = proto1;
|
||||
uint16_t port = port1;
|
||||
|
||||
IpcNetSock *netsock = ipc_netsockmake(net, proto, port);
|
||||
|
||||
if (netsock == NULL) {
|
||||
return E_NOMEMORY;
|
||||
}
|
||||
|
||||
spinlock_acquire(&IPC_NETSOCKS.spinlock);
|
||||
size_t idx = 0;
|
||||
IpcNetSock *ns = NULL, *nstmp = NULL;
|
||||
LL_FOREACH_SAFE_IDX(IPC_NETSOCKS.netsocks, ns, nstmp, idx) {
|
||||
if (ns == netsock) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
spinlock_release(&IPC_NETSOCKS.spinlock);
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
int32_t SYSCALL2(sys_ipc_netsocklisten, socknum1, maxlisteners1) {
|
||||
size_t socknum = socknum1;
|
||||
size_t maxlisteners = maxlisteners1;
|
||||
|
||||
spinlock_acquire(&IPC_NETSOCKS.spinlock);
|
||||
size_t idx = 0;
|
||||
IpcNetSock *ns = NULL, *nstmp = NULL;
|
||||
LL_FOREACH_SAFE_IDX(IPC_NETSOCKS.netsocks, ns, nstmp, idx) {
|
||||
if (idx == socknum) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
spinlock_release(&IPC_NETSOCKS.spinlock);
|
||||
|
||||
if (ns == NULL) {
|
||||
return E_NOENTRY;
|
||||
}
|
||||
|
||||
return ipc_netsocklisten(ns, maxlisteners);
|
||||
}
|
||||
|
||||
int32_t SYSCALL1(sys_ipc_netsockpollev, socknum1) {
|
||||
size_t socknum = socknum1;
|
||||
|
||||
spinlock_acquire(&IPC_NETSOCKS.spinlock);
|
||||
size_t idx = 0;
|
||||
IpcNetSock *ns, *nstmp;
|
||||
LL_FOREACH_SAFE_IDX(IPC_NETSOCKS.netsocks, ns, nstmp, idx) {
|
||||
if (idx == socknum) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
spinlock_release(&IPC_NETSOCKS.spinlock);
|
||||
|
||||
if (ns == NULL) {
|
||||
return E_NOENTRY;
|
||||
}
|
||||
|
||||
spinlock_acquire(&ns->spinlock);
|
||||
|
||||
IpcNetSockEventBuffer ev;
|
||||
bool empty = false;
|
||||
rbuft_pop(&ns->eventbuffer, &ev, &empty);
|
||||
|
||||
spinlock_release(&ns->spinlock);
|
||||
|
||||
if (empty) {
|
||||
return E_NOTYET;
|
||||
}
|
||||
|
||||
return (int32_t)ev;
|
||||
}
|
||||
12
kernel/syscall/ipcnetsock.h
Normal file
12
kernel/syscall/ipcnetsock.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef SYSCALL_IPCNETSOCK_H_
|
||||
#define SYSCALL_IPCNETSOCK_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include "syscall.h"
|
||||
|
||||
int32_t SYSCALL3(sys_ipc_netsockmake, net1, proto1, port1);
|
||||
int32_t SYSCALL2(sys_ipc_netsocklisten, socknum1, maxlisteners1);
|
||||
int32_t SYSCALL1(sys_ipc_netsockpollev, socknum1);
|
||||
|
||||
#endif // SYSCALL_IPC_NETSOCK_H_
|
||||
@ -12,6 +12,7 @@
|
||||
#include "fs.h"
|
||||
#include "dev.h"
|
||||
#include "time.h"
|
||||
#include "ipcnetsock.h"
|
||||
|
||||
int32_t SYSCALL1(sys_debugprint, string) {
|
||||
char *p = (char *)string;
|
||||
@ -21,37 +22,50 @@ int32_t SYSCALL1(sys_debugprint, string) {
|
||||
|
||||
SyscallFn SYSCALL_TABLE[SYSCALLS_MAX] = {
|
||||
[SYS_DEBUGPRINT] = &sys_debugprint,
|
||||
|
||||
[SYS_MMAN_MAP] = &sys_mman_map,
|
||||
[SYS_MMAN_UNMAP] = &sys_mman_unmap,
|
||||
|
||||
[SYS_SCHEDRELEASE] = &sys_schedrelease,
|
||||
|
||||
[SYS_RAND] = &sys_rand,
|
||||
|
||||
[SYS_VFSMOUNT] = &sys_vfsmount,
|
||||
[SYS_VFSUNMOUNT] = &sys_vfsunmount,
|
||||
[SYS_IPC_PIPEREAD] = &sys_ipc_piperead,
|
||||
[SYS_IPC_PIPEWRITE] = &sys_ipc_pipewrite,
|
||||
[SYS_IPC_PIPEMAKE] = &sys_ipc_pipemake,
|
||||
|
||||
[SYS_IPC_PIPEREAD] = &sys_ipc_piperead,
|
||||
[SYS_IPC_PIPEWRITE] = &sys_ipc_pipewrite,
|
||||
[SYS_IPC_PIPEMAKE] = &sys_ipc_pipemake,
|
||||
[SYS_IPC_PIPEDELETE] = &sys_ipc_pipedelete,
|
||||
[SYS_IPC_PIPECONNECT] = &sys_ipc_pipeconnect,
|
||||
[SYS_PROC_KILL] = &sys_proc_kill,
|
||||
[SYS_PROC_SPAWN] = &sys_proc_spawn,
|
||||
|
||||
[SYS_PROC_KILL] = &sys_proc_kill,
|
||||
[SYS_PROC_SPAWN] = &sys_proc_spawn,
|
||||
[SYS_PROC_POLLSTATE] = &sys_proc_pollstate,
|
||||
[SYS_PROC_GETPID] = &sys_proc_getpid,
|
||||
[SYS_PROC_RUN] = &sys_proc_run,
|
||||
[SYS_PROC_ARGLEN] = &sys_proc_arglen,
|
||||
[SYS_PROC_ARGV] = &sys_proc_argv,
|
||||
[SYS_PROC_LISTSIZE] = &sys_proc_listsize,
|
||||
[SYS_PROC_STAT] = &sys_proc_stat,
|
||||
[SYS_FS_OPENF] = &sys_fs_openf,
|
||||
[SYS_FS_CLOSEF] = &sys_fs_closef,
|
||||
[SYS_FS_READ] = &sys_fs_read,
|
||||
[SYS_FS_WRITE] = &sys_fs_write,
|
||||
[SYS_FS_STAT] = &sys_fs_stat,
|
||||
[SYS_PROC_GETPID] = &sys_proc_getpid,
|
||||
[SYS_PROC_RUN] = &sys_proc_run,
|
||||
[SYS_PROC_ARGLEN] = &sys_proc_arglen,
|
||||
[SYS_PROC_ARGV] = &sys_proc_argv,
|
||||
[SYS_PROC_LISTSIZE] = &sys_proc_listsize,
|
||||
[SYS_PROC_STAT] = &sys_proc_stat,
|
||||
|
||||
[SYS_FS_OPENF] = &sys_fs_openf,
|
||||
[SYS_FS_CLOSEF] = &sys_fs_closef,
|
||||
[SYS_FS_READ] = &sys_fs_read,
|
||||
[SYS_FS_WRITE] = &sys_fs_write,
|
||||
[SYS_FS_STAT] = &sys_fs_stat,
|
||||
[SYS_FS_FETCHDIRENT] = &sys_fs_fetchdirent,
|
||||
[SYS_FS_MKDIR] = &sys_fs_mkdir,
|
||||
[SYS_FS_DELETE] = &sys_fs_delete,
|
||||
[SYS_FS_MKDIR] = &sys_fs_mkdir,
|
||||
[SYS_FS_DELETE] = &sys_fs_delete,
|
||||
|
||||
[SYS_DEV_GETHANDLE] = &sys_dev_gethandle,
|
||||
[SYS_DEV_LISTSIZE] = &sys_dev_listsize,
|
||||
[SYS_DEV_STAT] = &sys_dev_stat,
|
||||
[SYS_DEV_CMD] = &sys_dev_cmd,
|
||||
|
||||
[SYS_TIME] = &sys_time,
|
||||
|
||||
[SYS_IPC_NETSOCKMAKE] = &sys_ipc_netsockmake,
|
||||
[SYS_IPC_NETSOCKLISTEN] = &sys_ipc_netsocklisten,
|
||||
[SYS_IPC_NETSOCKPOLLEV] = &sys_ipc_netsockpollev,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user