]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_vty.h
Merge pull request #11668 from rampxxxx/bfd_rtt_in_echo_pkt
[mirror_frr.git] / bgpd / bgp_vty.h
1 /* BGP VTY interface.
2 * Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
3 *
4 * This file is part of GNU Zebra.
5 *
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
9 * later version.
10 *
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.
15 *
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
19 */
20
21 #ifndef _QUAGGA_BGP_VTY_H
22 #define _QUAGGA_BGP_VTY_H
23
24 #include "bgpd/bgpd.h"
25 #include "stream.h"
26 struct bgp;
27
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"
30
31 #define BGP_AF_STR "Address Family\n"
32 #define BGP_AF_MODIFIER_STR "Address Family modifier\n"
33 #define BGP_AFI_CMD_STR "<ipv4|ipv6>"
34 #define BGP_AFI_HELP_STR BGP_AF_STR BGP_AF_STR
35 #define BGP_SAFI_CMD_STR "<unicast|multicast|vpn>"
36 #define BGP_SAFI_HELP_STR \
37 BGP_AF_MODIFIER_STR BGP_AF_MODIFIER_STR BGP_AF_MODIFIER_STR
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
40
41 #define BGP_SAFI_WITH_LABEL_CMD_STR "<unicast|multicast|vpn|labeled-unicast|flowspec>"
42 #define BGP_SAFI_WITH_LABEL_HELP_STR \
43 BGP_AF_MODIFIER_STR BGP_AF_MODIFIER_STR BGP_AF_MODIFIER_STR \
44 BGP_AF_MODIFIER_STR BGP_AF_MODIFIER_STR
45
46 #define SHOW_GR_HEADER \
47 "Codes: GR - Graceful Restart," \
48 " * - Inheriting Global GR Config,\n" \
49 " Restart - GR Mode-Restarting," \
50 " Helper - GR Mode-Helper,\n" \
51 " Disable - GR Mode-Disable.\n\n"
52
53 #define BGP_SHOW_SUMMARY_HEADER_ALL \
54 "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc\n"
55 #define BGP_SHOW_SUMMARY_HEADER_ALL_WIDE \
56 "V AS LocalAS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc\n"
57 #define BGP_SHOW_SUMMARY_HEADER_FAILED "EstdCnt DropCnt ResetTime Reason\n"
58
59 #define BGP_SHOW_PEER_GR_CAPABILITY(vty, p, use_json, json) \
60 do { \
61 bgp_show_neighbor_graceful_restart_local_mode(vty, p, \
62 use_json, json); \
63 bgp_show_neighbor_graceful_restart_remote_mode( \
64 vty, p, use_json, json); \
65 bgp_show_neighnor_graceful_restart_flags(vty, p, use_json, \
66 json); \
67 bgp_show_neighbor_graceful_restart_time(vty, p, use_json, \
68 json); \
69 bgp_show_neighbor_graceful_restart_capability_per_afi_safi( \
70 vty, p, use_json, json); \
71 } while (0)
72
73 #define VTY_BGP_GR_DEFINE_LOOP_VARIABLE \
74 struct peer *peer_loop = NULL; \
75 struct listnode *node = NULL; \
76 struct listnode *nnode = NULL; \
77 bool gr_router_detected = false
78
79 #define VTY_BGP_GR_ROUTER_DETECT(_bgp, _peer, _peer_list) \
80 do { \
81 if (_peer->bgp->t_startup) \
82 bgp_peer_gr_flags_update(_peer); \
83 for (ALL_LIST_ELEMENTS(_peer_list, node, nnode, peer_loop)) { \
84 if (CHECK_FLAG(peer_loop->flags, \
85 PEER_FLAG_GRACEFUL_RESTART)) \
86 gr_router_detected = true; \
87 } \
88 } while (0)
89
90
91 #define VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(_bgp, _ret) \
92 do { \
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 \
99 == ZEBRA_GR_ENABLE) { \
100 if (bgp_zebra_send_capabilities(_bgp, true)) \
101 _ret = BGP_ERR_INVALID_VALUE; \
102 } \
103 } while (0)
104
105 #define VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA( \
106 _bgp, _peer_list, _ret) \
107 do { \
108 struct peer *peer_loop; \
109 bool gr_router_detected = false; \
110 struct listnode *node = {0}; \
111 struct listnode *nnode = {0}; \
112 for (ALL_LIST_ELEMENTS(_peer_list, node, nnode, peer_loop)) { \
113 if (peer_loop->bgp->t_startup) \
114 bgp_peer_gr_flags_update(peer_loop); \
115 if (CHECK_FLAG(peer_loop->flags, \
116 PEER_FLAG_GRACEFUL_RESTART)) \
117 gr_router_detected = true; \
118 } \
119 if (gr_router_detected \
120 && _bgp->present_zebra_gr_state == ZEBRA_GR_DISABLE) { \
121 if (bgp_zebra_send_capabilities(_bgp, false)) \
122 _ret = BGP_ERR_INVALID_VALUE; \
123 } else if (!gr_router_detected \
124 && _bgp->present_zebra_gr_state \
125 == ZEBRA_GR_ENABLE) { \
126 if (bgp_zebra_send_capabilities(_bgp, true)) \
127 _ret = BGP_ERR_INVALID_VALUE; \
128 } \
129 } while (0)
130
131
132 #define PRINT_EOR(_eor_flag) \
133 do { \
134 if (eor_flag) \
135 vty_out(vty, "Yes\n"); \
136 else \
137 vty_out(vty, "No\n"); \
138 } while (0)
139
140 #define PRINT_EOR_JSON(_eor_flag) \
141 do { \
142 if (eor_flag) \
143 json_object_boolean_true_add( \
144 json_endofrib_status, \
145 "endOfRibSentAfterUpdate"); \
146 else \
147 json_object_boolean_false_add( \
148 json_endofrib_status, \
149 "endOfRibSentAfterUpdate"); \
150 } while (0)
151
152 extern void bgp_clear_soft_in(struct bgp *bgp, afi_t afi, safi_t safi);
153 extern void bgp_vty_init(void);
154 extern void community_alias_vty(void);
155 extern const char *get_afi_safi_str(afi_t afi, safi_t safi, bool for_json);
156 extern int bgp_get_vty(struct bgp **bgp, as_t *as, const char *name,
157 enum bgp_instance_type inst_type);
158 extern void bgp_config_write_update_delay(struct vty *vty, struct bgp *bgp);
159 extern void bgp_config_write_wpkt_quanta(struct vty *vty, struct bgp *bgp);
160 extern void bgp_config_write_rpkt_quanta(struct vty *vty, struct bgp *bgp);
161 extern void bgp_config_write_listen(struct vty *vty, struct bgp *bgp);
162 extern void bgp_config_write_coalesce_time(struct vty *vty, struct bgp *bgp);
163 extern int bgp_vty_return(struct vty *vty, int ret);
164 extern bool bgp_config_inprocess(void);
165 extern struct peer *peer_and_group_lookup_vty(struct vty *vty,
166 const char *peer_str);
167
168 extern afi_t bgp_vty_afi_from_str(const char *afi_str);
169
170 extern safi_t bgp_vty_safi_from_str(const char *safi_str);
171
172 extern int argv_find_and_parse_afi(struct cmd_token **argv, int argc,
173 int *index, afi_t *afi);
174
175 extern int argv_find_and_parse_safi(struct cmd_token **argv, int argc,
176 int *index, safi_t *safi);
177
178 extern int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
179 struct cmd_token **argv,
180 int argc, int *idx, afi_t *afi,
181 safi_t *safi, struct bgp **bgp,
182 bool use_json);
183 int bgp_vty_find_and_parse_bgp(struct vty *vty, struct cmd_token **argv,
184 int argc, struct bgp **bgp, bool use_json);
185 extern int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
186 safi_t safi, const char *neighbor, int as_type,
187 as_t as, uint16_t show_flags);
188
189 #endif /* _QUAGGA_BGP_VTY_H */