diff options
author | Jonas Johansson <jonas.johansson@westermo.se> | 2016-04-28 14:07:11 (GMT) |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-05-29 13:19:22 (GMT) |
commit | 3bf503d30c271822158414f63eed620afc9b10cd (patch) | |
tree | 69459bb2a8e438328c8182430425748a474765af /lib | |
parent | 648338a2170854952e605175af141ee27cc8dd2b (diff) | |
download | libnl-3bf503d30c271822158414f63eed620afc9b10cd.zip libnl-3bf503d30c271822158414f63eed620afc9b10cd.tar.gz libnl-3bf503d30c271822158414f63eed620afc9b10cd.tar.bz2 |
neigh: add function to look up neighbour (fdb) by ifindex, mac and vlan
The rtnl_neigh_get() function can not be used to look up a fdb entry in the
neigh cache. This is due to that the function searches among destination
addresses (NDA_DST) and not among link layer addresses (NDA_LLADDR), which is
used by fdb entries. A fdb entry can also exist in several vlans, so a vlan id
parameter is also needed to find a unique entry.
This commit adds a function, rtnl_neigh_get_by_vlan() which searches the neigh
cache for a specific neighbour (fdb) entry by interface index, link layer
address and vlan id.
Signed-off-by: Jonas Johansson <jonas.johansson@westermo.se>
Signed-off-by: Thomas Haller <thaller@redhat.com>
http://lists.infradead.org/pipermail/libnl/2016-May/002124.html
https://github.com/thom311/libnl/pull/98
Diffstat (limited to 'lib')
-rw-r--r-- | lib/route/neigh.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/route/neigh.c b/lib/route/neigh.c index 260e8b4..c8979ab 100644 --- a/lib/route/neigh.c +++ b/lib/route/neigh.c @@ -607,6 +607,32 @@ struct rtnl_neigh * rtnl_neigh_get(struct nl_cache *cache, int ifindex, return NULL; } +/** + * Look up a neighbour by interface index, link layer address and vlan id + * @arg cache neighbour cache + * @arg ifindex interface index the neighbour is on + * @arg lladdr link layer address of the neighbour + * @arg vlan vlan id of the neighbour + * + * @return neighbour handle or NULL if no match was found. + */ +struct rtnl_neigh * rtnl_neigh_get_by_vlan(struct nl_cache *cache, int ifindex, + struct nl_addr *lladdr, int vlan) +{ + struct rtnl_neigh *neigh; + + nl_list_for_each_entry(neigh, &cache->c_items, ce_list) { + if (neigh->n_ifindex == ifindex && + neigh->n_vlan == vlan && + neigh->n_lladdr && !nl_addr_cmp(neigh->n_lladdr, lladdr)) { + nl_object_get((struct nl_object *) neigh); + return neigh; + } + } + + return NULL; +} + /** @} */ /** |