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.
1235c288dc
...
9a6e1707e7
140
EXmDNS.cpp
140
EXmDNS.cpp
|
@ -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
|
|
||||||
|
|
24
EXmDNS.h
24
EXmDNS.h
|
@ -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
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
274
STM32lwipopts.h
274
STM32lwipopts.h
|
@ -1,89 +1,265 @@
|
||||||
/*
|
/**
|
||||||
* © 2024 Harald Barth
|
******************************************************************************
|
||||||
* All rights reserved.
|
* @file STM32lwipopts_default.h
|
||||||
*
|
* @author MCD Application Team
|
||||||
* This file is part of CommandStation-EX
|
* @brief lwIP Options Configuration.
|
||||||
*
|
******************************************************************************
|
||||||
* This is free software: you can redistribute it and/or modify
|
* @attention
|
||||||
* it under the terms of the GNU General Public License as published by
|
*
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V.
|
||||||
* (at your option) any later version.
|
* All rights reserved.</center></h2>
|
||||||
*
|
*
|
||||||
* It is distributed in the hope that it will be useful,
|
* This software component is licensed by ST under Ultimate Liberty license
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* SLA0044, the "License"; You may not use this file except in compliance with
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* the License. You may obtain a copy of the License at:
|
||||||
* GNU General Public License for more details.
|
* www.st.com/SLA0044
|
||||||
*
|
*
|
||||||
* 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****/
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user