Add support for receiving unsolicited MWI NOTIFY messages.

This change adds a configuration option to SIP peers, unsolicited_mailbox, which
configures a virtual mailbox to use for received new/old MWI information. This
virtual mailbox can then be used by any device supporting MWI.

(closes issue #13028)
Reported by: AsteriskRocks
Patches:
      bug_13028_chan_sip_external_mwi_20090707.patch uploaded by cmaj (license 830)


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@226060 65c4cc65-6c06-0410-ace0-fbb531ad65f3
certified/1.8.6
Joshua Colp 16 years ago
parent 7e29f0da44
commit 5825f68e8b

@ -50,6 +50,9 @@ SIP Changes
accessible via AMI and CLI. accessible via AMI and CLI.
* Added 'media_address' configuration option which can be used to explicitly specify * Added 'media_address' configuration option which can be used to explicitly specify
the IP address to use in the SDP for media (audio, video, and text) streams. the IP address to use in the SDP for media (audio, video, and text) streams.
* Added 'unsolicited_mailbox' configuration option which specifies the virtual mailbox
that the new/old count should be stored on if an unsolicited MWI NOTIFY message is
received.
IAX2 Changes IAX2 Changes
----------- -----------

@ -1995,6 +1995,7 @@ struct sip_peer {
AST_STRING_FIELD(useragent); /*!< User agent in SIP request (saved from registration) */ AST_STRING_FIELD(useragent); /*!< User agent in SIP request (saved from registration) */
AST_STRING_FIELD(mwi_from); /*!< Name to place in From header for outgoing NOTIFY requests */ AST_STRING_FIELD(mwi_from); /*!< Name to place in From header for outgoing NOTIFY requests */
AST_STRING_FIELD(engine); /*!< RTP Engine to use */ AST_STRING_FIELD(engine); /*!< RTP Engine to use */
AST_STRING_FIELD(unsolicited_mailbox); /*!< Mailbox to store received unsolicited MWI NOTIFY messages information in */
); );
struct sip_socket socket; /*!< Socket used for this peer */ struct sip_socket socket; /*!< Socket used for this peer */
enum sip_transport default_outbound_transport; /*!< Peer Registration may change the default outbound transport. enum sip_transport default_outbound_transport; /*!< Peer Registration may change the default outbound transport.
@ -7628,10 +7629,6 @@ static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *si
if (intended_method == SIP_REFER) { if (intended_method == SIP_REFER) {
/* We do support REFER, but not outside of a dialog yet */ /* We do support REFER, but not outside of a dialog yet */
transmit_response_using_temp(callid, sin, 1, intended_method, req, "603 Declined (no dialog)"); transmit_response_using_temp(callid, sin, 1, intended_method, req, "603 Declined (no dialog)");
} else if (intended_method == SIP_NOTIFY) {
/* We do not support out-of-dialog NOTIFY either,
like voicemail notification, so cancel that early */
transmit_response_using_temp(callid, sin, 1, intended_method, req, "489 Bad event");
} else { } else {
/* Ok, time to create a new SIP dialog object, a pvt */ /* Ok, time to create a new SIP dialog object, a pvt */
if ((p = sip_alloc(callid, sin, 1, intended_method, req))) { if ((p = sip_alloc(callid, sin, 1, intended_method, req))) {
@ -19829,25 +19826,39 @@ static int handle_request_notify(struct sip_pvt *p, struct sip_request *req, str
} }
/* Confirm that we received this packet */ /* Confirm that we received this packet */
transmit_response(p, "200 OK", req); transmit_response(p, "200 OK", req);
} else if (p->mwi && !strcmp(event, "message-summary")) { } else if (!strcmp(event, "message-summary")) {
const char *mailbox = NULL;
char *c = ast_strdupa(get_body(req, "Voice-Message", ':')); char *c = ast_strdupa(get_body(req, "Voice-Message", ':'));
if (!ast_strlen_zero(c)) { if (!p->mwi) {
struct sip_peer *peer = find_peer(NULL, &p->recv, TRUE, FINDPEERS, FALSE, p->socket.type);
if (peer) {
mailbox = ast_strdupa(peer->unsolicited_mailbox);
unref_peer(peer, "removing unsolicited mwi ref");
}
} else {
mailbox = p->mwi->mailbox;
}
if (!ast_strlen_zero(mailbox) && !ast_strlen_zero(c)) {
char *old = strsep(&c, " "); char *old = strsep(&c, " ");
char *new = strsep(&old, "/"); char *new = strsep(&old, "/");
struct ast_event *event; struct ast_event *event;
if ((event = ast_event_new(AST_EVENT_MWI, if ((event = ast_event_new(AST_EVENT_MWI,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, p->mwi->mailbox, AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox,
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, "SIP_Remote", AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, "SIP_Remote",
AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, atoi(new), AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, atoi(new),
AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_UINT, atoi(old), AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_UINT, atoi(old),
AST_EVENT_IE_END))) { AST_EVENT_IE_END))) {
ast_event_queue_and_cache(event); ast_event_queue_and_cache(event);
} }
transmit_response(p, "200 OK", req);
} else {
transmit_response(p, "489 Bad event", req);
res = -1;
} }
transmit_response(p, "200 OK", req);
} else if (!strcmp(event, "keep-alive")) { } else if (!strcmp(event, "keep-alive")) {
/* Used by Sipura/Linksys for NAT pinhole, /* Used by Sipura/Linksys for NAT pinhole,
* just confirm that we recieved the packet. */ * just confirm that we recieved the packet. */
@ -24897,6 +24908,8 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
} else if (!strcasecmp(v->name, "disallowed_methods")) { } else if (!strcasecmp(v->name, "disallowed_methods")) {
char *disallow = ast_strdupa(v->value); char *disallow = ast_strdupa(v->value);
mark_parsed_methods(&peer->disallowed_methods, disallow); mark_parsed_methods(&peer->disallowed_methods, disallow);
} else if (!strcasecmp(v->name, "unsolicited_mailbox")) {
ast_string_field_set(peer, unsolicited_mailbox, v->value);
} }
} }

@ -975,6 +975,7 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls
; contactdeny ; is to register at the same IP as a SIP provider, ; contactdeny ; is to register at the same IP as a SIP provider,
; ; then call oneself, and get redirected to that ; ; then call oneself, and get redirected to that
; ; same location). ; ; same location).
; unsolicited_mailbox
;[sip_proxy] ;[sip_proxy]
; For incoming calls only. Example: FWD (Free World Dialup) ; For incoming calls only. Example: FWD (Free World Dialup)
@ -1015,6 +1016,10 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls
;transport=udp,tcp ; This sets the transport type to udp for outgoing, and will ;transport=udp,tcp ; This sets the transport type to udp for outgoing, and will
; ; accept both tcp and udp. Default is udp. The first transport ; ; accept both tcp and udp. Default is udp. The first transport
; ; listed will always be used for outgoing connections. ; ; listed will always be used for outgoing connections.
;unsolicited_mailbox=4015552299 ; If the remote SIP server sends an unsolicited MWI NOTIFY message the new/old
; ; message count will be stored in the configured virtual mailbox. It can be used
; ; by any device supporting MWI by specifying <configured value>@SIP_Remote as the
; ; mailbox.
; ;
; Because you might have a large number of similar sections, it is generally ; Because you might have a large number of similar sections, it is generally

Loading…
Cancel
Save