lib,doc,tests: printfrr %pNHcg, %pNHci

Signed-off-by: G. Paul Ziemba <paulz@labn.net>
This commit is contained in:
G. Paul Ziemba 2021-09-09 08:25:03 -07:00
parent 4250098311
commit 016cfe701e
3 changed files with 79 additions and 0 deletions

View File

@ -191,6 +191,10 @@ Networking data types
``%pNHs``: :frrfmtout:`1.2.3.4 if 15` — same as :c:func:`nexthop2str()`
``%pNHcg``: :frrfmtout:`1.2.3.4` — compact gateway only
``%pNHci``: :frrfmtout:`eth0` — compact interface only
.. frrfmt:: %pBD (struct bgp_dest *)
:frrfmtout:`fe80::1234/64`

View File

@ -938,6 +938,12 @@ int nexthop_str2backups(const char *str, int *num_backups,
* unreachable (blackhole)
* %pNHs
* nexthop2str()
* %pNHcg
* 1.2.3.4
* (0-length if no IP address present)
* %pNHci
* eth0
* (0-length if no interface present)
*/
printfrr_ext_autoreg_p("NH", printfrr_nh)
static ssize_t printfrr_nh(struct fbuf *buf, struct printfrr_eargs *ea,
@ -1033,6 +1039,54 @@ static ssize_t printfrr_nh(struct fbuf *buf, struct printfrr_eargs *ea,
break;
}
return ret;
case 'c':
ea->fmt++;
if (*ea->fmt == 'g') {
ea->fmt++;
if (!nexthop)
return bputs(buf, "(null)");
switch (nexthop->type) {
case NEXTHOP_TYPE_IPV4:
case NEXTHOP_TYPE_IPV4_IFINDEX:
ret += bprintfrr(buf, "%pI4",
&nexthop->gate.ipv4);
break;
case NEXTHOP_TYPE_IPV6:
case NEXTHOP_TYPE_IPV6_IFINDEX:
ret += bprintfrr(buf, "%pI6",
&nexthop->gate.ipv6);
break;
case NEXTHOP_TYPE_IFINDEX:
case NEXTHOP_TYPE_BLACKHOLE:
break;
}
} else if (*ea->fmt == 'i') {
ea->fmt++;
if (!nexthop)
return bputs(buf, "(null)");
switch (nexthop->type) {
case NEXTHOP_TYPE_IFINDEX:
ret += bprintfrr(
buf, "%s",
ifindex2ifname(nexthop->ifindex,
nexthop->vrf_id));
break;
case NEXTHOP_TYPE_IPV4:
case NEXTHOP_TYPE_IPV4_IFINDEX:
case NEXTHOP_TYPE_IPV6:
case NEXTHOP_TYPE_IPV6_IFINDEX:
if (nexthop->ifindex)
ret += bprintfrr(
buf, "%s",
ifindex2ifname(
nexthop->ifindex,
nexthop->vrf_id));
break;
case NEXTHOP_TYPE_BLACKHOLE:
break;
}
}
return ret;
}
return -1;
}

View File

@ -24,6 +24,7 @@
#include "lib/printfrr.h"
#include "lib/memory.h"
#include "lib/prefix.h"
#include "lib/nexthop.h"
static int errors;
@ -253,5 +254,25 @@ int main(int argc, char **argv)
printchk("\"\"", "%pSQqn", (char *)NULL);
printchk("(null)", "%pSQq", (char *)NULL);
/*
* %pNH<foo> tests
*
* gateway addresses only for now: interfaces require more setup
*/
printchk("(null)", "%pNHcg", NULL);
printchk("(null)", "%pNHci", NULL);
struct nexthop nh;
memset(&nh, 0, sizeof(nh));
nh.type = NEXTHOP_TYPE_IPV4;
inet_aton("3.2.1.0", &nh.gate.ipv4);
printchk("3.2.1.0", "%pNHcg", &nh);
nh.type = NEXTHOP_TYPE_IPV6;
inet_pton(AF_INET6, "fe2c::34", &nh.gate.ipv6);
printchk("fe2c::34", "%pNHcg", &nh);
return !!errors;
}