diff -NaurbB old/chan_sip.c new/chan_sip.c --- old/chan_sip.c 2009-01-12 13:29:06.000000000 +0000 +++ new/chan_sip.c 2009-01-15 17:09:03.000000000 +0000 @@ -12715,6 +12714,12 @@ enum check_auth_result res; int debug=sip_debug_test_addr(sin); struct sip_peer *peer; + char tmp[256]; + char *name=tmp; + char *name2; + char *dummy; + char *domain; + struct sip_peer *requestpeer; if (sipmethod == SIP_SUBSCRIBE) { /* For subscribes, match on device name only; for other methods, @@ -12728,6 +12733,29 @@ /* Then find devices based on IP */ if (!peer) { peer = find_peer(NULL, &p->recv, TRUE, FINDALLDEVICES, FALSE); + /* Multiple peers may match IP address so get one with name matching request line if possible*/ + if (peer) { + ast_log(LOG_DEBUG, "Found a peer '%s' with matching IP but checking request line\n", peer->name); + ast_copy_string(tmp, uri2, sizeof(tmp)); + if (p->socket.type == SIP_TRANSPORT_TLS) { + name2 = ast_strdupa(name); + if (parse_uri(name2, "sips:", &name, &dummy, &domain, &dummy, &dummy)) { + if (parse_uri(name, "sip:", &name, &dummy, &domain, &dummy, &dummy)) + ast_log(LOG_NOTICE, "Request line missing 'sip:', using it anyway\n"); + } + } else { + if (parse_uri(name, "sip:", &name, &dummy, &domain, &dummy, &dummy)) + ast_log(LOG_NOTICE, "Request line missing 'sip:', using it anyway\n"); + } + if (sip_cfg.pedanticsipchecking) {ast_uri_decode(name);} + ast_log(LOG_DEBUG, "Looking for peer with name '%s' \n", name); + requestpeer = find_peer(name, NULL, FALSE, FINDALLDEVICES, FALSE); + if (requestpeer) + peer=requestpeer; + else + ast_log(LOG_NOTICE, "No peer found that matches requested name '%s'. Using '%s' with matching IP\n", name, peer->name); + + } } }