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);