pim_autorp_rp_fini(&(autorp->candidate_rp_list));
}
+static bool pim_autorp_should_close(struct pim_autorp *autorp)
+{
+ /* If discovery is active, then we need the socket open */
+ return !autorp->do_discovery;
+}
+
static bool pim_autorp_join_groups(struct interface *ifp)
{
struct pim_interface *pim_ifp;
{
int fd;
+ /* Return early if socket is already enabled */
+ if (autorp->sock != -1)
+ return true;
+
frr_with_privs (&pimd_privs) {
fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (fd < 0) {
static bool pim_autorp_socket_disable(struct pim_autorp *autorp)
{
+ /* Return early if socket is already disabled */
+ if (autorp->sock == -1)
+ return true;
+
if (close(autorp->sock)) {
zlog_warn("Failure closing autorp socket: fd=%d errno=%d: %s",
autorp->sock, errno, safe_strerror(errno));
struct interface *ifp;
struct pim_autorp *autorp = pim->autorp;
+ /* Make sure the socket is open and ready */
+ if (!pim_autorp_socket_enable(autorp)) {
+ zlog_err("%s: AutoRP failed to open socket", __func__);
+ return;
+ }
+
if (!autorp->do_discovery) {
autorp->do_discovery = true;
autorp_read_on(autorp);
if (PIM_DEBUG_AUTORP)
zlog_debug("%s: AutoRP Discovery stopped", __func__);
}
+
+ /* Close the socket if we need to */
+ if (pim_autorp_should_close(autorp) && !pim_autorp_socket_disable(autorp))
+ zlog_warn("%s: AutoRP failed to close socket", __func__);
}
void pim_autorp_init(struct pim_instance *pim)
pim->autorp = autorp;
- if (!pim_autorp_socket_enable(autorp)) {
- zlog_err("%s: AutoRP failed to initialize, feature will not work correctly", __func__);
- return;
- }
-
if (PIM_DEBUG_AUTORP)
zlog_debug("%s: AutoRP Initialized", __func__);
int pim_process_autorp_cmd(struct vty *vty)
{
- char xpath[XPATH_MAXLEN];
-
- snprintf(xpath, sizeof(xpath), "%s/%s", FRR_PIM_AUTORP_XPATH,
- "discovery-enabled");
-
- nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, "true");
-
- return nb_cli_apply_changes(vty, NULL);
+ nb_cli_enqueue_change(vty, "./discovery-enabled", NB_OP_MODIFY, "true");
+ return nb_cli_apply_changes(vty, "%s", FRR_PIM_AUTORP_XPATH);
}
int pim_process_no_autorp_cmd(struct vty *vty)
{
- char xpath[XPATH_MAXLEN];
-
- snprintf(xpath, sizeof(xpath), "%s/%s", FRR_PIM_AUTORP_XPATH,
- "discovery-enabled");
-
- nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL);
-
- return nb_cli_apply_changes(vty, NULL);
+ nb_cli_enqueue_change(vty, "./discovery-enabled", NB_OP_MODIFY, "false");
+ return nb_cli_apply_changes(vty, "%s", FRR_PIM_AUTORP_XPATH);
}
int pim_process_autorp_candidate_rp_cmd(struct vty *vty, bool no,