mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-12-25 18:14:53 +00:00
nd6: cache neighbour index for each next hop, not globally
See bug #47792 Signed-off-by: Simon Goldschmidt <goldsimon@gmx.de>
This commit is contained in:
parent
dc41eabf5f
commit
84228d4f4b
@ -100,7 +100,6 @@ u8_t nd6_queue_size = 0;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Index for cache entries. */
|
/* Index for cache entries. */
|
||||||
static u8_t nd6_cached_neighbor_index;
|
|
||||||
static netif_addr_idx_t nd6_cached_destination_index;
|
static netif_addr_idx_t nd6_cached_destination_index;
|
||||||
|
|
||||||
/* Multicast address holder. */
|
/* Multicast address holder. */
|
||||||
@ -2036,7 +2035,7 @@ nd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif)
|
|||||||
|
|
||||||
/* Look in neighbor cache for the next-hop address. */
|
/* Look in neighbor cache for the next-hop address. */
|
||||||
if (ip6_addr_cmp(&dest->next_hop_addr,
|
if (ip6_addr_cmp(&dest->next_hop_addr,
|
||||||
&(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) {
|
&(neighbor_cache[dest->cached_neighbor_idx].next_hop_address))) {
|
||||||
/* Cache hit. */
|
/* Cache hit. */
|
||||||
/* Do nothing. */
|
/* Do nothing. */
|
||||||
ND6_STATS_INC(nd6.cachehit);
|
ND6_STATS_INC(nd6.cachehit);
|
||||||
@ -2044,13 +2043,13 @@ nd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif)
|
|||||||
i = nd6_find_neighbor_cache_entry(&dest->next_hop_addr);
|
i = nd6_find_neighbor_cache_entry(&dest->next_hop_addr);
|
||||||
if (i >= 0) {
|
if (i >= 0) {
|
||||||
/* Found a matching record, make it new cached entry. */
|
/* Found a matching record, make it new cached entry. */
|
||||||
nd6_cached_neighbor_index = i;
|
dest->cached_neighbor_idx = i;
|
||||||
} else {
|
} else {
|
||||||
/* Neighbor not in cache. Make a new entry. */
|
/* Neighbor not in cache. Make a new entry. */
|
||||||
i = nd6_new_neighbor_cache_entry();
|
i = nd6_new_neighbor_cache_entry();
|
||||||
if (i >= 0) {
|
if (i >= 0) {
|
||||||
/* got new neighbor entry. make it our new cached index. */
|
/* got new neighbor entry. make it our new cached index. */
|
||||||
nd6_cached_neighbor_index = i;
|
dest->cached_neighbor_idx = i;
|
||||||
} else {
|
} else {
|
||||||
/* Could not create a neighbor cache entry. */
|
/* Could not create a neighbor cache entry. */
|
||||||
return ERR_MEM;
|
return ERR_MEM;
|
||||||
@ -2069,7 +2068,7 @@ nd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif)
|
|||||||
/* Reset this destination's age. */
|
/* Reset this destination's age. */
|
||||||
dest->age = 0;
|
dest->age = 0;
|
||||||
|
|
||||||
return nd6_cached_neighbor_index;
|
return dest->cached_neighbor_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2373,8 +2372,8 @@ nd6_reachability_hint(const ip6_addr_t *ip6addr)
|
|||||||
|
|
||||||
/* Find next hop neighbor in cache. */
|
/* Find next hop neighbor in cache. */
|
||||||
dest = &destination_cache[dst_idx];
|
dest = &destination_cache[dst_idx];
|
||||||
if (ip6_addr_cmp(&dest->next_hop_addr, &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) {
|
if (ip6_addr_cmp(&dest->next_hop_addr, &(neighbor_cache[dest->cached_neighbor_idx].next_hop_address))) {
|
||||||
i = nd6_cached_neighbor_index;
|
i = dest->cached_neighbor_idx;
|
||||||
ND6_STATS_INC(nd6.cachehit);
|
ND6_STATS_INC(nd6.cachehit);
|
||||||
} else {
|
} else {
|
||||||
i = nd6_find_neighbor_cache_entry(&dest->next_hop_addr);
|
i = nd6_find_neighbor_cache_entry(&dest->next_hop_addr);
|
||||||
|
@ -94,6 +94,7 @@ struct nd6_destination_cache_entry {
|
|||||||
ip6_addr_t destination_addr;
|
ip6_addr_t destination_addr;
|
||||||
ip6_addr_t next_hop_addr;
|
ip6_addr_t next_hop_addr;
|
||||||
u16_t pmtu;
|
u16_t pmtu;
|
||||||
|
u8_t cached_neighbor_idx;
|
||||||
u32_t age;
|
u32_t age;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user