mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-12-28 09:19:53 +00:00
nd6: use a static buffer to process RA options instead of using mem_malloc()
This commit is contained in:
parent
dccad08508
commit
6058389974
@ -77,6 +77,9 @@ static u8_t nd6_cached_destination_index;
|
|||||||
/* Multicast address holder. */
|
/* Multicast address holder. */
|
||||||
static ip6_addr_t multicast_address;
|
static ip6_addr_t multicast_address;
|
||||||
|
|
||||||
|
/* Static buffer to parse RA packet options (size of a prefix option, biggest option) */
|
||||||
|
static u8_t nd6_ra_buffer[sizeof(struct prefix_option)];
|
||||||
|
|
||||||
/* Forward declarations. */
|
/* Forward declarations. */
|
||||||
static s8_t nd6_find_neighbor_cache_entry(ip6_addr_t * ip6addr);
|
static s8_t nd6_find_neighbor_cache_entry(ip6_addr_t * ip6addr);
|
||||||
static s8_t nd6_new_neighbor_cache_entry(void);
|
static s8_t nd6_new_neighbor_cache_entry(void);
|
||||||
@ -392,17 +395,15 @@ nd6_input(struct pbuf *p, struct netif *inp)
|
|||||||
/* Offset to options. */
|
/* Offset to options. */
|
||||||
offset = sizeof(struct ra_header);
|
offset = sizeof(struct ra_header);
|
||||||
|
|
||||||
/* Allocate buffer to copy options (so we can traverse pbufs). */
|
|
||||||
buffer = (u8_t *)mem_malloc(sizeof(struct prefix_option)); /* Size of a prefix option, biggest option. */
|
|
||||||
if (buffer == NULL) {
|
|
||||||
pbuf_free(p);
|
|
||||||
ND6_STATS_INC(nd6.memerr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Process each option. */
|
/* Process each option. */
|
||||||
while ((p->tot_len - offset) > 0) {
|
while ((p->tot_len - offset) > 0) {
|
||||||
pbuf_copy_partial(p, buffer, sizeof(struct prefix_option), offset);
|
if (p->len == p->tot_len) {
|
||||||
|
/* no need to copy from contiguous pbuf */
|
||||||
|
buffer = &((u8_t*)p->payload)[offset];
|
||||||
|
} else {
|
||||||
|
buffer = nd6_ra_buffer;
|
||||||
|
pbuf_copy_partial(p, buffer, sizeof(struct prefix_option), offset);
|
||||||
|
}
|
||||||
switch (buffer[0]) {
|
switch (buffer[0]) {
|
||||||
case ND6_OPTION_TYPE_SOURCE_LLADDR:
|
case ND6_OPTION_TYPE_SOURCE_LLADDR:
|
||||||
{
|
{
|
||||||
@ -476,10 +477,6 @@ nd6_input(struct pbuf *p, struct netif *inp)
|
|||||||
offset += 8 * ((u16_t)buffer[1]);
|
offset += 8 * ((u16_t)buffer[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* free options buffer. */
|
|
||||||
mem_free(buffer);
|
|
||||||
|
|
||||||
break; /* ICMP6_TYPE_RA */
|
break; /* ICMP6_TYPE_RA */
|
||||||
}
|
}
|
||||||
case ICMP6_TYPE_RD: /* Redirect */
|
case ICMP6_TYPE_RD: /* Redirect */
|
||||||
|
Loading…
Reference in New Issue
Block a user