lwIP preparation patches.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@10709 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
9a4f19c574
commit
024ed93d46
|
@ -61,17 +61,47 @@ typedef uint32_t u32_t;
|
||||||
typedef int32_t s32_t;
|
typedef int32_t s32_t;
|
||||||
typedef uint32_t mem_ptr_t;
|
typedef uint32_t mem_ptr_t;
|
||||||
|
|
||||||
#define PACK_STRUCT_STRUCT __attribute__((packed))
|
#define PACK_STRUCT_STRUCT __attribute__((packed))
|
||||||
|
|
||||||
#define LWIP_PLATFORM_DIAG(x)
|
|
||||||
#define LWIP_PLATFORM_ASSERT(x) { \
|
|
||||||
osalSysHalt(x); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef BYTE_ORDER
|
#ifndef BYTE_ORDER
|
||||||
#define BYTE_ORDER LITTLE_ENDIAN
|
#define BYTE_ORDER LITTLE_ENDIAN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LWIP_PROVIDE_ERRNO
|
/**
|
||||||
|
* @brief Use lwIP provided error codes by default.
|
||||||
|
*/
|
||||||
|
#ifndef LWIP_PROVIDE_ERRNO
|
||||||
|
#define LWIP_PROVIDE_ERRNO 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Use system provided struct timeval by default.
|
||||||
|
*/
|
||||||
|
#ifndef LWIP_TIMEVAL_PRIVATE
|
||||||
|
#define LWIP_TIMEVAL_PRIVATE 0
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Use a no-op diagnostic output macro by default.
|
||||||
|
*/
|
||||||
|
#if !defined(LWIP_PLATFORM_DIAG)
|
||||||
|
#define LWIP_PLATFORM_DIAG(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Halt the system on lwIP assert failure by default.
|
||||||
|
*/
|
||||||
|
#if !defined(LWIP_PLATFORM_ASSERT)
|
||||||
|
#define LWIP_PLATFORM_ASSERT(x) osalSysHalt(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The NETIF API is required by lwipthread.
|
||||||
|
*/
|
||||||
|
#ifdef LWIP_NETIF_API
|
||||||
|
#undef LWIP_NETIF_API
|
||||||
|
#endif
|
||||||
|
#define LWIP_NETIF_API 1
|
||||||
|
|
||||||
#endif /* __CC_H__ */
|
#endif /* __CC_H__ */
|
||||||
|
|
|
@ -48,7 +48,9 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// see http://lwip.wikia.com/wiki/Porting_for_an_OS for instructions
|
/*
|
||||||
|
* See http://lwip.wikia.com/wiki/Porting_for_an_OS for instructions.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
|
|
||||||
|
|
|
@ -60,22 +60,25 @@
|
||||||
|
|
||||||
#include "lwipthread.h"
|
#include "lwipthread.h"
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
#include <lwip/opt.h>
|
||||||
|
#include <lwip/def.h>
|
||||||
#include "lwip/def.h"
|
#include <lwip/mem.h>
|
||||||
#include "lwip/mem.h"
|
#include <lwip/pbuf.h>
|
||||||
#include "lwip/pbuf.h"
|
#include <lwip/sys.h>
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include <lwip/stats.h>
|
#include <lwip/stats.h>
|
||||||
#include <lwip/snmp.h>
|
#include <lwip/snmp.h>
|
||||||
#include <lwip/tcpip.h>
|
#include <lwip/tcpip.h>
|
||||||
#include "netif/etharp.h"
|
#include <netif/etharp.h>
|
||||||
#include "netif/ppp_oe.h"
|
#include <netif/ppp_oe.h>
|
||||||
|
|
||||||
#if LWIP_DHCP
|
#if LWIP_DHCP
|
||||||
#include <lwip/dhcp.h>
|
#include <lwip/dhcp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if LWIP_AUTOIP
|
||||||
|
#include <lwip/autoip.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PERIODIC_TIMER_ID 1
|
#define PERIODIC_TIMER_ID 1
|
||||||
#define FRAME_RECEIVED_ID 2
|
#define FRAME_RECEIVED_ID 2
|
||||||
|
|
||||||
|
@ -97,7 +100,7 @@ static void low_level_init(struct netif *netif) {
|
||||||
netif->hwaddr_len = ETHARP_HWADDR_LEN;
|
netif->hwaddr_len = ETHARP_HWADDR_LEN;
|
||||||
|
|
||||||
/* maximum transfer unit */
|
/* maximum transfer unit */
|
||||||
netif->mtu = 1500;
|
netif->mtu = LWIP_NETIF_MTU;
|
||||||
|
|
||||||
/* device capabilities */
|
/* device capabilities */
|
||||||
/* don't set NETIF_FLAG_ETHARP if this device is not an Ethernet one */
|
/* don't set NETIF_FLAG_ETHARP if this device is not an Ethernet one */
|
||||||
|
@ -107,7 +110,19 @@ static void low_level_init(struct netif *netif) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Transmits a frame.
|
* This function does the actual transmission of the packet. The packet is
|
||||||
|
* contained in the pbuf that is passed to the function. This pbuf
|
||||||
|
* might be chained.
|
||||||
|
*
|
||||||
|
* @param netif the lwip network interface structure for this ethernetif
|
||||||
|
* @param p the MAC packet to send (e.g. IP packet including MAC addresses and type)
|
||||||
|
* @return ERR_OK if the packet could be sent
|
||||||
|
* an err_t value if the packet couldn't be sent
|
||||||
|
*
|
||||||
|
* @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to
|
||||||
|
* strange results. You might consider waiting for space in the DMA queue
|
||||||
|
* to become available since the stack doesn't retry to send a packet
|
||||||
|
* dropped because of memory failure (except for the TCP timers).
|
||||||
*/
|
*/
|
||||||
static err_t low_level_output(struct netif *netif, struct pbuf *p) {
|
static err_t low_level_output(struct netif *netif, struct pbuf *p) {
|
||||||
struct pbuf *q;
|
struct pbuf *q;
|
||||||
|
@ -182,13 +197,19 @@ static struct pbuf *low_level_input(struct netif *netif) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialization.
|
* Called at the beginning of the program to set up the
|
||||||
|
* network interface. It calls the function low_level_init() to do the
|
||||||
|
* actual setup of the hardware.
|
||||||
|
*
|
||||||
|
* This function should be passed as a parameter to netifapi_netif_add().
|
||||||
|
*
|
||||||
|
* @param netif the lwip network interface structure for this ethernetif
|
||||||
|
* @return ERR_OK if the loopif is initialised
|
||||||
|
* ERR_MEM if private data couldn't be allocated
|
||||||
|
* any other err_t on error
|
||||||
*/
|
*/
|
||||||
static err_t ethernetif_init(struct netif *netif) {
|
static err_t ethernetif_init(struct netif *netif) {
|
||||||
#if LWIP_NETIF_HOSTNAME
|
osalDbgAssert((netif != NULL), "netif != NULL");
|
||||||
/* Initialize interface hostname */
|
|
||||||
netif->hostname = "lwip";
|
|
||||||
#endif /* LWIP_NETIF_HOSTNAME */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the snmp variables and counters inside the struct netif.
|
* Initialize the snmp variables and counters inside the struct netif.
|
||||||
|
@ -222,11 +243,13 @@ static err_t ethernetif_init(struct netif *netif) {
|
||||||
static THD_FUNCTION(lwip_thread, p) {
|
static THD_FUNCTION(lwip_thread, p) {
|
||||||
event_timer_t evt;
|
event_timer_t evt;
|
||||||
event_listener_t el0, el1;
|
event_listener_t el0, el1;
|
||||||
struct ip_addr ip, gateway, netmask;
|
ip_addr_t ip, gateway, netmask;
|
||||||
static struct netif thisif;
|
static struct netif thisif = { 0 };
|
||||||
static const MACConfig mac_config = {thisif.hwaddr};
|
static const MACConfig mac_config = {thisif.hwaddr};
|
||||||
|
net_addr_mode_t addressMode;
|
||||||
|
err_t result;
|
||||||
|
|
||||||
chRegSetThreadName("lwipthread");
|
chRegSetThreadName(LWIP_THREAD_NAME);
|
||||||
|
|
||||||
/* Initializes the thing.*/
|
/* Initializes the thing.*/
|
||||||
tcpip_init(NULL, NULL);
|
tcpip_init(NULL, NULL);
|
||||||
|
@ -241,6 +264,10 @@ static THD_FUNCTION(lwip_thread, p) {
|
||||||
ip.addr = opts->address;
|
ip.addr = opts->address;
|
||||||
gateway.addr = opts->gateway;
|
gateway.addr = opts->gateway;
|
||||||
netmask.addr = opts->netmask;
|
netmask.addr = opts->netmask;
|
||||||
|
addressMode = opts->addrMode;
|
||||||
|
#if LWIP_NETIF_HOSTNAME
|
||||||
|
thisif.hostname = opts->ourHostName;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
thisif.hwaddr[0] = LWIP_ETHADDR_0;
|
thisif.hwaddr[0] = LWIP_ETHADDR_0;
|
||||||
|
@ -252,12 +279,41 @@ static THD_FUNCTION(lwip_thread, p) {
|
||||||
LWIP_IPADDR(&ip);
|
LWIP_IPADDR(&ip);
|
||||||
LWIP_GATEWAY(&gateway);
|
LWIP_GATEWAY(&gateway);
|
||||||
LWIP_NETMASK(&netmask);
|
LWIP_NETMASK(&netmask);
|
||||||
|
addressMode = NET_ADDRESS_STATIC;
|
||||||
|
#if LWIP_NETIF_HOSTNAME
|
||||||
|
thisif.hostname = NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LWIP_NETIF_HOSTNAME
|
||||||
|
if (thisif.hostname == NULL)
|
||||||
|
thisif.hostname = LWIP_NETIF_HOSTNAME_STRING;
|
||||||
|
#endif
|
||||||
|
|
||||||
macStart(ÐD1, &mac_config);
|
macStart(ÐD1, &mac_config);
|
||||||
netif_add(&thisif, &ip, &netmask, &gateway, NULL, ethernetif_init, tcpip_input);
|
|
||||||
|
/* Add interface. */
|
||||||
|
result = netifapi_netif_add(&thisif, &ip, &netmask, &gateway, NULL, ethernetif_init, tcpip_input);
|
||||||
|
if (result != ERR_OK)
|
||||||
|
{
|
||||||
|
chThdSleepMilliseconds(1000); // Give some time to print any other diagnostics.
|
||||||
|
osalSysHalt("netif_add error"); // Not sure what else we can do if an error occurs here.
|
||||||
|
};
|
||||||
|
|
||||||
netif_set_default(&thisif);
|
netif_set_default(&thisif);
|
||||||
netif_set_up(&thisif);
|
|
||||||
|
switch (addressMode)
|
||||||
|
{
|
||||||
|
#if LWIP_AUTOIP
|
||||||
|
case NET_ADDRESS_AUTO:
|
||||||
|
autoip_start(&thisif);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
netif_set_up(&thisif);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup event sources.*/
|
/* Setup event sources.*/
|
||||||
evtObjectInit(&evt, LWIP_LINK_POLL_INTERVAL);
|
evtObjectInit(&evt, LWIP_LINK_POLL_INTERVAL);
|
||||||
|
@ -279,14 +335,16 @@ static THD_FUNCTION(lwip_thread, p) {
|
||||||
tcpip_callback_with_block((tcpip_callback_fn) netif_set_link_up,
|
tcpip_callback_with_block((tcpip_callback_fn) netif_set_link_up,
|
||||||
&thisif, 0);
|
&thisif, 0);
|
||||||
#if LWIP_DHCP
|
#if LWIP_DHCP
|
||||||
dhcp_start(&thisif);
|
if (addressMode == NET_ADDRESS_DHCP)
|
||||||
|
dhcp_start(&thisif);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tcpip_callback_with_block((tcpip_callback_fn) netif_set_link_down,
|
tcpip_callback_with_block((tcpip_callback_fn) netif_set_link_down,
|
||||||
&thisif, 0);
|
&thisif, 0);
|
||||||
#if LWIP_DHCP
|
#if LWIP_DHCP
|
||||||
dhcp_stop(&thisif);
|
if (addressMode == NET_ADDRESS_DHCP)
|
||||||
|
dhcp_stop(&thisif);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -308,6 +366,7 @@ static THD_FUNCTION(lwip_thread, p) {
|
||||||
if (thisif.input(p, &thisif) == ERR_OK)
|
if (thisif.input(p, &thisif) == ERR_OK)
|
||||||
break;
|
break;
|
||||||
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
|
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
|
||||||
|
/* Falls through */
|
||||||
default:
|
default:
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
}
|
}
|
||||||
|
@ -324,7 +383,6 @@ static THD_FUNCTION(lwip_thread, p) {
|
||||||
* then the static configuration is used.
|
* then the static configuration is used.
|
||||||
*/
|
*/
|
||||||
void lwipInit(const lwipthread_opts_t *opts) {
|
void lwipInit(const lwipthread_opts_t *opts) {
|
||||||
|
|
||||||
/* Creating the lwIP thread (it changes priority internally).*/
|
/* Creating the lwIP thread (it changes priority internally).*/
|
||||||
chThdCreateStatic(wa_lwip_thread, sizeof (wa_lwip_thread),
|
chThdCreateStatic(wa_lwip_thread, sizeof (wa_lwip_thread),
|
||||||
chThdGetPriorityX() - 1, lwip_thread, (void *)opts);
|
chThdGetPriorityX() - 1, lwip_thread, (void *)opts);
|
||||||
|
|
|
@ -26,6 +26,27 @@
|
||||||
|
|
||||||
#include <lwip/opt.h>
|
#include <lwip/opt.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief lwIP default network interface maximum transmission unit (MTU).
|
||||||
|
*/
|
||||||
|
#if !defined(LWIP_NETIF_MTU) || defined(__DOXYGEN__)
|
||||||
|
#define LWIP_NETIF_MTU 1500
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Default network interface hostname.
|
||||||
|
*/
|
||||||
|
#if !defined(LWIP_NETIF_HOSTNAME_STRING) || defined(__DOXYGEN__)
|
||||||
|
#define LWIP_NETIF_HOSTNAME_STRING "lwip"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Default network interface hostname.
|
||||||
|
*/
|
||||||
|
#if !defined(LWIP_THREAD_NAME) || defined(__DOXYGEN__)
|
||||||
|
#define LWIP_THREAD_NAME "lwipthread"
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief lwIP thread priority.
|
* @brief lwIP thread priority.
|
||||||
*/
|
*/
|
||||||
|
@ -138,14 +159,79 @@
|
||||||
#define LWIP_IFNAME1 's'
|
#define LWIP_IFNAME1 's'
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Utility macro to define an IPv4 address.
|
||||||
|
*
|
||||||
|
* @note Within the networking subsystem, IPv4 network addresses are
|
||||||
|
* stored with LS byte of network address in MS byte of unsigned int.
|
||||||
|
*/
|
||||||
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||||
|
#define IP4_ADDR_VALUE(a,b,c,d) \
|
||||||
|
(((u32_t)((d) & 0xff) << 24) | \
|
||||||
|
((u32_t)((c) & 0xff) << 16) | \
|
||||||
|
((u32_t)((b) & 0xff) << 8) | \
|
||||||
|
(u32_t)((a) & 0xff))
|
||||||
|
#else
|
||||||
|
#define IP4_ADDR_VALUE(a,b,c,d) \
|
||||||
|
(((u32_t)((a) & 0xff) << 24) | \
|
||||||
|
((u32_t)((b) & 0xff) << 16) | \
|
||||||
|
((u32_t)((c) & 0xff) << 8) | \
|
||||||
|
(u32_t)((d) & 0xff))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Startup network assigning modes.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
#if LWIP_DHCP || defined(__DOXYGEN__)
|
||||||
|
/**
|
||||||
|
* @brief Assign a DHCP given address.
|
||||||
|
*/
|
||||||
|
NET_ADDRESS_DHCP = 1,
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @brief Assign a statically IPv4 address.
|
||||||
|
*/
|
||||||
|
NET_ADDRESS_STATIC = 2,
|
||||||
|
#if LWIP_AUTOIP || defined(__DOXYGEN__)
|
||||||
|
/**
|
||||||
|
* @brief Assign an IPv4 link-Local address.
|
||||||
|
*/
|
||||||
|
NET_ADDRESS_AUTO = 3
|
||||||
|
#endif
|
||||||
|
} net_addr_mode_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Runtime TCP/IP settings.
|
* @brief Runtime TCP/IP settings.
|
||||||
*/
|
*/
|
||||||
typedef struct lwipthread_opts {
|
typedef struct lwipthread_opts {
|
||||||
uint8_t *macaddress;
|
/**
|
||||||
uint32_t address;
|
* @brief Pointer to MAC address as an array of 6 unsigned bytes.
|
||||||
uint32_t netmask;
|
*/
|
||||||
uint32_t gateway;
|
uint8_t *macaddress;
|
||||||
|
/**
|
||||||
|
* @brief Network address as 32-bit unsigned integer.
|
||||||
|
*/
|
||||||
|
uint32_t address;
|
||||||
|
/**
|
||||||
|
* @brief Network subnet mask as 32-bit unsigned integer.
|
||||||
|
*/
|
||||||
|
uint32_t netmask;
|
||||||
|
/**
|
||||||
|
* @brief Network gateway as 32-bit unsigned integer.
|
||||||
|
*/
|
||||||
|
uint32_t gateway;
|
||||||
|
/**
|
||||||
|
* @brief Startup network addressing mode - static, DHCP, auto.
|
||||||
|
*/
|
||||||
|
net_addr_mode_t addrMode;
|
||||||
|
/**
|
||||||
|
* @brief Host name. If NULL, a default string is used.
|
||||||
|
* @note Not checked for validity. In particular, spaces not allowed.
|
||||||
|
*/
|
||||||
|
#if LWIP_NETIF_HOSTNAME || defined(__DOXYGEN__)
|
||||||
|
const char *ourHostName;
|
||||||
|
#endif
|
||||||
} lwipthread_opts_t;
|
} lwipthread_opts_t;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -79,3 +79,13 @@
|
||||||
*
|
*
|
||||||
* @ingroup various
|
* @ingroup various
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup LWIP_THREAD LWIP bindings
|
||||||
|
*
|
||||||
|
* @brief lwIP port and wrapper thread.
|
||||||
|
* @details This module implements the lwIP system abstraction and wrapper
|
||||||
|
* thread.
|
||||||
|
*
|
||||||
|
* @ingroup various
|
||||||
|
*/
|
||||||
|
|
Loading…
Reference in New Issue