]> git.proxmox.com Git - mirror_frr.git/commitdiff
lib,doc,tests: printfrr %pNHcg, %pNHci
authorG. Paul Ziemba <p-fbsd-bugs@ziemba.us>
Thu, 9 Sep 2021 15:25:03 +0000 (08:25 -0700)
committerG. Paul Ziemba <p-fbsd-bugs@ziemba.us>
Tue, 14 Sep 2021 17:06:57 +0000 (10:06 -0700)
Signed-off-by: G. Paul Ziemba <paulz@labn.net>
doc/developer/logging.rst
lib/nexthop.c
tests/lib/test_printfrr.c

index b827afd6cc5cc9eccae1341b7caa518d128f8e68..681fc1173c54efe4243f284f378569fa14ec101f 100644 (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`
index 23e3a2b7337ab2eecefac78233263ae6a89e0f66..fc33a990c0d61e2e92bfeaec713390064793a6bf 100644 (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;
 }
index 21b3a916b862464b49b69f527aa22882b53fba92..06996a2f13caad0037626eef1cba47c581c36ce6 100644 (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;
 }