From 2b6a8a501b1eabcfb205540610756f79c4751f8f Mon Sep 17 00:00:00 2001 From: Ulrich Mohr Date: Thu, 21 Sep 2023 18:02:13 +0200 Subject: [PATCH] WIP --- .gitmodules | 3 + CMakeLists.txt | 27 +++- bsp_z7/lwip/arch/cc.h | 23 +++ bsp_z7/lwip/lwipopts.h | 341 +++++++++++++++++++++++++++++++++++++++++ contrib/lwip | 1 + mission/CMakeLists.txt | 2 +- mission/main.cpp | 6 +- mission/testIp.cpp | 58 +++++++ 8 files changed, 458 insertions(+), 3 deletions(-) create mode 100644 bsp_z7/lwip/arch/cc.h create mode 100644 bsp_z7/lwip/lwipopts.h create mode 160000 contrib/lwip create mode 100644 mission/testIp.cpp diff --git a/.gitmodules b/.gitmodules index 492dd33..9879af9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "fsfw"] path = fsfw url = https://egit.irs.uni-stuttgart.de/fsfw/fsfw +[submodule "contrib/lwip"] + path = contrib/lwip + url = https://github.com/lwip-tcpip/lwip diff --git a/CMakeLists.txt b/CMakeLists.txt index 40bdc63..73607d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,9 @@ set(MISSION_PATH mission/) set(FreeRTOS_CONFIG_PATH bsp_z7/freeRTOS) set(BSP_PATH bsp_z7) +set (LWIP_DIR contrib/lwip) + + # ############################################################################## # Configuration # ############################################################################## @@ -37,6 +40,27 @@ set(BSP_PATH bsp_z7) # Add executable add_executable(${TARGET_NAME}) +# lwip +set (LWIP_INCLUDE_DIRS + "${LWIP_DIR}/src/include" + "${LWIP_DIR}/src/include/compat/posix" + "${LWIP_DIR}/contrib" + "${LWIP_DIR}/contrib/ports/freertos/include" + "${BSP_PATH}/lwip" +) +include(${LWIP_DIR}/src/Filelists.cmake) +set(lwip_SRCS + ${lwipcore_SRCS} + ${lwipcore4_SRCS} + ${lwipcore6_SRCS} + ${lwipapi_SRCS} + ${lwipnetif_SRCS} + ${LWIP_DIR}/src/netif/slipif.c + ${LWIP_DIR}/contrib/ports/freertos/sys_arch.c +) +add_library(lwip ${lwip_SRCS}) +target_include_directories(lwip PUBLIC ${LWIP_INCLUDE_DIRS}) + #target_compile_options(${TARGET_NAME} PUBLIC -g -O0 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard) # Add freeRTOS @@ -78,8 +102,9 @@ add_subdirectory(${MISSION_PATH}) # ############################################################################## # Add libraries for all sources. +target_link_libraries(lwip freertos_kernel) target_link_libraries(fsfw PUBLIC freertos_kernel) -target_link_libraries(${TARGET_NAME} PUBLIC fsfw) +target_link_libraries(${TARGET_NAME} PUBLIC fsfw lwip) target_include_directories( ${TARGET_NAME} PUBLIC ${BSP_PATH}) diff --git a/bsp_z7/lwip/arch/cc.h b/bsp_z7/lwip/arch/cc.h new file mode 100644 index 0000000..ed502c5 --- /dev/null +++ b/bsp_z7/lwip/arch/cc.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include + +#include "lwipopts.h" + +/** if you want to use the struct timeval provided + * by your system, set this to 0 and include in cc.h */ +#define LWIP_TIMEVAL_PRIVATE 0 +#include + +#define LWIP_ERRNO_INCLUDE + +#define LWIP_RAND rand + +#define PACK_STRUCT_FIELD(x) x +#define PACK_STRUCT_STRUCT __attribute__((packed)) +#define PACK_STRUCT_BEGIN +#define PACK_STRUCT_END + +#define LWIP_PLATFORM_ASSERT(x) +#define LWIP_PLATFORM_DIAG(x) do { printf x; } while(0) \ No newline at end of file diff --git a/bsp_z7/lwip/lwipopts.h b/bsp_z7/lwip/lwipopts.h new file mode 100644 index 0000000..9bfd5f9 --- /dev/null +++ b/bsp_z7/lwip/lwipopts.h @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#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 NO_SYS 0 +#define LWIP_SOCKET (NO_SYS==0) +#define LWIP_NETCONN (NO_SYS==0) +#define LWIP_NETIF_API (NO_SYS==0) + +#define LWIP_IGMP LWIP_IPV4 +#define LWIP_ICMP LWIP_IPV4 + +#define LWIP_SNMP LWIP_UDP +//#define MIB2_STATS LWIP_SNMP +#ifdef LWIP_HAVE_MBEDTLS +#define LWIP_SNMP_V3 (LWIP_SNMP) +#endif + +#define LWIP_DNS LWIP_UDP +#define LWIP_MDNS_RESPONDER LWIP_UDP + +#define LWIP_NUM_NETIF_CLIENT_DATA (LWIP_MDNS_RESPONDER) + +#define LWIP_HAVE_LOOPIF 1 +#define LWIP_NETIF_LOOPBACK 1 +#define LWIP_LOOPBACK_MAX_PBUFS 10 + +#define TCP_LISTEN_BACKLOG 1 + +#define LWIP_COMPAT_SOCKETS 1 +#define LWIP_SO_RCVTIMEO 1 +#define LWIP_SO_RCVBUF 1 + +#define LWIP_TCPIP_CORE_LOCKING 1 + +#define LWIP_NETIF_LINK_CALLBACK 1 +#define LWIP_NETIF_STATUS_CALLBACK 1 +#define LWIP_NETIF_EXT_STATUS_CALLBACK 1 + +#ifdef LWIP_DEBUG + +#define LWIP_DBG_MIN_LEVEL 0 +#define PPP_DEBUG LWIP_DBG_OFF +#define MEM_DEBUG LWIP_DBG_OFF +#define MEMP_DEBUG LWIP_DBG_OFF +#define PBUF_DEBUG LWIP_DBG_OFF +#define API_LIB_DEBUG LWIP_DBG_OFF +#define API_MSG_DEBUG LWIP_DBG_OFF +#define TCPIP_DEBUG LWIP_DBG_OFF +#define NETIF_DEBUG LWIP_DBG_OFF +#define SOCKETS_DEBUG LWIP_DBG_OFF +#define DNS_DEBUG LWIP_DBG_OFF +#define AUTOIP_DEBUG LWIP_DBG_OFF +#define DHCP_DEBUG LWIP_DBG_OFF +#define IP_DEBUG LWIP_DBG_OFF +#define IP_REASS_DEBUG LWIP_DBG_OFF +#define ICMP_DEBUG LWIP_DBG_OFF +#define IGMP_DEBUG LWIP_DBG_OFF +#define UDP_DEBUG LWIP_DBG_OFF +#define TCP_DEBUG LWIP_DBG_OFF +#define TCP_INPUT_DEBUG LWIP_DBG_OFF +#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +#define TCP_RTO_DEBUG LWIP_DBG_OFF +#define TCP_CWND_DEBUG LWIP_DBG_OFF +#define TCP_WND_DEBUG LWIP_DBG_OFF +#define TCP_FR_DEBUG LWIP_DBG_OFF +#define TCP_QLEN_DEBUG LWIP_DBG_OFF +#define TCP_RST_DEBUG LWIP_DBG_OFF +#endif + +#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT) + + +/* ---------- Memory options ---------- */ +/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which + lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 + byte alignment -> define MEM_ALIGNMENT to 2. */ +/* MSVC port: intel processors don't need 4-byte alignment, + but are faster that way! */ +#define MEM_ALIGNMENT 8U + +/* MEM_SIZE: the size of the heap memory. If the application will send +a lot of data that needs to be copied, this should be set high. */ +#define MEM_SIZE 10240 + +/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application + sends a lot of data out of ROM (or other static memory), this + should be set high. */ +#define MEMP_NUM_PBUF 16 +/* MEMP_NUM_RAW_PCB: the number of UDP protocol control blocks. One + per active RAW "connection". */ +#define MEMP_NUM_RAW_PCB 3 +/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One + per active UDP "connection". */ +#define MEMP_NUM_UDP_PCB 8 +/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP + connections. */ +#define MEMP_NUM_TCP_PCB 5 +/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP + connections. */ +#define MEMP_NUM_TCP_PCB_LISTEN 8 +/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP + segments. */ +#define MEMP_NUM_TCP_SEG 16 +/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active + timeouts. */ +#define MEMP_NUM_SYS_TIMEOUT 17 + +/* The following four are used only with the sequential API and can be + set to 0 if the application only will use the raw API. */ +/* MEMP_NUM_NETBUF: the number of struct netbufs. */ +#define MEMP_NUM_NETBUF 2 +/* MEMP_NUM_NETCONN: the number of struct netconns. */ +#define MEMP_NUM_NETCONN 12 +/* MEMP_NUM_TCPIP_MSG_*: the number of struct tcpip_msg, which is used + for sequential API communication and incoming packets. Used in + src/api/tcpip.c. */ +#define MEMP_NUM_TCPIP_MSG_API 16 +#define MEMP_NUM_TCPIP_MSG_INPKT 16 + +#define TCPIP_THREAD_STACKSIZE 1024 + +/* Enable all socket operations */ +#define LWIP_TCP_KEEPALIVE 1 +#define LWIP_SO_SNDTIMEO 1 +#define LWIP_SO_RCVTIMEO 1 +#define LWIP_SO_RCVBUF 1 +#define LWIP_SO_LINGER 1 +#define SO_REUSE 1 +#define LWIP_MULTICAST_TX_OPTIONS 1 + + +/* ---------- Pbuf options ---------- */ +/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ +#define PBUF_POOL_SIZE 120 + +/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */ +#define PBUF_POOL_BUFSIZE 256 + +/** SYS_LIGHTWEIGHT_PROT + * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection + * for certain critical regions during buffer allocation, deallocation and memory + * allocation and deallocation. + */ +#define SYS_LIGHTWEIGHT_PROT (NO_SYS==0) + + +/* ---------- TCP options ---------- */ +#define LWIP_TCP 0 +#define TCP_TTL 255 + +#define LWIP_ALTCP (LWIP_TCP) +#ifdef LWIP_HAVE_MBEDTLS +#define LWIP_ALTCP_TLS (LWIP_TCP) +#define LWIP_ALTCP_TLS_MBEDTLS (LWIP_TCP) +#endif + + +/* Controls if TCP should queue segments that arrive out of + order. Define to 0 if your device is low on memory. */ +#define TCP_QUEUE_OOSEQ 1 + +/* TCP Maximum segment size. */ +#define TCP_MSS 1024 + +/* TCP sender buffer space (bytes). */ +#define TCP_SND_BUF 2048 + +/* TCP sender buffer space (pbufs). This must be at least = 2 * + TCP_SND_BUF/TCP_MSS for things to work. */ +#define TCP_SND_QUEUELEN (4 * TCP_SND_BUF/TCP_MSS) + +/* TCP writable space (bytes). This must be less than or equal + to TCP_SND_BUF. It is the amount of space which must be + available in the tcp snd_buf for select to return writable */ +#define TCP_SNDLOWAT (TCP_SND_BUF/2) + +/* TCP receive window. */ +#define TCP_WND (20 * 1024) + +/* Maximum number of retransmissions of data segments. */ +#define TCP_MAXRTX 12 + +/* Maximum number of retransmissions of SYN segments. */ +#define TCP_SYNMAXRTX 4 + + +#define TCPIP_MBOX_SIZE 5 + +/* ---------- ARP options ---------- */ +#define LWIP_ARP 1 +#define ARP_TABLE_SIZE 10 +#define ARP_QUEUEING 1 +#define ARP_QUEUE_LEN 10 + + +/* ---------- IP options ---------- */ +/* Define IP_FORWARD to 1 if you wish to have the ability to forward + IP packets across network interfaces. If you are going to run lwIP + on a device with only one network interface, define this to 0. */ +#define IP_FORWARD 0 + +/* IP reassembly and segmentation.These are orthogonal even + * if they both deal with IP fragments */ +#define IP_REASSEMBLY 1 +#define IP_REASS_MAX_PBUFS (10 * ((1500 + PBUF_POOL_BUFSIZE - 1) / PBUF_POOL_BUFSIZE)) +#define MEMP_NUM_REASSDATA IP_REASS_MAX_PBUFS +#define IP_FRAG 1 +#define IPV6_FRAG_COPYHEADER 1 + +/* ---------- ICMP options ---------- */ +#define ICMP_TTL 255 + + +/* ---------- DHCP options ---------- */ +/* Define LWIP_DHCP to 1 if you want DHCP configuration of + interfaces. */ +#define LWIP_DHCP 0 + +/* 1 if you want to do an ARP check on the offered address + (recommended). */ +#define DHCP_DOES_ARP_CHECK (LWIP_DHCP) + + +/* ---------- AUTOIP options ------- */ +#define LWIP_AUTOIP (LWIP_DHCP) +#define LWIP_DHCP_AUTOIP_COOP (LWIP_DHCP && LWIP_AUTOIP) + + +/* ---------- UDP options ---------- */ +#define LWIP_UDP 1 +#define LWIP_UDPLITE LWIP_UDP +#define UDP_TTL 255 +#define DEFAULT_UDP_RECVMBOX_SIZE 4 + +/* ---------- RAW options ---------- */ +#define LWIP_RAW 1 +#define DEFAULT_TCP_RECVMBOX_SIZE 2 + +/* ---------- Statistics options ---------- */ + +#define LWIP_STATS 0 +#define LWIP_STATS_DISPLAY 0 + +#if LWIP_STATS +#define LINK_STATS 1 +#define IP_STATS 1 +#define ICMP_STATS 1 +#define IGMP_STATS 1 +#define IPFRAG_STATS 1 +#define UDP_STATS 1 +#define TCP_STATS 1 +#define MEM_STATS 1 +#define MEMP_STATS 1 +#define PBUF_STATS 1 +#define SYS_STATS 1 +#endif /* LWIP_STATS */ + +/* ---------- NETBIOS options ---------- */ +#define LWIP_NETBIOS_RESPOND_NAME_QUERY 1 + +/* ---------- PPP options ---------- */ + +#define PPP_SUPPORT 0 /* Set > 0 for PPP */ + +#if PPP_SUPPORT + +#define NUM_PPP 1 /* Max PPP sessions. */ + + +/* Select modules to enable. Ideally these would be set in the makefile but + * we're limited by the command line length so you need to modify the settings + * in this file. + */ +#define PPPOE_SUPPORT 1 +#define PPPOS_SUPPORT 1 + +#define PAP_SUPPORT 1 /* Set > 0 for PAP. */ +#define CHAP_SUPPORT 1 /* Set > 0 for CHAP. */ +#define MSCHAP_SUPPORT 0 /* Set > 0 for MSCHAP */ +#define CBCP_SUPPORT 0 /* Set > 0 for CBCP (NOT FUNCTIONAL!) */ +#define CCP_SUPPORT 0 /* Set > 0 for CCP */ +#define VJ_SUPPORT 0 /* Set > 0 for VJ header compression. */ +#define MD5_SUPPORT 1 /* Set > 0 for MD5 (see also CHAP) */ + +#endif /* PPP_SUPPORT */ + +#endif /* LWIP_OPTTEST_FILE */ + +/* The following defines must be done even in OPTTEST mode: */ + +#define LWIP_FREERTOS_CHECK_CORE_LOCKING 1 + + +void sys_check_core_locking(void); +#define LWIP_ASSERT_CORE_LOCKED() sys_check_core_locking() + +void sys_mark_tcpip_thread(void); +#define LWIP_MARK_TCPIP_THREAD() sys_mark_tcpip_thread() + +// Disable slip task +#define SLIP_USE_RX_THREAD 0 + +#endif /* LWIP_LWIPOPTS_H */ diff --git a/contrib/lwip b/contrib/lwip new file mode 160000 index 0000000..84fde1e --- /dev/null +++ b/contrib/lwip @@ -0,0 +1 @@ +Subproject commit 84fde1ebbfe35b3125fc2d89b8a456cbacf148e9 diff --git a/mission/CMakeLists.txt b/mission/CMakeLists.txt index fe377c2..d507b27 100644 --- a/mission/CMakeLists.txt +++ b/mission/CMakeLists.txt @@ -1 +1 @@ -target_sources(${TARGET_NAME} PRIVATE main.cpp controller/PrintController.cpp) \ No newline at end of file +target_sources(${TARGET_NAME} PRIVATE main.cpp testIp.cpp controller/PrintController.cpp) \ No newline at end of file diff --git a/mission/main.cpp b/mission/main.cpp index 21a45e6..96112b0 100644 --- a/mission/main.cpp +++ b/mission/main.cpp @@ -160,7 +160,7 @@ int main(void) { mission, /* The function that implements the task. */ "init", /* The text name assigned to the task - for debug only as it is not used by the kernel. */ - configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */ + 1024, /* The size of the stack to allocate to the task. */ &taskParameters, /* The parameter passed to the task - not used in this simple case. */ 1, /* The priority assigned to the task. */ nullptr); /* The task handle is not required, so NULL is passed. */ @@ -180,10 +180,14 @@ int main(void) { return 0; } +void testIp(); + void mission(void *){ printf("Starting Mission\n"); + testIp(); + sif::debug << "OStreams working" << std::endl; ObjectManager* objManager = ObjectManager::instance(); diff --git a/mission/testIp.cpp b/mission/testIp.cpp new file mode 100644 index 0000000..c330a63 --- /dev/null +++ b/mission/testIp.cpp @@ -0,0 +1,58 @@ +#include "lwip/sio.h" +#include +#include +#include +#include +#include +#include + +#include + +extern "C" { +void myInitDone(void *arg) { + puts("init done"); + + 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_INET6; + 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)); +} +} + +sio_fd_t sio_open(u8_t devnum) { return 0; } + +void sio_send(u8_t c, sio_fd_t fd) { XUartPs_SendByte(STDOUT_BASEADDRESS, c); } + +void testIp() { + struct netif netif; + + tcpip_init(myInitDone, nullptr); + + ip_addr_t slip_addr = IPADDR4_INIT_BYTES(10, 0, 0, 32), + slip_mask = IPADDR4_INIT_BYTES(255, 255, 255, 0), + slip_gw = IPADDR4_INIT_BYTES(255, 255, 255, 0); + + netif_add(&netif, &slip_addr.u_addr.ip4, &slip_mask.u_addr.ip4, + &slip_gw.u_addr.ip4, NULL, slipif_init, netif_input); + + netif_set_default(&netif); + netif_set_up(&netif); +} \ No newline at end of file