i have one more comment on flow token vs. contact aliasing.
flow token is part of a route uri that represent a proxy in the route
set. route set cannot be changed during the dialog, but remote target
uri can. from rfc3261:
Requests within a dialog MAY contain Record-Route and Contact header
fields. However, these requests do not cause the dialog's route set
to be modified, although they may modify the remote target URI.
Specifically, requests that are not target refresh requests do not
modify the dialog's remote target URI, and requests that are target
refresh requests do. For dialogs that have been established with an
INVITE, the only target refresh request defined is re-INVITE (see
Section 14). Other extensions may define different target refresh
requests for dialogs established in other ways.
Note that an ACK is NOT a target refresh request.
Target refresh requests only update the dialog's remote target URI,
and not the route set formed from the Record-Route.
if flow token is used instead of contact aliasing to store the remote
target uri, then it is not possible to modify the remote target uri via
target refresh requests (e.g. when moving from wifi to mobile network)
and such setup is violating the above text of rfc3261.
this problem does not exist with contact aliasing, because
add_contact_alias() is called on each in-dialog target refresh request,
which allows changing of remote target uri during the dialog.
-- juha