]> git.ipfire.org Git - thirdparty/libnl.git/commitdiff
add new function to provide neighbour event parsing
authorBrett Ciphery <brett.ciphery@windriver.com>
Sun, 29 Jan 2012 17:19:00 +0000 (12:19 -0500)
committerThomas Graf <tgraf@redhat.com>
Mon, 30 Jan 2012 11:54:29 +0000 (12:54 +0100)
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>
include/netlink/route/neighbour.h
lib/route/neigh.c

index 698539a04a455a0377774bcef614f524f62990e9..1d1179b392d5e86fefe63f1a3fe71d1816c870dc 100644 (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 *);
 
index 7985d348f52c24184f6f902e469eec9026cb0722..bb6157119a885fda805bbd54e8cd3bf52e8edb1c 100644 (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;