Module: sems
Branch: rco/dnscache
Commit: 248bc3e11ab3ac2b14c9bc0841e132162574218b
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=248bc3e11ab3ac2b14c9bc0841e132162574218b

Author: Raphael Coeffic <[email protected]>
Committer: Raphael Coeffic <[email protected]>
Date:   Thu Sep  2 17:04:58 2010 +0200

corrected some bugs

---

 core/sip/resolver.cpp |   55 +++++++++++++++++++++++++++++++++----------------
 1 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/core/sip/resolver.cpp b/core/sip/resolver.cpp
index 9828c83..1b4d13f 100644
--- a/core/sip/resolver.cpp
+++ b/core/sip/resolver.cpp
@@ -142,37 +142,48 @@ int dns_srv_entry::next_ip(dns_handle* h, 
sockaddr_storage* sa)
 
     // fetch current priority
     unsigned short p = ((srv_entry*)ip_vec[i])->p;
-    unsigned int w_sum = ((srv_entry*)ip_vec[i])->w;
-    srv_lst.push_back(std::make_pair(w_sum,i));
+    unsigned int w_sum = 0;
 
     // and fetch records with same priority
     // which have not been chosen yet
     int srv_lst_size=0;
     unsigned int used_mask=(1<<i);
-    while( (++i != (int)ip_vec.size()) && 
-          (i<(int)MAX_SRV_RR) &&
-          (p==((srv_entry*)ip_vec[i])->p) ){
+    while( (p==((srv_entry*)ip_vec[i])->p) ){
        
-       used_mask = used_mask << 1;
+       DBG("used_mask & h->srv_used: %i & %i",used_mask,h->srv_used);
        if(!(used_mask & h->srv_used)){
            w_sum += ((srv_entry*)ip_vec[i])->w;
            srv_lst.push_back(std::make_pair(w_sum,i));
            srv_lst_size++;
        }
+
+       if((++i >= (int)ip_vec.size()) ||
+          (i >= (int)MAX_SRV_RR)){
+           break;
+       }
+
+       DBG("(p==((srv_entry*)ip_vec[i])->p): %i, 
%i",p,((srv_entry*)ip_vec[i])->p);
+       used_mask = used_mask << 1;
     }
 
     srv_entry* e=NULL;
+    DBG("srv_lst_size: %i",srv_lst_size);
     if((srv_lst_size > 1) && w_sum){
        // multiple records: apply weigthed load balancing
        // - remember the entries which have already been used
-       unsigned int r = rand() % (w_sum+1);
+       unsigned int r = random() % (w_sum+1);
 
+       DBG("random SRV lottery: %u / %u",r,w_sum);
        list<pair<unsigned int,int> >::iterator srv_lst_it = srv_lst.begin();
        while(srv_lst_it != srv_lst.end()){
            if(srv_lst_it->first >= r){
+               DBG("h->srv_used: %i (before)",h->srv_used);
                h->srv_used |= (1<<(srv_lst_it->second));
+               DBG("h->srv_used: %i (after)",h->srv_used);
                e = (srv_entry*)ip_vec[srv_lst_it->second];
+               break;
            }
+           ++srv_lst_it;
        }
 
        // should never trigger
@@ -180,10 +191,18 @@ int dns_srv_entry::next_ip(dns_handle* h, 
sockaddr_storage* sa)
     }
     else {
        // single record or all weights == 0
-       e = (srv_entry*)ip_vec[index];
-       if( (++i >= (int)ip_vec.size()) || (i>=(int)MAX_SRV_RR)){
-           h->srv_n = -1;
+       e = (srv_entry*)ip_vec[srv_lst.begin()->second];
+
+       if( (i<(int)ip_vec.size()) && (i<(int)MAX_SRV_RR)){
+           index = i;
        }
+       else if(!w_sum){
+           index++;
+       }
+       else {
+           index = -1;
+       }
+       DBG("index = %i",index);
     }
 
     //TODO: find a solution for IPv6
@@ -390,13 +409,13 @@ static dns_base_entry* rr_to_srv_entry(ns_msg* handle, 
ns_rr* rr)
        return NULL;
     }
     
-    printf("SRV:\tTTL=%i\t%s\tP=<%i> W=<%i> P=<%i> T=<%s>\n",
-          ns_rr_ttl(*rr),
-          ns_rr_name(*rr),
-          ns_get16(rdata),
-          ns_get16(rdata+2),
-          ns_get16(rdata+4),
-          name_buf);
+    DBG("SRV:\tTTL=%i\t%s\tP=<%i> W=<%i> P=<%i> T=<%s>\n",
+       ns_rr_ttl(*rr),
+       ns_rr_name(*rr),
+       ns_get16(rdata),
+       ns_get16(rdata+2),
+       ns_get16(rdata+4),
+       name_buf);
     
     srv_entry* srv_r = new srv_entry();
     srv_r->p = ns_get16(rdata);
@@ -602,7 +621,7 @@ bool dns_handle::valid()
 
 bool dns_handle::eoip()  
 { 
-    if(srv_n)
+    if(srv_e)
        return (srv_n == -1) && (ip_n == -1);
     else
        return (ip_n == -1);

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to