mbed first pass

This commit is contained in:
2026-04-19 16:22:00 -05:00
parent 4205899f5a
commit 9c71df5bfd
24 changed files with 2347 additions and 8 deletions
+1
View File
@@ -6,4 +6,5 @@
target_sources(${DUSK_LIBRARY_TARGET_NAME}
PUBLIC
networkdolphin.c
networksocketdolphin.c
)
@@ -0,0 +1,162 @@
/**
* Copyright (c) 2026 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "network/networksocket.h"
#include "assert/assert.h"
#include <network.h>
#include <netdb.h>
#include <string.h>
/** Poll timeout in microseconds — short enough to check the stop flag often. */
#define NETWORKSOCKET_DOLPHIN_RECV_TIMEOUT_US 100000
errorret_t networksocketDolphinInit(networksocket_t *socket) {
socket->platform.fd = -1;
errorOk();
}
errorret_t networksocketDolphinConnect(networksocket_t *nsocket) {
struct hostent *he;
struct sockaddr_in addr;
s32 fd;
s32 ret;
he = net_gethostbyname(nsocket->host);
if (!he) {
errorThrowState(
&nsocket->errorState,
"net_gethostbyname(%s) failed",
nsocket->host
);
}
fd = net_socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(fd == INVALID_SOCKET) {
errorThrowState(
&nsocket->errorState,
"net_socket failed with invalid socket"
);
} else if (fd < 0) {
errorThrowState(
&nsocket->errorState,
"net_socket failed: %d",
(int)fd
);
}
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(nsocket->port);
memcpy(&addr.sin_addr, he->h_addr_list[0], (size_t)he->h_length);
ret = net_connect(fd, (struct sockaddr *)&addr, sizeof(addr));
if (ret < 0) {
net_close(fd);
errorThrowState(
&nsocket->errorState,
"net_connect to %s:%u failed: %d",
nsocket->host,
(unsigned int)nsocket->port,
(int)ret
);
}
nsocket->platform.fd = fd;
errorOk();
}
errorret_t networksocketDolphinSend(
networksocket_t *socket,
const uint8_t *data,
size_t len
) {
size_t total = 0;
s32 sent;
while (total < len) {
sent = net_send(
socket->platform.fd,
(const void *)(data + total),
len - total,
0
);
if (sent <= 0) {
errorThrowState(
&socket->errorState,
"net_send failed: %d",
(int)sent
);
}
total += (size_t)sent;
}
errorOk();
}
errorret_t networksocketDolphinRecv(
networksocket_t *socket,
uint8_t *buf,
size_t maxLen,
size_t *outLen
) {
struct timeval tv;
fd_set readset;
s32 ready;
s32 received;
tv.tv_sec = 0;
tv.tv_usec = NETWORKSOCKET_DOLPHIN_RECV_TIMEOUT_US;
FD_ZERO(&readset);
FD_SET(socket->platform.fd, &readset);
ready = net_select(socket->platform.fd + 1, &readset, NULL, NULL, &tv);
if (ready < 0) {
errorThrowState(
&socket->errorState,
"net_select failed: %d",
(int)ready
);
}
if (ready == 0) {
*outLen = 0;
errorOk();
}
received = net_recv(socket->platform.fd, buf, maxLen, 0);
if (received < 0) {
errorThrowState(
&socket->errorState,
"net_recv failed: %d",
(int)received
);
}
if (received == 0) {
*outLen = NETWORKSOCKET_RECV_CLOSED;
errorOk();
}
*outLen = (size_t)received;
errorOk();
}
errorret_t networksocketDolphinDisconnect(networksocket_t *socket) {
if (socket->platform.fd >= 0) {
net_close(socket->platform.fd);
socket->platform.fd = -1;
}
errorOk();
}
errorret_t networksocketDolphinDispose(networksocket_t *socket) {
if (socket->platform.fd >= 0) {
net_close(socket->platform.fd);
socket->platform.fd = -1;
}
errorOk();
}
@@ -0,0 +1,58 @@
/**
* Copyright (c) 2026 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#pragma once
#include "dusk.h"
#include "error/error.h"
#include <network.h>
typedef struct networksocket_s networksocket_t;
typedef struct {
s32 fd;
} networksocketdolphin_t;
/**
* Initializes platform state (sets fd to -1).
*/
errorret_t networksocketDolphinInit(networksocket_t *socket);
/**
* Resolves host/port via net_gethostbyname and establishes a TCP connection.
*/
errorret_t networksocketDolphinConnect(networksocket_t *socket);
/**
* Writes all bytes in data to the socket. Loops on partial sends.
*/
errorret_t networksocketDolphinSend(
networksocket_t *socket,
const uint8_t *data,
size_t len
);
/**
* Polls for incoming data with a short timeout (via net_select) so the
* socket thread can periodically check its stop flag. Sets *outLen to bytes
* received, 0 on timeout, or NETWORKSOCKET_RECV_CLOSED when peer closed.
*/
errorret_t networksocketDolphinRecv(
networksocket_t *socket,
uint8_t *buf,
size_t maxLen,
size_t *outLen
);
/**
* Closes the socket file descriptor.
*/
errorret_t networksocketDolphinDisconnect(networksocket_t *socket);
/**
* Closes the file descriptor if still open (idempotent).
*/
errorret_t networksocketDolphinDispose(networksocket_t *socket);
@@ -0,0 +1,18 @@
/**
* Copyright (c) 2026 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#pragma once
#include "networksocketdolphin.h"
#define networksocketPlatformInit networksocketDolphinInit
#define networksocketPlatformConnect networksocketDolphinConnect
#define networksocketPlatformSend networksocketDolphinSend
#define networksocketPlatformRecv networksocketDolphinRecv
#define networksocketPlatformDisconnect networksocketDolphinDisconnect
#define networksocketPlatformDispose networksocketDolphinDispose
typedef networksocketdolphin_t networksocketplatform_t;