Fixed PBUF_LINK_ENCAPSULATION_HLEN support

PBUF_LINK_ENCAPSULATION_HLEN support was introduced by 6ef7563f and
missed the fact that header size calculation/reservation using
computation like PBUF_LINK_HLEN + PBUF_IP_HLEN + ... are used all over
the source code. Hopefully fixed all of them.
This commit is contained in:
Sylvain Rochet 2015-04-20 23:43:33 +02:00
parent 2db7513590
commit 632de523de
8 changed files with 23 additions and 19 deletions

View File

@ -292,10 +292,10 @@
#if TCP_SNDQUEUELOWAT >= TCP_SND_QUEUELEN #if TCP_SNDQUEUELOWAT >= TCP_SND_QUEUELEN
#error "lwip_sanity_check: WARNING: TCP_SNDQUEUELOWAT must be less than TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #error "lwip_sanity_check: WARNING: TCP_SNDQUEUELOWAT must be less than TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
#endif #endif
#if !MEMP_MEM_MALLOC && (PBUF_POOL_BUFSIZE <= (PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) #if !MEMP_MEM_MALLOC && (PBUF_POOL_BUFSIZE <= (PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))
#error "lwip_sanity_check: WARNING: PBUF_POOL_BUFSIZE does not provide enough space for protocol headers. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #error "lwip_sanity_check: WARNING: PBUF_POOL_BUFSIZE does not provide enough space for protocol headers. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
#endif #endif
#if !MEMP_MEM_MALLOC && (TCP_WND > (PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - (PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)))) #if !MEMP_MEM_MALLOC && (TCP_WND > (PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - (PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))))
#error "lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - protocol headers). If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #error "lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - protocol headers). If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error."
#endif #endif
#if TCP_WND < TCP_MSS #if TCP_WND < TCP_MSS

View File

@ -143,7 +143,7 @@ icmp_input(struct pbuf *p, struct netif *inp)
} }
#endif #endif
#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN #if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) { if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN))) {
/* p is not big enough to contain link headers /* p is not big enough to contain link headers
* allocate a new one and copy p into it * allocate a new one and copy p into it
*/ */
@ -175,7 +175,7 @@ icmp_input(struct pbuf *p, struct netif *inp)
p = r; p = r;
} else { } else {
/* restore p->payload to point to icmp header */ /* restore p->payload to point to icmp header */
if (pbuf_header(p, -(s16_t)(PBUF_IP_HLEN + PBUF_LINK_HLEN))) { if (pbuf_header(p, -(s16_t)(PBUF_IP_HLEN + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN))) {
LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0);
goto memerr; goto memerr;
} }

View File

@ -378,15 +378,19 @@ pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_cust
switch (l) { switch (l) {
case PBUF_TRANSPORT: case PBUF_TRANSPORT:
/* add room for transport (often TCP) layer header */ /* add room for transport (often TCP) layer header */
offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN; offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
break; break;
case PBUF_IP: case PBUF_IP:
/* add room for IP layer header */ /* add room for IP layer header */
offset = PBUF_LINK_HLEN + PBUF_IP_HLEN; offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN;
break; break;
case PBUF_LINK: case PBUF_LINK:
/* add room for link layer header */ /* add room for link layer header */
offset = PBUF_LINK_HLEN; offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN;
break;
case PBUF_RAW_TX:
/* add room for encapsulating link layer headers (e.g. 802.11) */
offset = PBUF_LINK_ENCAPSULATION_HLEN;
break; break;
case PBUF_RAW: case PBUF_RAW:
offset = 0; offset = 0;

View File

@ -3123,7 +3123,7 @@ ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
* The current solution is to calculate for 2 simultaneous packets... * The current solution is to calculate for 2 simultaneous packets...
*/ */
*sint_ptr = (IP_HLEN + ((IP_REASS_MAX_PBUFS/2) * *sint_ptr = (IP_HLEN + ((IP_REASS_MAX_PBUFS/2) *
(PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN - IP_HLEN))); (PBUF_POOL_BUFSIZE - PBUF_LINK_ENCAPSULATION_HLEN - PBUF_LINK_HLEN - IP_HLEN)));
#else #else
/** @todo returning MTU would be a bad thing and /** @todo returning MTU would be a bad thing and
returning a wild guess like '576' isn't good either */ returning a wild guess like '576' isn't good either */

View File

@ -1296,7 +1296,7 @@
* TCP_MSS, IP header, and link header. * TCP_MSS, IP header, and link header.
*/ */
#ifndef PBUF_POOL_BUFSIZE #ifndef PBUF_POOL_BUFSIZE
#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) #define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
#endif #endif
/* /*

View File

@ -569,7 +569,7 @@ pppos_input(ppp_pcb *ppp, u8_t *s, int l)
pppos->in_tail = NULL; pppos->in_tail = NULL;
#if IP_FORWARD || LWIP_IPV6_FORWARD #if IP_FORWARD || LWIP_IPV6_FORWARD
/* hide the room for Ethernet forwarding header */ /* hide the room for Ethernet forwarding header */
pbuf_header(inp, -(s16_t)PBUF_LINK_HLEN); pbuf_header(inp, -(s16_t)(PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN));
#endif /* IP_FORWARD || LWIP_IPV6_FORWARD */ #endif /* IP_FORWARD || LWIP_IPV6_FORWARD */
#if PPP_INPROC_IRQ_SAFE #if PPP_INPROC_IRQ_SAFE
if(tcpip_callback_with_block(pppos_input_callback, inp, 0) != ERR_OK) { if(tcpip_callback_with_block(pppos_input_callback, inp, 0) != ERR_OK) {
@ -672,12 +672,12 @@ pppos_input(ppp_pcb *ppp, u8_t *s, int l)
/* If we haven't started a packet, we need a packet header. */ /* If we haven't started a packet, we need a packet header. */
pbuf_alloc_len = 0; pbuf_alloc_len = 0;
#if IP_FORWARD || LWIP_IPV6_FORWARD #if IP_FORWARD || LWIP_IPV6_FORWARD
/* If IP forwarding is enabled we are reserving PBUF_LINK_HLEN bytes so /* If IP forwarding is enabled we are reserving PBUF_LINK_ENCAPSULATION_HLEN
* the packet is being allocated with enough header space to be * + PBUF_LINK_HLEN bytes so the packet is being allocated with enough header
* forwarded (to Ethernet for example). * space to be forwarded (to Ethernet for example).
*/ */
if (pppos->in_head == NULL) { if (pppos->in_head == NULL) {
pbuf_alloc_len = PBUF_LINK_HLEN; pbuf_alloc_len = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN;
} }
#endif /* IP_FORWARD || LWIP_IPV6_FORWARD */ #endif /* IP_FORWARD || LWIP_IPV6_FORWARD */
next_pbuf = pbuf_alloc(PBUF_RAW, pbuf_alloc_len, PBUF_POOL); next_pbuf = pbuf_alloc(PBUF_RAW, pbuf_alloc_len, PBUF_POOL);

View File

@ -252,7 +252,7 @@ slipif_rxbyte(struct netif *netif, u8_t c)
if (priv->p == NULL) { if (priv->p == NULL) {
/* allocate a new pbuf */ /* allocate a new pbuf */
LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n")); LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n"));
priv->p = pbuf_alloc(PBUF_LINK, (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN), PBUF_POOL); priv->p = pbuf_alloc(PBUF_LINK, (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN - PBUF_LINK_ENCAPSULATION_HLEN), PBUF_POOL);
if (priv->p == NULL) { if (priv->p == NULL) {
LINK_STATS_INC(link.drop); LINK_STATS_INC(link.drop);

View File

@ -643,7 +643,7 @@ END_TEST
START_TEST(test_tcp_recv_ooseq_max_bytes) START_TEST(test_tcp_recv_ooseq_max_bytes)
{ {
#if TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) #if TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))
int i, k; int i, k;
struct test_tcp_counters counters; struct test_tcp_counters counters;
struct tcp_pcb* pcb; struct tcp_pcb* pcb;
@ -717,14 +717,14 @@ START_TEST(test_tcp_recv_ooseq_max_bytes)
EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
tcp_abort(pcb); tcp_abort(pcb);
EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
#endif /* TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) */ #endif /* TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) */
LWIP_UNUSED_ARG(_i); LWIP_UNUSED_ARG(_i);
} }
END_TEST END_TEST
START_TEST(test_tcp_recv_ooseq_max_pbufs) START_TEST(test_tcp_recv_ooseq_max_pbufs)
{ {
#if TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_PBUFS < ((TCP_WND / TCP_MSS) + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) #if TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_PBUFS < ((TCP_WND / TCP_MSS) + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))
int i; int i;
struct test_tcp_counters counters; struct test_tcp_counters counters;
struct tcp_pcb* pcb; struct tcp_pcb* pcb;
@ -798,7 +798,7 @@ START_TEST(test_tcp_recv_ooseq_max_pbufs)
EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
tcp_abort(pcb); tcp_abort(pcb);
EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
#endif /* TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) */ #endif /* TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) */
LWIP_UNUSED_ARG(_i); LWIP_UNUSED_ARG(_i);
} }
END_TEST END_TEST