Skip to content

Commit e23be8a

Browse files
committed
Merge pull request #46 from adamgreen/netAssertDisableAndCrashFixes2
Robustness fixes for netstack
2 parents 1798920 + b0c0f47 commit e23be8a

File tree

3 files changed

+18
-7
lines changed

3 files changed

+18
-7
lines changed

libraries/net/eth/lwip-eth/arch/lpc17_emac.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@
8888
*/
8989
#define TXINTGROUP (EMAC_INT_TX_UNDERRUN | EMAC_INT_TX_ERR | EMAC_INT_TX_DONE)
9090

91+
/** \brief Signal used for ethernet ISR to signal packet_rx() thread.
92+
*/
93+
#define RX_SIGNAL 1
94+
9195
#else
9296
#define RXINTGROUP 0
9397
#define TXINTGROUP 0
@@ -123,7 +127,7 @@ struct lpc_enetdata {
123127
struct pbuf *txb[LPC_NUM_BUFF_TXDESCS]; /**< TX pbuf pointer list, zero-copy mode */
124128
u32_t lpc_last_tx_idx; /**< TX last descriptor index, zero-copy mode */
125129
#if NO_SYS == 0
126-
sys_sem_t RxSem; /**< RX receive thread wakeup semaphore */
130+
sys_thread_t RxThread; /**< RX receive thread data object pointer */
127131
sys_sem_t TxCleanSem; /**< TX cleanup thread wakeup semaphore */
128132
sys_mutex_t TXLockMutex; /**< TX critical section mutex */
129133
sys_sem_t xTXDCountSem; /**< TX free buffer counting semaphore */
@@ -346,6 +350,7 @@ static struct pbuf *lpc_low_level_input(struct netif *netif)
346350
struct lpc_enetdata *lpc_enetif = netif->state;
347351
struct pbuf *p = NULL;
348352
u32_t idx, length;
353+
u16_t origLength;
349354

350355
#ifdef LOCK_RX_THREAD
351356
#if NO_SYS == 0
@@ -428,6 +433,7 @@ static struct pbuf *lpc_low_level_input(struct netif *netif)
428433

429434
/* Zero-copy */
430435
p = lpc_enetif->rxb[idx];
436+
origLength = p->len;
431437
p->len = (u16_t) length;
432438

433439
/* Free pbuf from descriptor */
@@ -440,6 +446,7 @@ static struct pbuf *lpc_low_level_input(struct netif *netif)
440446
LINK_STATS_INC(link.drop);
441447

442448
/* Re-queue the pbuf for receive */
449+
p->len = origLength;
443450
lpc_rxqueue_pbuf(lpc_enetif, p);
444451

445452
LWIP_DEBUGF(UDP_LPC_EMAC | LWIP_DBG_TRACE,
@@ -780,8 +787,8 @@ void ENET_IRQHandler(void)
780787
ints = LPC_EMAC->IntStatus;
781788

782789
if (ints & RXINTGROUP) {
783-
/* RX group interrupt(s): Give semaphore to wakeup RX receive task.*/
784-
sys_sem_signal(&lpc_enetdata.RxSem);
790+
/* RX group interrupt(s): Give signal to wakeup RX receive task.*/
791+
osSignalSet(lpc_enetdata.RxThread->id, RX_SIGNAL);
785792
}
786793

787794
if (ints & TXINTGROUP) {
@@ -807,7 +814,7 @@ static void packet_rx(void* pvParameters) {
807814

808815
while (1) {
809816
/* Wait for receive task to wakeup */
810-
sys_arch_sem_wait(&lpc_enetif->RxSem, 0);
817+
osSignalWait(RX_SIGNAL, osWaitForever);
811818

812819
/* Process packets until all empty */
813820
while (LPC_EMAC->RxConsumeIndex != LPC_EMAC->RxProduceIndex)
@@ -1093,9 +1100,8 @@ err_t lpc_enetif_init(struct netif *netif)
10931100
LWIP_ASSERT("TXLockMutex creation error", (err == ERR_OK));
10941101

10951102
/* Packet receive task */
1096-
err = sys_sem_new(&lpc_enetdata.RxSem, 0);
1097-
LWIP_ASSERT("RxSem creation error", (err == ERR_OK));
1098-
sys_thread_new("receive_thread", packet_rx, netif->state, DEFAULT_THREAD_STACKSIZE, RX_PRIORITY);
1103+
lpc_enetdata.RxThread = sys_thread_new("receive_thread", packet_rx, netif->state, DEFAULT_THREAD_STACKSIZE, RX_PRIORITY);
1104+
LWIP_ASSERT("RxThread creation error", (lpc_enetdata.RxThread));
10991105

11001106
/* Transmit cleanup task */
11011107
err = sys_sem_new(&lpc_enetdata.TxCleanSem, 0);

libraries/net/lwip/lwip/core/pbuf.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,6 +998,8 @@ pbuf_coalesce(struct pbuf *p, pbuf_layer layer)
998998
}
999999
err = pbuf_copy(q, p);
10001000
LWIP_ASSERT("pbuf_copy failed", err == ERR_OK);
1001+
/* next line references err variable even if LWIP_ASSERT is ignored. */
1002+
(void)err;
10011003
pbuf_free(p);
10021004
return q;
10031005
}

libraries/net/lwip/lwip/lwipopts.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#if NO_SYS == 0
2828
#include "cmsis_os.h"
2929

30+
#define SYS_LIGHTWEIGHT_PROT 1
31+
3032
#define LWIP_RAW 0
3133

3234
#define TCPIP_MBOX_SIZE 8
@@ -99,6 +101,7 @@
99101
#define MEMP_OVERFLOW_CHECK 1
100102
#define MEMP_SANITY_CHECK 1
101103
#else
104+
#define LWIP_NOASSERT 1
102105
#define LWIP_STATS 0
103106
#endif
104107

0 commit comments

Comments
 (0)