2 * Copyright (C) 2016 by Open Source Routing.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; see the file COPYING; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
52 #define LDPBUFSIZ 65535
54 static int show_interface_msg(struct vty
*, struct imsg
*,
55 struct show_params
*);
56 static int show_interface_msg_json(struct imsg
*,
57 struct show_params
*, json_object
*);
58 static int show_discovery_msg(struct vty
*, struct imsg
*,
59 struct show_params
*);
60 static void show_discovery_detail_adj(struct vty
*, char *,
62 static int show_discovery_detail_msg(struct vty
*, struct imsg
*,
63 struct show_params
*);
64 static int show_discovery_msg_json(struct imsg
*,
65 struct show_params
*, json_object
*);
66 static void show_discovery_detail_adj_json(json_object
*,
68 static int show_discovery_detail_msg_json(struct imsg
*,
69 struct show_params
*, json_object
*);
71 static int show_nbr_msg(struct vty
*, struct imsg
*,
72 struct show_params
*);
73 static int show_nbr_msg_json(struct imsg
*, struct show_params
*,
75 static void show_nbr_detail_adj(struct vty
*, char *,
77 static int show_nbr_detail_msg(struct vty
*, struct imsg
*,
78 struct show_params
*);
79 static void show_nbr_detail_adj_json(struct ctl_adj
*,
81 static int show_nbr_detail_msg_json(struct imsg
*,
82 struct show_params
*, json_object
*);
83 static void show_nbr_capabilities(struct vty
*, struct ctl_nbr
*);
84 static int show_nbr_capabilities_msg(struct vty
*, struct imsg
*,
85 struct show_params
*);
86 static void show_nbr_capabilities_json(struct ctl_nbr
*,
88 static int show_nbr_capabilities_msg_json(struct imsg
*,
89 struct show_params
*, json_object
*);
90 static int show_lib_msg(struct vty
*, struct imsg
*,
91 struct show_params
*);
92 static int show_lib_detail_msg(struct vty
*, struct imsg
*,
93 struct show_params
*);
94 static int show_lib_msg_json(struct imsg
*, struct show_params
*,
96 static int show_lib_detail_msg_json(struct imsg
*,
97 struct show_params
*, json_object
*);
98 static int show_l2vpn_binding_msg(struct vty
*, struct imsg
*,
99 struct show_params
*);
100 static int show_l2vpn_binding_msg_json(struct imsg
*,
101 struct show_params
*, json_object
*);
102 static int show_l2vpn_pw_msg(struct vty
*, struct imsg
*,
103 struct show_params
*);
104 static int show_l2vpn_pw_msg_json(struct imsg
*,
105 struct show_params
*, json_object
*);
106 static int ldp_vty_connect(struct imsgbuf
*);
107 static int ldp_vty_dispatch_msg(struct vty
*, struct imsg
*,
108 enum show_command
, struct show_params
*,
110 static int ldp_vty_dispatch(struct vty
*, struct imsgbuf
*,
111 enum show_command
, struct show_params
*);
112 static int ldp_vty_get_af(const char *, int *);
115 show_interface_msg(struct vty
*vty
, struct imsg
*imsg
,
116 struct show_params
*params
)
118 struct ctl_iface
*iface
;
121 switch (imsg
->hdr
.type
) {
122 case IMSG_CTL_SHOW_INTERFACE
:
125 if (params
->family
!= AF_UNSPEC
&& params
->family
!= iface
->af
)
128 snprintf(timers
, sizeof(timers
), "%u/%u",
129 iface
->hello_interval
, iface
->hello_holdtime
);
131 vty_outln (vty
, "%-4s %-11s %-6s %-8s %-12s %3u",
132 af_name(iface
->af
), iface
->name
,
133 if_state_name(iface
->state
), iface
->uptime
== 0 ?
134 "00:00:00" : log_time(iface
->uptime
), timers
,
148 show_interface_msg_json(struct imsg
*imsg
, struct show_params
*params
,
151 struct ctl_iface
*iface
;
152 json_object
*json_iface
;
155 switch (imsg
->hdr
.type
) {
156 case IMSG_CTL_SHOW_INTERFACE
:
159 if (params
->family
!= AF_UNSPEC
&& params
->family
!= iface
->af
)
162 json_iface
= json_object_new_object();
163 json_object_string_add(json_iface
, "name", iface
->name
);
164 json_object_string_add(json_iface
, "addressFamily",
166 json_object_string_add(json_iface
, "state",
167 if_state_name(iface
->state
));
168 json_object_string_add(json_iface
, "upTime",
169 log_time(iface
->uptime
));
170 json_object_int_add(json_iface
, "helloInterval",
171 iface
->hello_interval
);
172 json_object_int_add(json_iface
, "helloHoldtime",
173 iface
->hello_holdtime
);
174 json_object_int_add(json_iface
, "adjacencyCount",
177 sprintf(key_name
, "%s: %s", iface
->name
, af_name(iface
->af
));
178 json_object_object_add(json
, key_name
, json_iface
);
190 show_discovery_msg(struct vty
*vty
, struct imsg
*imsg
,
191 struct show_params
*params
)
196 switch (imsg
->hdr
.type
) {
197 case IMSG_CTL_SHOW_DISCOVERY
:
200 if (params
->family
!= AF_UNSPEC
&& params
->family
!= adj
->af
)
203 vty_out(vty
, "%-4s %-15s ", af_name(adj
->af
),
207 vty_out(vty
, "%-8s %-15s ", "Link", adj
->ifname
);
210 addr
= log_addr(adj
->af
, &adj
->src_addr
);
212 vty_out(vty
, "%-8s %-15s ", "Targeted", addr
);
213 if (strlen(addr
) > 15)
214 vty_out(vty
, "%s%46s", VTY_NEWLINE
, " ");
217 vty_outln (vty
, "%9u", adj
->holdtime
);
230 show_discovery_detail_adj(struct vty
*vty
, char *buffer
, struct ctl_adj
*adj
)
232 size_t buflen
= strlen(buffer
);
234 snprintf(buffer
+ buflen
, LDPBUFSIZ
- buflen
,
235 " LSR Id: %s:0%s", inet_ntoa(adj
->id
), VTY_NEWLINE
);
236 buflen
= strlen(buffer
);
237 snprintf(buffer
+ buflen
, LDPBUFSIZ
- buflen
,
238 " Source address: %s%s",
239 log_addr(adj
->af
, &adj
->src_addr
), VTY_NEWLINE
);
240 buflen
= strlen(buffer
);
241 snprintf(buffer
+ buflen
, LDPBUFSIZ
- buflen
,
242 " Transport address: %s%s",
243 log_addr(adj
->af
, &adj
->trans_addr
), VTY_NEWLINE
);
244 buflen
= strlen(buffer
);
245 snprintf(buffer
+ buflen
, LDPBUFSIZ
- buflen
,
246 " Hello hold time: %u secs (due in %u secs)%s",
247 adj
->holdtime
, adj
->holdtime_remaining
, VTY_NEWLINE
);
248 buflen
= strlen(buffer
);
249 snprintf(buffer
+ buflen
, LDPBUFSIZ
- buflen
,
250 " Dual-stack capability TLV: %s%s",
251 (adj
->ds_tlv
) ? "yes" : "no", VTY_NEWLINE
);
255 show_discovery_detail_msg(struct vty
*vty
, struct imsg
*imsg
,
256 struct show_params
*params
)
259 struct ctl_disc_if
*iface
;
260 struct ctl_disc_tnbr
*tnbr
;
261 struct in_addr rtr_id
;
262 union ldpd_addr
*trans_addr
;
264 static char ifaces_buffer
[LDPBUFSIZ
];
265 static char tnbrs_buffer
[LDPBUFSIZ
];
267 switch (imsg
->hdr
.type
) {
268 case IMSG_CTL_SHOW_DISCOVERY
:
269 ifaces_buffer
[0] = '\0';
270 tnbrs_buffer
[0] = '\0';
272 case IMSG_CTL_SHOW_DISC_IFACE
:
275 if (params
->family
!= AF_UNSPEC
&&
276 ((params
->family
== AF_INET
&& !iface
->active_v4
) ||
277 (params
->family
== AF_INET6
&& !iface
->active_v6
)))
280 buflen
= strlen(ifaces_buffer
);
281 snprintf(ifaces_buffer
+ buflen
, LDPBUFSIZ
- buflen
,
282 " %s: %s%s", iface
->name
, (iface
->no_adj
) ?
283 "(no adjacencies)" : "", VTY_NEWLINE
);
285 case IMSG_CTL_SHOW_DISC_TNBR
:
288 if (params
->family
!= AF_UNSPEC
&& params
->family
!= tnbr
->af
)
291 trans_addr
= &(ldp_af_conf_get(ldpd_conf
,
292 tnbr
->af
))->trans_addr
;
293 buflen
= strlen(tnbrs_buffer
);
294 snprintf(tnbrs_buffer
+ buflen
, LDPBUFSIZ
- buflen
,
295 " %s -> %s: %s%s", log_addr(tnbr
->af
, trans_addr
),
296 log_addr(tnbr
->af
, &tnbr
->addr
), (tnbr
->no_adj
) ?
297 "(no adjacencies)" : "", VTY_NEWLINE
);
299 case IMSG_CTL_SHOW_DISC_ADJ
:
302 if (params
->family
!= AF_UNSPEC
&& params
->family
!= adj
->af
)
307 show_discovery_detail_adj(vty
, ifaces_buffer
, adj
);
310 show_discovery_detail_adj(vty
, tnbrs_buffer
, adj
);
315 rtr_id
.s_addr
= ldp_rtr_id_get(ldpd_conf
);
316 vty_outln (vty
, "Local:");
317 vty_outln (vty
, " LSR Id: %s:0",inet_ntoa(rtr_id
));
318 if (ldpd_conf
->ipv4
.flags
& F_LDPD_AF_ENABLED
)
319 vty_outln (vty
, " Transport Address (IPv4): %s",
320 log_addr(AF_INET
, &ldpd_conf
->ipv4
.trans_addr
));
321 if (ldpd_conf
->ipv6
.flags
& F_LDPD_AF_ENABLED
)
322 vty_outln (vty
, " Transport Address (IPv6): %s",
323 log_addr(AF_INET6
, &ldpd_conf
->ipv6
.trans_addr
));
324 vty_outln (vty
, "Discovery Sources:");
325 vty_outln (vty
, " Interfaces:");
326 vty_out(vty
, "%s", ifaces_buffer
);
327 vty_outln (vty
, " Targeted Hellos:");
328 vty_out(vty
, "%s", tnbrs_buffer
);
339 show_discovery_msg_json(struct imsg
*imsg
, struct show_params
*params
,
343 json_object
*json_array
;
344 json_object
*json_adj
;
346 switch (imsg
->hdr
.type
) {
347 case IMSG_CTL_SHOW_DISCOVERY
:
350 if (params
->family
!= AF_UNSPEC
&& params
->family
!= adj
->af
)
353 json_object_object_get_ex(json
, "adjacencies", &json_array
);
355 json_array
= json_object_new_array();
356 json_object_object_add(json
, "adjacencies", json_array
);
359 json_adj
= json_object_new_object();
360 json_object_string_add(json_adj
, "addressFamily",
362 json_object_string_add(json_adj
, "neighborId",
366 json_object_string_add(json_adj
, "type", "link");
367 json_object_string_add(json_adj
, "interface",
371 json_object_string_add(json_adj
, "type", "targeted");
372 json_object_string_add(json_adj
, "peer",
373 log_addr(adj
->af
, &adj
->src_addr
));
376 json_object_int_add(json_adj
, "helloHoldtime", adj
->holdtime
);
378 json_object_array_add(json_array
, json_adj
);
390 show_discovery_detail_adj_json(json_object
*json
, struct ctl_adj
*adj
)
392 json_object
*json_adj
;
393 json_object
*json_array
;
395 json_object_object_get_ex(json
, "adjacencies", &json_array
);
397 json_array
= json_object_new_array();
398 json_object_object_add(json
, "adjacencies", json_array
);
401 json_adj
= json_object_new_object();
402 json_object_string_add(json_adj
, "lsrId", inet_ntoa(adj
->id
));
403 json_object_string_add(json_adj
, "sourceAddress", log_addr(adj
->af
,
405 json_object_string_add(json_adj
, "transportAddress", log_addr(adj
->af
,
407 json_object_int_add(json_adj
, "helloHoldtime", adj
->holdtime
);
408 json_object_int_add(json_adj
, "helloHoldtimeRemaining",
409 adj
->holdtime_remaining
);
410 json_object_int_add(json_adj
, "dualStackCapabilityTlv",
412 json_object_array_add(json_array
, json_adj
);
416 show_discovery_detail_msg_json(struct imsg
*imsg
, struct show_params
*params
,
420 struct ctl_disc_if
*iface
;
421 struct ctl_disc_tnbr
*tnbr
;
422 struct in_addr rtr_id
;
423 union ldpd_addr
*trans_addr
;
424 json_object
*json_interface
;
425 json_object
*json_target
;
426 static json_object
*json_interfaces
;
427 static json_object
*json_targets
;
428 static json_object
*json_container
;
430 switch (imsg
->hdr
.type
) {
431 case IMSG_CTL_SHOW_DISCOVERY
:
432 rtr_id
.s_addr
= ldp_rtr_id_get(ldpd_conf
);
433 json_object_string_add(json
, "lsrId", inet_ntoa(rtr_id
));
434 if (ldpd_conf
->ipv4
.flags
& F_LDPD_AF_ENABLED
)
435 json_object_string_add(json
, "transportAddressIPv4",
436 log_addr(AF_INET
, &ldpd_conf
->ipv4
.trans_addr
));
437 if (ldpd_conf
->ipv6
.flags
& F_LDPD_AF_ENABLED
)
438 json_object_string_add(json
, "transportAddressIPv6",
439 log_addr(AF_INET6
, &ldpd_conf
->ipv6
.trans_addr
));
440 json_interfaces
= json_object_new_object();
441 json_object_object_add(json
, "interfaces", json_interfaces
);
442 json_targets
= json_object_new_object();
443 json_object_object_add(json
, "targetedHellos", json_targets
);
444 json_container
= NULL
;
446 case IMSG_CTL_SHOW_DISC_IFACE
:
449 if (params
->family
!= AF_UNSPEC
&&
450 ((params
->family
== AF_INET
&& !iface
->active_v4
) ||
451 (params
->family
== AF_INET6
&& !iface
->active_v6
)))
454 json_interface
= json_object_new_object();
455 json_object_object_add(json_interfaces
, iface
->name
,
457 json_container
= json_interface
;
459 case IMSG_CTL_SHOW_DISC_TNBR
:
462 if (params
->family
!= AF_UNSPEC
&& params
->family
!= tnbr
->af
)
465 trans_addr
= &(ldp_af_conf_get(ldpd_conf
, tnbr
->af
))->trans_addr
;
467 json_target
= json_object_new_object();
468 json_object_string_add(json_target
, "sourceAddress",
469 log_addr(tnbr
->af
, trans_addr
));
470 json_object_object_add(json_targets
, log_addr(tnbr
->af
,
471 &tnbr
->addr
), json_target
);
472 json_container
= json_target
;
474 case IMSG_CTL_SHOW_DISC_ADJ
:
477 if (params
->family
!= AF_UNSPEC
&& params
->family
!= adj
->af
)
482 show_discovery_detail_adj_json(json_container
, adj
);
485 show_discovery_detail_adj_json(json_container
, adj
);
499 show_nbr_msg(struct vty
*vty
, struct imsg
*imsg
, struct show_params
*params
)
504 switch (imsg
->hdr
.type
) {
505 case IMSG_CTL_SHOW_NBR
:
508 addr
= log_addr(nbr
->af
, &nbr
->raddr
);
510 vty_out(vty
, "%-4s %-15s %-11s %-15s",
511 af_name(nbr
->af
), inet_ntoa(nbr
->id
),
512 nbr_state_name(nbr
->nbr_state
), addr
);
513 if (strlen(addr
) > 15)
514 vty_out(vty
, "%s%48s", VTY_NEWLINE
, " ");
515 vty_outln (vty
, " %8s", log_time(nbr
->uptime
));
527 show_nbr_detail_adj(struct vty
*vty
, char *buffer
, struct ctl_adj
*adj
)
529 size_t buflen
= strlen(buffer
);
533 snprintf(buffer
+ buflen
, LDPBUFSIZ
- buflen
,
534 " Interface: %s%s", adj
->ifname
, VTY_NEWLINE
);
537 snprintf(buffer
+ buflen
, LDPBUFSIZ
- buflen
,
538 " Targeted Hello: %s%s", log_addr(adj
->af
,
539 &adj
->src_addr
), VTY_NEWLINE
);
545 show_nbr_detail_msg(struct vty
*vty
, struct imsg
*imsg
,
546 struct show_params
*params
)
549 struct ldp_stats
*stats
;
551 static char v4adjs_buffer
[LDPBUFSIZ
];
552 static char v6adjs_buffer
[LDPBUFSIZ
];
554 switch (imsg
->hdr
.type
) {
555 case IMSG_CTL_SHOW_NBR
:
558 v4adjs_buffer
[0] = '\0';
559 v6adjs_buffer
[0] = '\0';
560 vty_outln (vty
, "Peer LDP Identifier: %s:0",
562 vty_outln (vty
, " TCP connection: %s:%u - %s:%u",
563 log_addr(nbr
->af
, &nbr
->laddr
), ntohs(nbr
->lport
),
564 log_addr(nbr
->af
, &nbr
->raddr
),ntohs(nbr
->rport
));
565 vty_outln (vty
, " Authentication: %s",
566 (nbr
->auth_method
== AUTH_MD5SIG
) ? "TCP MD5 Signature" : "none");
567 vty_outln(vty
, " Session Holdtime: %u secs; "
568 "KeepAlive interval: %u secs", nbr
->holdtime
,
569 nbr
->holdtime
/ KEEPALIVE_PER_PERIOD
);
570 vty_outln(vty
, " State: %s; Downstream-Unsolicited",
571 nbr_state_name(nbr
->nbr_state
));
572 vty_outln (vty
, " Up time: %s",log_time(nbr
->uptime
));
575 vty_outln (vty
, " Messages sent/rcvd:");
576 vty_outln (vty
, " - Keepalive Messages: %u/%u",
577 stats
->kalive_sent
, stats
->kalive_rcvd
);
578 vty_outln (vty
, " - Address Messages: %u/%u",
579 stats
->addr_sent
, stats
->addr_rcvd
);
580 vty_outln (vty
, " - Address Withdraw Messages: %u/%u",
581 stats
->addrwdraw_sent
, stats
->addrwdraw_rcvd
);
582 vty_outln (vty
, " - Notification Messages: %u/%u",
583 stats
->notif_sent
, stats
->notif_rcvd
);
584 vty_outln (vty
, " - Capability Messages: %u/%u",
585 stats
->capability_sent
, stats
->capability_rcvd
);
586 vty_outln (vty
, " - Label Mapping Messages: %u/%u",
587 stats
->labelmap_sent
, stats
->labelmap_rcvd
);
588 vty_outln (vty
, " - Label Request Messages: %u/%u",
589 stats
->labelreq_sent
, stats
->labelreq_rcvd
);
590 vty_outln (vty
, " - Label Withdraw Messages: %u/%u",
591 stats
->labelwdraw_sent
, stats
->labelwdraw_rcvd
);
592 vty_outln (vty
, " - Label Release Messages: %u/%u",
593 stats
->labelrel_sent
, stats
->labelrel_rcvd
);
594 vty_outln (vty
, " - Label Abort Request Messages: %u/%u",
595 stats
->labelabreq_sent
, stats
->labelabreq_rcvd
);
597 show_nbr_capabilities(vty
, nbr
);
599 case IMSG_CTL_SHOW_NBR_DISC
:
604 show_nbr_detail_adj(vty
, v4adjs_buffer
, adj
);
607 show_nbr_detail_adj(vty
, v6adjs_buffer
, adj
);
610 fatalx("show_nbr_detail_msg: unknown af");
613 case IMSG_CTL_SHOW_NBR_END
:
614 vty_outln (vty
, " LDP Discovery Sources:");
615 if (v4adjs_buffer
[0] != '\0') {
616 vty_outln (vty
, " IPv4:");
617 vty_out(vty
, "%s", v4adjs_buffer
);
619 if (v6adjs_buffer
[0] != '\0') {
620 vty_outln (vty
, " IPv6:");
621 vty_out(vty
, "%s", v6adjs_buffer
);
635 show_nbr_msg_json(struct imsg
*imsg
, struct show_params
*params
,
639 json_object
*json_array
;
640 json_object
*json_nbr
;
642 switch (imsg
->hdr
.type
) {
643 case IMSG_CTL_SHOW_NBR
:
646 json_object_object_get_ex(json
, "neighbors", &json_array
);
648 json_array
= json_object_new_array();
649 json_object_object_add(json
, "neighbors", json_array
);
652 json_nbr
= json_object_new_object();
653 json_object_string_add(json_nbr
, "addressFamily",
655 json_object_string_add(json_nbr
, "neighborId",
657 json_object_string_add(json_nbr
, "state",
658 nbr_state_name(nbr
->nbr_state
));
659 json_object_string_add(json_nbr
, "transportAddress",
660 log_addr(nbr
->af
, &nbr
->raddr
));
661 json_object_string_add(json_nbr
, "upTime",
662 log_time(nbr
->uptime
));
664 json_object_array_add(json_array
, json_nbr
);
676 show_nbr_detail_adj_json(struct ctl_adj
*adj
, json_object
*adj_list
)
678 char adj_string
[128];
682 strlcpy(adj_string
, "interface: ", sizeof(adj_string
));
683 strlcat(adj_string
, adj
->ifname
, sizeof(adj_string
));
686 strlcpy(adj_string
, "targetedHello: ", sizeof(adj_string
));
687 strlcat(adj_string
, log_addr(adj
->af
, &adj
->src_addr
),
692 json_object_array_add(adj_list
, json_object_new_string(adj_string
));
696 show_nbr_detail_msg_json(struct imsg
*imsg
, struct show_params
*params
,
700 struct ldp_stats
*stats
;
702 json_object
*json_nbr
;
703 json_object
*json_array
;
704 json_object
*json_counter
;
705 static json_object
*json_nbr_sources
;
706 static json_object
*json_v4adjs
;
707 static json_object
*json_v6adjs
;
709 switch (imsg
->hdr
.type
) {
710 case IMSG_CTL_SHOW_NBR
:
713 json_nbr
= json_object_new_object();
714 json_object_object_add(json
, inet_ntoa(nbr
->id
), json_nbr
);
716 json_object_string_add(json_nbr
, "peerId", inet_ntoa(nbr
->id
));
717 json_object_string_add(json_nbr
, "tcpLocalAddress",
718 log_addr(nbr
->af
, &nbr
->laddr
));
719 json_object_int_add(json_nbr
, "tcpLocalPort",
721 json_object_string_add(json_nbr
, "tcpRemoteAddress",
722 log_addr(nbr
->af
, &nbr
->raddr
));
723 json_object_int_add(json_nbr
, "tcpRemotePort",
725 json_object_string_add(json_nbr
, "authentication",
726 (nbr
->auth_method
== AUTH_MD5SIG
) ? "TCP MD5 Signature" :
728 json_object_int_add(json_nbr
, "sessionHoldtime", nbr
->holdtime
);
729 json_object_int_add(json_nbr
, "keepAliveInterval",
730 nbr
->holdtime
/ KEEPALIVE_PER_PERIOD
);
731 json_object_string_add(json_nbr
, "state",
732 nbr_state_name(nbr
->nbr_state
));
733 json_object_string_add(json_nbr
, "upTime",
734 log_time(nbr
->uptime
));
736 /* message_counters */
738 json_array
= json_object_new_array();
739 json_object_object_add(json_nbr
, "sentMessages", json_array
);
740 json_counter
= json_object_new_object();
741 json_object_int_add(json_counter
, "keepalive",
743 json_object_array_add(json_array
, json_counter
);
744 json_counter
= json_object_new_object();
745 json_object_int_add(json_counter
, "address",
747 json_object_array_add(json_array
, json_counter
);
748 json_counter
= json_object_new_object();
749 json_object_int_add(json_counter
, "addressWithdraw",
750 stats
->addrwdraw_sent
);
751 json_object_array_add(json_array
, json_counter
);
752 json_counter
= json_object_new_object();
753 json_object_int_add(json_counter
, "notification",
755 json_object_array_add(json_array
, json_counter
);
756 json_counter
= json_object_new_object();
757 json_object_int_add(json_counter
, "capability",
758 stats
->capability_sent
);
759 json_object_array_add(json_array
, json_counter
);
760 json_counter
= json_object_new_object();
761 json_object_int_add(json_counter
, "labelMapping",
762 stats
->labelmap_sent
);
763 json_object_array_add(json_array
, json_counter
);
764 json_counter
= json_object_new_object();
765 json_object_int_add(json_counter
, "labelRequest",
766 stats
->labelreq_sent
);
767 json_object_array_add(json_array
, json_counter
);
768 json_counter
= json_object_new_object();
769 json_object_int_add(json_counter
, "labelWithdraw",
770 stats
->labelwdraw_sent
);
771 json_object_array_add(json_array
, json_counter
);
772 json_counter
= json_object_new_object();
773 json_object_int_add(json_counter
, "labelRelease",
774 stats
->labelrel_sent
);
775 json_object_array_add(json_array
, json_counter
);
776 json_counter
= json_object_new_object();
777 json_object_int_add(json_counter
, "labelAbortRequest",
778 stats
->labelabreq_sent
);
779 json_object_array_add(json_array
, json_counter
);
781 json_array
= json_object_new_array();
782 json_object_object_add(json_nbr
, "receivedMessages", json_array
);
783 json_counter
= json_object_new_object();
784 json_object_int_add(json_counter
, "keepalive",
786 json_object_array_add(json_array
, json_counter
);
787 json_counter
= json_object_new_object();
788 json_object_int_add(json_counter
, "address",
790 json_object_array_add(json_array
, json_counter
);
791 json_counter
= json_object_new_object();
792 json_object_int_add(json_counter
, "addressWithdraw",
793 stats
->addrwdraw_rcvd
);
794 json_object_array_add(json_array
, json_counter
);
795 json_counter
= json_object_new_object();
796 json_object_int_add(json_counter
, "notification",
798 json_object_array_add(json_array
, json_counter
);
799 json_counter
= json_object_new_object();
800 json_object_int_add(json_counter
, "capability",
801 stats
->capability_rcvd
);
802 json_object_array_add(json_array
, json_counter
);
803 json_counter
= json_object_new_object();
804 json_object_int_add(json_counter
, "labelMapping",
805 stats
->labelmap_rcvd
);
806 json_object_array_add(json_array
, json_counter
);
807 json_counter
= json_object_new_object();
808 json_object_int_add(json_counter
, "labelRequest",
809 stats
->labelreq_rcvd
);
810 json_object_array_add(json_array
, json_counter
);
811 json_counter
= json_object_new_object();
812 json_object_int_add(json_counter
, "labelWithdraw",
813 stats
->labelwdraw_rcvd
);
814 json_object_array_add(json_array
, json_counter
);
815 json_counter
= json_object_new_object();
816 json_object_int_add(json_counter
, "labelRelease",
817 stats
->labelrel_rcvd
);
818 json_object_array_add(json_array
, json_counter
);
819 json_counter
= json_object_new_object();
820 json_object_int_add(json_counter
, "labelAbortRequest",
821 stats
->labelabreq_rcvd
);
822 json_object_array_add(json_array
, json_counter
);
825 show_nbr_capabilities_json(nbr
, json_nbr
);
827 /* discovery sources */
828 json_nbr_sources
= json_object_new_object();
829 json_object_object_add(json_nbr
, "discoverySources",
834 case IMSG_CTL_SHOW_NBR_DISC
:
840 json_v4adjs
= json_object_new_array();
841 json_object_object_add(json_nbr_sources
, "ipv4",
844 show_nbr_detail_adj_json(adj
, json_v4adjs
);
848 json_v6adjs
= json_object_new_array();
849 json_object_object_add(json_nbr_sources
, "ipv6",
852 show_nbr_detail_adj_json(adj
, json_v6adjs
);
855 fatalx("show_nbr_detail_msg_json: unknown af");
858 case IMSG_CTL_SHOW_NBR_END
:
870 show_nbr_capabilities(struct vty
*vty
, struct ctl_nbr
*nbr
)
872 vty_outln (vty
, " Capabilities Sent:%s"
873 " - Dynamic Announcement (0x0506)%s"
874 " - Typed Wildcard (0x050B)%s"
875 " - Unrecognized Notification (0x0603)",
876 VTY_NEWLINE
, VTY_NEWLINE
, VTY_NEWLINE
);
877 vty_outln (vty
, " Capabilities Received:");
878 if (nbr
->flags
& F_NBR_CAP_DYNAMIC
)
879 vty_outln (vty
," - Dynamic Announcement (0x0506)");
880 if (nbr
->flags
& F_NBR_CAP_TWCARD
)
881 vty_outln (vty
, " - Typed Wildcard (0x050B)");
882 if (nbr
->flags
& F_NBR_CAP_UNOTIF
)
883 vty_outln (vty
," - Unrecognized Notification (0x0603)");
887 show_nbr_capabilities_msg(struct vty
*vty
, struct imsg
*imsg
, struct show_params
*params
)
891 switch (imsg
->hdr
.type
) {
892 case IMSG_CTL_SHOW_NBR
:
895 if (nbr
->nbr_state
!= NBR_STA_OPER
)
898 vty_outln (vty
, "Peer LDP Identifier: %s:0",
900 show_nbr_capabilities(vty
, nbr
);
914 show_nbr_capabilities_json(struct ctl_nbr
*nbr
, json_object
*json_nbr
)
916 json_object
*json_array
;
917 json_object
*json_cap
;
919 /* sent capabilities */
920 json_array
= json_object_new_array();
921 json_object_object_add(json_nbr
, "sentCapabilities", json_array
);
923 /* Dynamic Announcement (0x0506) */
924 json_cap
= json_object_new_object();
925 json_object_string_add(json_cap
, "description", "Dynamic Announcement");
926 json_object_string_add(json_cap
, "tlvType", "0x0506");
927 json_object_array_add(json_array
, json_cap
);
929 /* Typed Wildcard (0x050B) */
930 json_cap
= json_object_new_object();
931 json_object_string_add(json_cap
, "description", "Typed Wildcard");
932 json_object_string_add(json_cap
, "tlvType", "0x050B");
933 json_object_array_add(json_array
, json_cap
);
935 /* Unrecognized Notification (0x0603) */
936 json_cap
= json_object_new_object();
937 json_object_string_add(json_cap
, "description",
938 "Unrecognized Notification");
939 json_object_string_add(json_cap
, "tlvType", "0x0603");
940 json_object_array_add(json_array
, json_cap
);
942 /* received capabilities */
943 json_array
= json_object_new_array();
944 json_object_object_add(json_nbr
, "receivedCapabilities", json_array
);
946 /* Dynamic Announcement (0x0506) */
947 if (nbr
->flags
& F_NBR_CAP_DYNAMIC
) {
948 json_cap
= json_object_new_object();
949 json_object_string_add(json_cap
, "description",
950 "Dynamic Announcement");
951 json_object_string_add(json_cap
, "tlvType", "0x0506");
952 json_object_array_add(json_array
, json_cap
);
955 /* Typed Wildcard (0x050B) */
956 if (nbr
->flags
& F_NBR_CAP_TWCARD
) {
957 json_cap
= json_object_new_object();
958 json_object_string_add(json_cap
, "description",
960 json_object_string_add(json_cap
, "tlvType", "0x050B");
961 json_object_array_add(json_array
, json_cap
);
964 /* Unrecognized Notification (0x0603) */
965 if (nbr
->flags
& F_NBR_CAP_UNOTIF
) {
966 json_cap
= json_object_new_object();
967 json_object_string_add(json_cap
, "description",
968 "Unrecognized Notification");
969 json_object_string_add(json_cap
, "tlvType", "0x0603");
970 json_object_array_add(json_array
, json_cap
);
975 show_nbr_capabilities_msg_json(struct imsg
*imsg
, struct show_params
*params
,
979 json_object
*json_nbr
;
981 switch (imsg
->hdr
.type
) {
982 case IMSG_CTL_SHOW_NBR
:
985 if (nbr
->nbr_state
!= NBR_STA_OPER
)
988 json_nbr
= json_object_new_object();
989 json_object_object_add(json
, inet_ntoa(nbr
->id
), json_nbr
);
990 show_nbr_capabilities_json(nbr
, json_nbr
);
1002 show_lib_msg(struct vty
*vty
, struct imsg
*imsg
, struct show_params
*params
)
1005 char dstnet
[BUFSIZ
];
1007 switch (imsg
->hdr
.type
) {
1008 case IMSG_CTL_SHOW_LIB_BEGIN
:
1009 case IMSG_CTL_SHOW_LIB_RCVD
:
1012 if (imsg
->hdr
.type
== IMSG_CTL_SHOW_LIB_BEGIN
&&
1016 if (params
->family
!= AF_UNSPEC
&& params
->family
!= rt
->af
)
1019 snprintf(dstnet
, sizeof(dstnet
), "%s/%d",
1020 log_addr(rt
->af
, &rt
->prefix
), rt
->prefixlen
);
1022 vty_out(vty
, "%-4s %-20s", af_name(rt
->af
), dstnet
);
1023 if (strlen(dstnet
) > 20)
1024 vty_out(vty
, "%s%25s", VTY_NEWLINE
, " ");
1025 vty_outln (vty
, " %-15s %-11s %-13s %6s", inet_ntoa(rt
->nexthop
),
1026 log_label(rt
->local_label
), log_label(rt
->remote_label
),
1027 rt
->in_use
? "yes" : "no");
1030 vty_outln (vty
, "");
1040 show_lib_detail_msg(struct vty
*vty
, struct imsg
*imsg
, struct show_params
*params
)
1042 struct ctl_rt
*rt
= NULL
;
1043 char dstnet
[BUFSIZ
];
1044 static int upstream
, downstream
;
1046 static char sent_buffer
[LDPBUFSIZ
];
1047 static char rcvd_buffer
[LDPBUFSIZ
];
1049 switch (imsg
->hdr
.type
) {
1050 case IMSG_CTL_SHOW_LIB_BEGIN
:
1051 case IMSG_CTL_SHOW_LIB_SENT
:
1052 case IMSG_CTL_SHOW_LIB_RCVD
:
1053 case IMSG_CTL_SHOW_LIB_END
:
1055 if (params
->family
!= AF_UNSPEC
&& params
->family
!= rt
->af
)
1062 switch (imsg
->hdr
.type
) {
1063 case IMSG_CTL_SHOW_LIB_BEGIN
:
1066 sent_buffer
[0] = '\0';
1067 rcvd_buffer
[0] = '\0';
1069 snprintf(dstnet
, sizeof(dstnet
), "%s/%d",
1070 log_addr(rt
->af
, &rt
->prefix
), rt
->prefixlen
);
1072 vty_outln (vty
, "%s", dstnet
);
1073 vty_outln (vty
, "%-8sLocal binding: label: %s", "",
1074 log_label(rt
->local_label
));
1076 case IMSG_CTL_SHOW_LIB_SENT
:
1078 buflen
= strlen(sent_buffer
);
1079 snprintf(sent_buffer
+ buflen
, LDPBUFSIZ
- buflen
,
1080 "%12s%s:0%s", "", inet_ntoa(rt
->nexthop
), VTY_NEWLINE
);
1082 case IMSG_CTL_SHOW_LIB_RCVD
:
1084 buflen
= strlen(rcvd_buffer
);
1085 snprintf(rcvd_buffer
+ buflen
, LDPBUFSIZ
- buflen
,
1086 "%12s%s:0, label %s%s%s", "", inet_ntoa(rt
->nexthop
),
1087 log_label(rt
->remote_label
),
1088 rt
->in_use
? " (in use)" : "", VTY_NEWLINE
);
1090 case IMSG_CTL_SHOW_LIB_END
:
1092 vty_outln (vty
, "%-8sAdvertised to:", "");
1093 vty_out(vty
, "%s", sent_buffer
);
1096 vty_outln (vty
, "%-8sRemote bindings:", "");
1097 vty_out(vty
, "%s", rcvd_buffer
);
1099 vty_outln (vty
, "%-8sNo remote bindings","");
1102 vty_outln (vty
, "");
1112 show_lib_msg_json(struct imsg
*imsg
, struct show_params
*params
,
1116 json_object
*json_array
;
1117 json_object
*json_lib_entry
;
1118 char dstnet
[BUFSIZ
];
1120 switch (imsg
->hdr
.type
) {
1121 case IMSG_CTL_SHOW_LIB_BEGIN
:
1122 case IMSG_CTL_SHOW_LIB_RCVD
:
1125 if (imsg
->hdr
.type
== IMSG_CTL_SHOW_LIB_BEGIN
&&
1129 json_object_object_get_ex(json
, "bindings", &json_array
);
1131 json_array
= json_object_new_array();
1132 json_object_object_add(json
, "bindings", json_array
);
1135 json_lib_entry
= json_object_new_object();
1136 json_object_string_add(json_lib_entry
, "addressFamily",
1138 snprintf(dstnet
, sizeof(dstnet
), "%s/%d",
1139 log_addr(rt
->af
, &rt
->prefix
), rt
->prefixlen
);
1140 json_object_string_add(json_lib_entry
, "prefix", dstnet
);
1141 json_object_string_add(json_lib_entry
, "neighborId",
1142 inet_ntoa(rt
->nexthop
));
1143 json_object_string_add(json_lib_entry
, "localLabel",
1144 log_label(rt
->local_label
));
1145 json_object_string_add(json_lib_entry
, "remoteLabel",
1146 log_label(rt
->remote_label
));
1147 json_object_int_add(json_lib_entry
, "inUse", rt
->in_use
);
1149 json_object_array_add(json_array
, json_lib_entry
);
1161 show_lib_detail_msg_json(struct imsg
*imsg
, struct show_params
*params
,
1164 struct ctl_rt
*rt
= NULL
;
1165 char dstnet
[BUFSIZ
];
1166 static json_object
*json_lib_entry
;
1167 static json_object
*json_adv_labels
;
1168 json_object
*json_adv_label
;
1169 static json_object
*json_remote_labels
;
1170 json_object
*json_remote_label
;
1172 switch (imsg
->hdr
.type
) {
1173 case IMSG_CTL_SHOW_LIB_BEGIN
:
1174 case IMSG_CTL_SHOW_LIB_SENT
:
1175 case IMSG_CTL_SHOW_LIB_RCVD
:
1176 case IMSG_CTL_SHOW_LIB_END
:
1178 if (params
->family
!= AF_UNSPEC
&& params
->family
!= rt
->af
)
1185 switch (imsg
->hdr
.type
) {
1186 case IMSG_CTL_SHOW_LIB_BEGIN
:
1187 snprintf(dstnet
, sizeof(dstnet
), "%s/%d",
1188 log_addr(rt
->af
, &rt
->prefix
), rt
->prefixlen
);
1190 json_lib_entry
= json_object_new_object();
1191 json_object_string_add(json_lib_entry
, "localLabel",
1192 log_label(rt
->local_label
));
1194 json_adv_labels
= json_object_new_array();
1195 json_object_object_add(json_lib_entry
, "advertisedTo",
1198 json_remote_labels
= json_object_new_array();
1199 json_object_object_add(json_lib_entry
, "remoteLabels",
1200 json_remote_labels
);
1202 json_object_object_add(json
, dstnet
, json_lib_entry
);
1204 case IMSG_CTL_SHOW_LIB_SENT
:
1205 json_adv_label
= json_object_new_object();
1206 json_object_string_add(json_adv_label
, "neighborId",
1207 inet_ntoa(rt
->nexthop
));
1208 json_object_array_add(json_adv_labels
, json_adv_label
);
1210 case IMSG_CTL_SHOW_LIB_RCVD
:
1211 json_remote_label
= json_object_new_object();
1212 json_object_string_add(json_remote_label
, "neighborId",
1213 inet_ntoa(rt
->nexthop
));
1214 json_object_string_add(json_remote_label
, "label",
1215 log_label(rt
->remote_label
));
1216 json_object_int_add(json_remote_label
, "inUse", rt
->in_use
);
1217 json_object_array_add(json_remote_labels
, json_remote_label
);
1229 show_l2vpn_binding_msg(struct vty
*vty
, struct imsg
*imsg
,
1230 struct show_params
*params
)
1234 switch (imsg
->hdr
.type
) {
1235 case IMSG_CTL_SHOW_L2VPN_BINDING
:
1238 vty_outln (vty
, " Destination Address: %s, VC ID: %u",
1239 inet_ntoa(pw
->lsr_id
), pw
->pwid
);
1242 if (pw
->local_label
!= NO_LABEL
) {
1243 vty_outln (vty
, " Local Label: %u",
1245 vty_outln (vty
, "%-8sCbit: %u, VC Type: %s, "
1246 "GroupID: %u", "", pw
->local_cword
,
1247 pw_type_name(pw
->type
),pw
->local_gid
);
1248 vty_outln (vty
, "%-8sMTU: %u", "",pw
->local_ifmtu
);
1250 vty_outln (vty
," Local Label: unassigned");
1252 /* remote binding */
1253 if (pw
->remote_label
!= NO_LABEL
) {
1254 vty_outln (vty
, " Remote Label: %u",
1256 vty_outln (vty
, "%-8sCbit: %u, VC Type: %s, "
1257 "GroupID: %u", "", pw
->remote_cword
,
1258 pw_type_name(pw
->type
),pw
->remote_gid
);
1259 vty_outln (vty
, "%-8sMTU: %u", "",pw
->remote_ifmtu
);
1261 vty_outln (vty
," Remote Label: unassigned");
1264 vty_outln (vty
, "");
1274 show_l2vpn_binding_msg_json(struct imsg
*imsg
, struct show_params
*params
,
1278 json_object
*json_pw
;
1281 switch (imsg
->hdr
.type
) {
1282 case IMSG_CTL_SHOW_L2VPN_BINDING
:
1285 json_pw
= json_object_new_object();
1286 json_object_string_add(json_pw
, "destination",
1287 inet_ntoa(pw
->lsr_id
));
1288 json_object_int_add(json_pw
, "vcId", pw
->pwid
);
1291 if (pw
->local_label
!= NO_LABEL
) {
1292 json_object_int_add(json_pw
, "localLabel",
1294 json_object_int_add(json_pw
, "localControlWord",
1296 json_object_string_add(json_pw
, "localVcType",
1297 pw_type_name(pw
->type
));
1298 json_object_int_add(json_pw
, "localGroupID",
1300 json_object_int_add(json_pw
, "localIfMtu",
1303 json_object_string_add(json_pw
, "localLabel",
1306 /* remote binding */
1307 if (pw
->remote_label
!= NO_LABEL
) {
1308 json_object_int_add(json_pw
, "remoteLabel",
1310 json_object_int_add(json_pw
, "remoteControlWord",
1312 json_object_string_add(json_pw
, "remoteVcType",
1313 pw_type_name(pw
->type
));
1314 json_object_int_add(json_pw
, "remoteGroupID",
1316 json_object_int_add(json_pw
, "remoteIfMtu",
1319 json_object_string_add(json_pw
, "remoteLabel",
1322 sprintf(key_name
, "%s: %u", inet_ntoa(pw
->lsr_id
), pw
->pwid
);
1323 json_object_object_add(json
, key_name
, json_pw
);
1335 show_l2vpn_pw_msg(struct vty
*vty
, struct imsg
*imsg
, struct show_params
*params
)
1339 switch (imsg
->hdr
.type
) {
1340 case IMSG_CTL_SHOW_L2VPN_PW
:
1343 vty_outln (vty
, "%-9s %-15s %-10u %-16s %-10s", pw
->ifname
,
1344 inet_ntoa(pw
->lsr_id
), pw
->pwid
, pw
->l2vpn_name
,
1345 (pw
->status
? "UP" : "DOWN"));
1348 vty_outln (vty
, "");
1358 show_l2vpn_pw_msg_json(struct imsg
*imsg
, struct show_params
*params
,
1362 json_object
*json_pw
;
1364 switch (imsg
->hdr
.type
) {
1365 case IMSG_CTL_SHOW_L2VPN_PW
:
1368 json_pw
= json_object_new_object();
1369 json_object_string_add(json_pw
, "peerId", inet_ntoa(pw
->lsr_id
));
1370 json_object_int_add(json_pw
, "vcId", pw
->pwid
);
1371 json_object_string_add(json_pw
, "VpnName", pw
->l2vpn_name
);
1373 json_object_string_add(json_pw
, "status", "up");
1375 json_object_string_add(json_pw
, "status", "down");
1376 json_object_object_add(json
, pw
->ifname
, json_pw
);
1388 ldp_vty_connect(struct imsgbuf
*ibuf
)
1390 struct sockaddr_un s_un
;
1393 /* connect to ldpd control socket */
1394 if ((ctl_sock
= socket(AF_UNIX
, SOCK_STREAM
, 0)) == -1) {
1395 log_warn("%s: socket", __func__
);
1399 memset(&s_un
, 0, sizeof(s_un
));
1400 s_un
.sun_family
= AF_UNIX
;
1401 strlcpy(s_un
.sun_path
, ctl_sock_path
, sizeof(s_un
.sun_path
));
1402 if (connect(ctl_sock
, (struct sockaddr
*)&s_un
, sizeof(s_un
)) == -1) {
1403 log_warn("%s: connect: %s", __func__
, ctl_sock_path
);
1408 imsg_init(ibuf
, ctl_sock
);
1414 ldp_vty_dispatch_msg(struct vty
*vty
, struct imsg
*imsg
, enum show_command cmd
,
1415 struct show_params
*params
, json_object
*json
)
1422 ret
= show_interface_msg_json(imsg
, params
, json
);
1424 ret
= show_interface_msg(vty
, imsg
, params
);
1427 if (params
->detail
) {
1429 ret
= show_discovery_detail_msg_json(imsg
,
1432 ret
= show_discovery_detail_msg(vty
, imsg
,
1436 ret
= show_discovery_msg_json(imsg
, params
,
1439 ret
= show_discovery_msg(vty
, imsg
, params
);
1443 if (params
->capabilities
) {
1445 ret
= show_nbr_capabilities_msg_json(imsg
,
1448 ret
= show_nbr_capabilities_msg(vty
, imsg
,
1450 } else if (params
->detail
) {
1452 ret
= show_nbr_detail_msg_json(imsg
, params
,
1455 ret
= show_nbr_detail_msg(vty
, imsg
, params
);
1458 ret
= show_nbr_msg_json(imsg
, params
, json
);
1460 ret
= show_nbr_msg(vty
, imsg
, params
);
1464 if (params
->detail
) {
1466 ret
= show_lib_detail_msg_json(imsg
, params
,
1469 ret
= show_lib_detail_msg(vty
, imsg
, params
);
1472 ret
= show_lib_msg_json(imsg
, params
, json
);
1474 ret
= show_lib_msg(vty
, imsg
, params
);
1479 ret
= show_l2vpn_pw_msg_json(imsg
, params
, json
);
1481 ret
= show_l2vpn_pw_msg(vty
, imsg
, params
);
1483 case SHOW_L2VPN_BINDING
:
1485 ret
= show_l2vpn_binding_msg_json(imsg
, params
, json
);
1487 ret
= show_l2vpn_binding_msg(vty
, imsg
, params
);
1497 ldp_vty_dispatch(struct vty
*vty
, struct imsgbuf
*ibuf
, enum show_command cmd
,
1498 struct show_params
*params
)
1501 int n
, done
= 0, ret
= CMD_SUCCESS
;
1502 json_object
*json
= NULL
;
1504 while (ibuf
->w
.queued
)
1505 if (msgbuf_write(&ibuf
->w
) <= 0 && errno
!= EAGAIN
) {
1506 log_warn("write error");
1508 return (CMD_WARNING
);
1512 json
= json_object_new_object();
1515 if ((n
= imsg_read(ibuf
)) == -1 && errno
!= EAGAIN
) {
1516 log_warnx("imsg_read error");
1521 log_warnx("pipe closed");
1527 if ((n
= imsg_get(ibuf
, &imsg
)) == -1) {
1528 log_warnx("imsg_get error");
1534 done
= ldp_vty_dispatch_msg(vty
, &imsg
, cmd
, params
,
1543 vty_outln (vty
, "%s",
1544 json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
));
1545 json_object_free(json
);
1552 ldp_vty_get_af(const char *str
, int *af
)
1557 } else if (strcmp(str
, "ipv4") == 0) {
1560 } else if (strcmp(str
, "ipv6") == 0) {
1569 ldp_vty_show_binding(struct vty
*vty
, const char *af_str
, int detail
, int json
)
1571 struct imsgbuf ibuf
;
1572 struct show_params params
;
1575 if (ldp_vty_connect(&ibuf
) < 0)
1576 return (CMD_WARNING
);
1578 if (ldp_vty_get_af(af_str
, &af
) < 0)
1579 return (CMD_ERR_NO_MATCH
);
1581 memset(¶ms
, 0, sizeof(params
));
1583 params
.detail
= detail
;
1586 if (!params
.detail
&& !params
.json
)
1587 vty_outln (vty
, "%-4s %-20s %-15s %-11s %-13s %6s", "AF",
1588 "Destination", "Nexthop", "Local Label", "Remote Label",
1591 imsg_compose(&ibuf
, IMSG_CTL_SHOW_LIB
, 0, 0, -1, NULL
, 0);
1592 return (ldp_vty_dispatch(vty
, &ibuf
, SHOW_LIB
, ¶ms
));
1596 ldp_vty_show_discovery(struct vty
*vty
, const char *af_str
, int detail
,
1599 struct imsgbuf ibuf
;
1600 struct show_params params
;
1603 if (ldp_vty_connect(&ibuf
) < 0)
1604 return (CMD_WARNING
);
1606 if (ldp_vty_get_af(af_str
, &af
) < 0)
1607 return (CMD_ERR_NO_MATCH
);
1609 memset(¶ms
, 0, sizeof(params
));
1611 params
.detail
= detail
;
1614 if (!params
.detail
&& !params
.json
)
1615 vty_outln (vty
, "%-4s %-15s %-8s %-15s %9s",
1616 "AF", "ID", "Type", "Source", "Holdtime");
1619 imsg_compose(&ibuf
, IMSG_CTL_SHOW_DISCOVERY_DTL
, 0, 0, -1,
1622 imsg_compose(&ibuf
, IMSG_CTL_SHOW_DISCOVERY
, 0, 0, -1, NULL
, 0);
1623 return (ldp_vty_dispatch(vty
, &ibuf
, SHOW_DISC
, ¶ms
));
1627 ldp_vty_show_interface(struct vty
*vty
, const char *af_str
, int json
)
1629 struct imsgbuf ibuf
;
1630 struct show_params params
;
1631 unsigned int ifidx
= 0;
1634 if (ldp_vty_connect(&ibuf
) < 0)
1635 return (CMD_WARNING
);
1637 if (ldp_vty_get_af(af_str
, &af
) < 0)
1638 return (CMD_ERR_NO_MATCH
);
1640 memset(¶ms
, 0, sizeof(params
));
1646 vty_outln (vty
, "%-4s %-11s %-6s %-8s %-12s %3s", "AF",
1647 "Interface", "State", "Uptime", "Hello Timers","ac");
1650 imsg_compose(&ibuf
, IMSG_CTL_SHOW_INTERFACE
, 0, 0, -1, &ifidx
,
1652 return (ldp_vty_dispatch(vty
, &ibuf
, SHOW_IFACE
, ¶ms
));
1656 ldp_vty_show_capabilities(struct vty
*vty
, int json
)
1660 json_object
*json_array
;
1661 json_object
*json_cap
;
1663 json
= json_object_new_object();
1664 json_array
= json_object_new_array();
1665 json_object_object_add(json
, "capabilities", json_array
);
1667 /* Dynamic Announcement (0x0506) */
1668 json_cap
= json_object_new_object();
1669 json_object_string_add(json_cap
, "description",
1670 "Dynamic Announcement");
1671 json_object_string_add(json_cap
, "tlvType",
1673 json_object_array_add(json_array
, json_cap
);
1675 /* Typed Wildcard (0x050B) */
1676 json_cap
= json_object_new_object();
1677 json_object_string_add(json_cap
, "description",
1679 json_object_string_add(json_cap
, "tlvType",
1681 json_object_array_add(json_array
, json_cap
);
1683 /* Unrecognized Notification (0x0603) */
1684 json_cap
= json_object_new_object();
1685 json_object_string_add(json_cap
, "description",
1686 "Unrecognized Notification");
1687 json_object_string_add(json_cap
, "tlvType",
1689 json_object_array_add(json_array
, json_cap
);
1691 vty_outln (vty
, "%s",
1692 json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
));
1693 json_object_free(json
);
1698 "Supported LDP Capabilities%s"
1699 " * Dynamic Announcement (0x0506)%s"
1700 " * Typed Wildcard (0x050B)%s"
1701 " * Unrecognized Notification (0x0603)%s", VTY_NEWLINE
,
1702 VTY_NEWLINE
, VTY_NEWLINE
, VTY_NEWLINE
);
1708 ldp_vty_show_neighbor(struct vty
*vty
, int capabilities
, int detail
, int json
)
1710 struct imsgbuf ibuf
;
1711 struct show_params params
;
1713 if (ldp_vty_connect(&ibuf
) < 0)
1714 return (CMD_WARNING
);
1716 memset(¶ms
, 0, sizeof(params
));
1717 params
.capabilities
= capabilities
;
1718 params
.detail
= detail
;
1721 if (params
.capabilities
)
1724 if (!params
.detail
&& !params
.json
)
1725 vty_outln (vty
, "%-4s %-15s %-11s %-15s %8s",
1726 "AF", "ID", "State", "Remote Address","Uptime");
1728 imsg_compose(&ibuf
, IMSG_CTL_SHOW_NBR
, 0, 0, -1, NULL
, 0);
1729 return (ldp_vty_dispatch(vty
, &ibuf
, SHOW_NBR
, ¶ms
));
1733 ldp_vty_show_atom_binding(struct vty
*vty
, int json
)
1735 struct imsgbuf ibuf
;
1736 struct show_params params
;
1738 if (ldp_vty_connect(&ibuf
) < 0)
1739 return (CMD_WARNING
);
1741 memset(¶ms
, 0, sizeof(params
));
1744 imsg_compose(&ibuf
, IMSG_CTL_SHOW_L2VPN_BINDING
, 0, 0, -1, NULL
, 0);
1745 return (ldp_vty_dispatch(vty
, &ibuf
, SHOW_L2VPN_BINDING
, ¶ms
));
1749 ldp_vty_show_atom_vc(struct vty
*vty
, int json
)
1751 struct imsgbuf ibuf
;
1752 struct show_params params
;
1754 if (ldp_vty_connect(&ibuf
) < 0)
1755 return (CMD_WARNING
);
1757 memset(¶ms
, 0, sizeof(params
));
1762 vty_outln (vty
, "%-9s %-15s %-10s %-16s %-10s",
1763 "Interface", "Peer ID", "VC ID", "Name","Status");
1764 vty_outln (vty
, "%-9s %-15s %-10s %-16s %-10s",
1765 "---------", "---------------", "----------",
1766 "----------------", "----------");
1769 imsg_compose(&ibuf
, IMSG_CTL_SHOW_L2VPN_PW
, 0, 0, -1, NULL
, 0);
1770 return (ldp_vty_dispatch(vty
, &ibuf
, SHOW_L2VPN_PW
, ¶ms
));
1774 ldp_vty_clear_nbr(struct vty
*vty
, const char *addr_str
)
1776 struct imsgbuf ibuf
;
1779 memset(&nbr
, 0, sizeof(nbr
));
1781 (ldp_get_address(addr_str
, &nbr
.af
, &nbr
.raddr
) == -1 ||
1782 bad_addr(nbr
.af
, &nbr
.raddr
))) {
1783 vty_outln (vty
, "%% Malformed address");
1784 return (CMD_WARNING
);
1787 if (ldp_vty_connect(&ibuf
) < 0)
1788 return (CMD_WARNING
);
1790 imsg_compose(&ibuf
, IMSG_CTL_CLEAR_NBR
, 0, 0, -1, &nbr
, sizeof(nbr
));
1792 while (ibuf
.w
.queued
)
1793 if (msgbuf_write(&ibuf
.w
) <= 0 && errno
!= EAGAIN
) {
1794 log_warn("write error");
1796 return (CMD_WARNING
);
1801 return (CMD_SUCCESS
);