[Asterisk-Dev] SIP bug and Polycom phones
Christian Hecimovic
checimovic at qworks.ca
Thu Dec 11 12:02:40 MST 2003
Hi,
Polycom phones track the current SIP transaction with the branch number in the
Via header. When Asterisk does a reinvite to set up a native bridge, it does
not change the branch number - it's still the magic cookie plus some network
info plus an unchanging random number stored in sip_pvt.branch. In short, the
branch number stays the same from one invite to the next.
To get reinvites to work, I made a very simple fix in
transmit_reinvite_with_sdp(). I incremented the branch number and recreated
the via field of the sip_pvt struct before making the call to reqprep(). Now
Polycom phones perform native bridging; sniffing the network shows that the
RTP streams do not touch the server.
According to RFC 3261, Section 8.1.1.7, changing the branch number for each
new transaction is the correct behaviour. I guess the question is, are
reinvites new transactions? Polycom thinks so.
Before I submit this little patch, I would really like to hear from anyone who
thinks this may destabilise Asterisk with other phones, who assume the branch
number will stay the same between invites. I do not have any other phones to
test with. The code is as follows:
static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp,
struct ast_rtp *vrtp)
{
struct sip_request req;
if (p->canreinvite == REINVITE_UPDATE)
reqprep(&req, p, "UPDATE", 0);
else {
// BEGIN POLYCOM SPECIFIC CODE
p->branch++;
snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP
%s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
// END POLYCOM SPECIFIC CODE
reqprep(&req, p, "INVITE", 0);
}
... the rest of the function follows.
Thanks,
Christian
More information about the asterisk-dev
mailing list