Changeset 1102


Ignore:
Timestamp:
Mar 24, 2007 5:37:25 PM (17 years ago)
Author:
bennylp
Message:

Added generic DNS SRV resolution in pjlib-util

Location:
pjproject/trunk
Files:
2 added
8 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib-util/build/pjlib_util.dsp

    r1062 r1102  
    142142# Begin Source File 
    143143 
     144SOURCE="..\src\pjlib-util\srv_resolver.c" 
     145# End Source File 
     146# Begin Source File 
     147 
    144148SOURCE="..\src\pjlib-util\string.c" 
    145149# End Source File 
     
    219223 
    220224SOURCE="..\include\pjlib-util\sha1.h" 
     225# End Source File 
     226# Begin Source File 
     227 
     228SOURCE="..\include\pjlib-util\srv_resolver.h" 
    221229# End Source File 
    222230# Begin Source File 
  • pjproject/trunk/pjlib-util/build/pjlib_util.vcproj

    r1100 r1102  
    55        Name="pjlib_util" 
    66        ProjectGUID="{FE07F272-AE7F-4549-9E9F-EF9B80CB1693}" 
     7        RootNamespace="pjlib_util" 
    78        > 
    89        <Platforms> 
     
    466467                        </File> 
    467468                        <File 
     469                                RelativePath="..\src\pjlib-util\srv_resolver.c" 
     470                                > 
     471                        </File> 
     472                        <File 
    468473                                RelativePath="..\src\pjlib-util\string.c" 
    469474                                > 
     
    637642                        </File> 
    638643                        <File 
     644                                RelativePath="..\include\pjlib-util\srv_resolver.h" 
     645                                > 
     646                        </File> 
     647                        <File 
    639648                                RelativePath="..\include\pjlib-util\string.h" 
    640649                                > 
  • pjproject/trunk/pjlib-util/include/pjlib-util.h

    r1062 r1102  
    4242#include <pjlib-util/dns.h> 
    4343#include <pjlib-util/resolver.h> 
     44#include <pjlib-util/srv_resolver.h> 
    4445 
    4546/* Text scanner */ 
  • pjproject/trunk/pjsip-apps/build/sample_debug.dsp

    r794 r1102  
    4343# PROP Target_Dir "" 
    4444# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c 
    45 # ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../pjsip/include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../../pjmedia/include" /D PJ_WIN32=1 /D PJ_M_I386=1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /c 
     45# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../pjsip/include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../../pjmedia/include" /I "../../pjnath/include" /D PJ_WIN32=1 /D PJ_M_I386=1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /c 
    4646# SUBTRACT CPP /YX 
    4747# ADD BASE RSC /l 0x409 /d "NDEBUG" 
     
    6969# PROP Target_Dir "" 
    7070# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c 
    71 # ADD CPP /nologo /MTd /W4 /Gm /GX /ZI /Od /I "../../pjsip/include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../../pjmedia/include" /D PJ_WIN32=1 /D PJ_M_I386=1 /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c 
     71# ADD CPP /nologo /MTd /W4 /Gm /GX /ZI /Od /I "../../pjsip/include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../../pjmedia/include" /I "../../pjnath/include" /D PJ_WIN32=1 /D PJ_M_I386=1 /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c 
    7272# ADD BASE RSC /l 0x409 /d "_DEBUG" 
    7373# ADD RSC /l 0x409 /d "_DEBUG" 
  • pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c

    r1098 r1102  
    326326           OPT_REGISTRAR, OPT_REG_TIMEOUT, OPT_PUBLISH, OPT_ID, OPT_CONTACT, 
    327327           OPT_REALM, OPT_USERNAME, OPT_PASSWORD, 
    328            OPT_NAMESERVER, OPT_STUN_SRV, 
     328           OPT_NAMESERVER, OPT_STUN_DOMAIN, OPT_STUN_SRV, 
    329329           OPT_ADD_BUDDY, OPT_OFFER_X_MS_MSG, OPT_NO_PRESENCE, 
    330330           OPT_AUTO_ANSWER, OPT_AUTO_HANGUP, OPT_AUTO_PLAY, OPT_AUTO_LOOP, 
     
    367367        { "password",   1, 0, OPT_PASSWORD}, 
    368368        { "nameserver", 1, 0, OPT_NAMESERVER}, 
     369        { "stun-domain",1, 0, OPT_STUN_DOMAIN}, 
    369370        { "stun-srv",   1, 0, OPT_STUN_SRV}, 
    370371        { "add-buddy",  1, 0, OPT_ADD_BUDDY}, 
     
    632633            break; 
    633634 
     635        case OPT_STUN_DOMAIN:   /* STUN domain */ 
     636            cfg->cfg.stun_domain = pj_str(pj_optarg); 
     637            break; 
     638 
    634639        case OPT_STUN_SRV:   /* STUN server */ 
    635             cfg->cfg.stun_srv = pj_str(pj_optarg); 
     640            cfg->cfg.stun_host = pj_str(pj_optarg); 
    636641            break; 
    637642 
     
    10841089 
    10851090    /* STUN */ 
    1086     if (config->cfg.stun_srv.slen) { 
     1091    if (config->cfg.stun_domain.slen) { 
     1092        pj_ansi_sprintf(line, "--stun-domain %.*s\n", 
     1093                        (int)config->cfg.stun_domain.slen,  
     1094                        config->cfg.stun_domain.ptr); 
     1095        pj_strcat2(&cfg, line); 
     1096    } 
     1097    if (config->cfg.stun_host.slen) { 
    10871098        pj_ansi_sprintf(line, "--stun-srv %.*s\n", 
    1088                         (int)config->cfg.stun_srv.slen,  
    1089                         config->cfg.stun_srv.ptr); 
     1099                        (int)config->cfg.stun_host.slen,  
     1100                        config->cfg.stun_host.ptr); 
    10901101        pj_strcat2(&cfg, line); 
    10911102    } 
  • pjproject/trunk/pjsip/build/test_pjsip.dsp

    r753 r1102  
    4343# PROP Target_Dir "" 
    4444# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c 
    45 # ADD CPP /nologo /MD /W3 /Zi /O2 /Ob2 /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "PJ_WIN32" /D "PJ_M_I386" /FR /FD /c 
     45# ADD CPP /nologo /MD /W3 /Zi /O2 /Ob2 /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../../pjnath/include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "PJ_WIN32" /D "PJ_M_I386" /FR /FD /c 
    4646# SUBTRACT CPP /YX 
    4747# ADD BASE RSC /l 0x409 /d "NDEBUG" 
     
    6868# PROP Target_Dir "" 
    6969# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c 
    70 # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "PJ_WIN32" /D "PJ_M_I386" /FR /FD /GZ /c 
     70# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../../pjnath/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "PJ_WIN32" /D "PJ_M_I386" /FR /FD /GZ /c 
    7171# SUBTRACT CPP /YX 
    7272# ADD BASE RSC /l 0x409 /d "_DEBUG" 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h

    r1098 r1102  
    904904 
    905905    /** 
    906      * Specify STUN server. This server will be first resolved with DNS SRV 
    907      * to get the actual server address. If DNS SRV resolution failed, or 
    908      * when nameserver is not configured, the server will be resolved using 
    909      * DNS A resolution (i.e. gethostbyname()). 
    910      */ 
    911     pj_str_t        stun_srv; 
     906     * Specify domain name to be resolved with DNS SRV resolution to get the 
     907     * address of the STUN servers. Alternatively application may specify 
     908     * \a stun_host and \a stun_relay_host instead. 
     909     * 
     910     * If DNS SRV resolution failed for this domain, then DNS A resolution 
     911     * will be performed only if \a stun_host is specified. 
     912     */ 
     913    pj_str_t        stun_domain; 
     914 
     915    /** 
     916     * Specify STUN server to be used. 
     917     */ 
     918    pj_str_t        stun_host; 
     919 
     920    /** 
     921     * Specify STUN relay server to be used. 
     922     */ 
     923    pj_str_t        stun_relay_host; 
    912924 
    913925    /**  
     
    10101022 
    10111023    pj_strdup_with_null(pool, &dst->user_agent, &src->user_agent); 
    1012     pj_strdup_with_null(pool, &dst->stun_srv, &src->stun_srv); 
     1024    pj_strdup_with_null(pool, &dst->stun_domain, &src->stun_domain); 
     1025    pj_strdup_with_null(pool, &dst->stun_host, &src->stun_host); 
     1026    pj_strdup_with_null(pool, &dst->stun_relay_host, &src->stun_relay_host); 
    10131027} 
    10141028 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r1101 r1102  
    653653} 
    654654 
     655 
     656static pj_status_t resolve_stun_server(pj_bool_t use_dns_srv); 
     657 
     658/* 
     659 * Callback function to receive notification from the resolver 
     660 * when the resolution process completes. 
     661 */ 
     662static void stun_dns_srv_resolver_cb(void *user_data, 
     663                                     pj_status_t status, 
     664                                     const pj_dns_srv_record *rec) 
     665{ 
     666    unsigned i; 
     667 
     668    PJ_UNUSED_ARG(user_data); 
     669 
     670    pjsua_var.stun_status = status; 
     671     
     672    if (status != PJ_SUCCESS) { 
     673        /* DNS SRV resolution failed. If stun_host is specified, resolve 
     674         * it with gethostbyname() 
     675         */ 
     676        if (pjsua_var.ua_cfg.stun_host.slen) { 
     677            pj_hostent he; 
     678 
     679            pjsua_var.stun_status = pj_gethostbyname(&pjsua_var.ua_cfg.stun_host, &he); 
     680 
     681            if (pjsua_var.stun_status == PJ_SUCCESS) { 
     682                pj_sockaddr_in_init(&pjsua_var.stun_srv.ipv4, NULL, 0); 
     683                pjsua_var.stun_srv.ipv4.sin_addr = *(pj_in_addr*)he.h_addr; 
     684                pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)3478); 
     685 
     686                PJ_LOG(3,(THIS_FILE,  
     687                          "STUN server %.*s resolved, address is %s:%d", 
     688                          (int)pjsua_var.ua_cfg.stun_host.slen, 
     689                          pjsua_var.ua_cfg.stun_host.ptr, 
     690                          pj_inet_ntoa(pjsua_var.stun_srv.ipv4.sin_addr), 
     691                          (int)pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port))); 
     692            } 
     693        } else { 
     694            char errmsg[PJ_ERR_MSG_SIZE]; 
     695 
     696            pj_strerror(status, errmsg, sizeof(errmsg)); 
     697            PJ_LOG(1,(THIS_FILE,  
     698                     "DNS SRV resolution failed for STUN server %.*s: %s", 
     699                     (int)pjsua_var.ua_cfg.stun_domain.slen, 
     700                     pjsua_var.ua_cfg.stun_domain.ptr, 
     701                     errmsg)); 
     702        } 
     703        return; 
     704    } 
     705 
     706    pj_memcpy(&pjsua_var.stun_srv, &rec->entry[0].addr,  
     707              rec->entry[0].addr_len); 
     708 
     709    PJ_LOG(3,(THIS_FILE, "_stun._udp.%.*s resolved, found %d entry(s):", 
     710              (int)pjsua_var.ua_cfg.stun_domain.slen, 
     711              pjsua_var.ua_cfg.stun_domain.ptr, 
     712              rec->count)); 
     713 
     714    for (i=0; i<rec->count; ++i) { 
     715        PJ_LOG(3,(THIS_FILE,  
     716                  " %d: prio=%d, weight=%d  %s:%d",  
     717                  i, rec->entry[i].priority, rec->entry[i].weight, 
     718                  pj_inet_ntoa(rec->entry[i].addr.ipv4.sin_addr), 
     719                  (int)pj_ntohs(rec->entry[i].addr.ipv4.sin_port))); 
     720    } 
     721 
     722} 
     723 
    655724/* 
    656725 * Resolve STUN server. 
     
    665734 
    666735        /* Start STUN server resolution */ 
    667         /* For now just do DNS A resolution */ 
    668  
    669         if (pjsua_var.ua_cfg.stun_srv.slen == 0) { 
    670             pjsua_var.stun_status = PJ_SUCCESS; 
    671         } else { 
     736         
     737        pjsua_var.stun_status = PJ_EPENDING; 
     738 
     739        /* If stun_domain is specified, resolve STUN servers with DNS 
     740         * SRV resolution. 
     741         */ 
     742        if (pjsua_var.ua_cfg.stun_domain.slen) { 
     743            pj_str_t res_type; 
     744 
     745            /* Fail if resolver is not configured */ 
     746            if (pjsua_var.resolver == NULL) { 
     747                PJ_LOG(1,(THIS_FILE, "Nameserver must be configured when " 
     748                                     "stun_domain is specified")); 
     749                pjsua_var.stun_status = PJLIB_UTIL_EDNSNONS; 
     750                return PJLIB_UTIL_EDNSNONS; 
     751            } 
     752            res_type = pj_str("_stun._udp"); 
     753            pjsua_var.stun_status =  
     754                pj_dns_srv_resolve(&pjsua_var.ua_cfg.stun_domain, &res_type, 
     755                                   3478, pjsua_var.pool, pjsua_var.resolver, 
     756                                   0, NULL, stun_dns_srv_resolver_cb); 
     757            if (pjsua_var.stun_status != PJ_SUCCESS) { 
     758                pjsua_perror(THIS_FILE, "Error starting DNS SRV resolution",  
     759                             pjsua_var.stun_status); 
     760                return pjsua_var.stun_status; 
     761            } 
     762        } 
     763        /* Otherwise if stun_host is specified, resolve STUN server with 
     764         * gethostbyname(). 
     765         */ 
     766        else if (pjsua_var.ua_cfg.stun_host.slen) { 
    672767            pj_hostent he; 
    673768 
    674             pjsua_var.stun_status =  
    675                 pj_gethostbyname(&pjsua_var.ua_cfg.stun_srv, &he); 
     769            pjsua_var.stun_status = pj_gethostbyname(&pjsua_var.ua_cfg.stun_host, &he); 
    676770 
    677771            if (pjsua_var.stun_status == PJ_SUCCESS) { 
     
    680774                pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)3478); 
    681775 
    682                 PJ_LOG(4,(THIS_FILE,  
     776                PJ_LOG(3,(THIS_FILE,  
    683777                          "STUN server %.*s resolved, address is %s:%d", 
    684                           (int)pjsua_var.ua_cfg.stun_srv.slen, 
    685                           pjsua_var.ua_cfg.stun_srv.ptr, 
     778                          (int)pjsua_var.ua_cfg.stun_host.slen, 
     779                          pjsua_var.ua_cfg.stun_host.ptr, 
    686780                          pj_inet_ntoa(pjsua_var.stun_srv.ipv4.sin_addr), 
    687781                          (int)pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port))); 
    688782            } 
    689         } 
     783 
     784        } 
     785        /* Otherwise disable STUN. */ 
     786        else { 
     787            pjsua_var.stun_status = PJ_SUCCESS; 
     788        } 
     789 
     790 
    690791        return pjsua_var.stun_status; 
    691792 
     
    694795         * result. 
    695796         */ 
    696         pj_assert(!"Should not happen"); 
    697         return PJ_EBUG; 
     797        if (wait) { 
     798            while (pjsua_var.stun_status == PJ_EPENDING) 
     799                pjsua_handle_events(10); 
     800        } 
     801 
     802        return pjsua_var.stun_status; 
    698803 
    699804    } else { 
     
    9471052                                         p_pub_addr); 
    9481053        if (status != PJ_SUCCESS) { 
    949             pjsua_perror(THIS_FILE, "Error resolving with STUN", status); 
     1054            pjsua_perror(THIS_FILE, "Error contacting STUN server", status); 
    9501055            pj_sock_close(sock); 
    9511056            return status; 
Note: See TracChangeset for help on using the changeset viewer.