[sr-dev] git:master: core/dns: dns SRV lookup, if no NAPTR available

Ovidiu Sas osas at voipembedded.com
Thu Dec 20 18:58:00 CET 2012


CC (gcc) [kamailio]             dns_cache.o
dns_cache.c: In function âdns_naptr_sip_resolvehostâ:
dns_cache.c:2893: warning: implicit declaration of function
âno_naptr_srv_sip_resolvehostâ
dns_cache.c:2893: warning: return makes pointer from integer without a cast


gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)


On Thu, Dec 20, 2012 at 7:43 AM, Mihaly Meszaros <misi at niif.hu> wrote:
> Module: sip-router
> Branch: master
> Commit: 63ef5f0edcfebe86cffe7489f3524186ed3400d4
> URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=63ef5f0edcfebe86cffe7489f3524186ed3400d4
>
> Author: Mihály Mészáros <misi at niif.hu>
> Committer: Mihály Mészáros <misi at niif.hu>
> Date:   Mon Nov 12 16:02:48 2012 +0100
>
> core/dns: dns SRV lookup, if no NAPTR available
>
> - Resolving the first most preferred and available SRV record if no NAPTR found.
>   It reuse the dns protocol preference scores. Sort protocols based on this preference.
>
> ---
>
>  dns_cache.c |    2 +-
>  resolve.c   |  138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 137 insertions(+), 3 deletions(-)
>
> diff --git a/dns_cache.c b/dns_cache.c
> index 1a7f1c5..1f4ae82 100644
> --- a/dns_cache.c
> +++ b/dns_cache.c
> @@ -2890,7 +2890,7 @@ struct hostent* dns_naptr_sip_resolvehost(str* name, unsigned short* port,
>                 dns_hash_put(e);
>         }
>  naptr_not_found:
> -       return dns_srv_sip_resolvehost(name, port, proto);
> +       return no_naptr_srv_sip_resolvehost(name,port,proto);
>  }
>  #endif /* USE_NAPTR */
>
> diff --git a/resolve.c b/resolve.c
> index 73715e3..251d680 100644
> --- a/resolve.c
> +++ b/resolve.c
> @@ -1448,8 +1448,142 @@ end:
>         return 0;
>  }
>
> +/* Resolves SRV if no naptr found.
> + * It reuse dns_pref values and according that resolves supported protocols.
> + * If dns_pref are equal then it use udp,tcp,tls,sctp order.
> + * returns: hostent struct & *port filled with the port from the SRV record;
> + *  0 on error
> + */
> +
> +struct hostent* no_naptr_srv_sip_resolvehost(str* name, unsigned short* port, char* proto)
> +{
> +       struct dns_srv_proto_t {
> +               char proto;
> +               int proto_pref;
> +       } srv_proto_list[PROTO_LAST], tmp_srv_element;
> +       struct hostent* he;
> +       str srv_name;
> +       static char tmp_srv[MAX_DNS_NAME]; /* tmp. buff. for SRV lookups */
> +       int len;
> +       unsigned char i,j,max,default_order=0,list_len=0;
> +       /* init variables */
> +       he=0;
> +       len=0;
> +
> +       if ((name->len+SRV_MAX_PREFIX_LEN+1)>MAX_DNS_NAME){
> +               LOG(L_WARN, "WARNING: no_naptr_srv_sip_resolvehost: domain name too long"
> +                                               " (%d), unable to perform SRV lookup\n", name->len);
> +       } else {
> +               /* if proto available, then add only the forced protocol to the list */
> +               if (proto && *proto==0){
> +                       srv_proto_list[0].proto=*proto;
> +                       list_len=1;
> +               } else {
> +
> +                       /*get protocols and preference scores, and add availble protocol(s) and score(s) to the list*/
> +                       for (i=PROTO_UDP; i<PROTO_LAST;i++) {
> +                               tmp_srv_element.proto_pref = proto_pref_score(i);
> +                               /* if -1 so disabled continue with next protocol*/
> +                               if (naptr_proto_supported(i) == 0 ) {
> +                                       continue;
> +                               } else {
> +                                       srv_proto_list[i-1].proto_pref=tmp_srv_element.proto_pref;
> +                                       srv_proto_list[i-1].proto=i;
> +                                       list_len++;
> +                               }
> +                       };
> +
> +                       /* if all protocol prefence scores equal, then set the perference to default values: udp,tcp,tls,sctp */
> +                       for (i=1; i<list_len;i++) {
> +                               if(srv_proto_list[0].proto_pref!=srv_proto_list[i].proto_pref){
> +                                       default_order=0;
> +                               }
> +                       }
> +                       if (default_order){
> +                               for (i=0; i<list_len;i++) {
> +                                       switch ( srv_proto_list[i].proto) {
> +                                               case PROTO_UDP:
> +                                                       srv_proto_list[i].proto_pref=4;
> +                                                       break;
> +                                               case PROTO_TCP:
> +                                                       srv_proto_list[i].proto_pref=3;
> +                                                       break;
> +                                               case PROTO_TLS:
> +                                                       srv_proto_list[i].proto_pref=2;
> +                                                       break;
> +                                               case PROTO_SCTP:
> +                                                       srv_proto_list[i].proto_pref=1;
> +                                                       break;
> +                                       }
> +                               }
> +                       }
> +
> +                       /* sorting the list */
> +                       for (i=0;i<list_len-1;i++) {
> +                               max=i;
> +                               for (j=i+1;j<list_len;j++) {
> +                                       if (srv_proto_list[j].proto_pref>srv_proto_list[max].proto_pref) {
> +                                               max=j;
> +                                       }
> +                               }
> +                               if (i!=max) {
> +                                       tmp_srv_element=srv_proto_list[i];
> +                                       srv_proto_list[i]=srv_proto_list[max];
> +                                       srv_proto_list[max]=tmp_srv_element;
> +                               }
> +                       }
>
> +               }
> +               /* looping on the ordered list until we found a protocol what has srv record */
> +               for (i=0; i<list_len;i++) {
> +                       switch (srv_proto_list[i].proto) {
> +                               case PROTO_NONE: /* no proto specified, use udp */
> +                                       if (proto)
> +                                               *proto=PROTO_UDP;
> +                                       /* no break */
> +                               case PROTO_UDP:
> +                                       memcpy(tmp_srv, SRV_UDP_PREFIX, SRV_UDP_PREFIX_LEN);
> +                                       memcpy(tmp_srv+SRV_UDP_PREFIX_LEN, name->s, name->len);
> +                                       tmp_srv[SRV_UDP_PREFIX_LEN + name->len] = '\0';
> +                                       len=SRV_UDP_PREFIX_LEN + name->len;
> +                                       break;
> +                               case PROTO_TCP:
> +                                       memcpy(tmp_srv, SRV_TCP_PREFIX, SRV_TCP_PREFIX_LEN);
> +                                       memcpy(tmp_srv+SRV_TCP_PREFIX_LEN, name->s, name->len);
> +                                       tmp_srv[SRV_TCP_PREFIX_LEN + name->len] = '\0';
> +                                       len=SRV_TCP_PREFIX_LEN + name->len;
> +                                       break;
> +                               case PROTO_TLS:
> +                                       memcpy(tmp_srv, SRV_TLS_PREFIX, SRV_TLS_PREFIX_LEN);
> +                                       memcpy(tmp_srv+SRV_TLS_PREFIX_LEN, name->s, name->len);
> +                                       tmp_srv[SRV_TLS_PREFIX_LEN + name->len] = '\0';
> +                                       len=SRV_TLS_PREFIX_LEN + name->len;
> +                                       break;
> +                               case PROTO_SCTP:
> +                                       memcpy(tmp_srv, SRV_SCTP_PREFIX, SRV_SCTP_PREFIX_LEN);
> +                                       memcpy(tmp_srv+SRV_SCTP_PREFIX_LEN, name->s, name->len);
> +                                       tmp_srv[SRV_SCTP_PREFIX_LEN + name->len] = '\0';
> +                                       len=SRV_SCTP_PREFIX_LEN + name->len;
> +                                       break;
> +                               default:
> +                                       LOG(L_CRIT, "BUG: sip_resolvehost: unknown proto %d\n",
> +                                                       (int)srv_proto_list[i].proto);
> +                                       return 0;
> +                       }
> +                       /* set default port */
> +                       if ((port)&&(*port==0)){
> +                               *port=(srv_proto_list[i].proto==PROTO_TLS)?SIPS_PORT:SIP_PORT; /* just in case we don't find another */
> +                       }
> +                       srv_name.s=tmp_srv;
> +                       srv_name.len=len;
> +                       if ((he=dns_srv_get_he(&srv_name, port, dns_flags))!=0) {
> +                               return he;
> +                       }
> +               }
> +       }
> +       return 0;
>
> +}
>
>  /* internal sip naptr resolver function: resolves a host name trying:
>   * - NAPTR lookup if the address is not an ip and *proto==0 and *port==0.
> @@ -1515,8 +1649,8 @@ struct hostent* naptr_sip_resolvehost(str* name,  unsigned short* port,
>                                 " trying SRV lookup...\n", name->len, name->s);
>  #endif
>         }
> -       /* fallback to normal srv lookup */
> -       he=srv_sip_resolvehost(name, 0, port, proto, 0, 0);
> +       /* fallback to srv lookup */
> +       no_naptr_srv_sip_resolvehost(name,port,proto);
>  end:
>         if (naptr_head)
>                 free_rdata_list(naptr_head);
>
>



More information about the sr-dev mailing list