summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--channels/chan_sip.c43
-rw-r--r--channels/sip/include/sip.h1
2 files changed, 40 insertions, 4 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 665daec1a..ef521c46a 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -15272,6 +15272,20 @@ static void extract_host_from_hostport(char **hostport)
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
@@ -15285,6 +15299,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
char tmp[256];
char *c, *name, *unused_password, *domain;
char *uri2 = ast_strdupa(uri);
+ int send_mwi = 0;
terminate_uri(uri2);
@@ -15414,12 +15429,14 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
ast_string_field_set(p, fullcontact, peer->fullcontact);
transmit_response_with_date(p, "200 OK", req);
res = 0;
+ send_mwi = 1;
break;
case PARSE_REGISTER_UPDATE:
ast_string_field_set(p, fullcontact, peer->fullcontact);
update_peer(peer, p->expiry);
/* Say OK and ask subsystem to retransmit msg counter */
transmit_response_with_date(p, "200 OK", req);
+ send_mwi = 1;
res = 0;
break;
}
@@ -15454,6 +15471,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
case PARSE_REGISTER_QUERY:
ast_string_field_set(p, fullcontact, peer->fullcontact);
transmit_response_with_date(p, "200 OK", req);
+ send_mwi = 1;
res = 0;
break;
case PARSE_REGISTER_UPDATE:
@@ -15461,6 +15479,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
/* 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));
+ send_mwi = 1;
res = 0;
break;
}
@@ -15468,9 +15487,13 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock
}
}
if (!res) {
- ao2_unlock(p);
- sip_send_mwi_to_peer(peer, 0);
- ao2_lock(p);
+ if (send_mwi) {
+ ao2_unlock(p);
+ sip_send_mwi_to_peer(peer, 0);
+ ao2_lock(p);
+ } else {
+ update_peer_lastmsgssent(peer, -1, 0);
+ }
ast_devstate_changed(AST_DEVICE_UNKNOWN, "SIP/%s", peer->name);
}
if (res < 0) {
@@ -18250,6 +18273,7 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
ast_cli(fd, " MOH Suggest : %s\n", peer->mohsuggest);
ast_cli(fd, " Mailbox : %s\n", mailbox_str->str);
ast_cli(fd, " VM Extension : %s\n", peer->vmexten);
+ ast_cli(fd, " LastMsgsSent : %d/%d\n", (peer->lastmsgssent & 0x7fff0000) >> 16, peer->lastmsgssent & 0xffff);
ast_cli(fd, " Call limit : %d\n", peer->call_limit);
ast_cli(fd, " Max forwards : %d\n", peer->maxforwards);
if (peer->busy_level)
@@ -18365,6 +18389,7 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
peer_mailboxes_to_str(&mailbox_str, peer);
astman_append(s, "VoiceMailbox: %s\r\n", mailbox_str->str);
astman_append(s, "TransferMode: %s\r\n", transfermode2str(peer->allowtransfer));
+ astman_append(s, "LastMsgsSent: %d\r\n", peer->lastmsgssent);
astman_append(s, "Maxforwards: %d\r\n", peer->maxforwards);
astman_append(s, "Call-limit: %d\r\n", peer->call_limit);
astman_append(s, "Busy-level: %d\r\n", peer->busy_level);
@@ -26730,12 +26755,14 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer, int cache_only)
}
if (ast_test_flag((&peer->flags[1]), SIP_PAGE2_SUBSCRIBEMWIONLY) && !peer->mwipvt) {
+ update_peer_lastmsgssent(peer, -1, 1);
ao2_unlock(peer);
return -1;
}
/* 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 -1;
}
@@ -26751,6 +26778,11 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer, int cache_only)
return -1;
}
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);
}
@@ -26763,6 +26795,7 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer, int cache_only)
ao2_unlock(peer);
/* Build temporary dialog for this message */
if (!(p = sip_alloc(NULL, NULL, 0, SIP_NOTIFY, NULL, NULL))) {
+ update_peer_lastmsgssent(peer, -1, 0);
return -1;
}
@@ -26775,7 +26808,7 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer, int cache_only)
/* 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 -1;
}
/* Recalculate our side, and recalculate Call ID */
@@ -26808,6 +26841,8 @@ static int sip_send_mwi_to_peer(struct sip_peer *peer, int cache_only)
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;
}
diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h
index 6c9cba75e..cd061b7be 100644
--- a/channels/sip/include/sip.h
+++ b/channels/sip/include/sip.h
@@ -1298,6 +1298,7 @@ struct sip_peer {
int maxforwards; /*!< SIP Loop prevention */
enum transfermodes allowtransfer; /*! SIP Refer restriction scheme */
struct ast_codec_pref prefs; /*!< codec prefs */
+ int lastmsgssent; /*!< The last known VM message counts (new/old) */
unsigned int sipoptions; /*!< Supported SIP options */
struct ast_flags flags[3]; /*!< SIP_ flags */