3 * Copyright (C) 2022 Vmware, Inc.
4 * Mobashshera Rasool <mrasool@vmware.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program 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
36 #include "lib/northbound_cli.h"
37 #include "pim_errors.h"
39 #include "pim_cmd_common.h"
42 * Get current node VRF name.
45 * In case of failure it will print error message to user.
47 * \returns name or NULL if failed to get VRF.
49 const char *pim_cli_get_vrf_name(struct vty
*vty
)
51 const struct lyd_node
*vrf_node
;
53 /* Not inside any VRF context. */
54 if (vty
->xpath_index
== 0)
55 return VRF_DEFAULT_NAME
;
57 vrf_node
= yang_dnode_get(vty
->candidate_config
->dnode
, VTY_CURR_XPATH
);
58 if (vrf_node
== NULL
) {
59 vty_out(vty
, "%% Failed to get vrf dnode in configuration\n");
63 return yang_dnode_get_string(vrf_node
, "./name");
66 int pim_process_join_prune_cmd(struct vty
*vty
, const char *jpi_str
)
68 char xpath
[XPATH_MAXLEN
];
70 snprintf(xpath
, sizeof(xpath
), FRR_PIM_ROUTER_XPATH
,
71 FRR_PIM_AF_XPATH_VAL
);
72 strlcat(xpath
, "/join-prune-interval", sizeof(xpath
));
74 nb_cli_enqueue_change(vty
, xpath
, NB_OP_MODIFY
, jpi_str
);
76 return nb_cli_apply_changes(vty
, NULL
);
79 int pim_process_no_join_prune_cmd(struct vty
*vty
)
81 char xpath
[XPATH_MAXLEN
];
83 snprintf(xpath
, sizeof(xpath
), FRR_PIM_ROUTER_XPATH
,
84 FRR_PIM_AF_XPATH_VAL
);
85 strlcat(xpath
, "/join-prune-interval", sizeof(xpath
));
87 nb_cli_enqueue_change(vty
, xpath
, NB_OP_DESTROY
, NULL
);
89 return nb_cli_apply_changes(vty
, NULL
);
92 int pim_process_spt_switchover_infinity_cmd(struct vty
*vty
)
95 char spt_plist_xpath
[XPATH_MAXLEN
];
96 char spt_action_xpath
[XPATH_MAXLEN
];
98 vrfname
= pim_cli_get_vrf_name(vty
);
100 return CMD_WARNING_CONFIG_FAILED
;
102 snprintf(spt_plist_xpath
, sizeof(spt_plist_xpath
),
103 FRR_PIM_VRF_XPATH
, "frr-pim:pimd", "pim", vrfname
,
104 FRR_PIM_AF_XPATH_VAL
);
105 strlcat(spt_plist_xpath
, "/spt-switchover/spt-infinity-prefix-list",
106 sizeof(spt_plist_xpath
));
108 snprintf(spt_action_xpath
, sizeof(spt_action_xpath
),
109 FRR_PIM_VRF_XPATH
, "frr-pim:pimd", "pim", vrfname
,
110 FRR_PIM_AF_XPATH_VAL
);
111 strlcat(spt_action_xpath
, "/spt-switchover/spt-action",
112 sizeof(spt_action_xpath
));
114 if (yang_dnode_exists(vty
->candidate_config
->dnode
, spt_plist_xpath
))
115 nb_cli_enqueue_change(vty
, spt_plist_xpath
, NB_OP_DESTROY
,
117 nb_cli_enqueue_change(vty
, spt_action_xpath
, NB_OP_MODIFY
,
120 return nb_cli_apply_changes(vty
, NULL
);
123 int pim_process_spt_switchover_prefixlist_cmd(struct vty
*vty
,
127 char spt_plist_xpath
[XPATH_MAXLEN
];
128 char spt_action_xpath
[XPATH_MAXLEN
];
130 vrfname
= pim_cli_get_vrf_name(vty
);
132 return CMD_WARNING_CONFIG_FAILED
;
134 snprintf(spt_plist_xpath
, sizeof(spt_plist_xpath
),
135 FRR_PIM_VRF_XPATH
, "frr-pim:pimd", "pim", vrfname
,
136 FRR_PIM_AF_XPATH_VAL
);
137 strlcat(spt_plist_xpath
, "/spt-switchover/spt-infinity-prefix-list",
138 sizeof(spt_plist_xpath
));
140 snprintf(spt_action_xpath
, sizeof(spt_action_xpath
),
141 FRR_PIM_VRF_XPATH
, "frr-pim:pimd", "pim", vrfname
,
142 FRR_PIM_AF_XPATH_VAL
);
143 strlcat(spt_action_xpath
, "/spt-switchover/spt-action",
144 sizeof(spt_action_xpath
));
146 nb_cli_enqueue_change(vty
, spt_action_xpath
, NB_OP_MODIFY
,
148 nb_cli_enqueue_change(vty
, spt_plist_xpath
, NB_OP_MODIFY
,
151 return nb_cli_apply_changes(vty
, NULL
);
154 int pim_process_no_spt_switchover_cmd(struct vty
*vty
)
157 char spt_plist_xpath
[XPATH_MAXLEN
];
158 char spt_action_xpath
[XPATH_MAXLEN
];
160 vrfname
= pim_cli_get_vrf_name(vty
);
162 return CMD_WARNING_CONFIG_FAILED
;
164 snprintf(spt_plist_xpath
, sizeof(spt_plist_xpath
),
165 FRR_PIM_VRF_XPATH
, "frr-pim:pimd", "pim", vrfname
,
166 FRR_PIM_AF_XPATH_VAL
);
167 strlcat(spt_plist_xpath
, "/spt-switchover/spt-infinity-prefix-list",
168 sizeof(spt_plist_xpath
));
170 snprintf(spt_action_xpath
, sizeof(spt_action_xpath
),
171 FRR_PIM_VRF_XPATH
, "frr-pim:pimd", "pim", vrfname
,
172 FRR_PIM_AF_XPATH_VAL
);
173 strlcat(spt_action_xpath
, "/spt-switchover/spt-action",
174 sizeof(spt_action_xpath
));
176 nb_cli_enqueue_change(vty
, spt_plist_xpath
, NB_OP_DESTROY
, NULL
);
177 nb_cli_enqueue_change(vty
, spt_action_xpath
, NB_OP_MODIFY
,
178 "PIM_SPT_IMMEDIATE");
180 return nb_cli_apply_changes(vty
, NULL
);
183 int pim_process_pim_packet_cmd(struct vty
*vty
, const char *packet
)
185 char xpath
[XPATH_MAXLEN
];
187 snprintf(xpath
, sizeof(xpath
), FRR_PIM_ROUTER_XPATH
,
188 FRR_PIM_AF_XPATH_VAL
);
189 strlcat(xpath
, "/packets", sizeof(xpath
));
191 nb_cli_enqueue_change(vty
, xpath
, NB_OP_MODIFY
, packet
);
193 return nb_cli_apply_changes(vty
, NULL
);
196 int pim_process_no_pim_packet_cmd(struct vty
*vty
)
198 char xpath
[XPATH_MAXLEN
];
200 snprintf(xpath
, sizeof(xpath
), FRR_PIM_ROUTER_XPATH
,
201 FRR_PIM_AF_XPATH_VAL
);
202 strlcat(xpath
, "/packets", sizeof(xpath
));
204 nb_cli_enqueue_change(vty
, xpath
, NB_OP_DESTROY
, NULL
);
206 return nb_cli_apply_changes(vty
, NULL
);
209 int pim_process_keepalivetimer_cmd(struct vty
*vty
, const char *kat
)
212 char ka_timer_xpath
[XPATH_MAXLEN
];
214 vrfname
= pim_cli_get_vrf_name(vty
);
216 return CMD_WARNING_CONFIG_FAILED
;
218 snprintf(ka_timer_xpath
, sizeof(ka_timer_xpath
), FRR_PIM_VRF_XPATH
,
219 "frr-pim:pimd", "pim", vrfname
, FRR_PIM_AF_XPATH_VAL
);
220 strlcat(ka_timer_xpath
, "/keep-alive-timer", sizeof(ka_timer_xpath
));
222 nb_cli_enqueue_change(vty
, ka_timer_xpath
, NB_OP_MODIFY
,
225 return nb_cli_apply_changes(vty
, NULL
);
228 int pim_process_no_keepalivetimer_cmd(struct vty
*vty
)
231 char ka_timer_xpath
[XPATH_MAXLEN
];
233 vrfname
= pim_cli_get_vrf_name(vty
);
235 return CMD_WARNING_CONFIG_FAILED
;
237 snprintf(ka_timer_xpath
, sizeof(ka_timer_xpath
), FRR_PIM_VRF_XPATH
,
238 "frr-pim:pimd", "pim", vrfname
, FRR_PIM_AF_XPATH_VAL
);
239 strlcat(ka_timer_xpath
, "/keep-alive-timer", sizeof(ka_timer_xpath
));
241 nb_cli_enqueue_change(vty
, ka_timer_xpath
, NB_OP_DESTROY
, NULL
);
243 return nb_cli_apply_changes(vty
, NULL
);
246 int pim_process_rp_kat_cmd(struct vty
*vty
, const char *rpkat
)
249 char rp_ka_timer_xpath
[XPATH_MAXLEN
];
251 vrfname
= pim_cli_get_vrf_name(vty
);
253 return CMD_WARNING_CONFIG_FAILED
;
255 snprintf(rp_ka_timer_xpath
, sizeof(rp_ka_timer_xpath
),
256 FRR_PIM_VRF_XPATH
, "frr-pim:pimd", "pim", vrfname
,
257 FRR_PIM_AF_XPATH_VAL
);
258 strlcat(rp_ka_timer_xpath
, "/rp-keep-alive-timer",
259 sizeof(rp_ka_timer_xpath
));
261 nb_cli_enqueue_change(vty
, rp_ka_timer_xpath
, NB_OP_MODIFY
,
264 return nb_cli_apply_changes(vty
, NULL
);
267 int pim_process_no_rp_kat_cmd(struct vty
*vty
)
271 char rp_ka_timer_xpath
[XPATH_MAXLEN
];
273 char rs_timer_xpath
[XPATH_MAXLEN
];
275 snprintf(rs_timer_xpath
, sizeof(rs_timer_xpath
),
276 FRR_PIM_ROUTER_XPATH
, FRR_PIM_AF_XPATH_VAL
);
277 strlcat(rs_timer_xpath
, "/register-suppress-time",
278 sizeof(rs_timer_xpath
));
281 v
= yang_dnode_get_uint16(vty
->candidate_config
->dnode
,
283 v
= 3 * v
+ PIM_REGISTER_PROBE_TIME_DEFAULT
;
286 snprintf(rp_ka_timer
, sizeof(rp_ka_timer
), "%u", v
);
288 vrfname
= pim_cli_get_vrf_name(vty
);
290 return CMD_WARNING_CONFIG_FAILED
;
292 snprintf(rp_ka_timer_xpath
, sizeof(rp_ka_timer_xpath
),
293 FRR_PIM_VRF_XPATH
, "frr-pim:pimd", "pim", vrfname
,
294 FRR_PIM_AF_XPATH_VAL
);
295 strlcat(rp_ka_timer_xpath
, "/rp-keep-alive-timer",
296 sizeof(rp_ka_timer_xpath
));
298 nb_cli_enqueue_change(vty
, rp_ka_timer_xpath
, NB_OP_MODIFY
,
301 return nb_cli_apply_changes(vty
, NULL
);
304 int pim_process_register_suppress_cmd(struct vty
*vty
, const char *rst
)
306 char xpath
[XPATH_MAXLEN
];
308 snprintf(xpath
, sizeof(xpath
), FRR_PIM_ROUTER_XPATH
,
309 FRR_PIM_AF_XPATH_VAL
);
310 strlcat(xpath
, "/register-suppress-time", sizeof(xpath
));
312 nb_cli_enqueue_change(vty
, xpath
, NB_OP_MODIFY
, rst
);
314 return nb_cli_apply_changes(vty
, NULL
);
317 int pim_process_no_register_suppress_cmd(struct vty
*vty
)
319 char xpath
[XPATH_MAXLEN
];
321 snprintf(xpath
, sizeof(xpath
), FRR_PIM_ROUTER_XPATH
,
322 FRR_PIM_AF_XPATH_VAL
);
323 strlcat(xpath
, "/register-suppress-time", sizeof(xpath
));
325 nb_cli_enqueue_change(vty
, xpath
, NB_OP_DESTROY
, NULL
);
327 return nb_cli_apply_changes(vty
, NULL
);
330 int pim_process_ip_pim_cmd(struct vty
*vty
)
332 nb_cli_enqueue_change(vty
, "./pim-enable", NB_OP_MODIFY
, "true");
334 return nb_cli_apply_changes(vty
, FRR_PIM_INTERFACE_XPATH
,
335 FRR_PIM_AF_XPATH_VAL
);
338 int pim_process_no_ip_pim_cmd(struct vty
*vty
)
340 const struct lyd_node
*mld_enable_dnode
;
341 char mld_if_xpath
[XPATH_MAXLEN
];
344 snprintf(mld_if_xpath
, sizeof(mld_if_xpath
),
345 "%s/frr-gmp:gmp/address-family[address-family='%s']",
346 VTY_CURR_XPATH
, FRR_PIM_AF_XPATH_VAL
);
348 if (printed
>= (int)(sizeof(mld_if_xpath
))) {
349 vty_out(vty
, "Xpath too long (%d > %u)", printed
+ 1,
351 return CMD_WARNING_CONFIG_FAILED
;
354 mld_enable_dnode
= yang_dnode_getf(vty
->candidate_config
->dnode
,
355 FRR_GMP_ENABLE_XPATH
, VTY_CURR_XPATH
,
356 FRR_PIM_AF_XPATH_VAL
);
358 if (!mld_enable_dnode
) {
359 nb_cli_enqueue_change(vty
, mld_if_xpath
, NB_OP_DESTROY
, NULL
);
360 nb_cli_enqueue_change(vty
, ".", NB_OP_DESTROY
, NULL
);
362 if (!yang_dnode_get_bool(mld_enable_dnode
, ".")) {
363 nb_cli_enqueue_change(vty
, mld_if_xpath
, NB_OP_DESTROY
,
365 nb_cli_enqueue_change(vty
, ".", NB_OP_DESTROY
, NULL
);
367 nb_cli_enqueue_change(vty
, "./pim-enable", NB_OP_MODIFY
,
371 return nb_cli_apply_changes(vty
, FRR_PIM_INTERFACE_XPATH
,
372 FRR_PIM_AF_XPATH_VAL
);