mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-25 07:01:09 +00:00
When receiving a STUN binding request send one out as the Google Talk client uses this as a method to determine if the remote party is still reachable or not.
Failure to do this results in the Google Talk client ignoring RTP packets after a specific period of time. This is also done as a result of receiving a STUN binding request so that the username information can be used from the inbound request, thus not requiring it to be stored on a per candidate basis. (closes issue ASTERISK-20107) Reported by: Malcolm Davenport git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@369858 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -328,6 +328,7 @@ int ast_stun_handle_packet(int s, struct sockaddr_in *src, unsigned char *data,
|
||||
struct stun_header *resp = (struct stun_header *)respdata;
|
||||
int resplen = 0; /* len excluding header */
|
||||
int respleft = sizeof(respdata) - sizeof(struct stun_header);
|
||||
char combined[33];
|
||||
|
||||
resp->id = hdr->id;
|
||||
resp->msgtype = 0;
|
||||
@@ -338,12 +339,16 @@ int ast_stun_handle_packet(int s, struct sockaddr_in *src, unsigned char *data,
|
||||
if (stundebug)
|
||||
ast_verbose("STUN Bind Request, username: %s\n",
|
||||
st.username ? st.username : "<none>");
|
||||
if (st.username)
|
||||
if (st.username) {
|
||||
append_attr_string(&attr, STUN_USERNAME, st.username, &resplen, &respleft);
|
||||
snprintf(combined, sizeof(combined), "%16s%16s", st.username + 16, st.username);
|
||||
}
|
||||
|
||||
append_attr_address(&attr, STUN_MAPPED_ADDRESS, src, &resplen, &respleft);
|
||||
resp->msglen = htons(resplen);
|
||||
resp->msgtype = htons(STUN_BINDRESP);
|
||||
stun_send(s, src, resp);
|
||||
ast_stun_request(s, src, combined, NULL);
|
||||
ret = AST_STUN_ACCEPT;
|
||||
break;
|
||||
default:
|
||||
|
Reference in New Issue
Block a user