[asterisk-dev] Peer matching and SRV records

Matthew Jordan mjordan at digium.com
Fri Apr 19 10:00:44 CDT 2013


On 04/19/2013 04:48 AM, Olle E. Johansson wrote:
> Friends,
> 
> Looking into the SRV record support of Asterisk I believe there's an issue with peer matching here.
> 
> If a service, like "edvina.org", have multiple SRV records that points to multiple hosts IPs, maybe even dual stack, then a request FROM that service
> may come from any of these IPs.
> 
> Let's assume the configuration looks like this:
> 
> register=marko:okram at edvinaservice/callback
> 
> [edvinaservice]
> type=peer
> host=edvina.org
> 
> 
> In this case the peer will pick one address from the SRV records and use for matching. If another server IP is used on the
> server side, matching will fail.
> 
> I would like to be able to add all available IP addresses and ports for matching. Will that work with the ao2object list or will it
> mess up the list to have many hash entries for the same object?
> 
> The way I would like to do this is to set up an ACL entry in the peer for the SRV record so we have a list to go through
> and perform the matching on. If that list is empty, we will match as before.
> 

ao2 containers work fine with hash collisions. If a hash collision
occurs, a comparison callback is used to find the explicit object you're
searching for. They can also be used to store objects with duplicate keys.

The case of duplicate keys is a bit more complex however, as you have to
know that you won't get back a single object when you do a search. In
that case, your comparison callback (either the one supplied for the
container during its creation or one used in an ao2_callback) has to
return when it has a match (it returns CMP_MATCH) but not instruct the
ao2 library to stop (it doesn't return CMP_STOP). In addition, you have
to tell ao2_find or ao2_callback that you expect to get multiple objects
back by passing it OBJ_MULTIPLE. When you do that, it will return a new
ao2_iterator with all of the objects that matched.

There's a good example of doing multi-object matching and returning in
chan_sip's find_call - we do a multi-object match using an ao2_callback
to find all dialogs that match a call-id, then iterate over each object.

-- 
Matthew Jordan
Digium, Inc. | Engineering Manager
445 Jan Davis Drive NW - Huntsville, AL 35806 - USA
Check us out at: http://digium.com & http://asterisk.org





More information about the asterisk-dev mailing list