diff --git a/include/netlink/route/neighbour.h b/include/netlink/route/neighbour.h index 698539a..1d1179b 100644 --- a/include/netlink/route/neighbour.h +++ b/include/netlink/route/neighbour.h @@ -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 *); diff --git a/lib/route/neigh.c b/lib/route/neigh.c index 7985d34..bb61571 100644 --- a/lib/route/neigh.c +++ b/lib/route/neigh.c @@ -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;