I have looked into the problem related to saving saving resources by not
calling rtpproxy or mediaproxy when both the caller and callee are
behind the same NAT.
This topic has been discussed many times however, there have been no
"working" examples, or even partial examples posted (that I'm aware of).
Below is a solution to the problem, but is a BAD hack at best.
This solution is BAD because AVP's are added to the usr_preferences
table during the registration process, but there is no notification that
a registration has expired and is no longer valid. A cron job could be
run periodically to delete all received_ip AVP's with no matching entry
in the location table, but this is another hack to fix the first hack.
The solution is BAD because a database calls must be made to save the
received_ip address into an AVP, then another database call must be made
to reload the value just so that it can be tested against the caller's
$src_ip. A pseudo variable $Ri already exists that contains the value
we use in received_ip, but I have not been able to find a way for
avp_check() to use $Ri.
The solution is BAD because it will fail when the SIP device(s) are
behind more than a single NAT router. I believe this is not an issue
for 95% of the users and 99% of the small office or home users.
I think that a better solution would be to enhance avp_check() to accept
pseudo variables for the "value" parameter. This would remove the need
for any database calls.
I'm cross-posting this response to the developers list to bring this to
their attention and ask for suggestions (it's possible that I've totally
missed something). If a decision is made to open the avpops module to
pseudo variables (other than just avp_print()), I would suggest the
following be looked at:
avp_check() the value parm should accept pseudo variables
avp_write() the value parm should accept pseudo variables
avp_pushto() the name parameter should accept pseudo variables
avp_op() the value parameter should accept pseudo variables
Regards,
Norm
1) During REGISTER processing, place the following code. I would
suggest that you put the code "after" all authentication checks and
"after" the save("location") statement.
# Delete any previously saved IP addressess from the user.
avp_db_delete("$from/username","s:received_ip");
# Save the source IP address of the user into an AVP called received_ip.
# The saved IP address should be the public address of the NAT router.
avp_write("$src_ip", "s:received_ip");
# Save the AVP received_ip into the usr_preferences tables associated
with the user that just registered
avp_db_store("$from/username","s:received_ip");
2) During INVITE processing (or wherever you make the decision to use or
not use rtpproxy / mediaproxy) , place the following code.
#---------------------------------------------------------------------------
# Are the caller and callee behind the same NAT ?
#---------------------------------------------------------------------------
avp_db_load("$to/username", "s:received_ip");
if (avp_check("s:received_ip", "eq/$src_ip")) {
setflag(CALLER_AND_CALLEE_ ARE_BEHIND_THE_SAME_NAT);
};