toaruos/contrib/netif/netif.c
2014-04-19 16:01:09 -07:00

185 lines
3.8 KiB
C

#include <module.h>
#include <printf.h>
#include <mod/shell.h>
#include "lwip/init.h"
#include "lwip/sys.h"
#include "lwip/opt.h"
#include "lwip/stats.h"
#include "lwip/ip.h"
#include "lwip/ip_frag.h"
#include "lwip/udp.h"
#include "lwip/dhcp.h"
#include "lwip/tcp_impl.h"
#include "netif/etharp.h"
int memcmp(const void *s1, const void *s2, size_t n) {
const uint8_t *b1 = (const uint8_t *)s1;
const uint8_t *b2 = (const uint8_t *)s2;
for (unsigned int i = 0; i < n; ++i) {
if (*b1 < *b2) return -1;
if (*b1 > *b2) return 1;
}
return 0;
}
uint32_t sys_now(void) {
unsigned long s, ss;
relative_time(0,0,&s,&ss);
return s * 1000 + ss * 10;
}
void * heap_external = NULL;
void sys_init(void) {
debug_print(NOTICE, "lwip sys_init() called");
heap_external = malloc(16000);
}
#if 1
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio) {
(void)stacksize;
(void)prio;
debug_print(WARNING, "lwip is creating thread [%s] point to 0x%x", name, thread);
int pid = create_kernel_tasklet((tasklet_t)thread, (char *)name, arg);
return (sys_thread_t)process_from_pid(pid);
}
struct sys_sem {
volatile uint8_t i;
};
err_t sys_sem_new(sys_sem_t *sem, u8_t count) {
sys_sem_t s = malloc(sizeof(struct sys_sem));
s->i = 0;
*sem = s;
return 0;
}
void sys_sem_free(sys_sem_t * sem) {
free(*sem);
}
void sys_sem_signal(sys_sem_t *sem) {
debug_print(NOTICE, "Unlocking sem 0x%x", *sem);
spin_unlock(&(*sem)->i);
}
u32_t sys_arch_sem_wait(sys_sem_t * sem, u32_t timeout) {
debug_print(NOTICE, "Waiting on sem 0x%x", *sem);
int i = now();
spin_lock(&(*sem)->i);
debug_print(NOTICE, "wait for sem 0x%x is done", *sem);
return (now() - i) * 1000;
}
struct sys_mbox {
volatile uint8_t i;
void * msg;
};
err_t sys_mbox_new(sys_mbox_t *mbox, int size) {
sys_mbox_t m = malloc(sizeof(struct sys_mbox));
m->i = 0;
m->msg = NULL;
*mbox = m;
return 0;
}
void sys_mbox_post(sys_mbox_t *mbox, void *msg) {
debug_print(NOTICE, "lwip post");
while (1) {
spin_lock(&(*mbox)->i);
if (!(*mbox)->msg) {
(*mbox)->msg = msg;
spin_unlock(&(*mbox)->i);
return;
}
spin_unlock(&(*mbox)->i);
}
}
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) {
debug_print(NOTICE, "lwip trypost");
spin_lock(&(*mbox)->i);
if ((*mbox)->msg) {
spin_unlock(&(*mbox)->i);
return 1;
}
(*mbox)->msg = msg;
spin_unlock(&(*mbox)->i);
return 0;
}
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) {
debug_print(NOTICE, "lwip fetch timeout=%d", timeout);
unsigned long ts, tss;
relative_time(0, 0, &ts, &tss);
unsigned long s, ss;
relative_time(0, timeout / 10, &s, &ss);
while (1) {
spin_lock(&(*mbox)->i);
if ((*mbox)->msg) {
*msg = (*mbox)->msg;
spin_unlock(&(*mbox)->i);
unsigned long _s, _ss;
relative_time(0, 0, &_s, &_ss);
return (_s - ts) * 1000 + (_ss - tss) * 10;
}
spin_unlock(&(*mbox)->i);
unsigned long _s, _ss;
relative_time(0, 0, &_s, &_ss);
if (_s > s || (_s == s && _ss > ss)) {
debug_print(NOTICE, "lwip fetch timed out");
return SYS_ARCH_TIMEOUT;
}
}
}
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) {
debug_print(NOTICE, "lwip tryfetch");
spin_lock(&(*mbox)->i);
if ((*mbox)->msg) {
*msg = (*mbox)->msg;
spin_unlock(&(*mbox)->i);
return 0;
}
spin_unlock(&(*mbox)->i);
return SYS_MBOX_EMPTY;
}
void sys_mbox_free(sys_mbox_t *mbox) {
free(*mbox);
}
#endif
DEFINE_SHELL_FUNCTION(netif_test, "networking stuff") {
fprintf(tty, "Initializing LWIP...\n");
lwip_init();
unsigned long s, ss;
relative_time(0, 200, &s, &ss);
sleep_until((process_t *)current_process, s, ss);
switch_task(0);
fprintf(tty, "LWIP is initialized\n");
return 0;
}
static int init(void) {
BIND_SHELL_FUNCTION(netif_test);
return 0;
}
static int fini(void) {
return 0;
}
MODULE_DEF(netif, init, fini);
MODULE_DEPENDS(debugshell);