chan_sip: Change SIPQualifyPeer to improve initial response time
Prior to this patch, The acknowledgement wasn't produced until after executing the sip_poke_peer action actually responsible for qualifying the peer. Now the response is given immediately once it is known that a peer will be qualified and a SIPqualifypeerdone event is issued when the process is finished. Thanks to OEJ for identifying the problem and helping to come up with a solution. (issue AST-969) Reported by John Bigelow Review: https://reviewboard.asterisk.org/r/2098/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@372808 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
parent
e65dea4616
commit
23a298f28c
1 changed files with 38 additions and 6 deletions
|
@ -545,6 +545,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||||
<description>
|
<description>
|
||||||
<para>Qualify a SIP peer.</para>
|
<para>Qualify a SIP peer.</para>
|
||||||
</description>
|
</description>
|
||||||
|
<see-also>
|
||||||
|
<ref type="managerEvent">SIPqualifypeerdone</ref>
|
||||||
|
</see-also>
|
||||||
</manager>
|
</manager>
|
||||||
<manager name="SIPshowregistry" language="en_US">
|
<manager name="SIPshowregistry" language="en_US">
|
||||||
<synopsis>
|
<synopsis>
|
||||||
|
@ -18957,18 +18960,47 @@ static char *_sip_qualify_peer(int type, int fd, struct mansession *s, const str
|
||||||
|
|
||||||
load_realtime = (argc == 5 && !strcmp(argv[4], "load")) ? TRUE : FALSE;
|
load_realtime = (argc == 5 && !strcmp(argv[4], "load")) ? TRUE : FALSE;
|
||||||
if ((peer = sip_find_peer(argv[3], NULL, load_realtime, FINDPEERS, FALSE, 0))) {
|
if ((peer = sip_find_peer(argv[3], NULL, load_realtime, FINDPEERS, FALSE, 0))) {
|
||||||
|
|
||||||
|
const char *id = astman_get_header(m,"ActionID");
|
||||||
|
char idText[256] = "";
|
||||||
|
|
||||||
|
if (type != 0) {
|
||||||
|
astman_send_ack(s, m, "SIP peer found - will qualify");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ast_strlen_zero(id)) {
|
||||||
|
snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
|
||||||
|
}
|
||||||
|
|
||||||
sip_poke_peer(peer, 1);
|
sip_poke_peer(peer, 1);
|
||||||
|
|
||||||
|
/*** DOCUMENTATION
|
||||||
|
<managerEventInstance>
|
||||||
|
<synopsis>Raised when SIPqualifypeer has finished qualifying the specified peer.</synopsis>
|
||||||
|
<syntax>
|
||||||
|
<parameter name="Peer">
|
||||||
|
<para>The name of the peer.</para>
|
||||||
|
</parameter>
|
||||||
|
<parameter name="ActionID">
|
||||||
|
<para>This is only included if an ActionID Header was sent with the action request, in which case it will be that ActionID.</para>
|
||||||
|
</parameter>
|
||||||
|
</syntax>
|
||||||
|
<see-also>
|
||||||
|
<ref type="manager">SIPqualifypeer</ref>
|
||||||
|
</see-also>
|
||||||
|
</managerEventInstance>
|
||||||
|
***/
|
||||||
|
manager_event(EVENT_FLAG_CALL, "SIPqualifypeerdone",
|
||||||
|
"Peer: %s\r\n"
|
||||||
|
"%s",
|
||||||
|
argv[3],
|
||||||
|
idText);
|
||||||
|
|
||||||
sip_unref_peer(peer, "qualify: done with peer");
|
sip_unref_peer(peer, "qualify: done with peer");
|
||||||
} else if (type == 0) {
|
} else if (type == 0) {
|
||||||
ast_cli(fd, "Peer '%s' not found\n", argv[3]);
|
ast_cli(fd, "Peer '%s' not found\n", argv[3]);
|
||||||
return CLI_SUCCESS;
|
|
||||||
} else {
|
} else {
|
||||||
astman_send_error(s, m, "Peer not found");
|
astman_send_error(s, m, "Peer not found");
|
||||||
return CLI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type != 0) {
|
|
||||||
astman_send_ack(s, m, "Qualify Peer successful");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CLI_SUCCESS;
|
return CLI_SUCCESS;
|
||||||
|
|
Loading…
Reference in a new issue