Skip to content

Commit

Permalink
net/ip: Removing useless extra data capability in neighbors
Browse files Browse the repository at this point in the history
This is not used by anyone, and is unlikely to be useful actually.
Helps to save 4 bytes for each instance of struct net_nbr also (removing
a 2 bytes attributes, which was anyway generating a 4bytes loss due to
structure misalignment).

Removing relevant useless functions related to it as well.

Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
  • Loading branch information
Tomasz Bursztyka authored and aescolar committed Mar 1, 2024
1 parent a3d7278 commit a4af2ac
Show file tree
Hide file tree
Showing 6 changed files with 9 additions and 114 deletions.
7 changes: 3 additions & 4 deletions subsys/net/ip/ipv6_nbr.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ static void ipv6_nd_restart_reachable_timer(struct net_nbr *nbr, int64_t time);
#define DELAY_FIRST_PROBE_TIME (5 * MSEC_PER_SEC)
#define RETRANS_TIMER 1000 /* ms */

extern void net_neighbor_data_remove(struct net_nbr *nbr);
extern void net_neighbor_remove(struct net_nbr *nbr);
extern void net_neighbor_table_clear(struct net_nbr_table *table);

/** Neighbor Solicitation reply timer */
Expand All @@ -89,8 +89,7 @@ static struct k_work_delayable ipv6_ns_reply_timer;
NET_NBR_POOL_INIT(net_neighbor_pool,
CONFIG_NET_IPV6_MAX_NEIGHBORS,
sizeof(struct net_ipv6_nbr_data),
net_neighbor_data_remove,
0);
net_neighbor_remove);

NET_NBR_TABLE_INIT(NET_NBR_GLOBAL,
neighbor,
Expand Down Expand Up @@ -665,7 +664,7 @@ struct net_nbr *net_ipv6_nbr_add(struct net_if *iface,
return nbr;
}

void net_neighbor_data_remove(struct net_nbr *nbr)
void net_neighbor_remove(struct net_nbr *nbr)
{
NET_DBG("Neighbor %p removed", nbr);

Expand Down
3 changes: 1 addition & 2 deletions subsys/net/ip/nbr.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,7 @@ static inline struct net_nbr *get_nbr(struct net_nbr *start, int idx)
NET_ASSERT(idx < CONFIG_NET_IPV6_MAX_NEIGHBORS);

return (struct net_nbr *)((uint8_t *)start +
((sizeof(struct net_nbr) +
start->size + start->extra_data_size) * idx));
((sizeof(struct net_nbr) + start->size) * idx));
}

struct net_nbr *net_nbr_get(struct net_nbr_table *table)
Expand Down
21 changes: 2 additions & 19 deletions subsys/net/ip/nbr.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,6 @@ struct net_nbr {
/** Amount of data that this neighbor buffer can store. */
const uint16_t size;

/** Extra data size associated with this neighbor */
const uint16_t extra_data_size;

/** Interface this neighbor is found */
struct net_if *iface;

Expand All @@ -75,17 +72,15 @@ struct net_nbr {
};

/* This is an array of struct net_nbr + some additional data */
#define NET_NBR_POOL_INIT(_name, _count, _size, _remove, _extra_size) \
#define NET_NBR_POOL_INIT(_name, _count, _size, _remove) \
struct { \
struct net_nbr nbr; \
uint8_t data[ROUND_UP(_size, 4)] __net_nbr_align; \
uint8_t extra[ROUND_UP(_extra_size, 4)] __net_nbr_align;\
} _name[_count] = { \
[0 ... (_count - 1)] = { .nbr = { \
.idx = NET_NBR_LLADDR_UNKNOWN, \
.remove = _remove, \
.size = ROUND_UP(_size, 4), \
.extra_data_size = ROUND_UP(_extra_size, 4) } },\
.size = ROUND_UP(_size, 4) } }, \
}

struct net_nbr_table {
Expand Down Expand Up @@ -115,18 +110,6 @@ struct net_nbr_table {
} \
}

/**
* @brief Get a pointer to the extra data of a neighbor entry.
*
* @param nbr A valid pointer to neighbor
*
* @return Pointer to the extra data of the nbr.
*/
static inline void *net_nbr_extra_data(struct net_nbr *nbr)
{
return (void *)ROUND_UP((nbr->__nbr + nbr->size), sizeof(int));
}

/**
* @brief Decrement the reference count. If count goes to 0, the neighbor
* is released and returned to free list.
Expand Down
74 changes: 2 additions & 72 deletions subsys/net/ip/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,6 @@ LOG_MODULE_REGISTER(net_route, CONFIG_NET_ROUTE_LOG_LEVEL);
#include "nbr.h"
#include "route.h"

#if !defined(NET_ROUTE_EXTRA_DATA_SIZE)
#define NET_ROUTE_EXTRA_DATA_SIZE 0
#endif

/* We keep track of the routes in a separate list so that we can remove
* the oldest routes (at tail) if needed.
*/
Expand All @@ -55,8 +51,7 @@ static void net_route_nexthop_remove(struct net_nbr *nbr)
NET_NBR_POOL_INIT(net_route_nexthop_pool,
CONFIG_NET_MAX_NEXTHOPS,
sizeof(struct net_route_nexthop),
net_route_nexthop_remove,
0);
net_route_nexthop_remove);

static inline struct net_route_nexthop *net_nexthop_data(struct net_nbr *nbr)
{
Expand Down Expand Up @@ -115,8 +110,7 @@ static void net_route_entries_table_clear(struct net_nbr_table *table)
NET_NBR_POOL_INIT(net_route_entries_pool,
CONFIG_NET_MAX_ROUTES,
sizeof(struct net_route_entry),
net_route_entry_remove,
NET_ROUTE_EXTRA_DATA_SIZE);
net_route_entry_remove);

NET_NBR_TABLE_INIT(NET_NBR_LOCAL, nbr_routes, net_route_entries_pool,
net_route_entries_table_clear);
Expand Down Expand Up @@ -665,70 +659,6 @@ int net_route_del_by_nexthop(struct net_if *iface, struct in6_addr *nexthop)
return 0;
}

int net_route_del_by_nexthop_data(struct net_if *iface,
struct in6_addr *nexthop,
void *data)
{
int count = 0, status = 0;
struct net_nbr *nbr_nexthop;
struct net_route_nexthop *nexthop_route;
int i, ret;

NET_ASSERT(iface);
NET_ASSERT(nexthop);

net_ipv6_nbr_lock();

nbr_nexthop = net_ipv6_nbr_lookup(iface, nexthop);
if (!nbr_nexthop) {
net_ipv6_nbr_unlock();
return -EINVAL;
}

for (i = 0; i < CONFIG_NET_MAX_ROUTES; i++) {
struct net_nbr *nbr = get_nbr(i);
struct net_route_entry *route = net_route_data(nbr);

SYS_SLIST_FOR_EACH_CONTAINER(&route->nexthop, nexthop_route,
node) {
void *extra_data;

if (nexthop_route->nbr != nbr_nexthop) {
continue;
}

if (nbr->extra_data_size == 0U) {
continue;
}

/* Routing engine specific extra data needs
* to match too.
*/
extra_data = net_nbr_extra_data(nbr_nexthop);
if (extra_data != data) {
continue;
}

ret = net_route_del(route);
if (!ret) {
count++;
} else {
status = ret;
}

break;
}
}

net_ipv6_nbr_unlock();

if (count) {
return count;
}

return status;
}

struct in6_addr *net_route_get_nexthop(struct net_route_entry *route)
{
struct net_route_nexthop *nexthop_route;
Expand Down
16 changes: 0 additions & 16 deletions subsys/net/ip/route.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,22 +138,6 @@ int net_route_del(struct net_route_entry *entry);
int net_route_del_by_nexthop(struct net_if *iface,
struct in6_addr *nexthop);

/**
* @brief Delete a route from routing table by nexthop if the routing engine
* specific data matches.
*
* @detail The routing engine specific data could be the RPL data.
*
* @param iface Network interface to use.
* @param nexthop IPv6 address of the nexthop device.
* @param data Routing engine specific data.
*
* @return number of routes deleted, <0 if error
*/
int net_route_del_by_nexthop_data(struct net_if *iface,
struct in6_addr *nexthop,
void *data);

/**
* @brief Update the route lifetime.
*
Expand Down
2 changes: 1 addition & 1 deletion tests/net/neighbor/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ static void net_neighbor_table_clear(struct net_nbr_table *table)
}

NET_NBR_POOL_INIT(net_test_neighbor_pool, CONFIG_NET_IPV6_MAX_NEIGHBORS,
0, net_neighbor_data_remove, 0);
0, net_neighbor_data_remove);

NET_NBR_TABLE_INIT(NET_NBR_LOCAL, test_neighbor, net_test_neighbor_pool,
net_neighbor_table_clear);
Expand Down

0 comments on commit a4af2ac

Please sign in to comment.