Porting PicoTCP WIP

This commit is contained in:
2025-10-29 14:29:06 +01:00
parent 6722f42e68
commit 815c2239fe
464 changed files with 235009 additions and 24 deletions

View File

@ -0,0 +1,112 @@
#include <stdint.h>
#include <stddef.h>
#include "hal/hal.h"
#include "spinlock/spinlock.h"
#include "netsock.h"
#include "errors.h"
#include "pico_socket.h"
#include "dlmalloc/malloc.h"
#include "util/util.h"
#include "sysdefs/ipcnetsock.h"
#include "kprintf.h"
IpcNetSocks IPC_NETSOCKS;
void ipc_netsockinit(void) {
hal_memset(&IPC_NETSOCKS, 0, sizeof(IPC_NETSOCKS));
spinlock_init(&IPC_NETSOCKS.spinlock);
}
void ipc_netsock_event(uint16_t ev, struct pico_socket *sock1) {
IpcNetSock *netsock, *netsocktmp;
spinlock_acquire(&IPC_NETSOCKS.spinlock);
LL_FOREACH_SAFE(IPC_NETSOCKS.netsocks, netsock, netsocktmp) {
if (netsock->picosock == sock1)
break;
}
spinlock_release(&IPC_NETSOCKS.spinlock);
if (netsock == NULL) {
return;
}
spinlock_acquire(&netsock->spinlock);
/* if (ev & PICO_SOCK_EV_RD) { */
/* uint8_t *buf = dlmalloc(IPC_PIPE_MAX); */
/* int32_t len = 0; */
/* int32_t read; */
/* do { */
/* read = pico_socket_read(netsock->picosock, buf + len, IPC_PIPE_MAX - len); */
/* if (read > 0) { */
/* len += read; */
/* } */
/* } while(read > 0); */
/* ipc_pipewrite(netsock->datapipe, buf, len); */
/* dlfree(buf); */
/* } */
/* if (ev & PICO_SOCK_EV_WR) { */
/* uint8_t *buf = dlmalloc(IPC_PIPE_MAX); */
/* int32_t read = ipc_piperead(netsock->datapipe, buf, IPC_PIPE_MAX); */
/* if (read > 0) { */
/* pico_socket_write(netsock->picosock, buf, read); */
/* } */
/* dlfree(buf); */
/* } */
/* if (ev & PICO_SOCK_EV_FIN) { */
/* // normal close */
/* } */
/* if (ev & PICO_SOCK_EV_CLOSE) { */
/* pico_socket_shutdown(netsock->picosock, PICO_SHUT_WR); */
/* } */
rbuft_push(&netsock->eventbuffer, &ev);
spinlock_release(&netsock->spinlock);
}
IpcNetSock *ipc_netsockmake(uint16_t net, uint16_t proto, uint16_t port) {
IpcNetSock *netsock = dlmalloc(sizeof(*netsock));
if (netsock == NULL) {
return NULL;
}
netsock->picosock = pico_socket_open(net, proto, &ipc_netsock_event);
if (netsock->picosock == NULL) {
goto err_sock_open;
}
spinlock_init(&netsock->spinlock);
netsock->datapipe = dlmalloc(sizeof(*netsock->datapipe));
ipc_pipeinit(netsock->datapipe, (uint64_t)-1);
uint8_t *eventbuffer = dlmalloc(sizeof(IpcNetSockEventBuffer) * IPC_NETSOCK_EVENTBUFFER_MAX);
rbuft_init(&netsock->eventbuffer, eventbuffer, sizeof(IpcNetSockEventBuffer), IPC_NETSOCK_EVENTBUFFER_MAX);
uint16_t port_be = short_be(port);
struct pico_ip4 inaddr_any = {0};
pico_socket_bind(netsock->picosock, &inaddr_any, &port_be);
spinlock_acquire(&IPC_NETSOCKS.spinlock);
LL_APPEND(IPC_NETSOCKS.netsocks, netsock);
spinlock_release(&IPC_NETSOCKS.spinlock);
return netsock;
err_sock_open:
dlfree(netsock);
return NULL;
}
int32_t ipc_netsocklisten(IpcNetSock *netsock, size_t maxlisteners) {
spinlock_acquire(&netsock->spinlock);
int32_t r = pico_socket_listen(netsock->picosock, (int)maxlisteners);
spinlock_release(&netsock->spinlock);
return r == 0 ? E_OK : E_NETSOCKLISTEN;
}

View File

@ -0,0 +1,32 @@
#ifndef NETSOCK_NETSOCK_H_
#define NETSOCK_NETSOCK_H_
#include <stdbool.h>
#include "spinlock/spinlock.h"
#include "pico_socket.h"
#include "ipc/pipe/pipe.h"
#include "rbuf/rbuf.h"
typedef uint16_t IpcNetSockEventBuffer;
#define IPC_NETSOCK_EVENTBUFFER_MAX 512
typedef struct IpcNetSock {
struct IpcNetSock *next;
struct pico_socket *picosock;
IpcPipe *datapipe;
RBufT eventbuffer;
SpinLock spinlock;
} IpcNetSock;
typedef struct {
IpcNetSock *netsocks;
SpinLock spinlock;
} IpcNetSocks;
extern IpcNetSocks IPC_NETSOCKS;
void ipc_netsockinit(void);
IpcNetSock *ipc_netsockmake(uint16_t net, uint16_t proto, uint16_t port);
int32_t ipc_netsocklisten(IpcNetSock *netsock, size_t maxlisteners);
#endif // NETSOCK_NETSOCK_H_