lwip without any alloc and sending and receiving UDP via slip

This commit is contained in:
Ulrich Mohr 2023-11-03 17:08:26 +01:00
parent 450eeede33
commit 701d3dca7f
3 changed files with 49 additions and 35 deletions

View File

@ -32,12 +32,8 @@
#ifndef LWIP_LWIPOPTS_H
#define LWIP_LWIPOPTS_H
#ifdef LWIP_OPTTEST_FILE
#include "lwipopts_test.h"
#else /* LWIP_OPTTEST_FILE */
#define LWIP_IPV4 1
#define LWIP_IPV6 1
#define LWIP_IPV6 0
#define NO_SYS 1
#define LWIP_SOCKET (NO_SYS==0)
@ -74,7 +70,7 @@
#define LWIP_NETIF_STATUS_CALLBACK 1
#define LWIP_NETIF_EXT_STATUS_CALLBACK 1
#define LWIP_DEBUG
//#define LWIP_DEBUG
#ifdef LWIP_DEBUG
@ -320,8 +316,6 @@ a lot of data that needs to be copied, this should be set high. */
#endif /* PPP_SUPPORT */
#endif /* LWIP_OPTTEST_FILE */
// Disable slip task
#define SLIP_USE_RX_THREAD 0

View File

@ -6,7 +6,7 @@ target_sources(${TARGET_NAME} PUBLIC
src/asm_vectors.S
src/open.c
src/xil_exception.c
src/sbrk.c
#src/sbrk.c
src/xl2cc_counter.c
src/xil_cache.c
src/xil_spinlock.c
@ -48,5 +48,5 @@ target_sources(${TARGET_NAME} PUBLIC
src/outbyte.c
src/unlink.c
src/abort.c
src/_sbrk.c
#src/_sbrk.c
)

View File

@ -2,6 +2,7 @@
#include "lwip/init.h"
#include "lwip/sio.h"
#include "lwip/timeouts.h"
#include "lwip/udp.h"
#include "queue.h"
#include "task.h"
@ -83,13 +84,42 @@ void handleUARTInt(void *) {
/* Clear the interrupt status. */
XUartPs_WriteReg(STDIN_BASEADDRESS, XUARTPS_ISR_OFFSET, IsrStatus);
/* directly yield if sending to the queue woke something in ourselves */
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
static struct udp_pcb *udpecho_raw_pcb;
static void
udpecho_raw_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
const ip_addr_t *addr, u16_t port)
{
LWIP_UNUSED_ARG(arg);
if (p != NULL) {
/* send received packet back to sender */
udp_sendto(upcb, p, addr, port);
/* free the pbuf */
pbuf_free(p);
}
}
uint8_t data[] = {'1','2','3','4','5'};
void lwip_main(void *) {
struct pbuf* tx = pbuf_alloc_reference(data, sizeof(data), PBUF_REF);
ip_addr_t addr = IPADDR4_INIT_BYTES(10,0,0,13);
udp_sendto(udpecho_raw_pcb, tx, &addr, 1177);
pbuf_free(tx);
while (1) {
// slipif_rxbyte_input() is private, so we use slipif_poll and implement
// sio_tryread()
// sio_tryread() will do a blocking read with a timeout, so we get to check
// the timeouts even if no data is incoming
slipif_poll(&netif);
sys_check_timeouts();
}
@ -116,7 +146,9 @@ u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len) {
}
}
#ifdef LWIP_DEBUG
const char *lwip_strerr(err_t err) { return "Dafuq i know? I am a NOSYS"; }
#endif
u32_t sys_now(void) { return xTaskGetTickCount() * portTICK_PERIOD_MS; }
@ -147,7 +179,19 @@ void testIp() {
netif_set_link_up(&netif);
netif_set_up(&netif);
vTaskDelay(pdMS_TO_TICKS(2000));
udpecho_raw_pcb = udp_new_ip_type(IPADDR_TYPE_ANY);
if (udpecho_raw_pcb != NULL) {
err_t err;
err = udp_bind(udpecho_raw_pcb, IP_ANY_TYPE, 7);
if (err == ERR_OK) {
udp_recv(udpecho_raw_pcb, udpecho_raw_recv, NULL);
} else {
/* TODO */
}
} else {
/* TODO */
}
/* Install the UART Interrupt handler. */
BaseType_t xStatus =
@ -183,28 +227,4 @@ void testIp() {
simple case. */
4, /* The priority assigned to the task. */
xStack, &xTaskBuffer);
// puts("socket");
// int serverSocket = socket(AF_INET, SOCK_DGRAM, 0);
// if (serverSocket == -1) {
// puts("socket failed");
// return;
// }
// sockaddr_in serverAddr;
// memset(&serverAddr, 0, sizeof(serverAddr));
// serverAddr.sin_family = AF_INET;
// serverAddr.sin_port = htons(0xcafe);
// serverAddr.sin_addr.s_addr = inet_addr("10.0.0.13");
// uint8_t data[] = {1, 2, 3, 4, 5, 6, 7};
// puts("send");
// sendto(serverSocket, data, sizeof(data), 0, (sockaddr *)&serverAddr,
// sizeof(serverAddr));
// puts("send done");
}