From f78fe8f3d60d23f96adf35f589dd7f257a4a40f4 Mon Sep 17 00:00:00 2001 From: Rafael Zalamena Date: Wed, 4 Dec 2019 10:37:40 -0300 Subject: [PATCH] zebra: export netlink function and change return Instead of retuning always `0`, lets return the amount of used bytes for the message. This will be used by the new FPM interface to know how many bytes we must reserve for the output buffer. Signed-off-by: Rafael Zalamena --- zebra/rt_netlink.c | 13 +++++++------ zebra/rt_netlink.h | 3 +++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 43f12145f4..cda6904517 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -1531,8 +1531,8 @@ static bool nexthop_set_src(const struct nexthop *nexthop, int family, /* * Routing table change via netlink interface, using a dataplane context object */ -static int netlink_route_multipath(int cmd, struct zebra_dplane_ctx *ctx, - uint8_t *data, size_t datalen) +ssize_t netlink_route_multipath(int cmd, struct zebra_dplane_ctx *ctx, + uint8_t *data, size_t datalen) { int bytelen; struct nexthop *nexthop = NULL; @@ -1636,7 +1636,7 @@ static int netlink_route_multipath(int cmd, struct zebra_dplane_ctx *ctx, * it. */ if (cmd == RTM_DELROUTE) - return 0; + return req->n.nlmsg_len; if (dplane_ctx_get_mtu(ctx) || dplane_ctx_get_nh_mtu(ctx)) { char buf[NL_PKT_BUF_SIZE]; @@ -1680,7 +1680,8 @@ static int netlink_route_multipath(int cmd, struct zebra_dplane_ctx *ctx, addattr_l(&req->n, datalen, RTA_PREFSRC, &src.ipv6, bytelen); } - return 0; + + return req->n.nlmsg_len; } /* Count overall nexthops so we can decide whether to use singlepath @@ -1719,7 +1720,7 @@ static int netlink_route_multipath(int cmd, struct zebra_dplane_ctx *ctx, req->r.rtm_type = RTN_BLACKHOLE; break; } - return 0; + return req->n.nlmsg_len; } if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE)) { @@ -1818,7 +1819,7 @@ static int netlink_route_multipath(int cmd, struct zebra_dplane_ctx *ctx, zlog_debug("%s: No useful nexthop.", __func__); } - return 0; + return req->n.nlmsg_len; } int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in) diff --git a/zebra/rt_netlink.h b/zebra/rt_netlink.h index 2b4b145149..64109e50e6 100644 --- a/zebra/rt_netlink.h +++ b/zebra/rt_netlink.h @@ -66,6 +66,9 @@ void rt_netlink_init(void); /* MPLS label forwarding table change, using dataplane context information. */ extern int netlink_mpls_multipath(int cmd, struct zebra_dplane_ctx *ctx); +extern ssize_t netlink_route_multipath(int cmd, struct zebra_dplane_ctx *ctx, + uint8_t *data, size_t datalen); + extern int netlink_route_change(struct nlmsghdr *h, ns_id_t ns_id, int startup); extern int netlink_route_read(struct zebra_ns *zns); -- 2.39.5