Slightly optimize pbuf_alloc: encode 'header offset' in 'enum pbuf_layer' instead of switch/case (which was duplicated in pbuf_alloc and pbuf_alloced_custom)

This commit is contained in:
goldsimon 2017-06-21 13:37:05 +02:00
parent 11da4ef024
commit 79d69ce526
2 changed files with 9 additions and 62 deletions

View File

@ -194,7 +194,7 @@ pbuf_init_alloced_pbuf(struct pbuf *p, void* payload, u16_t tot_len, u16_t len,
* layer at which the pbuf is allocated and the requested size * layer at which the pbuf is allocated and the requested size
* (from the size parameter). * (from the size parameter).
* *
* @param layer flag to define header size * @param layer header size
* @param length size of the pbuf's payload * @param length size of the pbuf's payload
* @param type this parameter decides how and where the pbuf * @param type this parameter decides how and where the pbuf
* should be allocated as follows: * should be allocated as follows:
@ -222,40 +222,13 @@ struct pbuf *
pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
{ {
struct pbuf *p; struct pbuf *p;
u16_t offset; u16_t offset = (u16_t)layer;
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length)); LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length));
if ((type == PBUF_REF) || (type == PBUF_ROM)) { if ((type == PBUF_REF) || (type == PBUF_ROM)) {
return pbuf_alloc_reference(NULL, length, type); return pbuf_alloc_reference(NULL, length, type);
} }
/* determine header offset */
switch (layer) {
case PBUF_TRANSPORT:
/* add room for transport (often TCP) layer header */
offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
break;
case PBUF_IP:
/* add room for IP layer header */
offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN;
break;
case PBUF_LINK:
/* add room for link layer header */
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;
case PBUF_RAW:
/* no offset (e.g. RX buffers or chain successors) */
offset = 0;
break;
default:
LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0);
return NULL;
}
switch (type) { switch (type) {
case PBUF_POOL: case PBUF_POOL:
{ {
@ -370,7 +343,7 @@ pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type)
* Initialize a custom pbuf (already allocated). * Initialize a custom pbuf (already allocated).
* Example of custom pbuf usage: @ref zerocopyrx * Example of custom pbuf usage: @ref zerocopyrx
* *
* @param l flag to define header size * @param l header size
* @param length size of the pbuf's payload * @param length size of the pbuf's payload
* @param type type of the pbuf (only used to treat the pbuf accordingly, as * @param type type of the pbuf (only used to treat the pbuf accordingly, as
* this function allocates no memory) * this function allocates no memory)
@ -386,36 +359,10 @@ struct pbuf*
pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p,
void *payload_mem, u16_t payload_mem_len) void *payload_mem, u16_t payload_mem_len)
{ {
u16_t offset; u16_t offset = (u16_t)l;
void *payload; void *payload;
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloced_custom(length=%"U16_F")\n", length)); LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloced_custom(length=%"U16_F")\n", length));
/* determine header offset */
switch (l) {
case PBUF_TRANSPORT:
/* add room for transport (often TCP) layer header */
offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
break;
case PBUF_IP:
/* add room for IP layer header */
offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN;
break;
case PBUF_LINK:
/* add room for link layer header */
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;
case PBUF_RAW:
offset = 0;
break;
default:
LWIP_ASSERT("pbuf_alloced_custom: bad pbuf layer", 0);
return NULL;
}
if (LWIP_MEM_ALIGN_SIZE(offset) + length > payload_mem_len) { if (LWIP_MEM_ALIGN_SIZE(offset) + length > payload_mem_len) {
LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_WARNING, ("pbuf_alloced_custom(length=%"U16_F") buffer too short\n", length)); LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_WARNING, ("pbuf_alloced_custom(length=%"U16_F") buffer too short\n", length));
return NULL; return NULL;

View File

@ -90,25 +90,25 @@ typedef enum {
/** Includes spare room for transport layer header, e.g. UDP header. /** Includes spare room for transport layer header, e.g. UDP header.
* Use this if you intend to pass the pbuf to functions like udp_send(). * Use this if you intend to pass the pbuf to functions like udp_send().
*/ */
PBUF_TRANSPORT, PBUF_TRANSPORT = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN,
/** Includes spare room for IP header. /** Includes spare room for IP header.
* Use this if you intend to pass the pbuf to functions like raw_send(). * Use this if you intend to pass the pbuf to functions like raw_send().
*/ */
PBUF_IP, PBUF_IP = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN,
/** Includes spare room for link layer header (ethernet header). /** Includes spare room for link layer header (ethernet header).
* Use this if you intend to pass the pbuf to functions like ethernet_output(). * Use this if you intend to pass the pbuf to functions like ethernet_output().
* @see PBUF_LINK_HLEN * @see PBUF_LINK_HLEN
*/ */
PBUF_LINK, PBUF_LINK = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN,
/** Includes spare room for additional encapsulation header before ethernet /** Includes spare room for additional encapsulation header before ethernet
* headers (e.g. 802.11). * headers (e.g. 802.11).
* Use this if you intend to pass the pbuf to functions like netif->linkoutput(). * Use this if you intend to pass the pbuf to functions like netif->linkoutput().
* @see PBUF_LINK_ENCAPSULATION_HLEN * @see PBUF_LINK_ENCAPSULATION_HLEN
*/ */
PBUF_RAW_TX, PBUF_RAW_TX = PBUF_LINK_ENCAPSULATION_HLEN,
/** Use this for input packets in a netif driver when calling netif->input() /** Use this for input packets in a netif driver when calling netif->input()
* in the most common case - ethernet-layer netif driver. */ * in the most common case - ethernet-layer netif driver. */
PBUF_RAW PBUF_RAW = 0
} pbuf_layer; } pbuf_layer;