summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fpm/fpm.h14
-rw-r--r--zebra/zebra_fpm.c81
-rw-r--r--zebra/zebra_fpm.h1
-rw-r--r--zebra/zserv.c21
4 files changed, 116 insertions, 1 deletions
diff --git a/fpm/fpm.h b/fpm/fpm.h
index 96f05f486..9a1dbf2b0 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 @@ fpm_msg_ok (const fpm_msg_hdr_t *hdr, size_t len)
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 220fddaf6..34f006851 100644
--- a/zebra/zebra_fpm.c
+++ b/zebra/zebra_fpm.c
@@ -156,6 +156,7 @@ typedef struct zfpm_glob_t_
zfpm_state_t state;
+ in_addr_t fpm_server;
/*
* Port on which the FPM is running.
*/
@@ -1129,7 +1130,10 @@ zfpm_connect_cb (struct thread *t)
#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.
@@ -1520,6 +1524,76 @@ DEFUN (clear_zebra_fpm_stats,
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;
+
+ zfpm_g->fpm_server = fpm_server;
+ zfpm_g->fpm_port = port_no;
+
+
+ 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;
+
+ 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
*
@@ -1563,11 +1637,16 @@ zfpm_init (struct thread_master *master, int enable, uint16_t port)
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/zebra_fpm.h b/zebra/zebra_fpm.h
index 44dec0286..7fa71e40b 100644
--- a/zebra/zebra_fpm.h
+++ b/zebra/zebra_fpm.h
@@ -30,5 +30,6 @@
*/
extern int zfpm_init (struct thread_master *master, int enable, uint16_t port);
extern void zfpm_trigger_update (struct route_node *rn, const char *reason);
+extern int fpm_remote_srv_write (struct vty *vty);
#endif /* _ZEBRA_FPM_H */
diff --git a/zebra/zserv.c b/zebra/zserv.c
index 4cfeead88..27d10a171 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -2576,6 +2576,24 @@ static struct cmd_node forwarding_node =
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
@@ -2587,6 +2605,9 @@ zebra_init (void)
/* 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);