Skip to content

Commit

Permalink
bgpd, lib, pimd: Abstract commands for nexthop tracking
Browse files Browse the repository at this point in the history
Abstract the code that sends the zapi message into zebra
for the turn on/off of nexthop tracking for a prefix.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
  • Loading branch information
donaldsharp committed Jan 23, 2018
1 parent daeda3d commit 3c19254
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 51 deletions.
29 changes: 5 additions & 24 deletions bgpd/bgp_nht.c
Original file line number Diff line number Diff line change
Expand Up @@ -572,45 +572,26 @@ static int make_prefix(int afi, struct bgp_info *ri, struct prefix *p)
*/
static void sendmsg_zebra_rnh(struct bgp_nexthop_cache *bnc, int command)
{
struct stream *s;
struct prefix *p;
bool exact_match = false;
int ret;

/* Check socket. */
if (!zclient || zclient->sock < 0)
if (!zclient)
return;

/* Don't try to register if Zebra doesn't know of this instance. */
if (!IS_BGP_INST_KNOWN_TO_ZEBRA(bnc->bgp))
return;

p = &(bnc->node->p);
s = zclient->obuf;
stream_reset(s);
zclient_create_header(s, command, bnc->bgp->vrf_id);
if ((command == ZEBRA_NEXTHOP_REGISTER ||
command == ZEBRA_IMPORT_ROUTE_REGISTER) &&
(CHECK_FLAG(bnc->flags, BGP_NEXTHOP_CONNECTED)
|| CHECK_FLAG(bnc->flags, BGP_STATIC_ROUTE_EXACT_MATCH)))
stream_putc(s, 1);
else
stream_putc(s, 0);

stream_putw(s, PREFIX_FAMILY(p));
stream_putc(s, p->prefixlen);
switch (PREFIX_FAMILY(p)) {
case AF_INET:
stream_put_in_addr(s, &p->u.prefix4);
break;
case AF_INET6:
stream_put(s, &(p->u.prefix6), 16);
break;
default:
break;
}
stream_putw_at(s, 0, stream_get_endp(s));
exact_match = true;

ret = zclient_send_message(zclient);
ret = zclient_send_rnh(zclient, command, p,
exact_match, bnc->bgp->vrf_id);
/* TBD: handle the failure */
if (ret < 0)
zlog_warn("sendmsg_nexthop: zclient_send_message() failed");
Expand Down
27 changes: 27 additions & 0 deletions lib/zclient.c
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,33 @@ static int zclient_connect(struct thread *t)
return zclient_start(zclient);
}

int zclient_send_rnh(struct zclient *zclient, int command, struct prefix *p,
bool exact_match, vrf_id_t vrf_id)
{
struct stream *s;

s = zclient->obuf;
stream_reset(s);
zclient_create_header(s, command, vrf_id);
stream_putc(s, (exact_match) ? 1 : 0);

stream_putw(s, PREFIX_FAMILY(p));
stream_putc(s, p->prefixlen);
switch (PREFIX_FAMILY(p)) {
case AF_INET:
stream_put_in_addr(s, &p->u.prefix4);
break;
case AF_INET6:
stream_put(s, &(p->u.prefix6), 16);
break;
default:
break;
}
stream_putw_at(s, 0, stream_get_endp(s));

return zclient_send_message(zclient);
}

/*
* "xdr_encode"-like interface that allows daemon (client) to send
* a message to zebra server for a route that needs to be
Expand Down
3 changes: 3 additions & 0 deletions lib/zclient.h
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,9 @@ extern int zapi_ipv4_route_ipv6_nexthop(u_char, struct zclient *,
struct zapi_ipv6 *)
__attribute__((deprecated));
extern int zclient_route_send(u_char, struct zclient *, struct zapi_route *);
extern int zclient_send_rnh(struct zclient *zclient, int command,
struct prefix *p, bool exact_match,
vrf_id_t vrf_id);
extern int zapi_route_encode(u_char, struct stream *, struct zapi_route *);
extern int zapi_route_decode(struct stream *, struct zapi_route *);
bool zapi_route_notify_decode(struct stream *s, struct prefix *p,
Expand Down
28 changes: 1 addition & 27 deletions pimd/pim_nht.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,40 +47,14 @@
void pim_sendmsg_zebra_rnh(struct pim_instance *pim, struct zclient *zclient,
struct pim_nexthop_cache *pnc, int command)
{
struct stream *s;
struct prefix *p;
int ret;

/* Check socket. */
if (!zclient || zclient->sock < 0)
return;

p = &(pnc->rpf.rpf_addr);
s = zclient->obuf;
stream_reset(s);
zclient_create_header(s, command, pim->vrf_id);
/* get update for all routes for a prefix */
stream_putc(s, 0);

stream_putw(s, PREFIX_FAMILY(p));
stream_putc(s, p->prefixlen);
switch (PREFIX_FAMILY(p)) {
case AF_INET:
stream_put_in_addr(s, &p->u.prefix4);
break;
case AF_INET6:
stream_put(s, &(p->u.prefix6), 16);
break;
default:
break;
}
stream_putw_at(s, 0, stream_get_endp(s));

ret = zclient_send_message(zclient);
ret = zclient_send_rnh(zclient, command, p, false, pim->vrf_id);
if (ret < 0)
zlog_warn("sendmsg_nexthop: zclient_send_message() failed");


if (PIM_DEBUG_PIM_NHT) {
char buf[PREFIX2STR_BUFFER];
prefix2str(p, buf, sizeof(buf));
Expand Down

0 comments on commit 3c19254

Please sign in to comment.