add new function to provide neighbour event parsing

the neighbour parsing function was previously not accessible, so
custom callback functions had to handle the decoding itself.
rtnl_neigh_parse is introduced and implemented in much the same way
as rtnl_route_parse.

Signed-off-by: Brett Ciphery <brett.ciphery@windriver.com>
Signed-off-by: Thomas Graf <tgraf@redhat.com>
This commit is contained in:
Brett Ciphery 2012-01-29 12:19:00 -05:00 committed by Thomas Graf
parent 9cbcbca77d
commit a39bb563ab
2 changed files with 20 additions and 1 deletions

View file

@ -29,6 +29,8 @@ extern int rtnl_neigh_alloc_cache(struct nl_sock *, struct nl_cache **);
extern struct rtnl_neigh *rtnl_neigh_get(struct nl_cache *, int,
struct nl_addr *);
extern int rtnl_neigh_parse(struct nlmsghdr *, struct rtnl_neigh **);
extern char * rtnl_neigh_state2str(int, char *, size_t);
extern int rtnl_neigh_str2state(const char *);

View file

@ -252,6 +252,21 @@ static struct nla_policy neigh_policy[NDA_MAX+1] = {
static int neigh_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
struct nlmsghdr *n, struct nl_parser_param *pp)
{
struct rtnl_neigh *neigh;
int err;
if ((err = rtnl_neigh_parse(n, &neigh)) < 0)
return err;
err = pp->pp_cb((struct nl_object *) neigh, pp);
rtnl_neigh_put(neigh);
return err;
}
int rtnl_neigh_parse(struct nlmsghdr *n, struct rtnl_neigh **result)
{
struct rtnl_neigh *neigh;
struct nlattr *tb[NDA_MAX + 1];
@ -317,7 +332,9 @@ static int neigh_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
neigh->ce_mask |= NEIGH_ATTR_PROBES;
}
err = pp->pp_cb((struct nl_object *) neigh, pp);
*result = neigh;
return 0;
errout:
rtnl_neigh_put(neigh);
return err;