2 * Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 #ifndef _QUAGGA_BGP_VTY_H
22 #define _QUAGGA_BGP_VTY_H
24 #include "bgpd/bgpd.h"
28 #define BGP_INSTANCE_HELP_STR "BGP view\nBGP VRF\nView/VRF name\n"
29 #define BGP_INSTANCE_ALL_HELP_STR "BGP view\nBGP VRF\nAll Views/VRFs\n"
31 #define BGP_AFI_CMD_STR "<ipv4|ipv6>"
32 #define BGP_AFI_HELP_STR "Address Family\nAddress Family\n"
33 #define BGP_SAFI_CMD_STR "<unicast|multicast|vpn>"
34 #define BGP_SAFI_HELP_STR \
35 "Address Family modifier\n" \
36 "Address Family modifier\n" \
37 "Address Family modifier\n"
38 #define BGP_AFI_SAFI_CMD_STR BGP_AFI_CMD_STR" "BGP_SAFI_CMD_STR
39 #define BGP_AFI_SAFI_HELP_STR BGP_AFI_HELP_STR BGP_SAFI_HELP_STR
41 #define BGP_SAFI_WITH_LABEL_CMD_STR "<unicast|multicast|vpn|labeled-unicast|flowspec>"
42 #define BGP_SAFI_WITH_LABEL_HELP_STR \
43 "Address Family modifier\n" \
44 "Address Family modifier\n" \
45 "Address Family modifier\n" \
46 "Address Family modifier\n" \
47 "Address Family modifier\n"
49 #define SHOW_GR_HEADER \
50 "Codes: GR - Graceful Restart," \
51 " * - Inheriting Global GR Config,\n" \
52 " Restart - GR Mode-Restarting," \
53 " Helper - GR Mode-Helper,\n" \
54 " Disable - GR Mode-Disable.\n\n"
56 #define BGP_SHOW_PEER_GR_CAPABILITY( \
57 vty, p, use_json, json) \
59 bgp_show_neighbor_graceful_restart_local_mode( \
60 vty, p, use_json, json); \
61 bgp_show_neighbor_graceful_restart_remote_mode( \
62 vty, p, use_json, json); \
63 bgp_show_neighnor_graceful_restart_rbit( \
64 vty, p, use_json, json); \
65 bgp_show_neighbor_graceful_restart_time( \
66 vty, p, use_json, json); \
67 bgp_show_neighbor_graceful_restart_capability_per_afi_safi(\
68 vty, p, use_json, json); \
71 #define VTY_BGP_GR_DEFINE_LOOP_VARIABLE \
72 struct peer *peer_loop = NULL; \
73 struct listnode *node = NULL; \
74 struct listnode *nnode = NULL; \
75 bool gr_router_detected = false
77 #define VTY_BGP_GR_ROUTER_DETECT( \
78 _bgp, _peer, _peer_list) \
80 if (_peer->bgp->t_startup) \
81 bgp_peer_gr_flags_update(_peer); \
82 for (ALL_LIST_ELEMENTS(_peer_list, \
83 node, nnode, peer_loop)) { \
84 if (CHECK_FLAG(peer_loop->flags,\
85 PEER_FLAG_GRACEFUL_RESTART)) \
86 gr_router_detected = true; \
91 #define VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(_bgp, _ret) \
93 if (gr_router_detected && \
94 _bgp->present_zebra_gr_state == ZEBRA_GR_DISABLE) { \
95 if (bgp_zebra_send_capabilities(_bgp, false)) \
96 _ret = BGP_ERR_INVALID_VALUE;\
97 } else if (!gr_router_detected && \
98 _bgp->present_zebra_gr_state == ZEBRA_GR_ENABLE) { \
99 if (bgp_zebra_send_capabilities(_bgp, true)) \
100 _ret = BGP_ERR_INVALID_VALUE;\
104 #define VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA( \
105 _bgp, _peer_list, _ret) \
107 struct peer *peer_loop; \
108 bool gr_router_detected = false; \
109 struct listnode *node = {0}; \
110 struct listnode *nnode = {0}; \
111 for (ALL_LIST_ELEMENTS( \
113 nnode, peer_loop)) { \
114 if (peer_loop->bgp->t_startup) \
115 bgp_peer_gr_flags_update(peer_loop); \
118 PEER_FLAG_GRACEFUL_RESTART)) \
119 gr_router_detected = true; \
121 if (gr_router_detected && \
122 _bgp->present_zebra_gr_state == ZEBRA_GR_DISABLE) { \
123 if (bgp_zebra_send_capabilities(_bgp, false)) \
124 _ret = BGP_ERR_INVALID_VALUE;\
125 } else if (!gr_router_detected && \
126 _bgp->present_zebra_gr_state == ZEBRA_GR_ENABLE) { \
127 if (bgp_zebra_send_capabilities(_bgp, true)) \
128 _ret = BGP_ERR_INVALID_VALUE;\
133 #define PRINT_EOR(_eor_flag) \
136 vty_out(vty, "Yes\n"); \
138 vty_out(vty, "No\n"); \
141 #define PRINT_EOR_JSON(_eor_flag) \
144 json_object_boolean_true_add( \
145 json_endofrib_status, \
146 "endOfRibSentAfterUpdate"); \
148 json_object_boolean_false_add( \
149 json_endofrib_status, \
150 "endOfRibSentAfterUpdate"); \
153 extern void bgp_vty_init(void);
154 extern const char *get_afi_safi_str(afi_t afi
, safi_t safi
, bool for_json
);
155 extern int bgp_get_vty(struct bgp
**bgp
, as_t
*as
, const char *name
,
156 enum bgp_instance_type inst_type
);
157 extern void bgp_config_write_update_delay(struct vty
*vty
, struct bgp
*bgp
);
158 extern void bgp_config_write_wpkt_quanta(struct vty
*vty
, struct bgp
*bgp
);
159 extern void bgp_config_write_rpkt_quanta(struct vty
*vty
, struct bgp
*bgp
);
160 extern void bgp_config_write_listen(struct vty
*vty
, struct bgp
*bgp
);
161 extern void bgp_config_write_coalesce_time(struct vty
*vty
, struct bgp
*bgp
);
162 extern int bgp_vty_return(struct vty
*vty
, int ret
);
163 extern struct peer
*peer_and_group_lookup_vty(struct vty
*vty
,
164 const char *peer_str
);
166 extern afi_t
bgp_vty_afi_from_str(const char *afi_str
);
168 extern safi_t
bgp_vty_safi_from_str(const char *safi_str
);
170 extern int argv_find_and_parse_afi(struct cmd_token
**argv
, int argc
,
171 int *index
, afi_t
*afi
);
173 extern int argv_find_and_parse_safi(struct cmd_token
**argv
, int argc
,
174 int *index
, safi_t
*safi
);
176 extern int bgp_vty_find_and_parse_afi_safi_bgp(struct vty
*vty
,
177 struct cmd_token
**argv
,
178 int argc
, int *idx
, afi_t
*afi
,
179 safi_t
*safi
, struct bgp
**bgp
,
181 extern int bgp_show_summary_vty(struct vty
*vty
, const char *name
, afi_t afi
,
182 safi_t safi
, bool show_failed
, bool use_json
);
184 #endif /* _QUAGGA_BGP_VTY_H */