[asterisk-commits] mjordan: branch 1.8 r367362 - /branches/1.8/channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed May 23 08:06:13 CDT 2012
Author: mjordan
Date: Wed May 23 08:06:08 2012
New Revision: 367362
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=367362
Log:
Update a peer's LastMsgsSent when the peer is notified of waiting messages
Previously, MWI logic utilized a counter called 'lastmsgssent' to know whether
or not MWI NOTIFY requests had been sent to a specific peer. When MWI
notifications were changed to use the internal event framework, this value was
no longer needed for its original purpose. Hence, it was no longer updated
with the new/old message counts for a peer. However, the value was still
presented when, either by AMI or CLI, a 'sip show peer [peer]' command
was executed. The output of the command would always display the erroneous
value of 32767/65535 for 'LastMsgsSent'.
This patch makes it so that the value of lastmsgssent is updated appropriately.
The value should now display the new/old message counts for a particular
peer.
(closes issue ASTERISK-17866)
Reported by: Steve Davies
patches by:
ast-17866-rb1272.patch (License #5041 by irroot)
Modified slightly for this commit
Review: https://reviewboard.asterisk.org/r/1939
Modified:
branches/1.8/channels/chan_sip.c
Modified: branches/1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_sip.c?view=diff&rev=367362&r1=367361&r2=367362
==============================================================================
--- branches/1.8/channels/chan_sip.c (original)
+++ branches/1.8/channels/chan_sip.c Wed May 23 08:06:08 2012
@@ -14736,6 +14736,20 @@
ast_sockaddr_split_hostport(*hostport, hostport, &dont_care, PARSE_PORT_IGNORE);
}
+/*! \internal \brief Helper function to update a peer's lastmsgssent value
+ */
+static void update_peer_lastmsgssent(struct sip_peer *peer, int value, int locked)
+{
+ if (!locked) {
+ ao2_lock(peer);
+ }
+ peer->lastmsgssent = value;
+ if (!locked) {
+ ao2_unlock(peer);
+ }
+}
+
+
/*! \brief Verify registration of user
- Registration is done in several steps, first a REGISTER without auth
to get a challenge (nonce) then a second one with auth
@@ -14749,6 +14763,7 @@
char tmp[256];
char *c, *name, *unused_password, *domain;
char *uri2 = ast_strdupa(uri);
+ int send_mwi = 0;
terminate_uri(uri2);
@@ -14852,19 +14867,16 @@
case PARSE_REGISTER_DENIED:
ast_log(LOG_WARNING, "Registration denied because of contact ACL\n");
transmit_response_with_date(p, "603 Denied", req);
- peer->lastmsgssent = -1;
res = 0;
break;
case PARSE_REGISTER_FAILED:
ast_log(LOG_WARNING, "Failed to parse contact info\n");
transmit_response_with_date(p, "400 Bad Request", req);
- peer->lastmsgssent = -1;
res = 0;
break;
case PARSE_REGISTER_QUERY:
ast_string_field_set(p, fullcontact, peer->fullcontact);
transmit_response_with_date(p, "200 OK", req);
- peer->lastmsgssent = -1;
res = 0;
break;
case PARSE_REGISTER_UPDATE:
@@ -14872,8 +14884,7 @@
update_peer(peer, p->expiry);
/* Say OK and ask subsystem to retransmit msg counter */
transmit_response_with_date(p, "200 OK", req);
- if (!ast_test_flag((&peer->flags[1]), SIP_PAGE2_SUBSCRIBEMWIONLY))
- peer->lastmsgssent = -1;
+ send_mwi = 1;
res = 0;
break;
}
@@ -14898,19 +14909,17 @@
case PARSE_REGISTER_DENIED:
ast_log(LOG_WARNING, "Registration denied because of contact ACL\n");
transmit_response_with_date(p, "403 Forbidden (ACL)", req);
- peer->lastmsgssent = -1;
res = 0;
break;
case PARSE_REGISTER_FAILED:
ast_log(LOG_WARNING, "Failed to parse contact info\n");
transmit_response_with_date(p, "400 Bad Request", req);
- peer->lastmsgssent = -1;
res = 0;
break;
case PARSE_REGISTER_QUERY:
ast_string_field_set(p, fullcontact, peer->fullcontact);
transmit_response_with_date(p, "200 OK", req);
- peer->lastmsgssent = -1;
+ send_mwi = 1;
res = 0;
break;
case PARSE_REGISTER_UPDATE:
@@ -14918,7 +14927,7 @@
/* Say OK and ask subsystem to retransmit msg counter */
transmit_response_with_date(p, "200 OK", req);
manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: Registered\r\nAddress: %s\r\n", peer->name, ast_sockaddr_stringify(addr));
- peer->lastmsgssent = -1;
+ send_mwi = 1;
res = 0;
break;
}
@@ -14926,6 +14935,11 @@
}
}
if (!res) {
+ if (send_mwi) {
+ sip_send_mwi_to_peer(peer, 0);
+ } else {
+ update_peer_lastmsgssent(peer, -1, 0);
+ }
ast_devstate_changed(AST_DEVICE_UNKNOWN, "SIP/%s", peer->name);
}
if (res < 0) {
@@ -25649,12 +25663,14 @@
}
if (ast_test_flag((&peer->flags[1]), SIP_PAGE2_SUBSCRIBEMWIONLY) && !peer->mwipvt) {
+ update_peer_lastmsgssent(peer, -1, 1);
ao2_unlock(peer);
return 0;
}
/* Do we have an IP address? If not, skip this peer */
if (ast_sockaddr_isnull(&peer->addr) && ast_sockaddr_isnull(&peer->defaddr)) {
+ update_peer_lastmsgssent(peer, -1, 1);
ao2_unlock(peer);
return 0;
}
@@ -25665,6 +25681,11 @@
struct ast_str *mailbox_str = ast_str_alloca(512);
peer_mailboxes_to_str(&mailbox_str, peer);
ao2_unlock(peer);
+ /* If there is no mailbox do nothing */
+ if (ast_strlen_zero(mailbox_str->str)) {
+ update_peer_lastmsgssent(peer, -1, 0);
+ return 0;
+ }
ast_app_inboxcount(mailbox_str->str, &newmsgs, &oldmsgs);
ao2_lock(peer);
}
@@ -25677,6 +25698,7 @@
ao2_unlock(peer);
/* Build temporary dialog for this message */
if (!(p = sip_alloc(NULL, NULL, 0, SIP_NOTIFY, NULL))) {
+ update_peer_lastmsgssent(peer, -1, 0);
return -1;
}
@@ -25689,7 +25711,7 @@
/* Maybe they're not registered, etc. */
dialog_unlink_all(p);
dialog_unref(p, "unref dialog p just created via sip_alloc");
- /* sip_destroy(p); */
+ update_peer_lastmsgssent(peer, -1, 0);
return 0;
}
/* Recalculate our side, and recalculate Call ID */
@@ -25721,6 +25743,8 @@
transmit_notify_with_mwi(p, newmsgs, oldmsgs, vmexten);
sip_pvt_unlock(p);
dialog_unref(p, "unref dialog ptr p just before it goes out of scope at the end of sip_send_mwi_to_peer.");
+
+ update_peer_lastmsgssent(peer, ((newmsgs > 0x7fff ? 0x7fff0000 : (newmsgs << 16)) | (oldmsgs > 0xffff ? 0xffff : oldmsgs)), 0);
return 0;
}
More information about the asterisk-commits
mailing list