git:sr_3.0: modules/lcr: bug fixes

1 message Options
Embed this post
Permalink
Juha Heinanen

git:sr_3.0: modules/lcr: bug fixes

Reply Threaded More More options
Print post
Permalink
Module: sip-router
Branch: sr_3.0
Commit: a375b567c86cf1e066e7a56cce4697674aa9d1b3
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=a375b567c86cf1e066e7a56cce4697674aa9d1b3

Author: Juha Heinanen <[hidden email]>
Committer: Juha Heinanen <[hidden email]>
Date:   Thu Oct 29 10:27:54 2009 +0200

modules/lcr: bug fixes

- Fixed selection of gateways's attributes when same gateway has different
  attributes in different groups.
- Fixed printing of gateway's tag by lcr.dump_gws.

---

 modules/lcr/lcr_mod.c |   33 ++++++++++++++++++++-------------
 modules/lcr/lcr_rpc.c |    6 +++---
 2 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/modules/lcr/lcr_mod.c b/modules/lcr/lcr_mod.c
index 549e570..2b6c719 100644
--- a/modules/lcr/lcr_mod.c
+++ b/modules/lcr/lcr_mod.c
@@ -151,7 +151,7 @@ struct matched_gw_info {
     unsigned short prefix_len;
     unsigned short priority;
     unsigned int weight;
-    unsigned int defunct_until;
+    unsigned short duplicate;
 };
 
 /*
@@ -1412,7 +1412,7 @@ int mi_print_gws(struct mi_node* rpl)
     attr = add_mi_attr(node, MI_DUP_VALUE, "TAG", 3,
        gws[i].tag, gws[i].tag_len);
     if (attr == NULL) goto err;
-    
+
     p = int2str((unsigned long)gws[i].weight, &len);
     attr = add_mi_attr(node, MI_DUP_VALUE, "WEIGHT", 6, p, len);
     if (attr == NULL) goto err;
@@ -1658,6 +1658,7 @@ void add_gws_into_avps(struct gw_info *gws, struct matched_gw_info *matched_gws,
     delete_avp(gw_uri_avp_type|AVP_VAL_STR, gw_uri_avp);
 
     for (i = 0; i < gw_cnt; i++) {
+ if (matched_gws[i].duplicate == 1) continue;
  index = matched_gws[i].gw_index;
        hostname_len = gws[index].hostname_len;
  strip = gws[index].strip;
@@ -1684,7 +1685,7 @@ void add_gws_into_avps(struct gw_info *gws, struct matched_gw_info *matched_gws,
  add_avp(gw_uri_avp_type|AVP_VAL_STR, gw_uri_avp, val);
 
  LM_DBG("added gw_uri_avp <%.*s> with weight <%u>\n",
- value.len, value.s, matched_gws[i].weight);
+       value.len, value.s, matched_gws[i].weight);
     skip:
  continue;
     }
@@ -1697,8 +1698,8 @@ void add_gws_into_avps(struct gw_info *gws, struct matched_gw_info *matched_gws,
 static int load_gws(struct sip_msg* _m, char *_lcr_id, char *_from_uri)
 {
     str ruri_user, from_uri;
-    unsigned int j, k, gw_index, gw_count, now;
-    int lcr_id;
+    int i, j, lcr_id;
+    unsigned int gw_index, gw_count, now, ip_addr;
     int_str val;
     struct matched_gw_info matched_gws[MAX_NO_OF_GWS + 1];
     struct lcr_info **lcrs, *lcr_rec, *pl;
@@ -1770,18 +1771,12 @@ static int load_gws(struct sip_msg* _m, char *_lcr_id, char *_from_uri)
     while (j) {
                         /* If this gw is defunct, skip it */
         if (gws[j].defunct_until > now) goto gw_found;
- for (k = 0; k < gw_index; k++) {
-    if (gws[j].ip_addr ==
- gws[matched_gws[k].gw_index].ip_addr)
- /* Skip already existing gw */
- goto gw_found;
- }
- /* This is a new gw */
  matched_gws[gw_index].gw_index = j;
  matched_gws[gw_index].prefix_len = pl->prefix_len;
  matched_gws[gw_index].priority = lcr_rec->priority;
  matched_gws[gw_index].weight = gws[j].weight *
     (rand() >> 8);
+ matched_gws[gw_index].duplicate = 0;
  LM_DBG("added matched_gws[%d]=[%u, %u, %u, %u]\n",
        gw_index, j, pl->prefix_len, lcr_rec->priority,
        matched_gws[gw_index].weight);
@@ -1796,9 +1791,21 @@ static int load_gws(struct sip_msg* _m, char *_lcr_id, char *_from_uri)
  pl = pl->next;
     }
 
-    /* Sort gateways based on prefix_len, priority, and randomized weight */
+    /* Sort gateways in reverse order based on prefix_len, priority,
+       and randomized weight */
     qsort(matched_gws, gw_index, sizeof(struct matched_gw_info), comp_matched);
 
+    /* Remove duplicate gws */
+    for (i = gw_index - 1; i >= 0; i--) {
+ if (matched_gws[i].duplicate == 1) continue;
+ ip_addr = gws[matched_gws[i].gw_index].ip_addr;
+ for (j = i - 1; j >= 0; j--) {
+    if (gws[matched_gws[j].gw_index].ip_addr == ip_addr) {
+ matched_gws[j].duplicate = 1;
+    }
+ }
+    }
+
     /* Add gateways into gw_uris_avp */
     add_gws_into_avps(gws, matched_gws, gw_index, &ruri_user);
 
diff --git a/modules/lcr/lcr_rpc.c b/modules/lcr/lcr_rpc.c
index d9f5e72..51ffd75 100644
--- a/modules/lcr/lcr_rpc.c
+++ b/modules/lcr/lcr_rpc.c
@@ -74,7 +74,7 @@ static void dump_gws(rpc_t* rpc, void* c)
  if (rpc->add(c, "{", &st) < 0) return;
  rpc->struct_add(st, "d", "lcr_id", j);
  rpc->struct_add(st, "d", "grp_id", gws[i].grp_id);
- rpc->struct_printf(st,   "ip_addr", "%d.%d.%d.%d",
+ rpc->struct_printf(st, "ip_addr", "%d.%d.%d.%d",
    (gws[i].ip_addr << 24) >> 24,
    ((gws[i].ip_addr >> 8) << 24) >> 24,
    ((gws[i].ip_addr >> 16) << 24) >> 24,
@@ -110,9 +110,9 @@ static void dump_gws(rpc_t* rpc, void* c)
  tag.len=gws[i].tag_len;
  rpc->struct_add(st, "dSddd",
  "strip",  gws[i].strip,
- "tag",    gws[i].tag, /* FIXME */
+ "tag",    &tag,
  "weight", gws[i].weight,
- "flags",  &tag,
+ "flags",  gws[i].flags,
  "defunct_until",  &gws[i].defunct_until
  );
     }


_______________________________________________
sr-dev mailing list
[hidden email]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev