2 * Asterisk -- A telephony toolkit for Linux.
4 * Implementation of Session Initiation Protocol
6 * Copyright (C) 1999, Mark Spencer
8 * Mark Spencer <markster@linux-support.net>
10 * This program is free software, distributed under the terms of
11 * the GNU General Public License
18 #include <asterisk/lock.h>
19 #include <asterisk/channel.h>
20 #include <asterisk/channel_pvt.h>
21 #include <asterisk/config.h>
22 #include <asterisk/logger.h>
23 #include <asterisk/module.h>
24 #include <asterisk/pbx.h>
25 #include <asterisk/options.h>
26 #include <asterisk/lock.h>
27 #include <asterisk/sched.h>
28 #include <asterisk/io.h>
29 #include <asterisk/rtp.h>
30 #include <asterisk/acl.h>
31 #include <asterisk/callerid.h>
32 #include <asterisk/cli.h>
33 #include <asterisk/md5.h>
34 #include <asterisk/app.h>
35 #include <asterisk/musiconhold.h>
36 #include <asterisk/dsp.h>
37 #include <asterisk/parking.h>
38 #include <asterisk/acl.h>
39 #include <asterisk/srv.h>
40 #include <asterisk/astdb.h>
41 #include <asterisk/causes.h>
42 #include <sys/socket.h>
43 #include <sys/ioctl.h>
50 #include <arpa/inet.h>
51 #include <sys/signal.h>
52 #include <netinet/in_systm.h>
53 #include <netinet/ip.h>
56 #define IPTOS_MINCOST 0x02
59 /* #define VOCAL_DATA_HACK */
62 #define DEFAULT_DEFAULT_EXPIRY 120
63 #define DEFAULT_MAX_EXPIRY 3600
64 #define EXPIRY_GUARD_SECS 15
66 #define CALLERID_UNKNOWN "Unknown"
68 #define SIP_DTMF_RFC2833 (1 << 0)
69 #define SIP_DTMF_INBAND (1 << 1)
70 #define SIP_DTMF_INFO (1 << 2)
72 static int max_expiry = DEFAULT_MAX_EXPIRY;
73 static int default_expiry = DEFAULT_DEFAULT_EXPIRY;
75 #define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
76 #define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
77 #define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
79 #define DEFAULT_RETRANS 1000 /* How frequently to retransmit */
80 #define MAX_RETRANS 5 /* Try only 5 times for retransmissions */
82 static char *desc = "Session Initiation Protocol (SIP)";
83 static char *type = "sip";
84 static char *tdesc = "Session Initiation Protocol (SIP)";
85 static char *config = "sip.conf";
87 #define DEFAULT_SIP_PORT 5060 /* From RFC 2543 */
88 #define SIP_MAX_PACKET 1500 /* Also from RFC 2543, should sub headers tho */
90 #define ALLOWED_METHODS "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER"
92 static char context[AST_MAX_EXTENSION] = "default";
94 static char language[MAX_LANGUAGE] = "";
96 static char callerid[AST_MAX_EXTENSION] = "asterisk";
98 static char fromdomain[AST_MAX_EXTENSION] = "";
100 static char notifymime[AST_MAX_EXTENSION] = "application/simple-message-summary";
102 static int srvlookup = 0;
104 static int pedanticsipchecking = 0;
106 static int usecnt =0;
107 static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
109 /* Protect the interface list (of sip_pvt's) */
110 static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
112 /* Protect the monitoring thread, so only one process can kill or start it, and not
113 when it's doing something critical. */
114 static ast_mutex_t netlock = AST_MUTEX_INITIALIZER;
116 static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
118 /* This is the thread for the monitor which checks for input on the channels
119 which are not currently in use. */
120 static pthread_t monitor_thread = 0;
122 static int restart_monitor(void);
124 /* Codecs that we support by default: */
125 static int capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263;
126 static int noncodeccapability = AST_RTP_DTMF;
128 static char ourhost[256];
129 static struct in_addr __ourip;
132 static int sipdebug = 0;
136 static int videosupport = 0;
138 static int globaldtmfmode = SIP_DTMF_RFC2833;
141 static int expiry = 900;
143 static struct sched_context *sched;
144 static struct io_context *io;
145 /* The private structures of the sip channels are linked for
146 selecting outgoing channels */
148 #define SIP_MAX_HEADERS 64
149 #define SIP_MAX_LINES 64
153 #define DEC_OUT_USE 2
154 #define INC_OUT_USE 3
156 static struct sip_codec_pref {
158 struct sip_codec_pref *next;
162 char *rlPart1; /* SIP Method Name or "SIP/2.0" protocol version */
163 char *rlPart2; /* The Request URI or Response Status */
165 int headers; /* SIP Headers */
166 char *header[SIP_MAX_HEADERS];
167 int lines; /* SDP Content */
168 char *line[SIP_MAX_LINES];
169 char data[SIP_MAX_PACKET];
175 struct sip_route *next;
179 static struct sip_pvt {
180 ast_mutex_t lock; /* Channel private lock */
181 char callid[80]; /* Global CallID */
182 char randdata[80]; /* Random data */
183 unsigned int ocseq; /* Current outgoing seqno */
184 unsigned int icseq; /* Current incoming seqno */
185 unsigned int callgroup;
186 unsigned int pickupgroup;
187 int lastinvite; /* Last Cseq of invite */
188 int alreadygone; /* Whether or not we've already been destroyed by or peer */
189 int needdestroy; /* if we need to be destroyed */
190 int capability; /* Special capability */
191 int jointcapability; /* Supported capability at both ends */
192 int noncodeccapability;
193 int outgoing; /* Outgoing or incoming call? */
194 int authtries; /* Times we've tried to authenticate */
195 int insecure; /* Don't check source port/ip */
196 int expiry; /* How long we take to expire */
197 int branch; /* One random number */
198 int canreinvite; /* Do we support reinvite */
199 int ringing; /* Have sent 180 ringing */
200 int progress; /* Have sent 183 message progress */
201 int tag; /* Another random number */
202 int nat; /* Whether to try to support NAT */
203 struct sockaddr_in sa; /* Our peer */
204 struct sockaddr_in redirip; /* Where our RTP should be going if not to us */
205 struct sockaddr_in vredirip; /* Where our Video RTP should be going if not to us */
206 struct sockaddr_in recv; /* Received as */
207 struct in_addr ourip; /* Our IP */
208 struct ast_channel *owner; /* Who owns us */
209 char exten[AST_MAX_EXTENSION]; /* Extention where to start */
210 char refer_to[AST_MAX_EXTENSION]; /* Place to store REFER-TO extension */
211 char referred_by[AST_MAX_EXTENSION];/* Place to store REFERRED-BY extension */
212 char refer_contact[AST_MAX_EXTENSION];/* Place to store Contact info from a REFER extension */
213 struct sip_pvt *refer_call; /* Call we are referring */
214 struct sip_route *route; /* Head of linked list of routing steps (fm Record-Route) */
215 char remote_party_id[256];
217 char context[AST_MAX_EXTENSION];
218 char fromdomain[AST_MAX_EXTENSION]; /* Domain to show in the from field */
219 char fromuser[AST_MAX_EXTENSION]; /* Domain to show in the user field */
220 char tohost[AST_MAX_EXTENSION]; /* Host we should put in the "to" field */
221 char language[MAX_LANGUAGE];
222 char rdnis[256]; /* Referring DNIS */
223 char theirtag[256]; /* Their tag */
226 char uri[256]; /* Original requested URI */
227 char peersecret[256];
228 char peermd5secret[256];
229 char callerid[256]; /* Caller*ID */
230 int restrictcid; /* hide presentation from remote user */
232 char accountcode[20]; /* Account code */
233 char our_contact[256]; /* Our contact header */
234 char realm[256]; /* Authorization realm */
235 char nonce[256]; /* Authorization nonce */
236 char domain[256]; /* Authorization nonce */
237 int amaflags; /* AMA Flags */
238 int pendinginvite; /* Any pending invite */
239 int pendingbye; /* Need to send bye after we ack? */
240 struct sip_request initreq; /* Initial request */
242 int maxtime; /* Max time for first response */
243 int initid; /* Auto-congest ID if appropriate */
244 int autokillid; /* Auto-kill ID */
253 struct sip_peer *peerpoke; /* If this calls is to poke a peer, which one */
254 struct sip_registry *registry; /* If this is a REGISTER call, to which registry */
255 struct ast_rtp *rtp; /* RTP Session */
256 struct ast_rtp *vrtp; /* Video RTP session */
257 struct sip_pkt *packets; /* Packets scheduled for re-transmission */
258 struct sip_pvt *next;
262 struct sip_pkt *next; /* Next packet */
263 int retrans; /* Retransmission number */
264 int seqno; /* Sequence number */
265 int resp; /* non-zero if this is a response packet (e.g. 200 OK) */
266 struct sip_pvt *owner; /* Owner call */
267 int retransid; /* Retransmission ID */
268 int packetlen; /* Length of packet */
273 /* Users who can access various contexts */
280 char accountcode[20];
281 unsigned int callgroup;
282 unsigned int pickupgroup;
295 struct sip_user *next;
302 char context[80]; /* JK02: peers need context too to allow parking etc */
308 char mailbox[AST_MAX_EXTENSION];
318 unsigned int callgroup;
319 unsigned int pickupgroup;
321 struct sockaddr_in addr;
325 struct sip_pvt *call; /* Call pointer */
326 int pokeexpire; /* When to expire poke */
327 int lastms; /* How long last response took (in ms), or -1 for no response */
328 int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
329 struct timeval ps; /* Ping send time */
331 struct sockaddr_in defaddr;
335 struct sip_peer *next;
338 static struct ast_user_list {
339 struct sip_user *users;
341 } userl = { NULL, AST_MUTEX_INITIALIZER };
343 static struct ast_peer_list {
344 struct sip_peer *peers;
346 } peerl = { NULL, AST_MUTEX_INITIALIZER };
349 #define REG_STATE_UNREGISTERED 0
350 #define REG_STATE_REGSENT 1
351 #define REG_STATE_AUTHSENT 2
352 #define REG_STATE_REGISTERED 3
353 #define REG_STATE_REJECTED 4
354 #define REG_STATE_TIMEOUT 5
355 #define REG_STATE_NOAUTH 6
357 struct sip_registry {
358 ast_mutex_t lock; /* Channel private lock */
359 struct sockaddr_in addr; /* Who we connect to for registration purposes */
360 char username[80]; /* Who we are registering as */
361 char authuser[80]; /* Who we *authenticate* as */
363 char secret[80]; /* Password or key name in []'s */
365 char contact[80]; /* Contact extension */
367 int expire; /* Sched ID of expiration */
368 int timeout; /* sched id of sip_reg_timeout */
369 int refresh; /* How often to refresh */
370 struct sip_pvt *call; /* create a sip_pvt structure for each outbound "registration call" in progress */
372 int callid_valid; /* 0 means we haven't chosen callid for this registry yet. */
373 char callid[80]; /* Global CallID for this registry */
374 unsigned int ocseq; /* Sequence number we got to for REGISTERs for this registry */
375 struct sockaddr_in us; /* Who the server thinks we are */
376 struct sip_registry *next;
379 #define REINVITE_INVITE 1
380 #define REINVITE_UPDATE 2
382 static int sip_do_register(struct sip_registry *r);
383 static struct sip_registry *registrations;
385 static int sipsock = -1;
386 static int globalnat = 0;
387 static int globalcanreinvite = REINVITE_INVITE;
390 static struct sockaddr_in bindaddr;
392 static struct ast_frame *sip_read(struct ast_channel *ast);
393 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req);
394 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
395 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *rand, int reliable);
396 static int transmit_request(struct sip_pvt *p, char *msg, int inc, int reliable);
397 static int transmit_request_with_auth(struct sip_pvt *p, char *msg, int inc, int reliable);
398 static int transmit_invite(struct sip_pvt *p, char *msg, int sendsdp, char *auth, char *vxml_url,char *distinctive_ring, int init);
399 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp);
400 static int transmit_info_with_digit(struct sip_pvt *p, char digit);
401 static int transmit_message_with_text(struct sip_pvt *p, char *text);
402 static int transmit_refer(struct sip_pvt *p, char *dest);
403 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req, char *msg, int init);
404 static char *getsipuri(char *header);
405 static void free_old_route(struct sip_route *route);
406 static int build_reply_digest(struct sip_pvt *p, char *orig_header, char *digest, int digest_len);
407 static int find_user(struct sip_pvt *fup, int event);
409 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
413 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->recv, sizeof(struct sockaddr_in));
415 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->sa, sizeof(struct sockaddr_in));
417 ast_log(LOG_WARNING, "sip_xmit of %p (len %d) to %s returned %d: %s\n", data, len, inet_ntoa(p->sa.sin_addr), res, strerror(errno));
422 static void sip_destroy(struct sip_pvt *p);
424 static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
426 if (bindaddr.sin_addr.s_addr)
427 memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr));
429 return ast_ouraddrfor(them, us);
433 static int retrans_pkt(void *data)
435 struct sip_pkt *pkt=data;
437 ast_mutex_lock(&pkt->owner->lock);
438 if (pkt->retrans < MAX_RETRANS) {
442 ast_verbose("Retransmitting #%d (NAT):\n%s\n to %s:%d\n", pkt->retrans, pkt->data, inet_ntoa(pkt->owner->recv.sin_addr), ntohs(pkt->owner->recv.sin_port));
444 ast_verbose("Retransmitting #%d (no NAT):\n%s\n to %s:%d\n", pkt->retrans, pkt->data, inet_ntoa(pkt->owner->sa.sin_addr), ntohs(pkt->owner->sa.sin_port));
446 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
449 ast_log(LOG_WARNING, "Maximum retries exceeded on call %s for seqno %d (%s)\n", pkt->owner->callid, pkt->seqno, pkt->resp ? "Response" : "Request");
451 while(pkt->owner->owner && ast_mutex_lock(&pkt->owner->owner->lock)) {
452 ast_mutex_unlock(&pkt->owner->lock);
454 ast_mutex_lock(&pkt->owner->lock);
456 if (pkt->owner->owner) {
457 /* XXX Potential deadlocK?? XXX */
458 ast_queue_hangup(pkt->owner->owner, 0);
459 ast_mutex_unlock(&pkt->owner->owner->lock);
461 /* If no owner, destroy now */
462 pkt->owner->needdestroy = 1;
466 ast_mutex_unlock(&pkt->owner->lock);
470 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len)
473 pkt = malloc(sizeof(struct sip_pkt) + len);
476 memset(pkt, 0, sizeof(struct sip_pkt));
477 memcpy(pkt->data, data, len);
478 pkt->packetlen = len;
479 pkt->next = p->packets;
483 /* Schedule retransmission */
484 pkt->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, pkt);
485 pkt->next = p->packets;
487 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
488 if (!strncasecmp(pkt->data, "INVITE", 6)) {
489 /* Note this is a pending invite */
490 p->pendinginvite = seqno;
495 static int __sip_autodestruct(void *data)
497 struct sip_pvt *p = data;
499 ast_log(LOG_DEBUG, "Auto destroying call '%s'\n", p->callid);
501 ast_log(LOG_WARNING, "Autodestruct on call '%s' with owner in place\n", p->callid);
502 ast_queue_hangup(p->owner, 0);
509 static int sip_scheddestroy(struct sip_pvt *p, int ms)
511 if (p->autokillid > -1)
512 ast_sched_del(sched, p->autokillid);
513 p->autokillid = ast_sched_add(sched, ms, __sip_autodestruct, p);
517 static int sip_cancel_destroy(struct sip_pvt *p)
519 if (p->autokillid > -1)
520 ast_sched_del(sched, p->autokillid);
525 static int __sip_ack(struct sip_pvt *p, int seqno, int resp)
527 struct sip_pkt *cur, *prev = NULL;
532 if ((cur->seqno == seqno) && (cur->resp == resp)) {
533 if (!resp && (seqno == p->pendinginvite)) {
534 ast_log(LOG_DEBUG, "Acked pending invite %d\n", p->pendinginvite);
535 p->pendinginvite = 0;
538 /* this is our baby */
540 prev->next = cur->next;
542 p->packets = cur->next;
543 if (cur->retransid > -1)
544 ast_sched_del(sched, cur->retransid);
552 ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
556 static int __sip_semi_ack(struct sip_pvt *p, int seqno, int resp)
562 if ((cur->seqno == seqno) && (cur->resp == resp)) {
563 /* this is our baby */
564 if (cur->retransid > -1)
565 ast_sched_del(sched, cur->retransid);
572 ast_log(LOG_DEBUG, "(Provisional) Stopping retransmission (but retaining packet) on '%s' %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
576 static int send_response(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
581 ast_verbose("%sTransmitting (NAT):\n%s\n to %s:%d\n", reliable ? "Reliably " : "", req->data, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
583 ast_verbose("%sTransmitting (no NAT):\n%s\n to %s:%d\n", reliable ? "Reliably " : "", req->data, inet_ntoa(p->sa.sin_addr), ntohs(p->sa.sin_port));
586 res = __sip_reliable_xmit(p, seqno, 1, req->data, req->len);
588 res = __sip_xmit(p, req->data, req->len);
594 static int send_request(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
599 ast_verbose("%sTransmitting:\n%s (NAT) to %s:%d\n", reliable ? "Reliably " : "", req->data, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
601 ast_verbose("%sTransmitting:\n%s (no NAT) to %s:%d\n", reliable ? "Reliably " : "", req->data, inet_ntoa(p->sa.sin_addr), ntohs(p->sa.sin_port));
604 res = __sip_reliable_xmit(p, seqno, 0, req->data, req->len);
606 res = __sip_xmit(p, req->data, req->len);
610 static char *ditch_braces(char *tmp)
615 if ((n = strchr(tmp, '<')) ) {
617 while(*c && *c != '>') c++;
619 ast_log(LOG_WARNING, "No closing brace in '%s'\n", tmp);
628 static int sip_sendtext(struct ast_channel *ast, char *text)
630 struct sip_pvt *p = ast->pvt->pvt;
632 ast_verbose("Sending text %s on %s\n", text, ast->name);
635 if (!text || !strlen(text))
638 ast_verbose("Really sending text %s on %s\n", text, ast->name);
639 transmit_message_with_text(p, text);
643 static int create_addr(struct sip_pvt *r, char *peer)
650 char host[256], *hostn;
652 r->sa.sin_family = AF_INET;
653 ast_mutex_lock(&peerl.lock);
656 if (!strcasecmp(p->name, peer)) {
658 r->capability = p->capability;
661 ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", r->nat);
662 ast_rtp_setnat(r->rtp, r->nat);
665 ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", r->nat);
666 ast_rtp_setnat(r->vrtp, r->nat);
668 strncpy(r->peername, p->username, sizeof(r->peername)-1);
669 strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1);
670 strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1);
671 strncpy(r->username, p->username, sizeof(r->username)-1);
672 strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1);
673 if (!strlen(r->tohost)) {
674 if (p->addr.sin_addr.s_addr)
675 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->addr.sin_addr));
677 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->defaddr.sin_addr));
679 if (strlen(p->fromdomain))
680 strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1);
681 if (strlen(p->fromuser))
682 strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1);
683 r->insecure = p->insecure;
684 r->canreinvite = p->canreinvite;
685 r->maxtime = p->maxms;
686 r->callgroup = p->callgroup;
687 r->pickupgroup = p->pickupgroup;
689 r->dtmfmode = p->dtmfmode;
690 if (r->dtmfmode & SIP_DTMF_RFC2833)
691 r->noncodeccapability |= AST_RTP_DTMF;
693 r->noncodeccapability &= ~AST_RTP_DTMF;
695 strncpy(r->context, p->context,sizeof(r->context)-1);
696 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
697 (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) {
698 if (p->addr.sin_addr.s_addr) {
699 r->sa.sin_addr = p->addr.sin_addr;
700 r->sa.sin_port = p->addr.sin_port;
702 r->sa.sin_addr = p->defaddr.sin_addr;
703 r->sa.sin_port = p->defaddr.sin_port;
705 memcpy(&r->recv, &r->sa, sizeof(r->recv));
711 ast_mutex_unlock(&peerl.lock);
713 if ((port=strchr(peer, ':'))) {
721 portno = DEFAULT_SIP_PORT;
726 snprintf(service, sizeof(service), "_sip._udp.%s", peer);
727 ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service);
733 hp = gethostbyname(hostn);
735 strncpy(r->tohost, peer, sizeof(r->tohost) - 1);
736 memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr));
737 r->sa.sin_port = htons(portno);
738 memcpy(&r->recv, &r->sa, sizeof(r->recv));
741 ast_log(LOG_WARNING, "No such host: %s\n", peer);
750 static int auto_congest(void *nothing)
752 struct sip_pvt *p = nothing;
753 ast_mutex_lock(&p->lock);
756 if (!ast_mutex_trylock(&p->owner->lock)) {
757 ast_log(LOG_NOTICE, "Auto-congesting %s\n", p->owner->name);
758 ast_queue_control(p->owner, AST_CONTROL_CONGESTION, 0);
759 ast_mutex_unlock(&p->owner->lock);
762 ast_mutex_unlock(&p->lock);
766 static void sip_prefs_free(void)
768 struct sip_codec_pref *cur, *next;
778 static void sip_pref_remove(int format)
780 struct sip_codec_pref *cur, *prev=NULL;
783 if (cur->codec == format) {
785 prev->next = cur->next;
796 static int sip_pref_append(int format)
798 struct sip_codec_pref *cur, *tmp;
799 sip_pref_remove(format);
800 tmp = (struct sip_codec_pref *)malloc(sizeof(struct sip_codec_pref));
803 memset(tmp, 0, sizeof(struct sip_codec_pref));
815 static int sip_codec_choose(int formats)
817 struct sip_codec_pref *cur;
818 formats &= (AST_FORMAT_MAX_AUDIO - 1);
821 if (formats & cur->codec)
825 return ast_best_codec(formats);
828 static int sip_call(struct ast_channel *ast, char *dest, int timeout)
832 char *vxml_url = NULL;
833 char *distinctive_ring = NULL;
834 struct varshead *headp;
835 struct ast_var_t *current;
838 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
839 ast_log(LOG_WARNING, "sip_call called on %s, neither down nor reserved\n", ast->name);
842 /* Check whether there is vxml_url, distinctive ring variables */
844 headp=&ast->varshead;
845 AST_LIST_TRAVERSE(headp,current,entries) {
846 /* Check whether there is a VXML_URL variable */
847 if (strcasecmp(ast_var_name(current),"VXML_URL")==0)
849 vxml_url = ast_var_value(current);
852 /* Check whether there is a ALERT_INFO variable */
853 if (strcasecmp(ast_var_name(current),"ALERT_INFO")==0)
855 distinctive_ring = ast_var_value(current);
862 ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
863 res = find_user(p,INC_OUT_USE);
864 p->restrictcid = ast->restrictcid;
865 p->jointcapability = p->capability;
866 transmit_invite(p, "INVITE", 1, NULL, vxml_url,distinctive_ring, 1);
868 /* Initialize auto-congest time */
869 p->initid = ast_sched_add(sched, p->maxtime * 2, auto_congest, p);
874 static void __sip_destroy(struct sip_pvt *p, int lockowner)
876 struct sip_pvt *cur, *prev = NULL;
879 ast_log(LOG_DEBUG, "Destorying call '%s'\n", p->callid);
881 ast_extension_state_del(p->stateid, NULL);
883 ast_sched_del(sched, p->initid);
884 if (p->autokillid > -1)
885 ast_sched_del(sched, p->autokillid);
888 ast_rtp_destroy(p->rtp);
891 ast_rtp_destroy(p->vrtp);
894 free_old_route(p->route);
898 /* Carefully unlink from registry */
899 struct sip_registry *reg;
902 if ((reg == p->registry) && (p->registry->call == p))
903 p->registry->call=NULL;
907 /* Unlink us from the owner if we have one */
910 ast_mutex_lock(&p->owner->lock);
911 ast_log(LOG_DEBUG, "Detaching from %s\n", p->owner->name);
912 p->owner->pvt->pvt = NULL;
914 ast_mutex_unlock(&p->owner->lock);
920 prev->next = cur->next;
929 ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
932 ast_sched_del(sched, p->initid);
933 while((cp = p->packets)) {
934 p->packets = p->packets->next;
935 if (cp->retransid > -1)
936 ast_sched_del(sched, cp->retransid);
943 static int find_user(struct sip_pvt *fup, int event)
947 strncpy(name, fup->username, sizeof(name) - 1);
948 ast_mutex_lock(&userl.lock);
951 if (!strcasecmp(u->name, name)) {
957 ast_log(LOG_DEBUG, "%s is not a local user\n", name);
958 ast_mutex_unlock(&userl.lock);
963 if ( u->inUse > 0 ) {
970 if (u->incominglimit > 0 ) {
971 if (u->inUse >= u->incominglimit) {
972 ast_log(LOG_ERROR, "Call from user '%s' rejected due to usage limit of %d\n", u->name, u->incominglimit);
973 ast_mutex_unlock(&userl.lock);
978 ast_log(LOG_DEBUG, "Call from user '%s' is %d out of %d\n", u->name, u->inUse, u->incominglimit);
981 if ( u->outUse > 0 ) {
988 if ( u->outgoinglimit > 0 ) {
989 if ( u->outUse >= u->outgoinglimit ) {
990 ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
991 ast_mutex_unlock(&userl.lock);
998 ast_log(LOG_ERROR, "find_user(%s,%d) called with no event!\n",u->name,event);
1000 ast_mutex_unlock(&userl.lock);
1004 static void sip_destroy(struct sip_pvt *p)
1006 ast_mutex_lock(&iflock);
1007 __sip_destroy(p, 1);
1008 ast_mutex_unlock(&iflock);
1011 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req);
1014 static int sip_hangup(struct ast_channel *ast)
1016 struct sip_pvt *p = ast->pvt->pvt;
1018 int needdestroy = 0;
1020 ast_log(LOG_DEBUG, "sip_hangup(%s)\n", ast->name);
1021 if (!ast->pvt->pvt) {
1022 ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
1025 ast_mutex_lock(&p->lock);
1026 if ( p->outgoing ) {
1027 ast_log(LOG_DEBUG, "find_user(%s) - decrement outUse counter\n", p->username);
1028 find_user(p, DEC_OUT_USE);
1030 ast_log(LOG_DEBUG, "find_user(%s) - decrement inUse counter\n", p->username);
1031 find_user(p, DEC_IN_USE);
1033 /* Determine how to disconnect */
1034 if (p->owner != ast) {
1035 ast_log(LOG_WARNING, "Huh? We aren't the owner?\n");
1036 ast_mutex_unlock(&p->lock);
1039 if (!ast || (ast->_state != AST_STATE_UP))
1044 ast_dsp_free(p->vad);
1047 ast->pvt->pvt = NULL;
1049 ast_mutex_lock(&usecnt_lock);
1051 ast_mutex_unlock(&usecnt_lock);
1052 ast_update_use_count();
1055 /* Start the process if it's not already started */
1056 if (!p->alreadygone && strlen(p->initreq.data)) {
1059 transmit_request_with_auth(p, "CANCEL", p->ocseq, 1);
1060 /* Actually don't destroy us yet, wait for the 487 on our original
1061 INVITE, but do set an autodestruct just in case. */
1063 sip_scheddestroy(p, 15000);
1065 transmit_response_reliable(p, "403 Forbidden", &p->initreq);
1067 if (!p->pendinginvite) {
1069 transmit_request_with_auth(p, "BYE", 0, 1);
1071 /* Note we will need a BYE when this all settles out
1072 but we can't send one while we have "INVITE" outstanding. */
1077 p->needdestroy = needdestroy;
1078 ast_mutex_unlock(&p->lock);
1082 static int sip_answer(struct ast_channel *ast)
1086 struct sip_pvt *p = ast->pvt->pvt;
1089 if (ast->_state != AST_STATE_UP) {
1093 codec=pbx_builtin_getvar_helper(p->owner,"SIP_CODEC");
1095 ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
1096 fmt=ast_getformatbyname(codec);
1099 } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized codec: %s\n",codec);
1102 ast_setstate(ast, AST_STATE_UP);
1104 ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
1105 res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
1110 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
1112 struct sip_pvt *p = ast->pvt->pvt;
1114 if (frame->frametype == AST_FRAME_VOICE) {
1115 if (!(frame->subclass & ast->nativeformats)) {
1116 ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
1117 frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
1121 ast_mutex_lock(&p->lock);
1123 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1124 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1127 res = ast_rtp_write(p->rtp, frame);
1129 ast_mutex_unlock(&p->lock);
1131 } else if (frame->frametype == AST_FRAME_VIDEO) {
1133 ast_mutex_lock(&p->lock);
1135 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1136 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1139 res = ast_rtp_write(p->vrtp, frame);
1141 ast_mutex_unlock(&p->lock);
1143 } else if (frame->frametype == AST_FRAME_IMAGE) {
1146 ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", frame->frametype);
1153 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
1155 struct sip_pvt *p = newchan->pvt->pvt;
1156 ast_mutex_lock(&p->lock);
1157 if (p->owner != oldchan) {
1158 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
1159 ast_mutex_unlock(&p->lock);
1163 ast_mutex_unlock(&p->lock);
1167 static int sip_senddigit(struct ast_channel *ast, char digit)
1169 struct sip_pvt *p = ast->pvt->pvt;
1170 if (p && (p->dtmfmode & SIP_DTMF_INFO)) {
1171 transmit_info_with_digit(p, digit);
1173 if (p && p->rtp && (p->dtmfmode & SIP_DTMF_RFC2833)) {
1174 ast_rtp_senddigit(p->rtp, digit);
1176 /* If in-band DTMF is desired, send that */
1177 if (p->dtmfmode & SIP_DTMF_INBAND)
1182 static int sip_transfer(struct ast_channel *ast, char *dest)
1184 struct sip_pvt *p = ast->pvt->pvt;
1186 res = transmit_refer(p, dest);
1190 static int sip_indicate(struct ast_channel *ast, int condition)
1192 struct sip_pvt *p = ast->pvt->pvt;
1194 case AST_CONTROL_RINGING:
1195 if (ast->_state == AST_STATE_RING) {
1196 if (!p->progress && !p->ringing) {
1197 transmit_response(p, "180 Ringing", &p->initreq);
1201 /* Oops, we've sent progress tones. Let Asterisk do it instead */
1205 case AST_CONTROL_BUSY:
1206 if (ast->_state != AST_STATE_UP) {
1207 transmit_response(p, "486 Busy Here", &p->initreq);
1209 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1213 case AST_CONTROL_CONGESTION:
1214 if (ast->_state != AST_STATE_UP) {
1215 transmit_response(p, "503 Service Unavailable", &p->initreq);
1217 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1221 case AST_CONTROL_PROGRESS:
1222 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1223 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1231 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
1239 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
1241 struct ast_channel *tmp;
1243 tmp = ast_channel_alloc(1);
1245 /* Select our native format based on codec preference until we receive
1246 something from another device to the contrary. */
1247 if (i->jointcapability)
1248 tmp->nativeformats = sip_codec_choose(i->jointcapability);
1249 else if (i->capability)
1250 tmp->nativeformats = sip_codec_choose(i->capability);
1252 tmp->nativeformats = sip_codec_choose(capability);
1253 fmt = ast_best_codec(tmp->nativeformats);
1255 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
1257 if (strchr(i->fromdomain,':'))
1259 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(i));
1263 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(i));
1266 if (i->dtmfmode & SIP_DTMF_INBAND) {
1267 i->vad = ast_dsp_new();
1268 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
1270 tmp->fds[0] = ast_rtp_fd(i->rtp);
1271 tmp->fds[1] = ast_rtcp_fd(i->rtp);
1273 tmp->fds[2] = ast_rtp_fd(i->vrtp);
1274 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
1276 ast_setstate(tmp, state);
1277 if (state == AST_STATE_RING)
1279 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
1280 tmp->writeformat = fmt;
1281 tmp->pvt->rawwriteformat = fmt;
1282 tmp->readformat = fmt;
1283 tmp->pvt->rawreadformat = fmt;
1285 tmp->pvt->send_text = sip_sendtext;
1286 tmp->pvt->call = sip_call;
1287 tmp->pvt->hangup = sip_hangup;
1288 tmp->pvt->answer = sip_answer;
1289 tmp->pvt->read = sip_read;
1290 tmp->pvt->write = sip_write;
1291 tmp->pvt->write_video = sip_write;
1292 tmp->pvt->indicate = sip_indicate;
1293 tmp->pvt->transfer = sip_transfer;
1294 tmp->pvt->fixup = sip_fixup;
1295 tmp->pvt->send_digit = sip_senddigit;
1297 tmp->pvt->bridge = ast_rtp_bridge;
1299 tmp->callgroup = i->callgroup;
1300 tmp->pickupgroup = i->pickupgroup;
1301 tmp->restrictcid = i->restrictcid;
1302 if (strlen(i->accountcode))
1303 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
1305 tmp->amaflags = i->amaflags;
1306 if (strlen(i->language))
1307 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
1309 ast_mutex_lock(&usecnt_lock);
1311 ast_mutex_unlock(&usecnt_lock);
1312 ast_update_use_count();
1313 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
1314 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
1315 if (strlen(i->callerid))
1316 tmp->callerid = strdup(i->callerid);
1317 if (strlen(i->rdnis))
1318 tmp->rdnis = strdup(i->rdnis);
1320 if (state != AST_STATE_DOWN) {
1321 if (ast_pbx_start(tmp)) {
1322 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
1328 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
1332 static struct cfalias {
1336 { "Content-Type", "c" },
1337 { "Content-Encoding", "e" },
1341 { "Content-Length", "l" },
1347 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
1348 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
1349 char* r = line + nameLen + 1;
1350 while (*r && (*r < 33)) ++r;
1357 static char *get_sdp(struct sip_request *req, char *name) {
1359 int len = strlen(name);
1362 for (x=0; x<req->lines; x++) {
1363 r = get_sdp_by_line(req->line[x], name, len);
1364 if (r[0] != '\0') return r;
1369 static void sdpLineNum_iterator_init(int* iterator) {
1373 static char* get_sdp_iterate(int* iterator,
1374 struct sip_request *req, char *name) {
1375 int len = strlen(name);
1377 while (*iterator < req->lines) {
1378 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
1379 if (r[0] != '\0') return r;
1384 static char *__get_header(struct sip_request *req, char *name, int *start)
1387 int len = strlen(name);
1389 for (x=*start;x<req->headers;x++) {
1390 if (!strncasecmp(req->header[x], name, len) &&
1391 (req->header[x][len] == ':')) {
1392 r = req->header[x] + len + 1;
1393 while(*r && (*r < 33))
1400 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
1401 if (!strcasecmp(aliases[x].fullname, name))
1402 return __get_header(req, aliases[x].shortname, start);
1404 /* Don't return NULL, so get_header is always a valid pointer */
1408 static char *get_header(struct sip_request *req, char *name)
1411 return __get_header(req, name, &start);
1414 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
1416 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
1417 struct ast_frame *f;
1418 static struct ast_frame null_frame = { AST_FRAME_NULL, };
1421 f = ast_rtp_read(p->rtp);
1424 f = ast_rtcp_read(p->rtp);
1427 f = ast_rtp_read(p->vrtp);
1430 f = ast_rtcp_read(p->vrtp);
1435 /* Don't send RFC2833 if we're not supposed to */
1436 if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & SIP_DTMF_RFC2833))
1439 /* We already hold the channel lock */
1440 if (f->frametype == AST_FRAME_VOICE) {
1441 if (f->subclass != p->owner->nativeformats) {
1442 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
1443 p->owner->nativeformats = f->subclass;
1444 ast_set_read_format(p->owner, p->owner->readformat);
1445 ast_set_write_format(p->owner, p->owner->writeformat);
1447 if (p->dtmfmode & SIP_DTMF_INBAND) {
1448 f = ast_dsp_process(p->owner,p->vad,f,0);
1455 static struct ast_frame *sip_read(struct ast_channel *ast)
1457 struct ast_frame *fr;
1458 struct sip_pvt *p = ast->pvt->pvt;
1459 ast_mutex_lock(&p->lock);
1460 fr = sip_rtp_read(ast, p);
1461 ast_mutex_unlock(&p->lock);
1465 static void build_callid(char *callid, int len, struct in_addr ourip)
1472 res = snprintf(callid, len, "%08x", val);
1476 /* It's not important that we really use our right IP here... */
1477 snprintf(callid, len, "@%s", inet_ntoa(ourip));
1480 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobalnat)
1484 p = malloc(sizeof(struct sip_pvt));
1487 /* Keep track of stuff */
1488 memset(p, 0, sizeof(struct sip_pvt));
1492 p->rtp = ast_rtp_new(sched, io, 1, 0);
1494 p->vrtp = ast_rtp_new(sched, io, 1, 0);
1498 /* Start with 101 instead of 1 */
1501 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
1505 ast_rtp_settos(p->rtp, tos);
1507 ast_rtp_settos(p->vrtp, tos);
1508 if (useglobalnat && sin) {
1509 /* Setup NAT structure according to global settings if we have an address */
1511 memcpy(&p->recv, sin, sizeof(p->recv));
1512 ast_rtp_setnat(p->rtp, p->nat);
1514 ast_rtp_setnat(p->vrtp, p->nat);
1516 ast_mutex_init(&p->lock);
1519 memcpy(&p->sa, sin, sizeof(p->sa));
1520 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
1521 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1523 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1525 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
1526 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
1528 build_callid(p->callid, sizeof(p->callid), p->ourip);
1530 strncpy(p->callid, callid, sizeof(p->callid) - 1);
1531 /* Assume reinvite OK and via INVITE */
1532 p->canreinvite = globalcanreinvite;
1533 p->dtmfmode = globaldtmfmode;
1534 p->capability = capability;
1535 if (p->dtmfmode & SIP_DTMF_RFC2833)
1536 p->noncodeccapability |= AST_RTP_DTMF;
1537 strncpy(p->context, context, sizeof(p->context) - 1);
1538 strncpy(p->fromdomain, fromdomain, sizeof(p->fromdomain) - 1);
1540 ast_mutex_lock(&iflock);
1543 ast_mutex_unlock(&iflock);
1545 ast_log(LOG_DEBUG, "Allocating new SIP call for %s\n", callid);
1549 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin)
1557 callid = get_header(req, "Call-ID");
1559 if (pedanticsipchecking) {
1560 /* In principle Call-ID's uniquely identify a call, however some vendors
1561 (i.e. Pingtel) send multiple calls with the same Call-ID and different
1562 tags in order to simplify billing. The RFC does state that we have to
1563 compare tags in addition to the call-id, but this generate substantially
1564 more overhead which is totally unnecessary for the vast majority of sane
1565 SIP implementations, and thus Asterisk does not enable this behavior
1566 by default. Short version: You'll need this option to support conferencing
1568 strncpy(tmp, req->header[0], sizeof(tmp) - 1);
1570 c = strchr(tmp, ' ');
1573 if (!strcasecmp(cmd, "SIP/2.0")) {
1579 strncpy(tmp, get_header(req, "From"), sizeof(tmp) - 1);
1581 strncpy(tmp, get_header(req, "To"), sizeof(tmp) - 1);
1582 tag = strstr(tmp, "tag=");
1585 c = strchr(tag, ';');
1592 if (!strlen(callid)) {
1593 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", inet_ntoa(sin->sin_addr));
1596 ast_mutex_lock(&iflock);
1599 if (!strcmp(p->callid, callid) &&
1600 (!pedanticsipchecking || !strlen(p->theirtag) || !strcmp(p->theirtag, tag))) {
1601 /* Found the call */
1602 ast_mutex_lock(&p->lock);
1603 ast_mutex_unlock(&iflock);
1608 ast_mutex_unlock(&iflock);
1609 p = sip_alloc(callid, sin, 1);
1611 ast_mutex_lock(&p->lock);
1615 static int sip_register(char *value, int lineno)
1617 struct sip_registry *reg;
1618 char copy[256] = "";
1619 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
1627 strncpy(copy, value, sizeof(copy)-1);
1630 hostname = strrchr(stringp, '@');
1635 if (!username || !strlen(username) || !hostname || !strlen(hostname)) {
1636 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d", lineno);
1640 username = strsep(&stringp, ":");
1642 secret = strsep(&stringp, ":");
1644 authuser = strsep(&stringp, ":");
1647 hostname = strsep(&stringp, "/");
1649 contact = strsep(&stringp, "/");
1650 if (!contact || !strlen(contact))
1653 hostname = strsep(&stringp, ":");
1654 porta = strsep(&stringp, ":");
1656 if (porta && !atoi(porta)) {
1657 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
1660 hp = gethostbyname(hostname);
1662 ast_log(LOG_WARNING, "Host '%s' not found at line %d\n", hostname, lineno);
1665 reg = malloc(sizeof(struct sip_registry));
1667 memset(reg, 0, sizeof(struct sip_registry));
1668 strncpy(reg->contact, contact, sizeof(reg->contact) - 1);
1670 strncpy(reg->username, username, sizeof(reg->username)-1);
1672 strncpy(reg->hostname, hostname, sizeof(reg->hostname)-1);
1674 strncpy(reg->authuser, authuser, sizeof(reg->authuser)-1);
1676 strncpy(reg->secret, secret, sizeof(reg->secret)-1);
1679 reg->refresh = default_expiry;
1680 reg->addr.sin_family = AF_INET;
1681 memcpy(®->addr.sin_addr, hp->h_addr, sizeof(®->addr.sin_addr));
1682 reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT);
1683 reg->next = registrations;
1684 reg->callid_valid = 0;
1686 registrations = reg;
1688 ast_log(LOG_ERROR, "Out of memory\n");
1694 static void parse(struct sip_request *req)
1696 /* Divide fields by NULL's */
1701 /* First header starts immediately */
1705 /* We've got a new header */
1709 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
1711 if (!strlen(req->header[f])) {
1712 /* Line by itself means we're now in content */
1716 if (f >= SIP_MAX_HEADERS - 1) {
1717 ast_log(LOG_WARNING, "Too many SIP headers...\n");
1720 req->header[f] = c + 1;
1721 } else if (*c == '\r') {
1722 /* Ignore but eliminate \r's */
1727 /* Check for last header */
1728 if (strlen(req->header[f]))
1731 /* Now we process any mime content */
1736 /* We've got a new line */
1739 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
1741 if (f >= SIP_MAX_LINES - 1) {
1742 ast_log(LOG_WARNING, "Too many SDP lines...\n");
1745 req->line[f] = c + 1;
1746 } else if (*c == '\r') {
1747 /* Ignore and eliminate \r's */
1752 /* Check for last line */
1753 if (strlen(req->line[f]))
1757 ast_verbose("%d headers, %d lines\n", req->headers, req->lines);
1759 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
1762 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
1771 int peercapability, peernoncodeccapability;
1772 int vpeercapability=0, vpeernoncodeccapability=0;
1773 struct sockaddr_in sin;
1780 /* Get codec and RTP info from SDP */
1781 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
1782 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
1785 m = get_sdp(req, "m");
1786 c = get_sdp(req, "c");
1787 if (!strlen(m) || !strlen(c)) {
1788 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
1791 if (sscanf(c, "IN IP4 %256s", host) != 1) {
1792 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
1795 /* XXX This could block for a long time, and block the main thread! XXX */
1796 hp = gethostbyname(host);
1798 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
1801 sdpLineNum_iterator_init(&iterator);
1802 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
1803 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) {
1805 // Scan through the RTP payload types specified in a "m=" line:
1806 ast_rtp_pt_clear(p->rtp);
1808 while(strlen(codecs)) {
1809 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
1810 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
1814 ast_verbose("Found audio format %s\n", ast_getformatname(codec));
1815 ast_rtp_set_m_type(p->rtp, codec);
1817 /* Skip over any whitespace */
1818 while(*codecs && (*codecs < 33)) codecs++;
1821 if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
1823 // Scan through the RTP payload types specified in a "m=" line:
1824 ast_rtp_pt_clear(p->vrtp);
1826 while(strlen(codecs)) {
1827 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
1828 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
1832 ast_verbose("Found video format %s\n", ast_getformatname(codec));
1833 ast_rtp_set_m_type(p->vrtp, codec);
1835 /* Skip over any whitespace */
1836 while(*codecs && (*codecs < 33)) codecs++;
1840 sin.sin_family = AF_INET;
1841 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
1842 /* Setup audio port number */
1843 sin.sin_port = htons(portno);
1844 if (p->rtp && sin.sin_port)
1845 ast_rtp_set_peer(p->rtp, &sin);
1846 /* Setup video port number */
1847 sin.sin_port = htons(vportno);
1848 if (p->vrtp && sin.sin_port)
1849 ast_rtp_set_peer(p->vrtp, &sin);
1851 printf("Peer RTP is at port %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
1853 // Next, scan through each "a=rtpmap:" line, noting each
1854 // specified RTP payload type (with corresponding MIME subtype):
1855 sdpLineNum_iterator_init(&iterator);
1856 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
1857 char* mimeSubtype = ast_strdupa(a); // ensures we have enough space
1858 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
1860 ast_verbose("Found description format %s\n", mimeSubtype);
1861 // Note: should really look at the 'freq' and '#chans' params too
1862 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
1864 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
1867 // Now gather all of the codecs that were asked for:
1868 ast_rtp_get_current_formats(p->rtp,
1869 &peercapability, &peernoncodeccapability);
1871 ast_rtp_get_current_formats(p->vrtp,
1872 &vpeercapability, &vpeernoncodeccapability);
1873 p->jointcapability = p->capability & (peercapability | vpeercapability);
1874 p->noncodeccapability = noncodeccapability & (peernoncodeccapability | vpeernoncodeccapability);
1877 ast_verbose("Capabilities: us - %d, them - %d/%d, combined - %d\n",
1878 p->capability, peercapability, vpeercapability, p->jointcapability);
1879 ast_verbose("Non-codec capabilities: us - %d, them - %d, combined - %d\n",
1880 noncodeccapability, peernoncodeccapability,
1881 p->noncodeccapability);
1883 if (!p->jointcapability) {
1884 ast_log(LOG_WARNING, "No compatible codecs!\n");
1888 if (!(p->owner->nativeformats & p->jointcapability)) {
1889 ast_log(LOG_DEBUG, "Oooh, we need to change our formats since our peer supports only %d and not %d\n", p->jointcapability, p->owner->nativeformats);
1890 p->owner->nativeformats = sip_codec_choose(p->jointcapability);
1891 ast_set_read_format(p->owner, p->owner->readformat);
1892 ast_set_write_format(p->owner, p->owner->writeformat);
1894 if (p->owner->bridge) {
1895 /* Turn on/off music on hold if we are holding/unholding */
1896 if (sin.sin_addr.s_addr) {
1897 ast_moh_stop(p->owner->bridge);
1899 ast_moh_start(p->owner->bridge, NULL);
1907 static int add_header(struct sip_request *req, char *var, char *value)
1909 if (req->len >= sizeof(req->data) - 4) {
1910 ast_log(LOG_WARNING, "Out of space, can't add anymore (%s:%s)\n", var, value);
1914 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
1917 req->header[req->headers] = req->data + req->len;
1918 snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", var, value);
1919 req->len += strlen(req->header[req->headers]);
1920 if (req->headers < SIP_MAX_HEADERS)
1923 ast_log(LOG_WARNING, "Out of header space\n");
1929 static int add_blank_header(struct sip_request *req)
1931 if (req->len >= sizeof(req->data) - 4) {
1932 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
1936 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
1939 req->header[req->headers] = req->data + req->len;
1940 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "\r\n");
1941 req->len += strlen(req->header[req->headers]);
1942 if (req->headers < SIP_MAX_HEADERS)
1945 ast_log(LOG_WARNING, "Out of header space\n");
1951 static int add_line(struct sip_request *req, char *line)
1953 if (req->len >= sizeof(req->data) - 4) {
1954 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
1958 /* Add extra empty return */
1959 snprintf(req->data + req->len, sizeof(req->data) - req->len, "\r\n");
1960 req->len += strlen(req->data + req->len);
1962 req->line[req->lines] = req->data + req->len;
1963 snprintf(req->line[req->lines], sizeof(req->data) - req->len, "%s", line);
1964 req->len += strlen(req->line[req->lines]);
1965 if (req->lines < SIP_MAX_LINES)
1968 ast_log(LOG_WARNING, "Out of line space\n");
1974 static int copy_header(struct sip_request *req, struct sip_request *orig, char *field)
1977 tmp = get_header(orig, field);
1979 /* Add what we're responding to */
1980 return add_header(req, field, tmp);
1982 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
1986 static int copy_all_header(struct sip_request *req, struct sip_request *orig, char *field)
1992 tmp = __get_header(orig, field, &start);
1994 /* Add what we're responding to */
1995 add_header(req, field, tmp);
2000 return copied ? 0 : -1;
2003 static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct sip_request *orig, char *field)
2010 tmp = __get_header(orig, field, &start);
2012 if (!copied && p->nat) {
2013 #ifdef THE_SIP_AUTHORS_CAN_SUCK_MY_GONADS
2014 /* SLD: FIXME: Nice try, but the received= should not have a port */
2015 /* SLD: FIXME: See RFC2543 BNF in Section 6.40.5 */
2016 /* MAS: Yup, RFC says you can't do it. No way to indicate PAT...
2018 if (ntohs(p->recv.sin_port) != DEFAULT_SIP_PORT)
2019 snprintf(new, sizeof(new), "%s;received=%s:%d", tmp, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
2022 snprintf(new, sizeof(new), "%s;received=%s", tmp, inet_ntoa(p->recv.sin_addr));
2023 add_header(req, field, new);
2025 /* Add what we're responding to */
2026 add_header(req, field, tmp);
2033 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2039 /* Add Route: header into request per learned route */
2040 static void add_route(struct sip_request *req, struct sip_route *route)
2043 int n, rem = 255; /* sizeof(r)-1: Room for terminating 0 */
2049 n = strlen(route->hop);
2050 if ((n+3)>rem) break;
2056 strcpy(p, route->hop); p += n;
2059 route = route->next;
2062 add_header(req, "Route", r);
2065 static void set_destination(struct sip_pvt *p, char *uri)
2067 char *h, *maddr, hostname[256];
2071 /* Parse uri to h (host) and port - uri is already just the part inside the <> */
2072 /* general form we are expecting is sip[s]:username[:password]@host[:port][;...] */
2075 ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
2077 /* Find and parse hostname */
2078 h = strchr(uri, '@');
2083 if (strncmp(h, "sip:", 4) == 0)
2085 else if (strncmp(h, "sips:", 5) == 0)
2088 hn = strcspn(h, ":;>");
2090 strncpy(hostname, h, hn); hostname[hn] = '\0';
2093 /* Is "port" present? if not default to 5060 */
2097 port = strtol(h, &h, 10);
2102 /* Got the hostname:port - but maybe there's a "maddr=" to override address? */
2103 maddr = strstr(h, "maddr=");
2106 hn = strspn(maddr, "0123456789.");
2108 strncpy(hostname, maddr, hn); hostname[hn] = '\0';
2111 hp = gethostbyname(hostname);
2113 ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
2116 p->sa.sin_family = AF_INET;
2117 memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr));
2118 p->sa.sin_port = htons(port);
2120 ast_verbose("set_destination: set destination to %s, port %d\n", inet_ntoa(p->sa.sin_addr), port);
2123 static int init_resp(struct sip_request *req, char *resp, struct sip_request *orig)
2125 /* Initialize a response */
2126 if (req->headers || req->len) {
2127 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2130 req->header[req->headers] = req->data + req->len;
2131 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "SIP/2.0 %s\r\n", resp);
2132 req->len += strlen(req->header[req->headers]);
2133 if (req->headers < SIP_MAX_HEADERS)
2136 ast_log(LOG_WARNING, "Out of header space\n");
2140 static int init_req(struct sip_request *req, char *resp, char *recip)
2142 /* Initialize a response */
2143 if (req->headers || req->len) {
2144 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2147 req->header[req->headers] = req->data + req->len;
2148 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "%s %s SIP/2.0\r\n", resp, recip);
2149 req->len += strlen(req->header[req->headers]);
2150 if (req->headers < SIP_MAX_HEADERS)
2153 ast_log(LOG_WARNING, "Out of header space\n");
2157 static int respprep(struct sip_request *resp, struct sip_pvt *p, char *msg, struct sip_request *req)
2159 char newto[256] = "", *ot;
2160 memset(resp, 0, sizeof(*resp));
2161 init_resp(resp, msg, req);
2162 copy_via_headers(p, resp, req, "Via");
2163 if (msg[0] == '2') copy_all_header(resp, req, "Record-Route");
2164 copy_header(resp, req, "From");
2165 ot = get_header(req, "To");
2166 if (!strstr(ot, "tag=")) {
2167 /* Add the proper tag if we don't have it already. If they have specified
2168 their tag, use it. Otherwise, use our own tag */
2169 if (strlen(p->theirtag) && p->outgoing)
2170 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2171 else if (p->tag && !p->outgoing)
2172 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2174 strncpy(newto, ot, sizeof(newto) - 1);
2177 add_header(resp, "To", ot);
2178 copy_header(resp, req, "Call-ID");
2179 copy_header(resp, req, "CSeq");
2180 add_header(resp, "User-Agent", "Asterisk PBX");
2181 add_header(resp, "Allow", ALLOWED_METHODS);
2183 /* For registration responses, we also need expiry and
2187 snprintf(contact, sizeof(contact), "%s;expires=%d", p->our_contact, p->expiry);
2188 snprintf(tmp, sizeof(tmp), "%d", p->expiry);
2189 add_header(resp, "Expires", tmp);
2190 add_header(resp, "Contact", contact);
2192 add_header(resp, "Contact", p->our_contact);
2197 static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int seqno)
2199 struct sip_request *orig = &p->initreq;
2200 char stripped[80] ="";
2206 memset(req, 0, sizeof(struct sip_request));
2213 if (strlen(p->uri)) {
2217 strncpy(stripped, get_header(orig, "To"), sizeof(stripped) - 1);
2219 strncpy(stripped, get_header(orig, "From"), sizeof(stripped) - 1);
2221 c = strchr(stripped, '<');
2233 init_req(req, msg, c);
2235 snprintf(tmp, sizeof(tmp), "%d %s", seqno, msg);
2237 add_header(req, "Via", p->via);
2239 set_destination(p, p->route->hop);
2240 add_route(req, p->route->next);
2243 ot = get_header(orig, "To");
2244 of = get_header(orig, "From");
2246 /* Add tag *unless* this is a CANCEL, in which case we need to send it exactly
2247 as our original request, including tag (or presumably lack thereof) */
2248 if (!strstr(ot, "tag=") && strcasecmp(msg, "CANCEL")) {
2249 /* Add the proper tag if we don't have it already. If they have specified
2250 their tag, use it. Otherwise, use our own tag */
2251 if (p->outgoing && strlen(p->theirtag))
2252 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2253 else if (!p->outgoing)
2254 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2256 snprintf(newto, sizeof(newto), "%s", ot);
2261 add_header(req, "From", of);
2262 add_header(req, "To", ot);
2264 add_header(req, "From", ot);
2265 add_header(req, "To", of);
2267 add_header(req, "Contact", p->our_contact);
2268 copy_header(req, orig, "Call-ID");
2269 add_header(req, "CSeq", tmp);
2271 add_header(req, "User-Agent", "Asterisk PBX");
2275 static int __transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2277 struct sip_request resp;
2279 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2280 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2283 respprep(&resp, p, msg, req);
2284 add_header(&resp, "Content-Length", "0");
2285 add_blank_header(&resp);
2286 return send_response(p, &resp, reliable, seqno);
2289 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req)
2291 return __transmit_response(p, msg, req, 0);
2293 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req)
2295 return __transmit_response(p, msg, req, 1);
2298 static void append_date(struct sip_request *req)
2305 strftime(tmpdat, sizeof(tmpdat), "%a, %d %b %Y %T GMT", &tm);
2306 add_header(req, "Date", tmpdat);
2309 static int transmit_response_with_date(struct sip_pvt *p, char *msg, struct sip_request *req)
2311 struct sip_request resp;
2312 respprep(&resp, p, msg, req);
2314 add_header(&resp, "Content-Length", "0");
2315 add_blank_header(&resp);
2316 return send_response(p, &resp, 0, 0);
2319 static int transmit_response_with_allow(struct sip_pvt *p, char *msg, struct sip_request *req)
2321 struct sip_request resp;
2322 respprep(&resp, p, msg, req);
2323 add_header(&resp, "Accept", "application/sdp");
2324 add_header(&resp, "Content-Length", "0");
2325 add_blank_header(&resp);
2326 return send_response(p, &resp, 0, 0);
2329 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *randdata, int reliable)
2331 struct sip_request resp;
2334 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2335 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2338 snprintf(tmp, sizeof(tmp), "Digest realm=\"asterisk\", nonce=\"%s\"", randdata);
2339 respprep(&resp, p, msg, req);
2340 add_header(&resp, "Proxy-Authenticate", tmp);
2341 add_header(&resp, "Content-Length", "0");
2342 add_blank_header(&resp);
2343 return send_response(p, &resp, reliable, seqno);
2346 static int add_text(struct sip_request *req, char *text)
2348 /* XXX Convert \n's to \r\n's XXX */
2349 int len = strlen(text);
2351 snprintf(clen, sizeof(clen), "%d", len);
2352 add_header(req, "Content-Type", "text/plain");
2353 add_header(req, "Content-Length", clen);
2354 add_line(req, text);
2358 static int add_digit(struct sip_request *req, char digit)
2363 snprintf(tmp, sizeof(tmp), "Signal=%c\r\nDuration=250\r\n", digit);
2365 snprintf(clen, sizeof(clen), "%d", len);
2366 add_header(req, "Content-Type", "application/dtmf-relay");
2367 add_header(req, "Content-Length", clen);
2372 static int add_sdp(struct sip_request *resp, struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2376 int alreadysent = 0;
2378 struct sockaddr_in sin;
2379 struct sockaddr_in vsin;
2380 struct sip_codec_pref *cur;
2391 struct sockaddr_in dest;
2392 struct sockaddr_in vdest;
2393 /* XXX We break with the "recommendation" and send our IP, in order that our
2394 peer doesn't have to gethostbyname() us XXX */
2397 ast_log(LOG_WARNING, "No way to add SDP without an RTP structure\n");
2400 ast_rtp_get_us(p->rtp, &sin);
2402 ast_rtp_get_us(p->vrtp, &vsin);
2404 if (p->redirip.sin_addr.s_addr) {
2405 dest.sin_port = p->redirip.sin_port;
2406 dest.sin_addr = p->redirip.sin_addr;
2408 ast_rtp_get_peer(rtp, &dest);
2410 dest.sin_addr = p->ourip;
2411 dest.sin_port = sin.sin_port;
2414 /* Determine video destination */
2416 if (p->vredirip.sin_addr.s_addr) {
2417 vdest.sin_port = p->vredirip.sin_port;
2418 vdest.sin_addr = p->vredirip.sin_addr;
2420 ast_rtp_get_peer(vrtp, &vdest);
2422 vdest.sin_addr = p->ourip;
2423 vdest.sin_port = vsin.sin_port;
2427 ast_verbose("We're at %s port %d\n", inet_ntoa(p->ourip), ntohs(sin.sin_port));
2428 if (sipdebug && p->vrtp)
2429 ast_verbose("Video is at %s port %d\n", inet_ntoa(p->ourip), ntohs(vsin.sin_port));
2430 snprintf(v, sizeof(v), "v=0\r\n");
2431 snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", getpid(), getpid(), inet_ntoa(dest.sin_addr));
2432 snprintf(s, sizeof(s), "s=session\r\n");
2433 snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", inet_ntoa(dest.sin_addr));
2434 snprintf(t, sizeof(t), "t=0 0\r\n");
2435 snprintf(m, sizeof(m), "m=audio %d RTP/AVP", ntohs(dest.sin_port));
2436 snprintf(m2, sizeof(m2), "m=video %d RTP/AVP", ntohs(vdest.sin_port));
2437 /* Start by sending our preferred codecs */
2440 if (p->jointcapability & cur->codec) {
2442 ast_verbose("Answering with preferred capability %d\n", cur->codec);
2443 codec = ast_rtp_lookup_code(p->rtp, 1, cur->codec);
2445 snprintf(costr, sizeof(costr), " %d", codec);
2446 if (cur->codec < AST_FORMAT_MAX_AUDIO) {
2448 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2452 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2457 alreadysent |= cur->codec;
2460 /* Now send any other common codecs, and non-codec formats: */
2461 for (x = 1; x <= AST_FORMAT_MAX_AUDIO; x <<= 1) {
2462 if ((p->jointcapability & x) && !(alreadysent & x)) {
2464 ast_verbose("Answering with capability %d\n", x);
2465 codec = ast_rtp_lookup_code(p->rtp, 1, x);
2467 snprintf(costr, sizeof(costr), " %d", codec);
2468 if (x < AST_FORMAT_MAX_AUDIO) {
2470 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2474 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2480 for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
2481 if (p->noncodeccapability & x) {
2483 ast_verbose("Answering with non-codec capability %d\n", x);
2484 codec = ast_rtp_lookup_code(p->rtp, 0, x);
2486 snprintf(costr, sizeof(costr), " %d", codec);
2488 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(0, x));
2490 if (x == AST_RTP_DTMF) {
2491 /* Indicate we support DTMF... Not sure about 16, but MSN supports it so dang it, we will too... */
2492 snprintf(costr, sizeof costr, "a=fmtp:%d 0-16\r\n",
2501 len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m) + strlen(a);
2503 len += strlen(m2) + strlen(a2);
2504 snprintf(costr, sizeof(costr), "%d", len);
2505 add_header(resp, "Content-Type", "application/sdp");
2506 add_header(resp, "Content-Length", costr);
2521 static void copy_request(struct sip_request *dst,struct sip_request *src)
2525 offset = ((void *)dst) - ((void *)src);
2526 /* First copy stuff */
2527 memcpy(dst, src, sizeof(*dst));
2528 /* Now fix pointer arithmetic */
2529 for (x=0;x<src->headers;x++)
2530 dst->header[x] += offset;
2531 for (x=0;x<src->lines;x++)
2532 dst->line[x] += offset;
2535 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans)
2537 struct sip_request resp;
2539 if (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1) {
2540 ast_log(LOG_WARNING, "Unable to get seqno from '%s'\n", get_header(req, "CSeq"));
2543 respprep(&resp, p, msg, req);
2544 add_sdp(&resp, p, NULL, NULL);
2545 return send_response(p, &resp, retrans, seqno);
2548 static int determine_firstline_parts( struct sip_request *req ) {
2553 cmd= req->header[0];
2554 while(*cmd && (*cmd < 33)) {
2561 while(*e && (*e > 32)) {
2564 /* Get the command */
2570 while( *e && ( *e < 33 ) ) {
2577 if ( !strcasecmp(cmd, "SIP/2.0") ) {
2578 /* We have a response */
2580 len= strlen( req->rlPart2 );
2581 if( len < 2 ) { return -1; }
2583 while( *e && *e<33 ) {
2588 /* We have a request */
2591 if( !*e ) { return -1; }
2594 if( ( e= strrchr( req->rlPart2, 'S' ) ) == NULL ) {
2597 while( isspace( *(--e) ) ) {}
2607 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2609 struct sip_request req;
2610 if (p->canreinvite == REINVITE_UPDATE)
2611 reqprep(&req, p, "UPDATE", 0);
2613 reqprep(&req, p, "INVITE", 0);
2614 add_header(&req, "Allow", ALLOWED_METHODS);
2615 add_sdp(&req, p, rtp, vrtp);
2616 /* Use this as the basis */
2617 copy_request(&p->initreq, &req);
2619 determine_firstline_parts(&p->initreq);
2620 p->lastinvite = p->ocseq;
2622 return send_request(p, &req, 1, p->ocseq);
2625 static void extract_uri(struct sip_pvt *p, struct sip_request *req)
2627 char stripped[256]="";
2629 strncpy(stripped, get_header(req, "Contact"), sizeof(stripped) - 1);
2630 c = strchr(stripped, '<');
2642 strncpy(p->uri, c, sizeof(p->uri) - 1);
2645 static void build_contact(struct sip_pvt *p)
2647 /* Construct Contact: header */
2648 if (ourport != 5060)
2649 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s:%d>", p->exten, inet_ntoa(p->ourip), ourport);
2651 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s>", p->exten, inet_ntoa(p->ourip));
2654 static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, char *vxml_url)
2661 char *l = callerid, *n=NULL;
2662 if (p->owner && p->owner->callerid) {
2663 strcpy(cid, p->owner->callerid);
2664 ast_callerid_parse(cid, &n, &l);
2666 ast_shrink_phone_number(l);
2667 if (!l || !ast_isphonenumber(l))
2670 /* if user want's his callerid restricted */
2672 l = CALLERID_UNKNOWN;
2673 if (!n || !strlen(n))
2675 /* Allow user to be overridden */
2676 if (strlen(p->fromuser))
2679 if ((ourport != 5060) && !strlen(p->fromdomain))
2680 snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s:%d>;tag=as%08x", n, l, strlen(p->fromdomain) ? p->fromdomain : inet_ntoa(p->ourip), ourport, p->tag);
2682 snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=as%08x", n, l, strlen(p->fromdomain) ? p->fromdomain : inet_ntoa(p->ourip), p->tag);
2684 if (strlen(p->username)) {
2685 if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2686 snprintf(invite, sizeof(invite), "sip:%s@%s:%d",p->username, p->tohost, ntohs(p->sa.sin_port));
2688 snprintf(invite, sizeof(invite), "sip:%s@%s",p->username, p->tohost);
2690 } else if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2691 snprintf(invite, sizeof(invite), "sip:%s:%d", p->tohost, ntohs(p->sa.sin_port));
2693 snprintf(invite, sizeof(invite), "sip:%s", p->tohost);
2695 strncpy(p->uri, invite, sizeof(p->uri) - 1);
2696 /* If there is a VXML URL append it to the SIP URL */
2699 snprintf(to, sizeof(to), "<%s>;%s", invite, vxml_url);
2703 snprintf(to, sizeof(to), "<%s>", invite );
2705 memset(req, 0, sizeof(struct sip_request));
2706 init_req(req, cmd, invite);
2707 snprintf(tmp, sizeof(tmp), "%d %s", ++p->ocseq, cmd);
2709 add_header(req, "Via", p->via);
2710 /* SLD: FIXME?: do Route: here too? I think not cos this is the first request.
2711 * OTOH, then we won't have anything in p->route anyway */
2712 add_header(req, "From", from);
2713 strncpy(p->exten, l, sizeof(p->exten) - 1);
2715 add_header(req, "To", to);
2716 add_header(req, "Contact", p->our_contact);
2717 add_header(req, "Call-ID", p->callid);
2718 add_header(req, "CSeq", tmp);
2719 add_header(req, "User-Agent", "Asterisk PBX");
2722 static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, char *vxml_url, char *distinctive_ring, int init)
2724 struct sip_request req;
2727 initreqprep(&req, p, cmd, vxml_url);
2729 reqprep(&req, p, cmd, 0);
2732 add_header(&req, "Proxy-Authorization", auth);
2734 if (distinctive_ring)
2736 add_header(&req, "Alert-info",distinctive_ring);
2738 add_header(&req, "Allow", ALLOWED_METHODS);
2740 add_sdp(&req, p, NULL, NULL);
2742 add_header(&req, "Content-Length", "0");
2743 add_blank_header(&req);
2746 if (!p->initreq.headers) {
2747 /* Use this as the basis */
2748 copy_request(&p->initreq, &req);
2750 determine_firstline_parts(&p->initreq);
2752 p->lastinvite = p->ocseq;
2753 return send_request(p, &req, 1, p->ocseq);
2756 static int transmit_state_notify(struct sip_pvt *p, int state, int full)
2759 char from[256], to[256];
2762 struct sip_request req;
2765 strncpy(from, get_header(&p->initreq, "From"), sizeof(from)-1);
2767 c = ditch_braces(from);
2768 if (strncmp(c, "sip:", 4)) {
2769 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
2772 if ((a = strchr(c, ';'))) {
2777 reqprep(&req, p, "NOTIFY", 0);
2779 if (p->subscribed == 1) {
2780 strncpy(to, get_header(&p->initreq, "To"), sizeof(to)-1);
2782 c = ditch_braces(to);
2783 if (strncmp(c, "sip:", 4)) {
2784 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
2787 if ((a = strchr(c, ';'))) {
2792 add_header(&req, "Content-Type", "application/xpidf+xml");
2794 if ((state==AST_EXTENSION_UNAVAILABLE) || (state==AST_EXTENSION_BUSY))
2796 else if (state==AST_EXTENSION_INUSE)
2802 sprintf(t, "<?xml version=\"1.0\"?>\n");
2803 t = tmp + strlen(tmp);
2804 sprintf(t, "<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n");
2805 t = tmp + strlen(tmp);
2806 sprintf(t, "<presence>\n");
2807 t = tmp + strlen(tmp);
2808 sprintf(t, "<presentity uri=\"%s;method=SUBSCRIBE\" />\n", mfrom);
2809 t = tmp + strlen(tmp);
2810 sprintf(t, "<atom id=\"%s\">\n", p->exten);
2811 t = tmp + strlen(tmp);
2812 sprintf(t, "<address uri=\"%s;user=ip\" priority=\"0,800000\">\n", mto);
2813 t = tmp + strlen(tmp);
2814 sprintf(t, "<status status=\"%s\" />\n", !state ? "open" : (state==1) ? "inuse" : "closed");
2815 t = tmp + strlen(tmp);
2816 sprintf(t, "<msnsubstatus substatus=\"%s\" />\n", !state ? "online" : (state==1) ? "onthephone" : "offline");
2817 t = tmp + strlen(tmp);
2818 sprintf(t, "</address>\n</atom>\n</presence>\n");
2820 add_header(&req, "Event", "dialog");
2821 add_header(&req, "Content-Type", "application/dialog-info+xml");
2824 sprintf(t, "<?xml version=\"1.0\"?>\n");
2825 t = tmp + strlen(tmp);
2826 sprintf(t, "<dialog-info xmlns=\"urn:ietf:params:xml:ns:dialog-info\" version=\"%d\" state=\"%s\" entity=\"%s\">\n", p->dialogver++, full ? "full":"partial", mfrom);
2827 t = tmp + strlen(tmp);
2828 sprintf(t, "<dialog id=\"%s\">\n", p->exten);
2829 t = tmp + strlen(tmp);
2830 sprintf(t, "<state>%s</state>\n", state ? "confirmed" : "terminated");
2831 t = tmp + strlen(tmp);
2832 sprintf(t, "</dialog>\n</dialog-info>\n");
2835 snprintf(clen, sizeof(clen), "%d", strlen(tmp));
2836 add_header(&req, "Content-Length", clen);
2837 add_line(&req, tmp);
2839 return send_request(p, &req, 1, p->ocseq);
2842 static int transmit_notify(struct sip_pvt *p, int newmsgs, int oldmsgs)
2844 struct sip_request req;
2848 initreqprep(&req, p, "NOTIFY", NULL);
2849 add_header(&req, "Event", "message-summary");
2850 add_header(&req, "Content-Type", notifymime);
2852 snprintf(tmp, sizeof(tmp), "Messages-Waiting: %s\n", newmsgs ? "yes" : "no");
2853 snprintf(tmp2, sizeof(tmp2), "Voicemail: %d/%d\n", newmsgs, oldmsgs);
2854 snprintf(clen, sizeof(clen), "%d", strlen(tmp) + strlen(tmp2));
2855 add_header(&req, "Content-Length", clen);
2856 add_line(&req, tmp);
2857 add_line(&req, tmp2);
2859 if (!p->initreq.headers) {
2860 /* Use this as the basis */
2861 copy_request(&p->initreq, &req);
2863 determine_firstline_parts(&p->initreq);
2866 return send_request(p, &req, 1, p->ocseq);
2869 static int transmit_register(struct sip_registry *r, char *cmd, char *auth, char *authheader);
2871 static int sip_reregister(void *data)
2873 /* if we are here, we know that we need to reregister. */
2874 struct sip_registry *r=(struct sip_registry *)data;
2881 static int sip_do_register(struct sip_registry *r)
2884 ast_mutex_lock(&r->lock);
2885 res=transmit_register(r, "REGISTER", NULL, NULL);
2886 ast_mutex_unlock(&r->lock);
2890 static int sip_reg_timeout(void *data)
2892 /* if we are here, our registration timed out, so we'll just do it over */
2893 struct sip_registry *r=data;
2896 ast_mutex_lock(&r->lock);
2897 ast_log(LOG_NOTICE, "Registration for '%s@%s' timed out, trying again\n", r->username, inet_ntoa(r->addr.sin_addr));
2899 /* Unlink us, destroy old call. Locking is not relevent here because all this happens
2900 in the single SIP manager thread. */
2906 r->regstate=REG_STATE_UNREGISTERED;
2908 res=transmit_register(r, "REGISTER", NULL, NULL);
2909 ast_mutex_unlock(&r->lock);
2913 static int transmit_register(struct sip_registry *r, char *cmd, char *auth, char *authheader)
2915 struct sip_request req;
2922 /* exit if we are already in process with this registrar ?*/
2923 if ( r == NULL || ((auth==NULL) && (r->regstate==REG_STATE_REGSENT || r->regstate==REG_STATE_AUTHSENT))) {
2924 ast_log(LOG_NOTICE, "Strange, trying to register when registration already pending\n");
2930 ast_log(LOG_WARNING, "Already have a call??\n");
2935 if (!r->callid_valid) {
2936 build_callid(r->callid, sizeof(r->callid), __ourip);
2937 r->callid_valid = 1;
2939 p=sip_alloc( r->callid, &r->addr, 0);
2941 ast_log(LOG_WARNING, "Unable to allocate registration call\n");
2947 strncpy(p->peersecret, r->secret, sizeof(p->peersecret)-1);
2948 strncpy(p->peermd5secret, r->md5secret, sizeof(p->peermd5secret)-1);
2949 if (strlen(r->authuser))
2950 strncpy(p->peername, r->authuser, sizeof(p->peername)-1);
2952 strncpy(p->peername, r->username, sizeof(p->peername)-1);
2953 strncpy(p->username, r->username, sizeof(p->username)-1);
2954 strncpy(p->exten, r->contact, sizeof(p->exten) - 1);
2955 /* Always bind to our IP if specified */
2956 if (bindaddr.sin_addr.s_addr)
2957 memcpy(&p->ourip, &bindaddr.sin_addr, sizeof(p->ourip));
2961 /* set up a timeout */
2963 if (r->timeout > -1) {
2964 ast_log(LOG_WARNING, "Still have a timeout, %d\n", r->timeout);
2965 ast_sched_del(sched, r->timeout);
2967 r->timeout = ast_sched_add(sched, 20*1000, sip_reg_timeout, r);
2968 ast_log(LOG_DEBUG, "Scheduled a timeout # %d\n", r->timeout);
2971 if (strchr(r->username, '@')) {
2972 snprintf(from, sizeof(from), "<sip:%s>;tag=as%08x", r->username, p->tag);
2973 snprintf(to, sizeof(to), "<sip:%s>", r->username);
2975 snprintf(from, sizeof(from), "<sip:%s@%s>;tag=as%08x", r->username, r->hostname, p->tag);
2976 snprintf(to, sizeof(to), "<sip:%s@%s>", r->username, r->hostname);
2979 snprintf(addr, sizeof(addr), "sip:%s", r->hostname);
2980 strncpy(p->uri, addr, sizeof(p->uri) - 1);
2982 memset(&req, 0, sizeof(req));
2983 init_req(&req, cmd, addr);
2985 snprintf(tmp, sizeof(tmp), "%u %s", ++r->ocseq, cmd);
2986 p->ocseq = r->ocseq;
2988 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
2989 snprintf(via, sizeof(via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
2990 add_header(&req, "Via", via);
2991 add_header(&req, "From", from);
2992 add_header(&req, "To", to);
2993 add_header(&req, "Call-ID", p->callid);
2994 add_header(&req, "CSeq", tmp);
2995 add_header(&req, "User-Agent", "Asterisk PBX");
2997 add_header(&req, authheader, auth);
2999 snprintf(tmp, sizeof(tmp), "%d", default_expiry);
3000 add_header(&req, "Expires", tmp);
3001 add_header(&req, "Contact", p->our_contact);
3002 add_header(&req, "Event", "registration");
3003 add_header(&req, "Content-length", "0");
3004 add_blank_header(&req);
3005 copy_request(&p->initreq, &req);
3007 determine_firstline_parts(&p->initreq);
3008 r->regstate=auth?REG_STATE_AUTHSENT:REG_STATE_REGSENT;
3009 return send_request(p, &req, 1, p->ocseq);
3012 static int transmit_message_with_text(struct sip_pvt *p, char *text)
3014 struct sip_request req;
3015 reqprep(&req, p, "MESSAGE", 0);
3016 add_text(&req, text);
3017 return send_request(p, &req, 1, p->ocseq);
3020 static int transmit_refer(struct sip_pvt *p, char *dest)
3022 struct sip_request req;
3027 of = get_header(&p->initreq, "To");
3029 of = get_header(&p->initreq, "From");
3030 strncpy(from, of, sizeof(from) - 1);
3031 of = ditch_braces(from);
3032 strncpy(p->from,of,sizeof(p->from) - 1);
3033 if (strncmp(of, "sip:", 4)) {
3034 ast_log(LOG_NOTICE, "From address missing 'sip:', using it anyway\n");
3037 /* Get just the username part */
3038 if ((c = strchr(of, '@'))) {
3043 snprintf(referto, sizeof(referto), "<sip:%s@%s>", dest, c);
3045 snprintf(referto, sizeof(referto), "<sip:%s>", dest);
3048 reqprep(&req, p, "REFER", 0);
3049 add_header(&req, "Refer-To", referto);
3050 add_header(&req, "Referred-By", callerid);
3051 return send_request(p, &req, 1, p->ocseq);
3054 static int transmit_info_with_digit(struct sip_pvt *p, char digit)
3056 struct sip_request req;
3057 reqprep(&req, p, "INFO", 0);
3058 add_digit(&req, digit);
3059 return send_request(p, &req, 1, p->ocseq);
3062 static int transmit_request(struct sip_pvt *p, char *msg, int seqno, int reliable)
3064 struct sip_request resp;
3065 reqprep(&resp, p, msg, seqno);
3066 add_header(&resp, "Content-Length", "0");
3067 add_blank_header(&resp);
3068 return send_request(p, &resp, reliable, seqno ? seqno : p->ocseq);
3071 static int transmit_request_with_auth(struct sip_pvt *p, char *msg, int seqno, int reliable)
3073 struct sip_request resp;
3074 reqprep(&resp, p, msg, seqno);
3078 memset(digest,0,sizeof(digest));
3079 build_reply_digest(p, msg, digest, sizeof(digest));
3080 add_header(&resp, "Proxy-Authorization", digest);
3083 add_header(&resp, "Content-Length", "0");
3084 add_blank_header(&resp);
3085 return send_request(p, &resp, reliable, seqno ? seqno : p->ocseq);
3088 static int expire_register(void *data)
3090 struct sip_peer *p = data;
3091 memset(&p->addr, 0, sizeof(p->addr));
3092 ast_db_del("SIP/Registry", p->name);
3094 ast_device_state_changed("SIP/%s", p->name);
3098 static int sip_poke_peer(struct sip_peer *peer);
3100 static void reg_source_db(struct sip_peer *p)
3106 if (!ast_db_get("SIP/Registry", p->name, data, sizeof(data))) {
3107 c = strchr(data, ':');