1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-27 01:56:14 +01:00

Compare commits

..

No commits in common. "1235c288dc795cedd433bca3abd2842556a6aefe" and "9a6e1707e7f7b51c7f0c09ba977d0ab4ef6f6b0c" have entirely different histories.

6 changed files with 291 additions and 181 deletions

View File

@ -1,70 +1,16 @@
/*
* © 2024 Harald Barth
* All rights reserved.
*
* This file is part of CommandStation-EX
*
* This is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* It is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CommandStation. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Arduino.h> #include <Arduino.h>
#include "EthernetInterface.h" #include "EthernetInterface.h"
#ifdef DO_MDNS
#include "EXmDNS.h" #include "EXmDNS.h"
#include "DIAG.h"
// fixed values for mDNS
static IPAddress mdnsMulticastIPAddr = IPAddress(224, 0, 0, 251); static IPAddress mdnsMulticastIPAddr = IPAddress(224, 0, 0, 251);
#define MDNS_SERVER_PORT 5353 #define MDNS_SERVER_PORT 5353
// dotToLen()
// converts stings of form ".foo.barbar.x" to a string with the
// dots replaced with lenght. So string above would result in
// "\x03foo\x06barbar\x01x" in C notation. If not NULL, *substr
// will point to the beginning of the last component, in this
// example that would be "\x01x".
//
static void dotToLen(char *str, char **substr) {
char *dotplace = NULL;
char *s;
byte charcount = 0;
for (s = str;/*see break*/ ; s++) {
if (*s == '.' || *s == '\0') {
// take care of accumulated
if (dotplace != NULL && charcount != 0) {
*dotplace = charcount;
}
if (*s == '\0')
break;
if (substr && *s == '.')
*substr = s;
// set new values
dotplace = s;
charcount = 0;
} else {
charcount++;
}
}
}
MDNS::MDNS(EthernetUDP& udp) { MDNS::MDNS(EthernetUDP& udp) {
_udp = &udp; _udp = &udp;
} }
MDNS::~MDNS() { MDNS::~MDNS() {
_udp->stop(); _udp->stop();
if (_name) free(_name);
if (_serviceName) free(_serviceName);
if (_serviceProto) free(_serviceProto);
} }
int MDNS::begin(const IPAddress& ip, char* name) { int MDNS::begin(const IPAddress& ip, char* name) {
// if we were called very soon after the board was booted, we need to give the // if we were called very soon after the board was booted, we need to give the
@ -75,53 +21,56 @@ int MDNS::begin(const IPAddress& ip, char* name) {
// delay(100); // delay(100);
_ipAddress = ip; _ipAddress = ip;
_name = (char *)malloc(strlen(name +2)); _name = name;
byte n;
for(n = 0; n<strlen(name); n++)
_name[n+1] = name[n];
_name[n+1] = '\0';
_name[0] = '.';
dotToLen(_name, NULL);
return _udp->beginMulticast(mdnsMulticastIPAddr, MDNS_SERVER_PORT); return _udp->beginMulticast(mdnsMulticastIPAddr, MDNS_SERVER_PORT);
} }
int MDNS::addServiceRecord(const char* name, uint16_t port, MDNSServiceProtocol_t proto) { int MDNS::addServiceRecord(const char* name, uint16_t port, MDNSServiceProtocol_t proto) {
// we ignore proto, assume TCP // we ignore proto, assume TCP
_serviceName = (char *)malloc(strlen(name +2)); _serviceName = (char *)malloc(strlen(name +2));
DIAG("name %d %s", strlen(name), name);
byte n; byte n;
for(n = 0; n<strlen(name); n++) for(n = 0; n<strlen(name); n++)
_serviceName[n+1] = name[n]; _serviceName[n+1] = name[n];
_serviceName[n+1] = '\0'; _serviceName[n+1] = '\0';
_serviceName[0] = '.'; //strcpy(&_serviceName[1], name);
_serviceProto = NULL; //to be filled in _serviceName[0] = (byte)strlen(name);
dotToLen(_serviceName, &_serviceProto); DIAG("sn %d", *_serviceName);
_servicePort = port; _servicePort = port;
DIAG("Sevicename %d %s", strlen(_serviceName), _serviceName);
return 1; return 1;
} }
static char dns_rr_services[] = "\x09_services\x07_dns-sd\x04_udp\x05local"; static char dns_rr_services[] = "\x09_services\x07_dns-sd\x04_udp\x05local";
static char dns_rr_tcplocal[] = "\x04_tcp\x05local"; static char dns_rr_withrottle[] = "\x0b_withrottle\x04_tcp\x05local";
static char *dns_rr_tcplocal = dns_rr_withrottle + dns_rr_withrottle[0] + 1; // jump over first record
static char *dns_rr_local = dns_rr_tcplocal + dns_rr_tcplocal[0] + 1; static char *dns_rr_local = dns_rr_tcplocal + dns_rr_tcplocal[0] + 1;
typedef struct _DNSHeader_t typedef struct _DNSHeader_t
{ {
uint16_t xid; uint16_t xid;
uint16_t flags; // flags condensed uint16_t flags;
/*
uint8_t recursionDesired : 1;
uint8_t truncated : 1;
uint8_t authoritiveAnswer : 1;
uint8_t opCode : 4;
uint8_t queryResponse : 1;
uint8_t responseCode : 4;
uint8_t checkingDisabled : 1;
uint8_t authenticatedData : 1;
uint8_t zReserved : 1;
uint8_t recursionAvailable : 1;
*/
uint16_t queryCount; uint16_t queryCount;
uint16_t answerCount; uint16_t answerCount;
uint16_t authorityCount; uint16_t authorityCount;
uint16_t additionalCount; uint16_t additionalCount;
} __attribute__((__packed__)) DNSHeader_t; } __attribute__((__packed__)) DNSHeader_t;
//
// MDNS::run()
// This broadcasts whatever we got evey BROADCASTTIME seconds.
// Why? Too much brokenness i all mDNS implementations available
//
void MDNS::run() { void MDNS::run() {
static long int lastrun = BROADCASTTIME * 1000UL; static long int lastrun = 10000;
unsigned long int now = millis(); unsigned long int now = millis();
if (!(now - lastrun > BROADCASTTIME * 1000UL)) { if (!(now - lastrun > 10000)) {
return; return;
} }
lastrun = now; lastrun = now;
@ -131,39 +80,33 @@ void MDNS::run() {
// dns header // dns header
dnsHeader.flags = lwip_htons(0x8400); // Response, authorative dnsHeader.flags = lwip_htons(0x8400); // Response, authorative
dnsHeader.answerCount = lwip_htons(4 /*5 if TXT but we do not do that */); dnsHeader.answerCount = lwip_htons(4 /*5*/);
_udp->write((uint8_t*)&dnsHeader, sizeof(DNSHeader_t)); _udp->write((uint8_t*)&dnsHeader, sizeof(DNSHeader_t));
// rr #1
// rr #1, the PTR record from generic _services.x.local to service.x.local
_udp->write((uint8_t*)dns_rr_services, sizeof(dns_rr_services)); _udp->write((uint8_t*)dns_rr_services, sizeof(dns_rr_services));
byte buf[10]; byte buf[10];
buf[0] = 0x00; buf[0] = 0x00;
buf[1] = 0x0c; //PTR buf[1] = 0x0c; //PTR
buf[2] = 0x00; buf[2] = 0x00;
buf[3] = 0x01; //IN buf[3] = 0x01; //IN
*((uint32_t*)(buf+4)) = lwip_htonl(120); //TTL in sec *((uint32_t*)(buf+4)) = lwip_htonl(120); //TTL in sec
*((uint16_t*)(buf+8)) = lwip_htons( _serviceProto[0] + 1 + strlen(dns_rr_tcplocal) + 1); *((uint16_t*)(buf+8)) = lwip_htons(sizeof(dns_rr_withrottle));
_udp->write(buf, 10);
_udp->write(dns_rr_withrottle, sizeof(dns_rr_withrottle));
// rr #2
_udp->write(dns_rr_withrottle, sizeof(dns_rr_withrottle));
*((uint16_t*)(buf+8)) = lwip_htons(strlen(_serviceName) + sizeof(dns_rr_withrottle)); // recycle most of buf
_udp->write(buf, 10); _udp->write(buf, 10);
_udp->write(_serviceProto,_serviceProto[0]+1); _udp->write(_serviceName, _serviceName[0]+1);
_udp->write(dns_rr_tcplocal, strlen(dns_rr_tcplocal)+1); _udp->write(dns_rr_withrottle, sizeof(dns_rr_withrottle));
// rr #3
// rr #2, the PTR record from proto.x to name.proto.x _udp->write(_serviceName, _serviceName[0]+1);
_udp->write(_serviceProto,_serviceProto[0]+1); _udp->write(dns_rr_withrottle, sizeof(dns_rr_withrottle));
_udp->write(dns_rr_tcplocal, strlen(dns_rr_tcplocal)+1);
*((uint16_t*)(buf+8)) = lwip_htons(strlen(_serviceName) + strlen(dns_rr_tcplocal) + 1); // recycle most of buf
_udp->write(buf, 10);
_udp->write(_serviceName, strlen(_serviceName));
_udp->write(dns_rr_tcplocal, strlen(dns_rr_tcplocal)+1);
// rr #3, the SRV record for the service that points to local name
_udp->write(_serviceName, strlen(_serviceName));
_udp->write(dns_rr_tcplocal, strlen(dns_rr_tcplocal)+1);
buf[1] = 0x21; // recycle most of buf but here SRV buf[1] = 0x21; // recycle most of buf but here SRV
buf[2] = 0x80; // cache flush buf[2] = 0x80; // cache flush
*((uint16_t*)(buf+8)) = lwip_htons(strlen(_name) + strlen(dns_rr_local) + 1 + 6); *((uint16_t*)(buf+8)) = lwip_htons(strlen(_serviceName) + strlen(dns_rr_local) + 1 + 6);
_udp->write(buf, 10); _udp->write(buf, 10);
byte srv[6]; byte srv[6];
@ -173,11 +116,11 @@ void MDNS::run() {
*((uint16_t*)(srv+4)) = lwip_htons(_servicePort); *((uint16_t*)(srv+4)) = lwip_htons(_servicePort);
_udp->write(srv, 6); _udp->write(srv, 6);
// target // target
_udp->write(_name, _name[0]+1); _udp->write(_serviceName, _serviceName[0]+1);
_udp->write(dns_rr_local, strlen(dns_rr_local)+1); _udp->write(dns_rr_local, strlen(dns_rr_local)+1);
// rr #4, the A record for the name.local // rr #4
_udp->write(_name, _name[0]+1); _udp->write(_serviceName, _serviceName[0]+1);
_udp->write(dns_rr_local, strlen(dns_rr_local)+1); _udp->write(dns_rr_local, strlen(dns_rr_local)+1);
buf[1] = 0x01; // recycle most of buf but here A buf[1] = 0x01; // recycle most of buf but here A
@ -194,4 +137,3 @@ void MDNS::run() {
_udp->flush(); _udp->flush();
// //
} }
#endif //DO_MDNS

View File

@ -1,25 +1,3 @@
/*
* © 2024 Harald Barth
* All rights reserved.
*
* This file is part of CommandStation-EX
*
* This is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* It is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CommandStation. If not, see <https://www.gnu.org/licenses/>.
*/
#ifdef DO_MDNS
#define BROADCASTTIME 15 //seconds
typedef enum _MDNSServiceProtocol_t typedef enum _MDNSServiceProtocol_t
{ {
MDNSServiceTCP, MDNSServiceTCP,
@ -38,7 +16,5 @@ private:
IPAddress _ipAddress; IPAddress _ipAddress;
char* _name; char* _name;
char* _serviceName; char* _serviceName;
char* _serviceProto;
int _servicePort; int _servicePort;
}; };
#endif //DO_MDNS

View File

@ -32,10 +32,25 @@
#include "WiThrottle.h" #include "WiThrottle.h"
#include "DCCTimer.h" #include "DCCTimer.h"
#ifdef DO_MDNS
#include "EXmDNS.h" #include "EXmDNS.h"
#define DO_MDNS
EthernetUDP udp; EthernetUDP udp;
MDNS mdns(udp); MDNS mdns(udp);
#if 0 //#if __has_include ( "MDNS_Generic.h")
#include "MDNS_Generic.h"
#define DO_MDNS
EthernetUDP udp;
MDNS mdns(udp);
void serviceFound(const char* type, MDNSServiceProtocol /*proto*/, const char* name, IPAddress ip,
unsigned short port, const char* txtContent)
{
if (name == NULL) {
DIAG("End service discovery of %s", type);
return;
}
DIAG("Got %s of type %s", name, type);
}
#endif #endif
//extern void looptimer(unsigned long timeout, const FSH* message); //extern void looptimer(unsigned long timeout, const FSH* message);
@ -115,10 +130,11 @@ void EthernetInterface::setup()
outboundRing=new RingStream(OUTBOUND_RING_SIZE); outboundRing=new RingStream(OUTBOUND_RING_SIZE);
#ifdef DO_MDNS #ifdef DO_MDNS
if (!mdns.begin(Ethernet.localIP(), (char *)WIFI_HOSTNAME)) if (!mdns.begin(Ethernet.localIP(), WIFI_HOSTNAME))
DIAG("mdns.begin fail"); // hostname DIAG("mdns.begin fail"); // hostname
mdns.addServiceRecord(WIFI_HOSTNAME "._withrottle", IP_PORT, MDNSServiceTCP); mdns.addServiceRecord(WIFI_HOSTNAME, IP_PORT, MDNSServiceTCP);
mdns.run(); // run it right away to get out info ASAP // Not sure if we need to run it once, but just in case!
mdns.run();
#endif #endif
connected=true; connected=true;
} }

View File

@ -31,16 +31,13 @@
#define EthernetInterface_h #define EthernetInterface_h
#include "defines.h" #include "defines.h"
#if ETHERNET_ON == true
#include "DCCEXParser.h" #include "DCCEXParser.h"
#include <Arduino.h> #include <Arduino.h>
//#include <avr/pgmspace.h> //#include <avr/pgmspace.h>
#if defined (ARDUINO_TEENSY41) #if defined (ARDUINO_TEENSY41)
#include <NativeEthernet.h> //TEENSY Ethernet Treiber #include <NativeEthernet.h> //TEENSY Ethernet Treiber
#include <NativeEthernetUdp.h> #include <NativeEthernetUdp.h>
#ifndef MAX_SOCK_NUM
#define MAX_SOCK_NUM 4 #define MAX_SOCK_NUM 4
#endif
#elif defined (ARDUINO_NUCLEO_F429ZI) || defined (ARDUINO_NUCLEO_F439ZI) || defined (ARDUINO_NUCLEO_F4X9ZI) #elif defined (ARDUINO_NUCLEO_F429ZI) || defined (ARDUINO_NUCLEO_F439ZI) || defined (ARDUINO_NUCLEO_F4X9ZI)
#include <LwIP.h> #include <LwIP.h>
// #include "STM32lwipopts.h" // #include "STM32lwipopts.h"
@ -49,7 +46,6 @@
extern "C" struct netif gnetif; extern "C" struct netif gnetif;
#define STM32_ETHERNET #define STM32_ETHERNET
#define MAX_SOCK_NUM MAX_NUM_TCP_CLIENTS #define MAX_SOCK_NUM MAX_NUM_TCP_CLIENTS
#define DO_MDNS
#else #else
#include "Ethernet.h" #include "Ethernet.h"
#endif #endif
@ -81,5 +77,5 @@ class EthernetInterface {
static void dropClient(byte socketnum); static void dropClient(byte socketnum);
}; };
#endif // ETHERNET_ON
#endif #endif

View File

@ -1,89 +1,265 @@
/* /**
* © 2024 Harald Barth ******************************************************************************
* All rights reserved. * @file STM32lwipopts_default.h
* @author MCD Application Team
* @brief lwIP Options Configuration.
******************************************************************************
* @attention
* *
* This file is part of CommandStation-EX * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics International N.V.
* All rights reserved.</center></h2>
* *
* This is free software: you can redistribute it and/or modify * This software component is licensed by ST under Ultimate Liberty license
* it under the terms of the GNU General Public License as published by * SLA0044, the "License"; You may not use this file except in compliance with
* the Free Software Foundation, either version 3 of the License, or * the License. You may obtain a copy of the License at:
* (at your option) any later version. * www.st.com/SLA0044
* *
* It is distributed in the hope that it will be useful, ******************************************************************************
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CommandStation. If not, see <https://www.gnu.org/licenses/>.
*/ */
//
// Rewrite of the STM32lwipopts.h file from STM
// To be copied into where lwipopts_default.h resides
//
#ifndef __STM32LWIPOPTS_H__ #ifndef __STM32LWIPOPTS_H__
#define __STM32LWIPOPTS_H__ #define __STM32LWIPOPTS_H__
// include this here and then override things we do differnet // we can not include that here so we
#include "lwipopts_default.h" // need to duplicate that.define
// #include "defines.h"
// we can not include our "defines.h" here
// so we need to duplicate that define
#define MAX_NUM_TCP_CLIENTS 20 #define MAX_NUM_TCP_CLIENTS 20
// increase ARP cache // increase ARP cache
#undef MEMP_NUM_APR_QUEUE
#define MEMP_NUM_ARP_QUEUE MAX_NUM_TCP_CLIENTS+3 // one for each client (all on different HW) and a few extra #define MEMP_NUM_ARP_QUEUE MAX_NUM_TCP_CLIENTS+3 // one for each client (all on different HW) and a few extra
// Example for debug // Example for debug
//#define LWIP_DEBUG 1 //#define LWIP_DEBUG 1
//#define TCP_DEBUG LWIP_DBG_ON //#define TCP_DEBUG LWIP_DBG_ON
// IMPORTANT CHANGE THE FIRST ONE /**
#undef MEM_LIBC_MALLOC * NO_SYS==1: Provides VERY minimal functionality. Otherwise,
* use lwIP facilities.
*/
#define NO_SYS 1
/**
* SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
* critical regions during buffer allocation, deallocation and memory
* allocation and deallocation.
*/
#define SYS_LIGHTWEIGHT_PROT 0
#define LWIP_NOASSERT
/* ---------- 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. */
#define MEM_ALIGNMENT 4
/* 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 (10*1024)
// Could be better or worse, needs more tests
#define MEM_LIBC_MALLOC 1 // critical, fixes heap trashing #define MEM_LIBC_MALLOC 1 // critical, fixes heap trashing
#undef MEMP_MEM_MALLOC
#define MEMP_MEM_MALLOC 1 // uses malloc which means no pools which means slower but not mean 32KB up front #define MEMP_MEM_MALLOC 1 // uses malloc which means no pools which means slower but not mean 32KB up front
#undef MEMP_NUM_TCP_PCB /* 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 10
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
per active UDP "connection". */
#define MEMP_NUM_UDP_PCB 6
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
connections. */
#define MEMP_NUM_TCP_PCB MAX_NUM_TCP_CLIENTS+1 // one extra so we can reject number N+1 from our code #define MEMP_NUM_TCP_PCB MAX_NUM_TCP_CLIENTS+1 // one extra so we can reject number N+1 from our code
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
connections. */
#define MEMP_NUM_TCP_PCB_LISTEN 6 #define MEMP_NUM_TCP_PCB_LISTEN 6
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
#undef MEMP_NUM_TCP_SEG segments. */
#define MEMP_NUM_TCP_SEG MAX_NUM_TCP_CLIENTS #define MEMP_NUM_TCP_SEG MAX_NUM_TCP_CLIENTS
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
#undef MEMP_NUM_SYS_TIMEOUT timeouts. */
#define MEMP_NUM_SYS_TIMEOUT MAX_NUM_TCP_CLIENTS+2 #define MEMP_NUM_SYS_TIMEOUT MAX_NUM_TCP_CLIENTS+2
#undef PBUF_POOL_SIZE
/* ---------- Pbuf options ---------- */
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
#define PBUF_POOL_SIZE MAX_NUM_TCP_CLIENTS #define PBUF_POOL_SIZE MAX_NUM_TCP_CLIENTS
#undef LWIO_ICMP /* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
#define PBUF_POOL_BUFSIZE 1524
/* ---------- TCP options ---------- */
#define LWIP_TCP 1
#define TCP_TTL 255
#define LWIP_SO_RCVTIMEO 1
#define LWIP_SO_RCVRCVTIMEO_NONSTANDARD 1 /* Pass an integer number of ms instead of a timeval struct. */
#define LWIP_SO_SNDTIMEO 1
#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 1 /* Pass an integer number of ms instead of a timeval struct. */
/* Controls if TCP should queue segments that arrive out of
order. Define to 0 if your device is low on memory and you are not scared by TCP congestion and latencies. */
#define TCP_QUEUE_OOSEQ 0
/* TCP Maximum segment size. */
#define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */
/* TCP sender buffer space (bytes). */
#define TCP_SND_BUF (4*TCP_MSS)
/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */
#define TCP_SND_QUEUELEN (2* TCP_SND_BUF/TCP_MSS)
/* TCP receive window. */
#define TCP_WND (3*TCP_MSS)
#define LWIP_TCP_KEEPALIVE 1 /* Keep the TCP link active. Important for MQTT/TLS */
#define LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS 1 /* Prevent the same port to be used after reset.
Otherwise, the remote host may be confused if the port was not explicitly closed before the reset. */
/* ---------- ICMP options ---------- */
#define LWIP_ICMP 1 #define LWIP_ICMP 1
#undef LWIP_RAW
#define LWIP_RAW 1 /* PING changed to 1 */ #define LWIP_RAW 1 /* PING changed to 1 */
#undef DEFAULT_RAW_RECVMBOX_SIZE
#define DEFAULT_RAW_RECVMBOX_SIZE 3 /* for ICMP PING */ #define DEFAULT_RAW_RECVMBOX_SIZE 3 /* for ICMP PING */
#undef LWIP_DHCP
/* ---------- DHCP options ---------- */
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
turning this on does currently not work. */
#define LWIP_DHCP 1 #define LWIP_DHCP 1
#undef LWIP_UDP
/* ---------- UDP options ---------- */
#define LWIP_UDP 1 #define LWIP_UDP 1
#define UDP_TTL 255
/* ---------- Statistics options ---------- */
#define LWIP_STATS 0
#define LWIP_PROVIDE_ERRNO
/* ---------- link callback options ---------- */
/* LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface
* whenever the link changes (i.e., link down)
*/
// need for building net_ip.c
#define LWIP_NETIF_HOSTNAME 1
#define LWIP_NETIF_STATUS_CALLBACK 1
#define LWIP_NETIF_LINK_CALLBACK 1
#define LWIP_DHCP_CHECK_LINK_UP 1
/*
--------------------------------------
---------- Checksum options ----------
--------------------------------------
*/
/* /*
The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums by hardware: The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums by hardware:
- To use this feature let the following define uncommented. - To use this feature let the following define uncommented.
- To disable it and process by CPU comment the the checksum. - To disable it and process by CPU comment the the checksum.
*/ */
#define CHECKSUM_BY_HARDWARE
#if CHECKSUM_GEN_TCP == 1
#error On STM32 TCP checksum should be in HW #ifdef CHECKSUM_BY_HARDWARE
/* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/
#define CHECKSUM_GEN_IP 0
/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/
#define CHECKSUM_GEN_UDP 0
/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/
#define CHECKSUM_GEN_TCP 0
/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/
#define CHECKSUM_CHECK_IP 0
/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/
#define CHECKSUM_CHECK_UDP 0
/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/
#define CHECKSUM_CHECK_TCP 0
/* CHECKSUM_CHECK_ICMP==0: Check checksums by hardware for incoming ICMP packets.*/
#define CHECKSUM_GEN_ICMP 0
#else
/* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/
#define CHECKSUM_GEN_IP 1
/* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/
#define CHECKSUM_GEN_UDP 1
/* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/
#define CHECKSUM_GEN_TCP 1
/* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/
#define CHECKSUM_CHECK_IP 1
/* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/
#define CHECKSUM_CHECK_UDP 1
/* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/
#define CHECKSUM_CHECK_TCP 1
/* CHECKSUM_CHECK_ICMP==1: Check checksums by hardware for incoming ICMP packets.*/
#define CHECKSUM_GEN_ICMP 1
#endif #endif
#undef LWIP_IGMP
#define LWIP_IGMP 1
//#define SO_REUSE 1 /*
//#define SO_REUSE_RXTOALL 1 ----------------------------------------------
---------- Sequential layer options ----------
----------------------------------------------
*/
/**
* LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)
*/
#define LWIP_NETCONN 0
/*
------------------------------------
---------- Socket options ----------
------------------------------------
*/
/**
* LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)
*/
#define LWIP_SOCKET 0
#define LWIP_DNS 1
/*
------------------------------------
---------- httpd options ----------
------------------------------------
*/
/** Set this to 1 to support CGI */
#define LWIP_HTTPD_CGI 1
/** Set this to 1 to support SSI (Server-Side-Includes) */
#define LWIP_HTTPD_SSI 1
/** Set this to 1 to include "fsdata_custom.c" instead of "fsdata.c" for the
* file system (to prevent changing the file included in CVS) */
#define HTTPD_USE_CUSTOM_FSDATA 1
/*
------------------------------------
---------- Custom options ----------
------------------------------------
*/
/** Enables the Ethernet peripheral in RMII mode. If not defined, MII mode will
be enabled. Pin mapping must be configured for the selected mode
(see PinMap_Ethernet in PeripheralPins.c). */
#define ETHERNET_RMII_MODE_CONFIGURATION 1
/** Uncomment this line to use the ethernet input in interrupt mode.
* NOTE: LwIP stack documentation recommends to use the polling mode without
* an operating system. */
//#define ETH_INPUT_USE_IT 1
// We don't need this as we do not need to respond - we only announce
//#define LWIP_MDNS_RESPONDER 1
//#define LWIP_NUM_NETIF_CLIENT_DATA 1 // MDNS needs at least one
#define LWIP_IGMP 1
#define SO_REUSE 1
#define SO_REUSE_RXTOALL 1
#warning testing this
#endif /* __STM32LWIPOPTS_H__ */ #endif /* __STM32LWIPOPTS_H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

View File

@ -104,6 +104,7 @@ lib_deps =
${env.lib_deps} ${env.lib_deps}
arduino-libraries/Ethernet arduino-libraries/Ethernet
SPI SPI
MDNS_Generic
lib_ignore = WiFi101 lib_ignore = WiFi101
WiFi101_Generic WiFi101_Generic
@ -122,6 +123,7 @@ framework = arduino
lib_deps = lib_deps =
${env.lib_deps} ${env.lib_deps}
arduino-libraries/Ethernet arduino-libraries/Ethernet
MDNS_Generic
SPI SPI
lib_ignore = WiFi101 lib_ignore = WiFi101
WiFi101_Generic WiFi101_Generic
@ -276,6 +278,7 @@ framework = arduino
lib_deps = ${env.lib_deps} lib_deps = ${env.lib_deps}
stm32duino/STM32Ethernet @ ^1.4.0 stm32duino/STM32Ethernet @ ^1.4.0
stm32duino/STM32duino LwIP @ ^2.1.3 stm32duino/STM32duino LwIP @ ^2.1.3
MDNS_Generic
lib_ignore = WiFi101 lib_ignore = WiFi101
WiFi101_Generic WiFi101_Generic
WiFiEspAT WiFiEspAT
@ -299,6 +302,7 @@ framework = arduino
lib_deps = ${env.lib_deps} lib_deps = ${env.lib_deps}
stm32duino/STM32Ethernet @ ^1.4.0 stm32duino/STM32Ethernet @ ^1.4.0
stm32duino/STM32duino LwIP @ ^2.1.3 stm32duino/STM32duino LwIP @ ^2.1.3
MDNS_Generic
lib_ignore = WiFi101 lib_ignore = WiFi101
WiFi101_Generic WiFi101_Generic
WiFiEspAT WiFiEspAT