[sr-dev] git:master: modules/lcr: added lcr.defunct_gw rpc command

admin at sip-router.org admin at sip-router.org
Tue Jan 31 00:21:39 CET 2012


Module: sip-router
Branch: master
Commit: 1c6fed07a177593634a8c31a8d004f0aab165d16
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1c6fed07a177593634a8c31a8d004f0aab165d16

Author: Juha Heinanen <jh at tutpro.com>
Committer: Juha Heinanen <jh at tutpro.com>
Date:   Tue Jan 31 01:20:10 2012 +0200

modules/lcr: added lcr.defunct_gw rpc command

---

 modules/lcr/README            |   17 +++++++++++++++++
 modules/lcr/doc/lcr_admin.xml |   19 +++++++++++++++++++
 modules/lcr/lcr_mod.c         |   32 ++++++++++++++++++++++++++++++++
 modules/lcr/lcr_mod.h         |    5 ++---
 modules/lcr/lcr_rpc.c         |   32 ++++++++++++++++++++++++++++++--
 5 files changed, 100 insertions(+), 5 deletions(-)

diff --git a/modules/lcr/README b/modules/lcr/README
index 3e1ab37..b98cb6c 100644
--- a/modules/lcr/README
+++ b/modules/lcr/README
@@ -78,6 +78,7 @@ Juha Heinanen
               5.1. lcr.reload
               5.2. lcr.dump_gws
               5.3. lcr.dump_rules
+              5.4. lcr.defunct_gw
 
         6. Known Limitations
 
@@ -131,6 +132,7 @@ Juha Heinanen
    1.46. lcr.reload RPC example
    1.47. lcr.dump_gws RPC example
    1.48. lcr.dump_rules RPC example
+   1.49. lcr.defunct_gw RPC example
 
 Chapter 1. Admin Guide
 
@@ -197,6 +199,7 @@ Chapter 1. Admin Guide
         5.1. lcr.reload
         5.2. lcr.dump_gws
         5.3. lcr.dump_rules
+        5.4. lcr.defunct_gw
 
    6. Known Limitations
 
@@ -971,6 +974,7 @@ if (to_any_gw("192.55.66.2", 1)) {
    5.1. lcr.reload
    5.2. lcr.dump_gws
    5.3. lcr.dump_rules
+   5.4. lcr.defunct_gw
 
 5.1. lcr.reload
 
@@ -1002,6 +1006,19 @@ if (to_any_gw("192.55.66.2", 1)) {
    Example 1.48. lcr.dump_rules RPC example
                 $ sercmd lcr.dump_rules
 
+5.4. lcr.defunct_gw
+
+   Defuncts gateway loaded into memory for a period of time (seconds)
+   without a need to store gateway's defunct value into database and
+   reload the tables.
+
+   Name: lcr.defunct_gw
+
+   Parameters: lcr_id gw_id period
+
+   Example 1.49. lcr.defunct_gw RPC example
+                $ sercmd lcr.defunct_gw 1 4 120
+
 6. Known Limitations
 
    In-memory LCR rules and gw tables are switched by two consecutive
diff --git a/modules/lcr/doc/lcr_admin.xml b/modules/lcr/doc/lcr_admin.xml
index 64854e9..b8e243d 100644
--- a/modules/lcr/doc/lcr_admin.xml
+++ b/modules/lcr/doc/lcr_admin.xml
@@ -1324,6 +1324,25 @@ if (to_any_gw("192.55.66.2", 1)) {
 		</programlisting>
 		</example>
 		</section>
+
+		<section>
+		<title><function>lcr.defunct_gw</function></title>
+		<para>
+			Defuncts gateway loaded into memory for a period of
+			time (seconds) without a need to store gateway's
+			defunct	value into database and reload the tables.
+		</para>
+		<para>
+		Name: <emphasis>lcr.defunct_gw</emphasis>
+		</para>
+		<para>Parameters: <emphasis>lcr_id gw_id period</emphasis></para>
+		<example>
+		<title><function>lcr.defunct_gw</function> RPC example</title>
+		<programlisting  format="linespecific">
+		$ sercmd lcr.defunct_gw 1 4 120
+		</programlisting>
+		</example>
+		</section>
 	</section>
 	<section>
 	<title>Known Limitations</title>
diff --git a/modules/lcr/lcr_mod.c b/modules/lcr/lcr_mod.c
index 8f8d373..58dd0cd 100644
--- a/modules/lcr/lcr_mod.c
+++ b/modules/lcr/lcr_mod.c
@@ -2049,6 +2049,38 @@ static int defunct_gw(struct sip_msg* _m, char *_defunct_period, char *_s2)
 
 
 /*
+ * Defunct given gw in given lcr until time period given as argument has passed.
+ */
+int rpc_defunct_gw(unsigned int lcr_id, unsigned int gw_id, unsigned int period)
+{
+    struct gw_info *gws;
+    unsigned int until, i;
+
+    if ((lcr_id < 1) || (lcr_id > lcr_count_param)) {
+	LM_ERR("invalid lcr_id value <%u>\n", lcr_id);
+	return 0;
+    }
+
+    until = time((time_t *)NULL) + period;
+
+    LM_DBG("defuncting gw <lcr_id/gw_id>=<%u/%u> for %u seconds until %d\n",
+	   lcr_id, gw_id, period, until);
+
+    gws = gw_pt[lcr_id];
+    for (i = 1; i <= gws[0].ip_addr.u.addr32[0]; i++) {
+	if (gws[i].gw_id == gw_id) {
+	    gws[i].defunct_until = until;
+	    return 1;
+	}
+    }
+    
+    LM_ERR("gateway with id <%u> not found\n", gw_id);
+
+    return 0;
+}
+
+
+/*
  * When called first time, rewrites scheme, host, port, and
  * transport parts of R-URI based on first gw_uri_avp value, which is then
  * destroyed.  Saves R-URI user to ruri_user_avp for later use.
diff --git a/modules/lcr/lcr_mod.h b/modules/lcr/lcr_mod.h
index e544f68..5ac2406 100644
--- a/modules/lcr/lcr_mod.h
+++ b/modules/lcr/lcr_mod.h
@@ -110,8 +110,7 @@ extern gen_lock_t *reload_lock;
 extern struct gw_info **gw_pt;
 extern struct rule_info ***rule_pt;
 
-int  mi_print_gws(struct mi_node* rpl);
-int  mi_print_lcrs(struct mi_node* rpl);
-int  reload_tables();
+extern int reload_tables();
+extern int rpc_defunct_gw(unsigned int, unsigned int, unsigned int);
 
 #endif /* LCR_MOD_H */
diff --git a/modules/lcr/lcr_rpc.c b/modules/lcr/lcr_rpc.c
index f70c042..111bfb0 100644
--- a/modules/lcr/lcr_rpc.c
+++ b/modules/lcr/lcr_rpc.c
@@ -67,6 +67,8 @@ static void dump_gws(rpc_t* rpc, void* c)
     str gw_name, hostname, params;
     str prefix, tag;
     struct gw_info *gws;
+    char buf[INT2STR_MAX_LEN], *start;
+    int len;
 
     for (j = 1; j <= lcr_count_param; j++) {
 
@@ -132,12 +134,14 @@ static void dump_gws(rpc_t* rpc, void* c)
 	    prefix.len=gws[i].prefix_len;
 	    tag.s=gws[i].tag;
 	    tag.len=gws[i].tag_len;
-	    rpc->struct_add(st, "dSSdd",
+	    start = int2strbuf(gws[i].defunct_until, &(buf[0]), INT2STR_MAX_LEN,
+			       &len);
+	    rpc->struct_add(st, "dSSds",
 			    "strip",  gws[i].strip,
 			    "prefix", &prefix,
 			    "tag",    &tag,
 			    "flags",  gws[i].flags,
-			    "defunct_until",  &gws[i].defunct_until
+			    "defunct_until",  start
 			    );
 	}
     }
@@ -199,9 +203,33 @@ static void dump_rules(rpc_t* rpc, void* c)
 }
 
 
+static const char* defunct_gw_doc[2] = {
+    "Defunct gateway until speficied time (Unix timestamp).",
+    0
+};
+
+
+static void defunct_gw(rpc_t* rpc, void* c)
+{
+    unsigned int lcr_id, gw_id, until;
+
+    if (rpc->scan(c, "ddd", &lcr_id, &gw_id, &until) < 3) {
+	rpc->fault(c, 400, "lcr_id, gw_id, and timestamp parameters required");
+	return;
+    }
+
+    if (rpc_defunct_gw(lcr_id, gw_id, until) == 0) {
+	rpc->fault(c, 400, "parameter value error (see syslog)");
+    }
+    
+    return;
+}
+
+
 rpc_export_t lcr_rpc[] = {
     {"lcr.reload", reload, reload_doc, 0},
     {"lcr.dump_gws", dump_gws, dump_gws_doc, 0},
     {"lcr.dump_rules", dump_rules, dump_rules_doc, 0},
+    {"lcr.defunct_gw", defunct_gw, defunct_gw_doc, 0},
     {0, 0, 0, 0}
 };




More information about the sr-dev mailing list