FPM patch allowing configuration of which server to connect to
diff --git a/fpm/fpm.h b/fpm/fpm.h
index 96f05f4..9a1dbf2 100644
--- a/fpm/fpm.h
+++ b/fpm/fpm.h
@@ -87,6 +87,14 @@
* table(s) when it reconnects.
*/
+/*
+ * Local host as a default server for fpm connection
+ */
+#define FPM_DEFAULT_IP (htonl (INADDR_LOOPBACK))
+
+/*
+ * default port for fpm connections
+ */
#define FPM_DEFAULT_PORT 2620
/*
@@ -270,4 +278,10 @@
return 1;
}
+// tcp maximum range
+#define TCP_MAX_PORT 65535
+
+// tcp minimum range
+#define TCP_MIN_PORT 1
+
#endif /* _FPM_H */
diff --git a/zebra/zebra_fpm.c b/zebra/zebra_fpm.c
index e02d174..fa2bc3a 100644
--- a/zebra/zebra_fpm.c
+++ b/zebra/zebra_fpm.c
@@ -153,6 +153,7 @@
zfpm_state_t state;
+ in_addr_t fpm_server;
/*
* Port on which the FPM is running.
*/
@@ -1126,7 +1127,10 @@
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
serv.sin_len = sizeof (struct sockaddr_in);
#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
- serv.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+ if (!zfpm_g->fpm_server)
+ serv.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+ else
+ serv.sin_addr.s_addr = (zfpm_g->fpm_server);
/*
* Connect to the FPM.
@@ -1518,6 +1522,86 @@
return CMD_SUCCESS;
}
+/*
+ * update fpm connection information
+ */
+DEFUN ( fpm_remote_ip,
+ fpm_remote_ip_cmd,
+ "fpm connection ip A.B.C.D port <1-65535>",
+ "fpm connection remote ip and port\n"
+ "Remote fpm server ip A.B.C.D\n"
+ "Enter ip ")
+{
+
+ in_addr_t fpm_server;
+ uint32_t port_no;
+
+ fpm_server = inet_addr (argv[0]);
+ if (fpm_server == INADDR_NONE)
+ return CMD_ERR_INCOMPLETE;
+
+ port_no = atoi (argv[1]);
+ if (port_no < TCP_MIN_PORT || port_no > TCP_MAX_PORT)
+ return CMD_ERR_INCOMPLETE;
+
+ if (zfpm_g->fpm_server == fpm_server &&
+ zfpm_g->fpm_port == port_no)
+ goto cmd_success;
+
+ zfpm_g->fpm_server = fpm_server;
+ zfpm_g->fpm_port = port_no;
+
+ if (zfpm_conn_is_up ())
+ zfpm_connection_down ("Restarting to new connection");
+
+cmd_success:
+ return CMD_SUCCESS;
+}
+
+DEFUN ( no_fpm_remote_ip,
+ no_fpm_remote_ip_cmd,
+ "no fpm connection ip A.B.C.D port <1-65535>",
+ "fpm connection remote ip and port\n"
+ "Connection\n"
+ "Remote fpm server ip A.B.C.D\n"
+ "Enter ip ")
+{
+ if (zfpm_g->fpm_server != inet_addr (argv[0]) ||
+ zfpm_g->fpm_port != atoi (argv[1]))
+ return CMD_ERR_NO_MATCH;
+
+ zfpm_g->fpm_server = FPM_DEFAULT_IP;
+ zfpm_g->fpm_port = FPM_DEFAULT_PORT;
+
+ if (zfpm_conn_is_up ())
+ zfpm_connection_down ("Reverting backto default fpm connection");
+
+ return CMD_SUCCESS;
+}
+
+
+/**
+ * fpm_remote_srv_write
+ *
+ * Module to write remote fpm connection
+ *
+ * Returns ZERO on success.
+ */
+
+int fpm_remote_srv_write (struct vty *vty )
+{
+ struct in_addr in;
+
+ in.s_addr = zfpm_g->fpm_server;
+
+ if (zfpm_g->fpm_server != FPM_DEFAULT_IP ||
+ zfpm_g->fpm_port != FPM_DEFAULT_PORT)
+ vty_out (vty,"fpm connection ip %s port %d%s", inet_ntoa (in),zfpm_g->fpm_port,VTY_NEWLINE);
+
+ return 0;
+}
+
+
/**
* zfpm_init
*
@@ -1561,11 +1645,16 @@
install_element (ENABLE_NODE, &show_zebra_fpm_stats_cmd);
install_element (ENABLE_NODE, &clear_zebra_fpm_stats_cmd);
+ install_element (CONFIG_NODE, &fpm_remote_ip_cmd);
+ install_element (CONFIG_NODE, &no_fpm_remote_ip_cmd);
if (!enable) {
return 1;
}
+ if (!zfpm_g->fpm_server)
+ zfpm_g->fpm_server = FPM_DEFAULT_IP;
+
if (!port)
port = FPM_DEFAULT_PORT;
diff --git a/zebra/zserv.c b/zebra/zserv.c
index afd722a..4b67c28 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -1864,6 +1864,24 @@
1
};
+#ifdef HAVE_FPM
+/* function to write the fpm config info */
+static int
+config_write_fpm (struct vty *vty)
+{
+ return
+ fpm_remote_srv_write (vty);
+}
+
+/* Zebra node */
+static struct cmd_node zebra_node =
+{
+ ZEBRA_NODE,
+ "",
+ 1
+};
+#endif
+
/* Initialisation of zebra and installation of commands. */
void
@@ -1875,6 +1893,9 @@
/* Install configuration write function. */
install_node (&table_node, config_write_table);
install_node (&forwarding_node, config_write_forwarding);
+#ifdef HAVE_FPM
+ install_node (&zebra_node, config_write_fpm);
+#endif
install_element (VIEW_NODE, &show_ip_forwarding_cmd);
install_element (ENABLE_NODE, &show_ip_forwarding_cmd);