[reSIProcate] Potential bug in TransportSelector

Robert Sparks rjsparks at nostrum.com
Mon Feb 12 09:31:23 CST 2007


I don't think this will be baked enough for 1.1.

RjS

On Feb 9, 2007, at 8:20 PM, Byron Campen wrote:

> 	Of course. It'll require dumping a message on the TU's fifo, but  
> shouldn't require anything more complicated. (or, if we want to be  
> extra careful in case the TU might go away, we could do it through  
> the stack) Do we want to try to get this in 1.1, or do we want to  
> give it a release cycle to settle?
>
> Best regards,
> Byron Campen
>
>> This isn't straightforward since we have to potentially cross thread
>> boundaries.
>>
>> On 2/9/07, Byron Campen <bcampen at estacado.net> wrote:
>>>
>>>  Ok, so what we need to do here is have DUM (or any TU that acts  
>>> as an
>>> endpoint) register an outbound decorator that inspects the final,  
>>> filled-out
>>> Contact, and remember what it is, so it can keep track of its  
>>> dialog-state
>>> properly (and reuse the fully specified Contact for the rest of  
>>> the dialog).
>>>
>>> Best regards,
>>> Byron Campen
>>>
>>>
>>> (fixing the list address)
>>>
>>> If the TU explicitly specifies a transport, sure.
>>> But if the TU has asked the stack to deal with this for it, the  
>>> stack needs
>>> to populate the right things (think multiple interfaces with  
>>> different
>>> policies wrt transports).
>>>
>>> We may be running into a problem where we're saying the wrong  
>>> thing by
>>> telling the stack to do this by only leaving the hostname blank.
>>>
>>> RjS
>>>
>>>
>>>
>>>
>>> On Feb 9, 2007, at 2:22 PM, Byron Campen wrote:
>>>
>>>  I feel uneasy about touching the transport param at all; perhaps  
>>> the UAC
>>> put one into its Contact for a reason!  And if there wasn't one  
>>> there in the
>>> first place, I think it should be safe to assume the UAC doesn't  
>>> care what
>>> protocol stuff comes in on, so we shouldn't go adding one. I  
>>> assume that the
>>> UAC is at least aware of what kinds of transports (TCP,  
>>> UDP,TLS,...) it is
>>> listening on, and if its transport loadout is somehow incomplete,  
>>> it should
>>> be prepared to compensate for its lack of compliance by putting  
>>> explicit
>>> transport params into the Contact. My vote would be to remove the  
>>> code block
>>> altogether.
>>>
>>> Best regards,
>>> Byron Campen
>>>
>>>
>>> In TransportSelector::transmit we are seeing a bug in the  
>>> following case:
>>>
>>> UAC sends a SUBSCRIBE over transport at TCP:5060 and puts the  
>>> correct
>>> contact in the message
>>> UAC receives 200/SUBSCRIBE with a Record-Route of UDP:5061
>>>
>>> With the following code, we correctly send over UDP to target  
>>> 5061 but we
>>> leave transport=tcp in the Contact which causes a problem for the  
>>> UAS since
>>> it looks like a Contact refresh and subsequent requests from the  
>>> peer are
>>> sent to TCP:5061 where there is no listener.
>>>
>>>
>>>
>>>       if (target.transport)
>>>       {
>>>          // There is a contact header and it contains exactly one  
>>> entry
>>>          if (msg->exists(h_Contacts) &&
>>> msg->header(h_Contacts).size()==1)
>>>          {
>>>             for (NameAddrs::iterator
>>> i=msg->header(h_Contacts).begin(); i !=
>>> msg->header(h_Contacts).end(); i++)
>>>             {
>>>                NameAddr& contact = *i;
>>>                // No host specified, so use the ip address and  
>>> port of the
>>>                // transport used. Otherwise, leave it as is.
>>>                if (contact.uri().host().empty())
>>>                {
>>>                   contact.uri().host() =
>>> (target.transport->hasSpecificContact() ?
>>>
>>> target.transport->interfaceName() :
>>>
>>> Tuple::inet_ntop(source) );
>>>                   contact.uri().port() = target.transport->port();
>>>
>>>                   if (target.transport->transport() != UDP)
>>>                    {
>>>                       contact.uri().param(p_transport) =
>>> Tuple::toData(target.transport->transport());
>>>                    }
>>>
>>>
>>> My proposal is to remove the if (target.transport->transport() !=  
>>> UDP). Does
>>> anybody remember why this is here?
>>>
>>> _______________________________________________
>>> resiprocate-devel mailing list
>>> resiprocate-devel at list.resiprocate.org
>>> https://list.resiprocate.org/mailman/listinfo/resiprocate-devel
>>> _______________________________________________
>>> resiprocate-devel mailing list
>>> resiprocate-devel at list.resiprocate.org
>>> https://list.resiprocate.org/mailman/listinfo/resiprocate-devel
>>>
>>>
>>>
>




More information about the resiprocate-devel mailing list