This commit is contained in:
2024-08-29 14:48:16 +02:00
parent 8e7424bb2f
commit 5ad8853fef
5 changed files with 127 additions and 16 deletions

View File

@ -12,9 +12,10 @@
#include "hardware/interfaces.h"
#include <unistd.h>
struct lwip_sock *get_socket(int fd);
// Those three are a hack, but a quite performant one
struct lwip_sock *get_socket(int fd); // only works with a patched lwip
extern QueueHandle_t uart0_receive_queue;
extern QueueHandle_t uart1_receive_queue;
void udp_echo_thread(void *_) {
vTaskDelay(5000 * portTICK_RATE_MS);
@ -51,8 +52,8 @@ void udp_echo_thread(void *_) {
xil_printf("no addr");
}
int uart_sock = hw_device_open("uart0", 5);
write(uart_sock, "1234", 4);
int uart0_fd = hw_device_open("uart0", 5);
int uart1_fd = hw_device_open("uart1", 5);
// char buffer[] = {'1','2','3','4'};
// ret = sendto(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)
@ -73,6 +74,7 @@ void udp_echo_thread(void *_) {
xQueueAddToSet(queue_id, listening_set);
xQueueAddToSet(uart0_receive_queue, listening_set);
xQueueAddToSet(uart1_receive_queue, listening_set);
while (1) {
QueueSetMemberHandle_t readable =
@ -80,8 +82,8 @@ void udp_echo_thread(void *_) {
if (readable == queue_id) {
socklen_t peer_len = sizeof(peer_addr);
ret = lwip_recvfrom(sock, rec_buffer, sizeof(rec_buffer), 0, (struct sockaddr *) &peer_addr,
&peer_len);
ret = lwip_recvfrom(sock, rec_buffer, sizeof(rec_buffer), 0,
(struct sockaddr *)&peer_addr, &peer_len);
if (peer_len > sizeof(peer_addr)) {
xil_printf("invalid peer");
continue;
@ -93,14 +95,30 @@ void udp_echo_thread(void *_) {
switch (port) {
case 8100:
xil_printf("udp rec 8100 len: %i\n", ret);
write(uart_sock, rec_buffer, ret);
write(uart0_fd, rec_buffer, ret);
break;
case 8101:
xil_printf("udp rec 8101 len: %i\n", ret);
write(uart1_fd, rec_buffer, ret);
break;
default:
xil_printf("invalid port %i\n", port);
break;
}
} else if (readable == uart1_receive_queue) {
ret = read(uart1_fd, rec_buffer, sizeof(rec_buffer));
// Do not send empty packets
if (ret <= 0) {
continue;
}
xil_printf("uart got %i\n", ret);
peer_addr.sin_port = htons(8101);
// TODO sending 1 byte gives invalid UDP checksum
lwip_sendto(sock, rec_buffer, ret, 0, (struct sockaddr *)&peer_addr,
sizeof(peer_addr));
} else if (readable == uart0_receive_queue) {
ret = read(uart_sock, rec_buffer, sizeof(rec_buffer));
ret = read(uart0_fd, rec_buffer, sizeof(rec_buffer));
xil_printf("uart got %i\n", ret);
// Do not send empty packets
@ -109,9 +127,9 @@ void udp_echo_thread(void *_) {
}
peer_addr.sin_port = htons(8100);
//TODO sending 1 byte gives invalid UDP checksum
// TODO sending 1 byte gives invalid UDP checksum
lwip_sendto(sock, rec_buffer, ret, 0, (struct sockaddr *)&peer_addr,
sizeof(peer_addr));
sizeof(peer_addr));
} else {
xil_printf("invalid handle");
}