mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-12-26 03:16:18 +00:00
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:
parent
11da4ef024
commit
79d69ce526
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user