[Asterisk-Dev] Proposed MWI support for Endpoints on Different Softswitch

Chris A. Icide chris at netgeeks.net
Thu Apr 14 14:02:24 MST 2005


Sorry for the previous empty message, here are the contents that was 
supposed to be inside...

This looks like a great idea.  However I've got some questions.

You indicate you are making some decision based upon whether or not an 
endpoint is registered or static.  What happens if a static endpoint is 
really just a SIP UA EP?  What happens if a softswitch you are serving as 
voicemail media for is registering with you instead of being static?

Would it work better if you added a special argument to the sip.conf?

instead of

<mailto:mailbox=12895551001 at suppc5cm1,12895551002 at suppc5cm1,12455551000 at suppc5cm1>mailbox=12895551001 at suppc5cm1,12895551002 at suppc5cm1,12455551000 at suppc5cm1

how about:

remotemailbox<mailto:mailbox=12895551001 at suppc5cm1,12895551002 at suppc5cm1,12455551000 at suppc5cm1>=12895551001 at suppc5cm1,12895551002 at suppc5cm1,12455551000 at suppc5cm1

That way you leave the decision of whether or not the host statement is 
static or dynamic to remain a functional decision versus a policy 
argument.  (I could just be misunderstanding your detailed description as well)

On similar another note, I've been thinking about something I think would 
be valuable.



How difficult would it be to create a dialplan command that could assign, 
un-assign, etc. MWI pointers on the fly?  How would this fit in with your 
changes here?

For example:

exten => s,1,MWISet(SIP/1234,1001 at office)  ;set MWI for SIP/1234 to 
1001 at office

exten => s,1,MWIClear(SIP/1234)  ;remove all MWI setting for SIP/1234

exten => s,1,MWISet(SIP/1234,2222 at softswitch,r)  ; same as above except r 
options indicates this is a remote softswitch.


-Chris


On 12:45 PM 4/14/2005, Jay Ray wrote:

>Here is relevant portion of sip.conf. for those peer softswitches....I 
>have tested with 2 Clarent Softswitches one with 3 and other with just one 
>mailbox..worked fine. I will go to bugs.digium.com..and submit a case....Thx
>
>I followed the NOTIFY mechanism for sending MWI as per RFC 3842....
>
>
>---------------------------------------------------------------sip.conf---------------------------------------
>[10.1.1.1:5080]         //This sofswitch uses port 5080 for VoiceMail...we 
>do have to
>                                  explicitly mention the port here so that 
> Asterisk does not loose it while
>                                  sending NOTIFY to Softswitches..I found 
> out that Asterisk does loose
>                                   this port.
>type=friend
>username=c5cm
>context=clarentcm
>dtmfmode=rfc2833
>host=10.1.1.1
><mailto:mailbox=12895551001 at suppc5cm1,12895551002 at suppc5cm1,12455551000 at suppc5cm1>mailbox=12895551001 at suppc5cm1,12895551002 at suppc5cm1,12455551000 at suppc5cm1
>allow=ulaw
>port=5080
>[10.1.1.2:5080]
>type=friend
>context=JerryC5_84
>dtmfmode=rfc2833
>host=10.1.1.2
><mailto:mailbox=15142550001 at jerryc5vm>mailbox=15142550001 at jerryc5vm
>allow=ulaw
>port=5080
>--------------------------------------------------------------------------------------------------------------------------------------------
>
>
>John Todd <jtodd at loligo.com> wrote:
>This looks interesting. Can you provide a bit more detail and some
>other updates?
>1) Can you supply a diff on the sip.conf file that shows an example
>of your new method (comment the section out, and use several lines of
>comments to explain what the example does)
>2) On what softswitches is this known to work? I assume you've
>tested with SER, as a baseline?
>3) Have you signed a disclaimer with Digium?
>4) Can you submit this as an addition to bugs.digium.com so that it
>will be included in future Asterisk releases if it meets approval and
>functionality criteria (as nebulous as both of those are...)?
>JT
>
>At 11:05 AM -0700 on 4/14/05, Jay Ray wrote:
> >Hi All,
> >
> > I had proposed the changes to be able to support Asterisk
> >VoiceMail for 3rd Party Softswitches. Here is what I have changed o n
> >Asterisk in chan_sip.c
> >
> >While in function sip_send_mwi_to_peer() . in case peer->tohost has
> >a value which means that its not a registered EP - but a static
> >peer, I call another function called sip_send_mwi_to_softswitch()
> >.....in which I separate the comma separated mailboxes defined in
> >sip.conf for that peer. and send NOTIFY in a for loop for each of
> >the Mailboxes....by calling another new function
> > transmit_notify_to_softswitch_with_mwi()
> >
> >In transmit_notify_to_softswitch_with_mwi() , I populate the
> >sip_pvt->username with the mailbox number (minus the mailbox
> >context, if any)...so that the mailbox number gets added to the "TO"
> >header in the NOTIFY going out to that Softswitch...for the
> >Softswitch to pass on the NOTIFY to the appropriate Endpoint....
> >
> >The DIFF is below, comments appreciated.......
> >
> >
> >
> >
> >[root at jerrylinux channels]# diff chan_sip.c.wrking1 chan_sip.c.orig
> >489,490d488
> >< int *lastmsgsent_switch; /* maintaining last message
> >sent for EPS on a Third Party Softswitch */
> ><
> >1207c1205
> ><
> >---
> >>
> >1209d1206
> ><
> >1212d1208
> ><
> >3930,3932d3925
> ><
> ><
> ><
> >4217,4271d4209
> >< /*--- transmit_notify_to_softswitch_with_mwi: Notify Softswitch user of
> >< messages waiting in voicemail ---*/
> >< /* Notification works for Softswitch peers with mailbox= definitions
> >< * in sip.conf
> >< * We use the SIP Event package message-summary
> >< * MIME type defaults to "application/simple-message-summary";
> >< */
> >< static int transmit_notify_to_softswitch_with_mwi(struct sip_pvt
> >*p, char *mbox, int newmsgs, int oldmsgs)
> >< {
> >< struct sip_request req;
> >< char tmp[256];
> >< char tmp2[256];
> >< char *tmp_mbox;
> >< char clen[20];
> ><
> >< /* I will put the Mailbox Number - the part before the @
> >< * in p->username, and then call initreqprep as initreqprep
> >< * looks for a p->username and puts it in TO Header
> >< */
> ><
> >< tmp_mbox = (char*) calloc(strlen(mbox), sizeof(char));
> ><
> >< strncpy(tmp_mbox, mbox, strlen(mbox));
> ><
> >< tmp_mbox = strsep(&tmp_mbox, "@");
> ><
> >< strncpy(p->username, tmp_mbox, strlen(tmp_mbox));
> ><
> ><
> ><
> >< initreqprep(&req, p, "NOTIFY", NULL);
> ><
> >< add_header(&req, "Event", "message-summary");
> >< add_header(&req, "Content-Type", default_notifymime);
> ><
> >< snprintf(tmp, sizeof(tmp), "Messages-Waiting: %s\r\n",
> >ne wmsgs ? "yes" : "no");
> >< snprintf(tmp2, sizeof(tmp2), "Voice-Message: %d/%d\r \n",
> >newmsgs, oldmsgs);
> >< snprintf(clen, sizeof(clen), "%d", (int)(strlen(tmp) +
> >strlen(tmp2)));
> >< add_header(&req, "Content-Length", clen);
> >< add_line(&req, tmp);
> >< add_line(&req, tmp2);
> ><
> >< if (!p->initreq.headers) {
> >< /* Use this as the basis */
> >< copy_request(&p->initreq, &req);
> >< parse(&p->initreq);
> >< if (sip_debug_test_pvt(p))
> >< ast_verbose("%d headers, %d lines\n",
> >p->initreq.headers, p->initreq.lines);
> >< determine_firstline_parts(&p->initreq);
> >< }
> ><
> >< return send_request(p, &req, 1, p->ocseq);
> >< }
> ><
> ><
> >8628,8734d8565
> >< //Ujju - sip_send_mwi_to_softswitch : Sending MWI to another Softswitch.
> >< static int sip_send_mwi_to_softswitch(struct sip_peer *peer)
> >< {
> >< /* Checking for all the m alboxes configured for a softswitch
> >< and sending NOTIFY w/MWI for all */
> >< struct sip_pvt *p;
> >< char name[256] = "";
> >< int newmsgs, oldmsgs;
> ><
> >< if(peer->mailbox==NULL){
> >< ast_log(LOG_WARNING, "No Mailboxes defined in sip.conf and
> >voicemail.conf for this softswitch");
> >< return 0;
> >< }
> ><
> >< int i;
> >< int mbox_count=0;
> >< char *mbox[500]; /*Pointer to individual malboxes*/
> >< char *tmp=NULL; /*Temp Pointer to individual mailboxes*/
> >< char *mailboxes;/* storing full comma separated mailbox
> >string here */
> ><
> >< mailboxes=(char *)calloc(strlen(peer->mailbox),sizeof(char));
> ><
> >< strcpy(mailboxes,peer->mailbox);
> ><
> ><
> >< tmp=strchr(mailboxes,',');
> >< //**mbox=(char **)malloc(sizeof(char *)*256);
> >< //This copies first Mailbox in mbox[0]
> >< mbox[mbox_count]=mailboxes;
> >< mbox[mbox_count]=strsep(&mbox[mbox_count], ",");
> ><
> >< //This copies rest of the mailboxes in mbox[1, 2, 3......]
> >< while(tmp!=NULL)
> >< {
> >< mbox_count++;
> >< tmp+=1;
> >< mbox[mbox_count]=(char*) calloc(strlen(tmp), sizeof(char));
> >< strncpy(mbox[mbox_count],tmp, strlen(tmp));
> >< mbox[mbox_count]=strsep(&mbox[mbox_count], ",");
> >< tmp=strchr(tmp,',');
> >< }
> ><
> ><
> >< /* Allocating memory for PTR to last msg for each mailbox
> >for EPs on Softswitch */
> >< if (peer->lastmsgsent_switch == NULL) {
> >< peer->lastmsgsent_switch = (int *)
> >calloc(mbox_count,sizeof(int));
> >< for (i=0;i<=mbox_count;i++)
> >< peer->lastmsgsent_switch[i]=-1;
> >< }
> ><
> ><
> >< //Now looping through all the Mailboxes to send individual Notify's
> >< for(i=0;i<=mbox_count;i++) {
> ><
> ><
> >< ast_app_messagecount(mbox[i], &newmsgs, &oldmsgs);
> ><
> >< time(&peer->lastmsgcheck);
> ><
> >< /* Retur n now if it's the same thing we told them
> >last time */
> >< if (((newmsgs << 8) | (oldmsgs)) ==
> >peer->lastmsgsent_switch[i]) {
> >< if (i==mbox_count)
> >< return 0;
> >< else
> >< continue;
> >< }
> ><
> >< p = sip_alloc(NULL, NULL, 0);
> >< if (!p) {
> >< ast_log(LOG_WARNING, "Unable to build sip
> >pvt data for MWI\n");
> >< return -1;
> >< }
> >< strncpy(name, peer->name, sizeof(name) - 1);
> >< peer->lastmsgsent_switch[i] = ((newmsgs << 8) | (oldmsgs));
> >< if (create_addr(p, name)) {
> >&lt
>; /* Maybe they're not registered, etc. */
> >< sip_destroy(p);
> >< return 0;
> >< }
> >< /* Recalculate our side, and recalculate Call ID */
> >< if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
> >< memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
> >< build_via(p, p->via, sizeof(p->via));
> >< build_callid(p->callid, sizeof(p->callid), p->ourip,
> >p->fromdomain);
> >< /* Here I call another Function to Build Proper to header */
> >< /* Sen d MWI */
> >< ast_set_flag(p, SIP_OUTGOING);
> ><
> >< //Ujju Set the p->peername pointer to char to NULL
> >if its length is 0
> ><
> >< if (!strlen(p->peername)){
> >< strncpy(p->peername, peer->name, sizeof(p->peername));
> >< }
> ><
> ><
> >< transmit_notify_to_softswitch_with_mwi(p, mbox[i],
> >newmsgs, oldmsgs);
> >&l
>t; ; sip_scheddestroy(p, 15000);
> >< }
> ><
> ><
> ><
> >< return 0;
> ><
> >< }
> ><
> ><
> ><
> >8743,8750c8574
> >< /* Ujju Here we call function to separate all the mailboxes
> >if tohost ne NULL and
> >< then call the below func - sip_send_mwi_to_softswitch -
> >for each of those mailboxes */
> ><
> >< if (strlen(peer->tohost) != 0){
> >< sip_send_mwi_to_softswitch(peer);
> >< return 0;
> >< }
> ><
> >---
> >> /* Check for messages */
> >
> >
> >
> >Do you Yahoo!?
> >Yahoo! Small Business -
> >Try
> >our new resources site!
> >
> >_______________________________________________
> >Asterisk-Dev mailing list
> >Asterisk-Dev at lists.digium.com
> >http://lists.digium.com/mailman/listinfo/asterisk-dev
> >To UNSUBSCRIBE or update options visit:
> > http://lists.digium.com/mailman/listinfo/asterisk-dev
>
>
>
>
>Do you Yahoo!?
>Yahoo! Mail - 250MB free storage. 
><http://us.rd.yahoo.com/evt=29915/*http://info.mail.yahoo.com/mail_250>Do 
>more. Manage less.
>_______________________________________________
>Asterisk-Dev mailing list
>Asterisk-Dev at lists.digium.com
>http://lists.digium.com/mailman/listinfo/asterisk-dev
>To UNSUBSCRIBE or update options visit:
>    http://lists.digium.com/mailman/listinfo/asterisk-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.digium.com/pipermail/asterisk-dev/attachments/20050414/05bb391e/attachment.htm


More information about the asterisk-dev mailing list