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>
53 #include <sys/signal.h>
54 #include <netinet/in_systm.h>
55 #include <netinet/ip.h>
58 #include <mysql/mysql.h>
62 #define IPTOS_MINCOST 0x02
65 /* #define VOCAL_DATA_HACK */
68 #define DEFAULT_DEFAULT_EXPIRY 120
69 #define DEFAULT_MAX_EXPIRY 3600
70 #define EXPIRY_GUARD_SECS 15
72 #define CALLERID_UNKNOWN "Unknown"
74 #define SIP_DTMF_RFC2833 (1 << 0)
75 #define SIP_DTMF_INBAND (1 << 1)
76 #define SIP_DTMF_INFO (1 << 2)
78 static int max_expiry = DEFAULT_MAX_EXPIRY;
79 static int default_expiry = DEFAULT_DEFAULT_EXPIRY;
81 #define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
82 #define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
83 #define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
85 #define DEFAULT_RETRANS 1000 /* How frequently to retransmit */
86 #define MAX_RETRANS 5 /* Try only 5 times for retransmissions */
89 static ast_mutex_t mysqllock = AST_MUTEX_INITIALIZER;
91 static char mydbuser[80];
92 static char mydbpass[80];
93 static char mydbhost[80];
94 static char mydbname[80];
97 static char *desc = "Session Initiation Protocol (SIP)";
98 static char *type = "SIP";
99 static char *tdesc = "Session Initiation Protocol (SIP)";
100 static char *config = "sip.conf";
102 #define DEFAULT_SIP_PORT 5060 /* From RFC 2543 */
103 #define SIP_MAX_PACKET 1500 /* Also from RFC 2543, should sub headers tho */
105 #define ALLOWED_METHODS "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER"
107 static char context[AST_MAX_EXTENSION] = "default";
109 static char language[MAX_LANGUAGE] = "";
111 static char callerid[AST_MAX_EXTENSION] = "asterisk";
113 static char fromdomain[AST_MAX_EXTENSION] = "";
115 static char notifymime[AST_MAX_EXTENSION] = "application/simple-message-summary";
117 static int srvlookup = 0;
119 static int pedanticsipchecking = 0;
121 static int autocreatepeer = 0;
123 static int usecnt =0;
124 static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
126 /* Protect the interface list (of sip_pvt's) */
127 static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
129 /* Protect the monitoring thread, so only one process can kill or start it, and not
130 when it's doing something critical. */
131 static ast_mutex_t netlock = AST_MUTEX_INITIALIZER;
133 static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
135 /* This is the thread for the monitor which checks for input on the channels
136 which are not currently in use. */
137 static pthread_t monitor_thread = 0;
139 static int restart_monitor(void);
141 /* Codecs that we support by default: */
142 static int capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263;
143 static int noncodeccapability = AST_RTP_DTMF;
145 static char ourhost[256];
146 static struct in_addr __ourip;
149 static int sipdebug = 0;
153 static int videosupport = 0;
155 static int globaldtmfmode = SIP_DTMF_RFC2833;
158 static int expiry = 900;
160 static struct sched_context *sched;
161 static struct io_context *io;
162 /* The private structures of the sip channels are linked for
163 selecting outgoing channels */
165 #define SIP_MAX_HEADERS 64
166 #define SIP_MAX_LINES 64
170 #define DEC_OUT_USE 2
171 #define INC_OUT_USE 3
173 static struct sip_codec_pref {
175 struct sip_codec_pref *next;
179 char *rlPart1; /* SIP Method Name or "SIP/2.0" protocol version */
180 char *rlPart2; /* The Request URI or Response Status */
182 int headers; /* SIP Headers */
183 char *header[SIP_MAX_HEADERS];
184 int lines; /* SDP Content */
185 char *line[SIP_MAX_LINES];
186 char data[SIP_MAX_PACKET];
192 struct sip_route *next;
196 static struct sip_pvt {
197 ast_mutex_t lock; /* Channel private lock */
198 char callid[80]; /* Global CallID */
199 char randdata[80]; /* Random data */
200 unsigned int ocseq; /* Current outgoing seqno */
201 unsigned int icseq; /* Current incoming seqno */
202 unsigned int callgroup;
203 unsigned int pickupgroup;
204 int lastinvite; /* Last Cseq of invite */
205 int alreadygone; /* Whether or not we've already been destroyed by or peer */
206 int needdestroy; /* if we need to be destroyed */
207 int capability; /* Special capability */
208 int jointcapability; /* Supported capability at both ends */
209 int noncodeccapability;
210 int outgoing; /* Outgoing or incoming call? */
211 int authtries; /* Times we've tried to authenticate */
212 int insecure; /* Don't check source port/ip */
213 int expiry; /* How long we take to expire */
214 int branch; /* One random number */
215 int canreinvite; /* Do we support reinvite */
216 int ringing; /* Have sent 180 ringing */
217 int progress; /* Have sent 183 message progress */
218 int tag; /* Another random number */
219 int nat; /* Whether to try to support NAT */
220 int sessionid; /* SDP Session ID */
221 int sessionversion; /* SDP Session Version */
222 struct sockaddr_in sa; /* Our peer */
223 struct sockaddr_in redirip; /* Where our RTP should be going if not to us */
224 struct sockaddr_in vredirip; /* Where our Video RTP should be going if not to us */
225 struct sockaddr_in recv; /* Received as */
226 struct in_addr ourip; /* Our IP */
227 struct ast_channel *owner; /* Who owns us */
228 char exten[AST_MAX_EXTENSION]; /* Extention where to start */
229 char refer_to[AST_MAX_EXTENSION]; /* Place to store REFER-TO extension */
230 char referred_by[AST_MAX_EXTENSION];/* Place to store REFERRED-BY extension */
231 char refer_contact[AST_MAX_EXTENSION];/* Place to store Contact info from a REFER extension */
232 struct sip_pvt *refer_call; /* Call we are referring */
233 struct sip_route *route; /* Head of linked list of routing steps (fm Record-Route) */
234 char remote_party_id[256];
236 char context[AST_MAX_EXTENSION];
237 char fromdomain[AST_MAX_EXTENSION]; /* Domain to show in the from field */
238 char fromuser[AST_MAX_EXTENSION]; /* Domain to show in the user field */
239 char tohost[AST_MAX_EXTENSION]; /* Host we should put in the "to" field */
240 char language[MAX_LANGUAGE];
241 char rdnis[256]; /* Referring DNIS */
242 char theirtag[256]; /* Their tag */
245 char uri[256]; /* Original requested URI */
246 char peersecret[256];
247 char peermd5secret[256];
248 char callerid[256]; /* Caller*ID */
249 int restrictcid; /* hide presentation from remote user */
251 char accountcode[20]; /* Account code */
252 char our_contact[256]; /* Our contact header */
253 char realm[256]; /* Authorization realm */
254 char nonce[256]; /* Authorization nonce */
255 char domain[256]; /* Authorization nonce */
256 char lastmsg[256]; /* Last Message sent/received */
257 int amaflags; /* AMA Flags */
258 int pendinginvite; /* Any pending invite */
259 int pendingbye; /* Need to send bye after we ack? */
260 int gotrefer; /* Got a refer? */
261 struct sip_request initreq; /* Initial request */
263 int maxtime; /* Max time for first response */
264 int initid; /* Auto-congest ID if appropriate */
265 int autokillid; /* Auto-kill ID */
274 struct sip_peer *peerpoke; /* If this calls is to poke a peer, which one */
275 struct sip_registry *registry; /* If this is a REGISTER call, to which registry */
276 struct ast_rtp *rtp; /* RTP Session */
277 struct ast_rtp *vrtp; /* Video RTP session */
278 struct sip_pkt *packets; /* Packets scheduled for re-transmission */
279 struct sip_pvt *next;
283 struct sip_pkt *next; /* Next packet */
284 int retrans; /* Retransmission number */
285 int seqno; /* Sequence number */
286 int resp; /* non-zero if this is a response packet (e.g. 200 OK) */
287 struct sip_pvt *owner; /* Owner call */
288 int retransid; /* Retransmission ID */
289 int packetlen; /* Length of packet */
294 /* Users who can access various contexts */
301 char accountcode[20];
302 char language[MAX_LANGUAGE];
303 unsigned int callgroup;
304 unsigned int pickupgroup;
318 struct sip_user *next;
325 char context[80]; /* JK02: peers need context too to allow parking etc */
331 char mailbox[AST_MAX_EXTENSION];
341 unsigned int callgroup;
342 unsigned int pickupgroup;
344 struct sockaddr_in addr;
348 struct sip_pvt *call; /* Call pointer */
349 int pokeexpire; /* When to expire poke */
350 int lastms; /* How long last response took (in ms), or -1 for no response */
351 int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
352 struct timeval ps; /* Ping send time */
354 struct sockaddr_in defaddr;
360 struct sip_peer *next;
363 ast_mutex_t sip_reload_lock = AST_MUTEX_INITIALIZER;
365 #define REG_STATE_UNREGISTERED 0
366 #define REG_STATE_REGSENT 1
367 #define REG_STATE_AUTHSENT 2
368 #define REG_STATE_REGISTERED 3
369 #define REG_STATE_REJECTED 4
370 #define REG_STATE_TIMEOUT 5
371 #define REG_STATE_NOAUTH 6
373 struct sip_registry {
374 ast_mutex_t lock; /* Channel private lock */
375 struct sockaddr_in addr; /* Who we connect to for registration purposes */
376 char username[80]; /* Who we are registering as */
377 char authuser[80]; /* Who we *authenticate* as */
379 char secret[80]; /* Password or key name in []'s */
381 char contact[80]; /* Contact extension */
383 int expire; /* Sched ID of expiration */
384 int timeout; /* sched id of sip_reg_timeout */
385 int refresh; /* How often to refresh */
386 struct sip_pvt *call; /* create a sip_pvt structure for each outbound "registration call" in progress */
388 int callid_valid; /* 0 means we haven't chosen callid for this registry yet. */
389 char callid[80]; /* Global CallID for this registry */
390 unsigned int ocseq; /* Sequence number we got to for REGISTERs for this registry */
391 struct sockaddr_in us; /* Who the server thinks we are */
392 struct sip_registry *next;
395 static struct ast_user_list {
396 struct sip_user *users;
398 } userl = { NULL, AST_MUTEX_INITIALIZER };
400 static struct ast_peer_list {
401 struct sip_peer *peers;
403 } peerl = { NULL, AST_MUTEX_INITIALIZER };
405 static struct ast_register_list {
406 struct sip_registry *registrations;
408 } regl = { NULL, AST_MUTEX_INITIALIZER };
411 #define REINVITE_INVITE 1
412 #define REINVITE_UPDATE 2
414 static int sip_do_register(struct sip_registry *r);
416 static int sipsock = -1;
417 static int globalnat = 0;
418 static int globalcanreinvite = REINVITE_INVITE;
421 static struct sockaddr_in bindaddr;
422 static struct sockaddr_in localnet;
423 static struct sockaddr_in localmask;
424 static struct sockaddr_in externip;
426 static struct ast_frame *sip_read(struct ast_channel *ast);
427 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req);
428 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
429 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *rand, int reliable);
430 static int transmit_request(struct sip_pvt *p, char *msg, int inc, int reliable);
431 static int transmit_request_with_auth(struct sip_pvt *p, char *msg, int inc, int reliable);
432 static int transmit_invite(struct sip_pvt *p, char *msg, int sendsdp, char *auth, char *authheader, char *vxml_url,char *distinctive_ring, int init);
433 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp);
434 static int transmit_info_with_digit(struct sip_pvt *p, char digit);
435 static int transmit_message_with_text(struct sip_pvt *p, char *text);
436 static int transmit_refer(struct sip_pvt *p, char *dest);
437 static struct sip_peer *temp_peer(char *name);
438 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req, char *header, char *respheader, char *msg, int init);
439 // static char *getsipuri(char *header);
440 static void free_old_route(struct sip_route *route);
441 static int build_reply_digest(struct sip_pvt *p, char *orig_header, char *digest, int digest_len);
442 static int find_user(struct sip_pvt *fup, int event);
443 static void prune_peers(void);
445 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
449 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->recv, sizeof(struct sockaddr_in));
451 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->sa, sizeof(struct sockaddr_in));
453 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));
458 static void sip_destroy(struct sip_pvt *p);
460 static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
463 check to see if them is contained in our localnet/mask,
464 if not, use our externip for us, otherwise use the
465 real internal address in bindaddr
467 if (localnet.sin_addr.s_addr && externip.sin_addr.s_addr &&
468 ((htonl(them->s_addr) & htonl(localnet.sin_addr.s_addr)) != htonl(localnet.sin_addr.s_addr)))
469 memcpy(us, &externip.sin_addr, sizeof(struct in_addr));
470 else if (bindaddr.sin_addr.s_addr)
471 memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr));
473 return ast_ouraddrfor(them, us);
477 static int retrans_pkt(void *data)
479 struct sip_pkt *pkt=data;
481 ast_mutex_lock(&pkt->owner->lock);
482 if (pkt->retrans < MAX_RETRANS) {
486 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));
488 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));
490 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
493 ast_log(LOG_WARNING, "Maximum retries exceeded on call %s for seqno %d (%s)\n", pkt->owner->callid, pkt->seqno, pkt->resp ? "Response" : "Request");
495 while(pkt->owner->owner && ast_mutex_trylock(&pkt->owner->owner->lock)) {
496 ast_mutex_unlock(&pkt->owner->lock);
498 ast_mutex_lock(&pkt->owner->lock);
500 if (pkt->owner->owner) {
501 /* XXX Potential deadlocK?? XXX */
502 ast_queue_hangup(pkt->owner->owner, 0);
503 ast_mutex_unlock(&pkt->owner->owner->lock);
505 /* If no owner, destroy now */
506 pkt->owner->needdestroy = 1;
510 ast_mutex_unlock(&pkt->owner->lock);
514 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len)
517 pkt = malloc(sizeof(struct sip_pkt) + len);
520 memset(pkt, 0, sizeof(struct sip_pkt));
521 memcpy(pkt->data, data, len);
522 pkt->packetlen = len;
523 pkt->next = p->packets;
527 /* Schedule retransmission */
528 pkt->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, pkt);
529 pkt->next = p->packets;
531 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
532 if (!strncasecmp(pkt->data, "INVITE", 6)) {
533 /* Note this is a pending invite */
534 p->pendinginvite = seqno;
539 static int __sip_autodestruct(void *data)
541 struct sip_pvt *p = data;
543 ast_log(LOG_DEBUG, "Auto destroying call '%s'\n", p->callid);
545 ast_log(LOG_WARNING, "Autodestruct on call '%s' with owner in place\n", p->callid);
546 ast_queue_hangup(p->owner, 0);
553 static int sip_scheddestroy(struct sip_pvt *p, int ms)
555 if (p->autokillid > -1)
556 ast_sched_del(sched, p->autokillid);
557 p->autokillid = ast_sched_add(sched, ms, __sip_autodestruct, p);
561 static int sip_cancel_destroy(struct sip_pvt *p)
563 if (p->autokillid > -1)
564 ast_sched_del(sched, p->autokillid);
569 static int __sip_ack(struct sip_pvt *p, int seqno, int resp)
571 struct sip_pkt *cur, *prev = NULL;
576 if ((cur->seqno == seqno) && (cur->resp == resp)) {
577 if (!resp && (seqno == p->pendinginvite)) {
578 ast_log(LOG_DEBUG, "Acked pending invite %d\n", p->pendinginvite);
579 p->pendinginvite = 0;
582 /* this is our baby */
584 prev->next = cur->next;
586 p->packets = cur->next;
587 if (cur->retransid > -1)
588 ast_sched_del(sched, cur->retransid);
596 ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
600 static int __sip_semi_ack(struct sip_pvt *p, int seqno, int resp)
606 if ((cur->seqno == seqno) && (cur->resp == resp)) {
607 /* this is our baby */
608 if (cur->retransid > -1)
609 ast_sched_del(sched, cur->retransid);
616 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");
620 static int send_response(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
625 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));
627 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));
630 res = __sip_reliable_xmit(p, seqno, 1, req->data, req->len);
632 res = __sip_xmit(p, req->data, req->len);
638 static int send_request(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
643 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));
645 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));
648 res = __sip_reliable_xmit(p, seqno, 0, req->data, req->len);
650 res = __sip_xmit(p, req->data, req->len);
654 static char *ditch_braces(char *tmp)
658 if ((n = strchr(tmp, '<')) ) {
660 while(*c && *c != '>') c++;
662 ast_log(LOG_WARNING, "No closing brace in '%s'\n", tmp);
671 static int sip_sendtext(struct ast_channel *ast, char *text)
673 struct sip_pvt *p = ast->pvt->pvt;
675 ast_verbose("Sending text %s on %s\n", text, ast->name);
678 if (!text || !strlen(text))
681 ast_verbose("Really sending text %s on %s\n", text, ast->name);
682 transmit_message_with_text(p, text);
688 static void mysql_update_peer(char *peer, struct sockaddr_in *sin)
690 if (mysql && (strlen(peer) < 128)) {
694 name = alloca(strlen(peer) * 2 + 1);
696 mysql_real_escape_string(mysql, name, peer, strlen(peer));
697 snprintf(query, sizeof(query), "UPDATE sipfriends SET ipaddr=\"%s\", port=\"%d\", regseconds=\"%ld\" WHERE name=\"%s\"",
698 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), nowtime, name);
699 ast_mutex_lock(&mysqllock);
700 if (mysql_real_query(mysql, query, strlen(query)))
701 ast_log(LOG_WARNING, "Unable to update database\n");
703 ast_mutex_unlock(&mysqllock);
707 static struct sip_peer *mysql_peer(char *peer, struct sockaddr_in *sin)
712 p = malloc(sizeof(struct sip_peer));
713 memset(p, 0, sizeof(struct sip_peer));
714 if (mysql && (!peer || (strlen(peer) < 128))) {
719 time_t regseconds, nowtime;
724 name = alloca(strlen(peer) * 2 + 1);
725 mysql_real_escape_string(mysql, name, peer, strlen(peer));
728 snprintf(query, sizeof(query), "SELECT * FROM sipfriends WHERE ipaddr=\"%s\" AND port=\"%d\"", inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
730 snprintf(query, sizeof(query), "SELECT * FROM sipfriends WHERE name=\"%s\"", name);
731 ast_mutex_lock(&mysqllock);
732 mysql_query(mysql, query);
733 if ((result = mysql_store_result(mysql))) {
734 if ((rowval = mysql_fetch_row(result))) {
735 numfields = mysql_num_fields(result);
736 fields = mysql_fetch_fields(result);
738 for (x=0;x<numfields;x++) {
740 if (!strcasecmp(fields[x].name, "secret")) {
741 strncpy(p->secret, rowval[x], sizeof(p->secret));
742 } else if (!strcasecmp(fields[x].name, "name")) {
743 strncpy(p->name, rowval[x], sizeof(p->name) - 1);
744 } else if (!strcasecmp(fields[x].name, "context")) {
745 strncpy(p->context, rowval[x], sizeof(p->context) - 1);
746 } else if (!strcasecmp(fields[x].name, "ipaddr")) {
747 inet_aton(rowval[x], &p->addr.sin_addr);
748 } else if (!strcasecmp(fields[x].name, "port")) {
749 if (sscanf(rowval[x], "%i", &port) != 1)
751 p->addr.sin_port = htons(port);
752 } else if (!strcasecmp(fields[x].name, "regseconds")) {
753 if (sscanf(rowval[x], "%li", ®seconds) != 1)
759 if ((nowtime - regseconds) > default_expiry)
760 memset(&p->addr, 0, sizeof(p->addr));
763 ast_mutex_unlock(&mysqllock);
770 p->capability = capability;
772 p->dtmfmode = globaldtmfmode;
780 #endif /* MYSQL_FRIENDS */
782 static int create_addr(struct sip_pvt *r, char *peer)
789 char host[256], *hostn;
791 r->sa.sin_family = AF_INET;
792 ast_mutex_lock(&peerl.lock);
795 if (!strcasecmp(p->name, peer))
801 p = mysql_peer(peer, NULL);
806 r->capability = p->capability;
809 ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", r->nat);
810 ast_rtp_setnat(r->rtp, r->nat);
813 ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", r->nat);
814 ast_rtp_setnat(r->vrtp, r->nat);
816 strncpy(r->peername, p->username, sizeof(r->peername)-1);
817 strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1);
818 strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1);
819 strncpy(r->username, p->username, sizeof(r->username)-1);
820 strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1);
821 if (!strlen(r->tohost)) {
822 if (p->addr.sin_addr.s_addr)
823 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->addr.sin_addr));
825 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->defaddr.sin_addr));
827 if (strlen(p->fromdomain))
828 strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1);
829 if (strlen(p->fromuser))
830 strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1);
831 r->insecure = p->insecure;
832 r->canreinvite = p->canreinvite;
833 r->maxtime = p->maxms;
834 r->callgroup = p->callgroup;
835 r->pickupgroup = p->pickupgroup;
837 r->dtmfmode = p->dtmfmode;
838 if (r->dtmfmode & SIP_DTMF_RFC2833)
839 r->noncodeccapability |= AST_RTP_DTMF;
841 r->noncodeccapability &= ~AST_RTP_DTMF;
843 strncpy(r->context, p->context,sizeof(r->context)-1);
844 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
845 (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) {
846 if (p->addr.sin_addr.s_addr) {
847 r->sa.sin_addr = p->addr.sin_addr;
848 r->sa.sin_port = p->addr.sin_port;
850 r->sa.sin_addr = p->defaddr.sin_addr;
851 r->sa.sin_port = p->defaddr.sin_port;
853 memcpy(&r->recv, &r->sa, sizeof(r->recv));
857 ast_mutex_unlock(&peerl.lock);
859 if ((port=strchr(peer, ':'))) {
867 portno = DEFAULT_SIP_PORT;
872 snprintf(service, sizeof(service), "_sip._udp.%s", peer);
873 ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service);
879 hp = gethostbyname(hostn);
881 strncpy(r->tohost, peer, sizeof(r->tohost) - 1);
882 memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr));
883 r->sa.sin_port = htons(portno);
884 memcpy(&r->recv, &r->sa, sizeof(r->recv));
887 ast_log(LOG_WARNING, "No such host: %s\n", peer);
899 static int auto_congest(void *nothing)
901 struct sip_pvt *p = nothing;
902 ast_mutex_lock(&p->lock);
905 if (!ast_mutex_trylock(&p->owner->lock)) {
906 ast_log(LOG_NOTICE, "Auto-congesting %s\n", p->owner->name);
907 ast_queue_control(p->owner, AST_CONTROL_CONGESTION, 0);
908 ast_mutex_unlock(&p->owner->lock);
911 ast_mutex_unlock(&p->lock);
915 static void sip_prefs_free(void)
917 struct sip_codec_pref *cur, *next;
927 static void sip_pref_remove(int format)
929 struct sip_codec_pref *cur, *prev=NULL;
932 if (cur->codec == format) {
934 prev->next = cur->next;
945 static int sip_pref_append(int format)
947 struct sip_codec_pref *cur, *tmp;
948 sip_pref_remove(format);
949 tmp = (struct sip_codec_pref *)malloc(sizeof(struct sip_codec_pref));
952 memset(tmp, 0, sizeof(struct sip_codec_pref));
964 static int sip_codec_choose(int formats)
966 struct sip_codec_pref *cur;
967 formats &= (AST_FORMAT_MAX_AUDIO - 1);
970 if (formats & cur->codec)
974 return ast_best_codec(formats);
977 static int sip_call(struct ast_channel *ast, char *dest, int timeout)
981 char *vxml_url = NULL;
982 char *distinctive_ring = NULL;
983 struct varshead *headp;
984 struct ast_var_t *current;
987 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
988 ast_log(LOG_WARNING, "sip_call called on %s, neither down nor reserved\n", ast->name);
991 /* Check whether there is vxml_url, distinctive ring variables */
993 headp=&ast->varshead;
994 AST_LIST_TRAVERSE(headp,current,entries) {
995 /* Check whether there is a VXML_URL variable */
996 if (strcasecmp(ast_var_name(current),"VXML_URL")==0)
998 vxml_url = ast_var_value(current);
1001 /* Check whether there is a ALERT_INFO variable */
1002 if (strcasecmp(ast_var_name(current),"ALERT_INFO")==0)
1004 distinctive_ring = ast_var_value(current);
1011 ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
1012 res = find_user(p,INC_OUT_USE);
1014 p->restrictcid = ast->restrictcid;
1015 p->jointcapability = p->capability;
1016 transmit_invite(p, "INVITE", 1, NULL, NULL, vxml_url,distinctive_ring, 1);
1018 /* Initialize auto-congest time */
1019 p->initid = ast_sched_add(sched, p->maxtime * 4, auto_congest, p);
1025 static void __sip_destroy(struct sip_pvt *p, int lockowner)
1027 struct sip_pvt *cur, *prev = NULL;
1030 ast_log(LOG_DEBUG, "Destorying call '%s'\n", p->callid);
1031 if (p->stateid > -1)
1032 ast_extension_state_del(p->stateid, NULL);
1034 ast_sched_del(sched, p->initid);
1035 if (p->autokillid > -1)
1036 ast_sched_del(sched, p->autokillid);
1039 ast_rtp_destroy(p->rtp);
1042 ast_rtp_destroy(p->vrtp);
1045 free_old_route(p->route);
1049 /* Carefully unlink from registry */
1050 struct sip_registry *reg;
1051 ast_mutex_lock(®l.lock);
1052 reg = regl.registrations;
1054 if ((reg == p->registry) && (p->registry->call == p))
1055 p->registry->call=NULL;
1058 ast_mutex_unlock(®l.lock);
1060 /* Unlink us from the owner if we have one */
1063 ast_mutex_lock(&p->owner->lock);
1064 ast_log(LOG_DEBUG, "Detaching from %s\n", p->owner->name);
1065 p->owner->pvt->pvt = NULL;
1067 ast_mutex_unlock(&p->owner->lock);
1073 prev->next = cur->next;
1082 ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
1085 ast_sched_del(sched, p->initid);
1086 while((cp = p->packets)) {
1087 p->packets = p->packets->next;
1088 if (cp->retransid > -1)
1089 ast_sched_del(sched, cp->retransid);
1096 static int find_user(struct sip_pvt *fup, int event)
1098 char name[256] = "";
1100 strncpy(name, fup->username, sizeof(name) - 1);
1101 ast_mutex_lock(&userl.lock);
1104 if (!strcasecmp(u->name, name)) {
1110 ast_log(LOG_DEBUG, "%s is not a local user\n", name);
1111 ast_mutex_unlock(&userl.lock);
1115 /* incoming and outgoing affects the inUse counter */
1118 if ( u->inUse > 0 ) {
1126 if (u->incominglimit > 0 ) {
1127 if (u->inUse >= u->incominglimit) {
1128 ast_log(LOG_ERROR, "Call from user '%s' rejected due to usage limit of %d\n", u->name, u->incominglimit);
1129 ast_mutex_unlock(&userl.lock);
1130 /* inc inUse as well */
1131 if ( event == INC_OUT_USE ) {
1138 ast_log(LOG_DEBUG, "Call from user '%s' is %d out of %d\n", u->name, u->inUse, u->incominglimit);
1140 /* we don't use these anymore
1142 if ( u->outUse > 0 ) {
1149 if ( u->outgoinglimit > 0 ) {
1150 if ( u->outUse >= u->outgoinglimit ) {
1151 ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
1152 ast_mutex_unlock(&userl.lock);
1160 ast_log(LOG_ERROR, "find_user(%s,%d) called with no event!\n",u->name,event);
1162 ast_mutex_unlock(&userl.lock);
1166 static void sip_destroy(struct sip_pvt *p)
1168 ast_mutex_lock(&iflock);
1169 __sip_destroy(p, 1);
1170 ast_mutex_unlock(&iflock);
1173 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req);
1175 static int hangup_sip2cause(int cause)
1180 return AST_CAUSE_BUSY;
1182 return AST_CAUSE_NORMAL;
1188 static char *hangup_cause2sip(int cause)
1192 case AST_CAUSE_BUSY:
1201 static int sip_hangup(struct ast_channel *ast)
1203 struct sip_pvt *p = ast->pvt->pvt;
1205 int needdestroy = 0;
1207 ast_log(LOG_DEBUG, "sip_hangup(%s)\n", ast->name);
1208 if (!ast->pvt->pvt) {
1209 ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
1212 ast_mutex_lock(&p->lock);
1213 if ( p->outgoing ) {
1214 ast_log(LOG_DEBUG, "find_user(%s) - decrement outUse counter\n", p->username);
1215 find_user(p, DEC_OUT_USE);
1217 ast_log(LOG_DEBUG, "find_user(%s) - decrement inUse counter\n", p->username);
1218 find_user(p, DEC_IN_USE);
1220 /* Determine how to disconnect */
1221 if (p->owner != ast) {
1222 ast_log(LOG_WARNING, "Huh? We aren't the owner?\n");
1223 ast_mutex_unlock(&p->lock);
1226 if (!ast || (ast->_state != AST_STATE_UP))
1231 ast_dsp_free(p->vad);
1234 ast->pvt->pvt = NULL;
1236 ast_mutex_lock(&usecnt_lock);
1238 ast_mutex_unlock(&usecnt_lock);
1239 ast_update_use_count();
1242 /* Start the process if it's not already started */
1243 if (!p->alreadygone && strlen(p->initreq.data)) {
1246 transmit_request_with_auth(p, "CANCEL", p->ocseq, 1);
1247 /* Actually don't destroy us yet, wait for the 487 on our original
1248 INVITE, but do set an autodestruct just in case. */
1250 sip_scheddestroy(p, 15000);
1251 if ( p->initid != -1 ) {
1252 /* channel still up - reverse dec of inUse counter
1253 only if the channel is not auto-congested */
1254 if ( p->outgoing ) {
1255 find_user(p, INC_OUT_USE);
1258 find_user(p, INC_IN_USE);
1263 if (ast->hangupcause && ((res = hangup_cause2sip(ast->hangupcause)))) {
1264 transmit_response_reliable(p, res, &p->initreq);
1266 transmit_response_reliable(p, "403 Forbidden", &p->initreq);
1269 if (!p->pendinginvite) {
1271 transmit_request_with_auth(p, "BYE", 0, 1);
1273 /* Note we will need a BYE when this all settles out
1274 but we can't send one while we have "INVITE" outstanding. */
1279 p->needdestroy = needdestroy;
1280 ast_mutex_unlock(&p->lock);
1284 static int sip_answer(struct ast_channel *ast)
1288 struct sip_pvt *p = ast->pvt->pvt;
1291 if (ast->_state != AST_STATE_UP) {
1295 codec=pbx_builtin_getvar_helper(p->owner,"SIP_CODEC");
1297 fmt=ast_getformatbyname(codec);
1299 ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
1300 p->jointcapability=fmt;
1301 } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n",codec);
1304 ast_setstate(ast, AST_STATE_UP);
1306 ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
1307 res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
1312 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
1314 struct sip_pvt *p = ast->pvt->pvt;
1316 if (frame->frametype == AST_FRAME_VOICE) {
1317 if (!(frame->subclass & ast->nativeformats)) {
1318 ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
1319 frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
1323 ast_mutex_lock(&p->lock);
1325 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1326 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1329 res = ast_rtp_write(p->rtp, frame);
1331 ast_mutex_unlock(&p->lock);
1333 } else if (frame->frametype == AST_FRAME_VIDEO) {
1335 ast_mutex_lock(&p->lock);
1337 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1338 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1341 res = ast_rtp_write(p->vrtp, frame);
1343 ast_mutex_unlock(&p->lock);
1345 } else if (frame->frametype == AST_FRAME_IMAGE) {
1348 ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", frame->frametype);
1355 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
1357 struct sip_pvt *p = newchan->pvt->pvt;
1358 ast_mutex_lock(&p->lock);
1359 if (p->owner != oldchan) {
1360 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
1361 ast_mutex_unlock(&p->lock);
1365 ast_mutex_unlock(&p->lock);
1369 static int sip_senddigit(struct ast_channel *ast, char digit)
1371 struct sip_pvt *p = ast->pvt->pvt;
1372 if (p && (p->dtmfmode & SIP_DTMF_INFO)) {
1373 transmit_info_with_digit(p, digit);
1375 if (p && p->rtp && (p->dtmfmode & SIP_DTMF_RFC2833)) {
1376 ast_rtp_senddigit(p->rtp, digit);
1378 /* If in-band DTMF is desired, send that */
1379 if (p->dtmfmode & SIP_DTMF_INBAND)
1384 static int sip_transfer(struct ast_channel *ast, char *dest)
1386 struct sip_pvt *p = ast->pvt->pvt;
1388 res = transmit_refer(p, dest);
1392 static int sip_indicate(struct ast_channel *ast, int condition)
1394 struct sip_pvt *p = ast->pvt->pvt;
1396 case AST_CONTROL_RINGING:
1397 if (ast->_state == AST_STATE_RING) {
1398 if (!p->progress && !p->ringing) {
1399 transmit_response(p, "180 Ringing", &p->initreq);
1403 /* Oops, we've sent progress tones. Let Asterisk do it instead */
1407 case AST_CONTROL_BUSY:
1408 if (ast->_state != AST_STATE_UP) {
1409 transmit_response(p, "486 Busy Here", &p->initreq);
1411 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1415 case AST_CONTROL_CONGESTION:
1416 if (ast->_state != AST_STATE_UP) {
1417 transmit_response(p, "503 Service Unavailable", &p->initreq);
1419 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1423 case AST_CONTROL_PROGRESS:
1424 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1425 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1433 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
1441 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
1443 struct ast_channel *tmp;
1445 tmp = ast_channel_alloc(1);
1447 /* Select our native format based on codec preference until we receive
1448 something from another device to the contrary. */
1449 if (i->jointcapability)
1450 tmp->nativeformats = sip_codec_choose(i->jointcapability);
1451 else if (i->capability)
1452 tmp->nativeformats = sip_codec_choose(i->capability);
1454 tmp->nativeformats = sip_codec_choose(capability);
1455 fmt = ast_best_codec(tmp->nativeformats);
1457 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
1459 if (strchr(i->fromdomain,':'))
1461 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(i));
1465 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(i));
1468 if (i->dtmfmode & SIP_DTMF_INBAND) {
1469 i->vad = ast_dsp_new();
1470 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
1472 tmp->fds[0] = ast_rtp_fd(i->rtp);
1473 tmp->fds[1] = ast_rtcp_fd(i->rtp);
1475 tmp->fds[2] = ast_rtp_fd(i->vrtp);
1476 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
1478 ast_setstate(tmp, state);
1479 if (state == AST_STATE_RING)
1481 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
1482 tmp->writeformat = fmt;
1483 tmp->pvt->rawwriteformat = fmt;
1484 tmp->readformat = fmt;
1485 tmp->pvt->rawreadformat = fmt;
1487 tmp->pvt->send_text = sip_sendtext;
1488 tmp->pvt->call = sip_call;
1489 tmp->pvt->hangup = sip_hangup;
1490 tmp->pvt->answer = sip_answer;
1491 tmp->pvt->read = sip_read;
1492 tmp->pvt->write = sip_write;
1493 tmp->pvt->write_video = sip_write;
1494 tmp->pvt->indicate = sip_indicate;
1495 tmp->pvt->transfer = sip_transfer;
1496 tmp->pvt->fixup = sip_fixup;
1497 tmp->pvt->send_digit = sip_senddigit;
1499 tmp->pvt->bridge = ast_rtp_bridge;
1501 tmp->callgroup = i->callgroup;
1502 tmp->pickupgroup = i->pickupgroup;
1503 tmp->restrictcid = i->restrictcid;
1504 if (strlen(i->accountcode))
1505 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
1507 tmp->amaflags = i->amaflags;
1508 if (strlen(i->language))
1509 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
1511 ast_mutex_lock(&usecnt_lock);
1513 ast_mutex_unlock(&usecnt_lock);
1514 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
1515 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
1516 if (strlen(i->callerid))
1517 tmp->callerid = strdup(i->callerid);
1518 if (strlen(i->rdnis))
1519 tmp->rdnis = strdup(i->rdnis);
1521 if (strlen(i->domain)) {
1522 pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
1525 if (state != AST_STATE_DOWN) {
1526 if (ast_pbx_start(tmp)) {
1527 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
1533 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
1537 static struct cfalias {
1541 { "Content-Type", "c" },
1542 { "Content-Encoding", "e" },
1546 { "Content-Length", "l" },
1552 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
1553 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
1554 char* r = line + nameLen + 1;
1555 while (*r && (*r < 33)) ++r;
1562 static char *get_sdp(struct sip_request *req, char *name) {
1564 int len = strlen(name);
1567 for (x=0; x<req->lines; x++) {
1568 r = get_sdp_by_line(req->line[x], name, len);
1569 if (r[0] != '\0') return r;
1574 static void sdpLineNum_iterator_init(int* iterator) {
1578 static char* get_sdp_iterate(int* iterator,
1579 struct sip_request *req, char *name) {
1580 int len = strlen(name);
1582 while (*iterator < req->lines) {
1583 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
1584 if (r[0] != '\0') return r;
1589 static char *__get_header(struct sip_request *req, char *name, int *start)
1592 int len = strlen(name);
1594 for (x=*start;x<req->headers;x++) {
1595 if (!strncasecmp(req->header[x], name, len) &&
1596 (req->header[x][len] == ':')) {
1597 r = req->header[x] + len + 1;
1598 while(*r && (*r < 33))
1605 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
1606 if (!strcasecmp(aliases[x].fullname, name))
1607 return __get_header(req, aliases[x].shortname, start);
1609 /* Don't return NULL, so get_header is always a valid pointer */
1613 static char *get_header(struct sip_request *req, char *name)
1616 return __get_header(req, name, &start);
1619 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
1621 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
1622 struct ast_frame *f;
1623 static struct ast_frame null_frame = { AST_FRAME_NULL, };
1626 f = ast_rtp_read(p->rtp);
1629 f = ast_rtcp_read(p->rtp);
1632 f = ast_rtp_read(p->vrtp);
1635 f = ast_rtcp_read(p->vrtp);
1640 /* Don't send RFC2833 if we're not supposed to */
1641 if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & SIP_DTMF_RFC2833))
1644 /* We already hold the channel lock */
1645 if (f->frametype == AST_FRAME_VOICE) {
1646 if (f->subclass != p->owner->nativeformats) {
1647 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
1648 p->owner->nativeformats = f->subclass;
1649 ast_set_read_format(p->owner, p->owner->readformat);
1650 ast_set_write_format(p->owner, p->owner->writeformat);
1652 if (p->dtmfmode & SIP_DTMF_INBAND) {
1653 f = ast_dsp_process(p->owner,p->vad,f,0);
1660 static struct ast_frame *sip_read(struct ast_channel *ast)
1662 struct ast_frame *fr;
1663 struct sip_pvt *p = ast->pvt->pvt;
1664 ast_mutex_lock(&p->lock);
1665 fr = sip_rtp_read(ast, p);
1666 ast_mutex_unlock(&p->lock);
1670 static void build_callid(char *callid, int len, struct in_addr ourip)
1677 res = snprintf(callid, len, "%08x", val);
1681 /* It's not important that we really use our right IP here... */
1682 snprintf(callid, len, "@%s", inet_ntoa(ourip));
1685 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobalnat)
1689 p = malloc(sizeof(struct sip_pvt));
1692 /* Keep track of stuff */
1693 memset(p, 0, sizeof(struct sip_pvt));
1697 p->rtp = ast_rtp_new(sched, io, 1, 0);
1699 p->vrtp = ast_rtp_new(sched, io, 1, 0);
1703 /* Start with 101 instead of 1 */
1706 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
1710 ast_rtp_settos(p->rtp, tos);
1712 ast_rtp_settos(p->vrtp, tos);
1713 if (useglobalnat && sin) {
1714 /* Setup NAT structure according to global settings if we have an address */
1716 memcpy(&p->recv, sin, sizeof(p->recv));
1717 ast_rtp_setnat(p->rtp, p->nat);
1719 ast_rtp_setnat(p->vrtp, p->nat);
1721 ast_mutex_init(&p->lock);
1724 memcpy(&p->sa, sin, sizeof(p->sa));
1725 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
1726 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1728 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1730 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
1731 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
1733 build_callid(p->callid, sizeof(p->callid), p->ourip);
1735 strncpy(p->callid, callid, sizeof(p->callid) - 1);
1736 /* Assume reinvite OK and via INVITE */
1737 p->canreinvite = globalcanreinvite;
1738 p->dtmfmode = globaldtmfmode;
1739 p->capability = capability;
1740 if (p->dtmfmode & SIP_DTMF_RFC2833)
1741 p->noncodeccapability |= AST_RTP_DTMF;
1742 strncpy(p->context, context, sizeof(p->context) - 1);
1743 strncpy(p->fromdomain, fromdomain, sizeof(p->fromdomain) - 1);
1745 ast_mutex_lock(&iflock);
1748 ast_mutex_unlock(&iflock);
1750 ast_log(LOG_DEBUG, "Allocating new SIP call for %s\n", callid);
1754 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin)
1762 callid = get_header(req, "Call-ID");
1764 if (pedanticsipchecking) {
1765 /* In principle Call-ID's uniquely identify a call, however some vendors
1766 (i.e. Pingtel) send multiple calls with the same Call-ID and different
1767 tags in order to simplify billing. The RFC does state that we have to
1768 compare tags in addition to the call-id, but this generate substantially
1769 more overhead which is totally unnecessary for the vast majority of sane
1770 SIP implementations, and thus Asterisk does not enable this behavior
1771 by default. Short version: You'll need this option to support conferencing
1773 strncpy(tmp, req->header[0], sizeof(tmp) - 1);
1775 c = strchr(tmp, ' ');
1778 if (!strcasecmp(cmd, "SIP/2.0")) {
1784 strncpy(tmp, get_header(req, "From"), sizeof(tmp) - 1);
1786 strncpy(tmp, get_header(req, "To"), sizeof(tmp) - 1);
1787 tag = strstr(tmp, "tag=");
1790 c = strchr(tag, ';');
1797 if (!strlen(callid)) {
1798 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", inet_ntoa(sin->sin_addr));
1801 ast_mutex_lock(&iflock);
1804 if (!strcmp(p->callid, callid) &&
1805 (!pedanticsipchecking || !tag || !strlen(p->theirtag) || !strcmp(p->theirtag, tag))) {
1806 /* Found the call */
1807 ast_mutex_lock(&p->lock);
1808 ast_mutex_unlock(&iflock);
1813 ast_mutex_unlock(&iflock);
1814 p = sip_alloc(callid, sin, 1);
1816 ast_mutex_lock(&p->lock);
1820 static int sip_register(char *value, int lineno)
1822 struct sip_registry *reg;
1823 char copy[256] = "";
1824 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
1832 strncpy(copy, value, sizeof(copy)-1);
1835 hostname = strrchr(stringp, '@');
1840 if (!username || !strlen(username) || !hostname || !strlen(hostname)) {
1841 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d", lineno);
1845 username = strsep(&stringp, ":");
1847 secret = strsep(&stringp, ":");
1849 authuser = strsep(&stringp, ":");
1852 hostname = strsep(&stringp, "/");
1854 contact = strsep(&stringp, "/");
1855 if (!contact || !strlen(contact))
1858 hostname = strsep(&stringp, ":");
1859 porta = strsep(&stringp, ":");
1861 if (porta && !atoi(porta)) {
1862 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
1865 hp = gethostbyname(hostname);
1867 ast_log(LOG_WARNING, "Host '%s' not found at line %d\n", hostname, lineno);
1870 reg = malloc(sizeof(struct sip_registry));
1872 memset(reg, 0, sizeof(struct sip_registry));
1873 strncpy(reg->contact, contact, sizeof(reg->contact) - 1);
1875 strncpy(reg->username, username, sizeof(reg->username)-1);
1877 strncpy(reg->hostname, hostname, sizeof(reg->hostname)-1);
1879 strncpy(reg->authuser, authuser, sizeof(reg->authuser)-1);
1881 strncpy(reg->secret, secret, sizeof(reg->secret)-1);
1884 reg->refresh = default_expiry;
1885 reg->addr.sin_family = AF_INET;
1886 memcpy(®->addr.sin_addr, hp->h_addr, sizeof(®->addr.sin_addr));
1887 reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT);
1888 reg->callid_valid = 0;
1890 ast_mutex_lock(®l.lock);
1891 reg->next = regl.registrations;
1892 regl.registrations = reg;
1893 ast_mutex_unlock(®l.lock);
1895 ast_log(LOG_ERROR, "Out of memory\n");
1901 static void parse(struct sip_request *req)
1903 /* Divide fields by NULL's */
1908 /* First header starts immediately */
1912 /* We've got a new header */
1916 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
1918 if (!strlen(req->header[f])) {
1919 /* Line by itself means we're now in content */
1923 if (f >= SIP_MAX_HEADERS - 1) {
1924 ast_log(LOG_WARNING, "Too many SIP headers...\n");
1927 req->header[f] = c + 1;
1928 } else if (*c == '\r') {
1929 /* Ignore but eliminate \r's */
1934 /* Check for last header */
1935 if (strlen(req->header[f]))
1938 /* Now we process any mime content */
1943 /* We've got a new line */
1946 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
1948 if (f >= SIP_MAX_LINES - 1) {
1949 ast_log(LOG_WARNING, "Too many SDP lines...\n");
1952 req->line[f] = c + 1;
1953 } else if (*c == '\r') {
1954 /* Ignore and eliminate \r's */
1959 /* Check for last line */
1960 if (strlen(req->line[f]))
1964 ast_verbose("%d headers, %d lines\n", req->headers, req->lines);
1966 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
1969 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
1978 int peercapability, peernoncodeccapability;
1979 int vpeercapability=0, vpeernoncodeccapability=0;
1980 struct sockaddr_in sin;
1988 /* Get codec and RTP info from SDP */
1989 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
1990 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
1993 m = get_sdp(req, "m");
1994 c = get_sdp(req, "c");
1995 if (!strlen(m) || !strlen(c)) {
1996 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
1999 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2000 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
2003 /* XXX This could block for a long time, and block the main thread! XXX */
2004 hp = gethostbyname(host);
2006 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
2009 sdpLineNum_iterator_init(&iterator);
2010 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
2011 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) {
2013 // Scan through the RTP payload types specified in a "m=" line:
2014 ast_rtp_pt_clear(p->rtp);
2016 while(strlen(codecs)) {
2017 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2018 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2022 ast_verbose("Found audio format %s\n", ast_getformatname(codec));
2023 ast_rtp_set_m_type(p->rtp, codec);
2025 /* Skip over any whitespace */
2026 while(*codecs && (*codecs < 33)) codecs++;
2029 if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
2031 // Scan through the RTP payload types specified in a "m=" line:
2032 ast_rtp_pt_clear(p->vrtp);
2034 while(strlen(codecs)) {
2035 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2036 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2040 ast_verbose("Found video format %s\n", ast_getformatname(codec));
2041 ast_rtp_set_m_type(p->vrtp, codec);
2043 /* Skip over any whitespace */
2044 while(*codecs && (*codecs < 33)) codecs++;
2048 sin.sin_family = AF_INET;
2049 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
2050 /* Setup audio port number */
2051 sin.sin_port = htons(portno);
2052 if (p->rtp && sin.sin_port)
2053 ast_rtp_set_peer(p->rtp, &sin);
2054 /* Setup video port number */
2055 sin.sin_port = htons(vportno);
2056 if (p->vrtp && sin.sin_port)
2057 ast_rtp_set_peer(p->vrtp, &sin);
2059 printf("Peer RTP is at port %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
2061 // Next, scan through each "a=rtpmap:" line, noting each
2062 // specified RTP payload type (with corresponding MIME subtype):
2063 sdpLineNum_iterator_init(&iterator);
2064 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
2065 char* mimeSubtype = ast_strdupa(a); // ensures we have enough space
2066 if (!strcasecmp(a, "sendonly")) {
2070 if (!strcasecmp(a, "sendrecv")) {
2073 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
2075 ast_verbose("Found description format %s\n", mimeSubtype);
2076 // Note: should really look at the 'freq' and '#chans' params too
2077 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
2079 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
2082 // Now gather all of the codecs that were asked for:
2083 ast_rtp_get_current_formats(p->rtp,
2084 &peercapability, &peernoncodeccapability);
2086 ast_rtp_get_current_formats(p->vrtp,
2087 &vpeercapability, &vpeernoncodeccapability);
2088 p->jointcapability = p->capability & (peercapability | vpeercapability);
2089 p->noncodeccapability = noncodeccapability & (peernoncodeccapability | vpeernoncodeccapability);
2092 ast_verbose("Capabilities: us - %d, them - %d/%d, combined - %d\n",
2093 p->capability, peercapability, vpeercapability, p->jointcapability);
2094 ast_verbose("Non-codec capabilities: us - %d, them - %d, combined - %d\n",
2095 noncodeccapability, peernoncodeccapability,
2096 p->noncodeccapability);
2098 if (!p->jointcapability) {
2099 ast_log(LOG_WARNING, "No compatible codecs!\n");
2103 if (!(p->owner->nativeformats & p->jointcapability)) {
2104 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);
2105 p->owner->nativeformats = sip_codec_choose(p->jointcapability);
2106 ast_set_read_format(p->owner, p->owner->readformat);
2107 ast_set_write_format(p->owner, p->owner->writeformat);
2109 if (p->owner->bridge) {
2110 /* Turn on/off music on hold if we are holding/unholding */
2111 if (sin.sin_addr.s_addr && !sendonly) {
2112 ast_moh_stop(p->owner->bridge);
2114 ast_moh_start(p->owner->bridge, NULL);
2122 static int add_header(struct sip_request *req, char *var, char *value)
2124 if (req->len >= sizeof(req->data) - 4) {
2125 ast_log(LOG_WARNING, "Out of space, can't add anymore (%s:%s)\n", var, value);
2129 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2132 req->header[req->headers] = req->data + req->len;
2133 snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", var, value);
2134 req->len += strlen(req->header[req->headers]);
2135 if (req->headers < SIP_MAX_HEADERS)
2138 ast_log(LOG_WARNING, "Out of header space\n");
2144 static int add_blank_header(struct sip_request *req)
2146 if (req->len >= sizeof(req->data) - 4) {
2147 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2151 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2154 req->header[req->headers] = req->data + req->len;
2155 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "\r\n");
2156 req->len += strlen(req->header[req->headers]);
2157 if (req->headers < SIP_MAX_HEADERS)
2160 ast_log(LOG_WARNING, "Out of header space\n");
2166 static int add_line(struct sip_request *req, char *line)
2168 if (req->len >= sizeof(req->data) - 4) {
2169 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2173 /* Add extra empty return */
2174 snprintf(req->data + req->len, sizeof(req->data) - req->len, "\r\n");
2175 req->len += strlen(req->data + req->len);
2177 req->line[req->lines] = req->data + req->len;
2178 snprintf(req->line[req->lines], sizeof(req->data) - req->len, "%s", line);
2179 req->len += strlen(req->line[req->lines]);
2180 if (req->lines < SIP_MAX_LINES)
2183 ast_log(LOG_WARNING, "Out of line space\n");
2189 static int copy_header(struct sip_request *req, struct sip_request *orig, char *field)
2192 tmp = get_header(orig, field);
2194 /* Add what we're responding to */
2195 return add_header(req, field, tmp);
2197 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2201 static int copy_all_header(struct sip_request *req, struct sip_request *orig, char *field)
2207 tmp = __get_header(orig, field, &start);
2209 /* Add what we're responding to */
2210 add_header(req, field, tmp);
2215 return copied ? 0 : -1;
2218 static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct sip_request *orig, char *field)
2225 tmp = __get_header(orig, field, &start);
2227 if (!copied && p->nat) {
2228 #ifdef THE_SIP_AUTHORS_CAN_SUCK_MY_GONADS
2229 /* SLD: FIXME: Nice try, but the received= should not have a port */
2230 /* SLD: FIXME: See RFC2543 BNF in Section 6.40.5 */
2231 /* MAS: Yup, RFC says you can't do it. No way to indicate PAT...
2233 if (ntohs(p->recv.sin_port) != DEFAULT_SIP_PORT)
2234 snprintf(new, sizeof(new), "%s;received=%s:%d", tmp, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
2237 snprintf(new, sizeof(new), "%s;received=%s", tmp, inet_ntoa(p->recv.sin_addr));
2238 add_header(req, field, new);
2240 /* Add what we're responding to */
2241 add_header(req, field, tmp);
2248 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2254 /* Add Route: header into request per learned route */
2255 static void add_route(struct sip_request *req, struct sip_route *route)
2258 int n, rem = 255; /* sizeof(r)-1: Room for terminating 0 */
2264 n = strlen(route->hop);
2265 if ((n+3)>rem) break;
2271 strcpy(p, route->hop); p += n;
2274 route = route->next;
2277 add_header(req, "Route", r);
2280 static void set_destination(struct sip_pvt *p, char *uri)
2282 char *h, *maddr, hostname[256];
2286 /* Parse uri to h (host) and port - uri is already just the part inside the <> */
2287 /* general form we are expecting is sip[s]:username[:password]@host[:port][;...] */
2290 ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
2292 /* Find and parse hostname */
2293 h = strchr(uri, '@');
2298 if (strncmp(h, "sip:", 4) == 0)
2300 else if (strncmp(h, "sips:", 5) == 0)
2303 hn = strcspn(h, ":;>");
2305 strncpy(hostname, h, hn); hostname[hn] = '\0';
2308 /* Is "port" present? if not default to 5060 */
2312 port = strtol(h, &h, 10);
2317 /* Got the hostname:port - but maybe there's a "maddr=" to override address? */
2318 maddr = strstr(h, "maddr=");
2321 hn = strspn(maddr, "0123456789.");
2323 strncpy(hostname, maddr, hn); hostname[hn] = '\0';
2326 hp = gethostbyname(hostname);
2328 ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
2331 p->sa.sin_family = AF_INET;
2332 memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr));
2333 p->sa.sin_port = htons(port);
2335 ast_verbose("set_destination: set destination to %s, port %d\n", inet_ntoa(p->sa.sin_addr), port);
2338 static int init_resp(struct sip_request *req, char *resp, struct sip_request *orig)
2340 /* Initialize a response */
2341 if (req->headers || req->len) {
2342 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2345 req->header[req->headers] = req->data + req->len;
2346 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "SIP/2.0 %s\r\n", resp);
2347 req->len += strlen(req->header[req->headers]);
2348 if (req->headers < SIP_MAX_HEADERS)
2351 ast_log(LOG_WARNING, "Out of header space\n");
2355 static int init_req(struct sip_request *req, char *resp, char *recip)
2357 /* Initialize a response */
2358 if (req->headers || req->len) {
2359 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2362 req->header[req->headers] = req->data + req->len;
2363 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "%s %s SIP/2.0\r\n", resp, recip);
2364 req->len += strlen(req->header[req->headers]);
2365 if (req->headers < SIP_MAX_HEADERS)
2368 ast_log(LOG_WARNING, "Out of header space\n");
2372 static int respprep(struct sip_request *resp, struct sip_pvt *p, char *msg, struct sip_request *req)
2374 char newto[256] = "", *ot;
2375 memset(resp, 0, sizeof(*resp));
2376 init_resp(resp, msg, req);
2377 copy_via_headers(p, resp, req, "Via");
2378 if (msg[0] == '2') copy_all_header(resp, req, "Record-Route");
2379 copy_header(resp, req, "From");
2380 ot = get_header(req, "To");
2381 if (!strstr(ot, "tag=")) {
2382 /* Add the proper tag if we don't have it already. If they have specified
2383 their tag, use it. Otherwise, use our own tag */
2384 if (strlen(p->theirtag) && p->outgoing)
2385 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2386 else if (p->tag && !p->outgoing)
2387 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2389 strncpy(newto, ot, sizeof(newto) - 1);
2392 add_header(resp, "To", ot);
2393 copy_header(resp, req, "Call-ID");
2394 copy_header(resp, req, "CSeq");
2395 add_header(resp, "User-Agent", "Asterisk PBX");
2396 add_header(resp, "Allow", ALLOWED_METHODS);
2398 /* For registration responses, we also need expiry and
2402 snprintf(contact, sizeof(contact), "%s;expires=%d", p->our_contact, p->expiry);
2403 snprintf(tmp, sizeof(tmp), "%d", p->expiry);
2404 add_header(resp, "Expires", tmp);
2405 add_header(resp, "Contact", contact);
2407 add_header(resp, "Contact", p->our_contact);
2412 static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int seqno)
2414 struct sip_request *orig = &p->initreq;
2415 char stripped[80] ="";
2421 memset(req, 0, sizeof(struct sip_request));
2423 snprintf(p->lastmsg, sizeof(p->lastmsg), "Tx: %s", msg);
2430 if (strlen(p->uri)) {
2434 strncpy(stripped, get_header(orig, "To"), sizeof(stripped) - 1);
2436 strncpy(stripped, get_header(orig, "From"), sizeof(stripped) - 1);
2438 c = strchr(stripped, '<');
2450 init_req(req, msg, c);
2452 snprintf(tmp, sizeof(tmp), "%d %s", seqno, msg);
2454 add_header(req, "Via", p->via);
2456 set_destination(p, p->route->hop);
2457 add_route(req, p->route->next);
2460 ot = get_header(orig, "To");
2461 of = get_header(orig, "From");
2463 /* Add tag *unless* this is a CANCEL, in which case we need to send it exactly
2464 as our original request, including tag (or presumably lack thereof) */
2465 if (!strstr(ot, "tag=") && strcasecmp(msg, "CANCEL")) {
2466 /* Add the proper tag if we don't have it already. If they have specified
2467 their tag, use it. Otherwise, use our own tag */
2468 if (p->outgoing && strlen(p->theirtag))
2469 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2470 else if (!p->outgoing)
2471 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2473 snprintf(newto, sizeof(newto), "%s", ot);
2478 add_header(req, "From", of);
2479 add_header(req, "To", ot);
2481 add_header(req, "From", ot);
2482 add_header(req, "To", of);
2484 add_header(req, "Contact", p->our_contact);
2485 copy_header(req, orig, "Call-ID");
2486 add_header(req, "CSeq", tmp);
2488 add_header(req, "User-Agent", "Asterisk PBX");
2492 static int __transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2494 struct sip_request resp;
2496 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2497 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2500 respprep(&resp, p, msg, req);
2501 add_header(&resp, "Content-Length", "0");
2502 add_blank_header(&resp);
2503 return send_response(p, &resp, reliable, seqno);
2506 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req)
2508 return __transmit_response(p, msg, req, 0);
2510 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req)
2512 return __transmit_response(p, msg, req, 1);
2515 static void append_date(struct sip_request *req)
2522 strftime(tmpdat, sizeof(tmpdat), "%a, %d %b %Y %T GMT", &tm);
2523 add_header(req, "Date", tmpdat);
2526 static int transmit_response_with_date(struct sip_pvt *p, char *msg, struct sip_request *req)
2528 struct sip_request resp;
2529 respprep(&resp, p, msg, req);
2531 add_header(&resp, "Content-Length", "0");
2532 add_blank_header(&resp);
2533 return send_response(p, &resp, 0, 0);
2536 static int transmit_response_with_allow(struct sip_pvt *p, char *msg, struct sip_request *req)
2538 struct sip_request resp;
2539 respprep(&resp, p, msg, req);
2540 add_header(&resp, "Accept", "application/sdp");
2541 add_header(&resp, "Content-Length", "0");
2542 add_blank_header(&resp);
2543 return send_response(p, &resp, 0, 0);
2546 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *randdata, int reliable)
2548 struct sip_request resp;
2551 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2552 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2555 snprintf(tmp, sizeof(tmp), "Digest realm=\"asterisk\", nonce=\"%s\"", randdata);
2556 respprep(&resp, p, msg, req);
2557 add_header(&resp, "Proxy-Authenticate", tmp);
2558 add_header(&resp, "Content-Length", "0");
2559 add_blank_header(&resp);
2560 return send_response(p, &resp, reliable, seqno);
2563 static int add_text(struct sip_request *req, char *text)
2565 /* XXX Convert \n's to \r\n's XXX */
2566 int len = strlen(text);
2568 snprintf(clen, sizeof(clen), "%d", len);
2569 add_header(req, "Content-Type", "text/plain");
2570 add_header(req, "Content-Length", clen);
2571 add_line(req, text);
2575 static int add_digit(struct sip_request *req, char digit)
2580 snprintf(tmp, sizeof(tmp), "Signal=%c\r\nDuration=250\r\n", digit);
2582 snprintf(clen, sizeof(clen), "%d", len);
2583 add_header(req, "Content-Type", "application/dtmf-relay");
2584 add_header(req, "Content-Length", clen);
2589 static int add_sdp(struct sip_request *resp, struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2593 int alreadysent = 0;
2595 struct sockaddr_in sin;
2596 struct sockaddr_in vsin;
2597 struct sip_codec_pref *cur;
2608 struct sockaddr_in dest;
2609 struct sockaddr_in vdest;
2610 /* XXX We break with the "recommendation" and send our IP, in order that our
2611 peer doesn't have to gethostbyname() us XXX */
2614 ast_log(LOG_WARNING, "No way to add SDP without an RTP structure\n");
2617 if (!p->sessionid) {
2618 p->sessionid = getpid();
2619 p->sessionversion = p->sessionid;
2621 p->sessionversion++;
2622 ast_rtp_get_us(p->rtp, &sin);
2624 ast_rtp_get_us(p->vrtp, &vsin);
2626 if (p->redirip.sin_addr.s_addr) {
2627 dest.sin_port = p->redirip.sin_port;
2628 dest.sin_addr = p->redirip.sin_addr;
2630 ast_rtp_get_peer(rtp, &dest);
2632 dest.sin_addr = p->ourip;
2633 dest.sin_port = sin.sin_port;
2636 /* Determine video destination */
2638 if (p->vredirip.sin_addr.s_addr) {
2639 vdest.sin_port = p->vredirip.sin_port;
2640 vdest.sin_addr = p->vredirip.sin_addr;
2642 ast_rtp_get_peer(vrtp, &vdest);
2644 vdest.sin_addr = p->ourip;
2645 vdest.sin_port = vsin.sin_port;
2649 ast_verbose("We're at %s port %d\n", inet_ntoa(p->ourip), ntohs(sin.sin_port));
2650 if (sipdebug && p->vrtp)
2651 ast_verbose("Video is at %s port %d\n", inet_ntoa(p->ourip), ntohs(vsin.sin_port));
2652 snprintf(v, sizeof(v), "v=0\r\n");
2653 snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, inet_ntoa(dest.sin_addr));
2654 snprintf(s, sizeof(s), "s=session\r\n");
2655 snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", inet_ntoa(dest.sin_addr));
2656 snprintf(t, sizeof(t), "t=0 0\r\n");
2657 snprintf(m, sizeof(m), "m=audio %d RTP/AVP", ntohs(dest.sin_port));
2658 snprintf(m2, sizeof(m2), "m=video %d RTP/AVP", ntohs(vdest.sin_port));
2659 /* Start by sending our preferred codecs */
2662 if (p->jointcapability & cur->codec) {
2664 ast_verbose("Answering with preferred capability %d\n", cur->codec);
2665 codec = ast_rtp_lookup_code(p->rtp, 1, cur->codec);
2667 snprintf(costr, sizeof(costr), " %d", codec);
2668 if (cur->codec < AST_FORMAT_MAX_AUDIO) {
2669 strncat(m, costr, sizeof(m) - strlen(m));
2670 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2671 strncat(a, costr, sizeof(a));
2673 strncat(m2, costr, sizeof(m2) - strlen(m2));
2674 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2675 strncat(a2, costr, sizeof(a2));
2679 alreadysent |= cur->codec;
2682 /* Now send any other common codecs, and non-codec formats: */
2683 for (x = 1; x <= AST_FORMAT_MAX_AUDIO; x <<= 1) {
2684 if ((p->jointcapability & x) && !(alreadysent & x)) {
2686 ast_verbose("Answering with capability %d\n", x);
2687 codec = ast_rtp_lookup_code(p->rtp, 1, x);
2689 snprintf(costr, sizeof(costr), " %d", codec);
2690 if (x < AST_FORMAT_MAX_AUDIO) {
2691 strncat(m, costr, sizeof(m) - strlen(m));
2692 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2693 strncat(a, costr, sizeof(a) - strlen(a));
2695 strncat(m2, costr, sizeof(m2) - strlen(m2));
2696 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2697 strncat(a2, costr, sizeof(a2) - strlen(a2));
2702 for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
2703 if (p->noncodeccapability & x) {
2705 ast_verbose("Answering with non-codec capability %d\n", x);
2706 codec = ast_rtp_lookup_code(p->rtp, 0, x);
2708 snprintf(costr, sizeof(costr), " %d", codec);
2709 strncat(m, costr, sizeof(m) - strlen(m));
2710 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(0, x));
2711 strncat(a, costr, sizeof(a) - strlen(a));
2712 if (x == AST_RTP_DTMF) {
2713 /* Indicate we support DTMF... Not sure about 16, but MSN supports it so dang it, we will too... */
2714 snprintf(costr, sizeof costr, "a=fmtp:%d 0-16\r\n",
2716 strncat(a, costr, sizeof(a) - strlen(a));
2721 if (strlen(m) < sizeof(m) - 2)
2723 if (strlen(m2) < sizeof(m2) - 2)
2725 if ((sizeof(m) <= strlen(m) - 2) || (sizeof(m2) <= strlen(m2) - 2) || (sizeof(a) == strlen(a)) || (sizeof(a2) == strlen(a2)))
2726 ast_log(LOG_WARNING, "SIP SDP may be truncated due to undersized buffer!!\n");
2727 len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m) + strlen(a);
2729 len += strlen(m2) + strlen(a2);
2730 snprintf(costr, sizeof(costr), "%d", len);
2731 add_header(resp, "Content-Type", "application/sdp");
2732 add_header(resp, "Content-Length", costr);
2747 static void copy_request(struct sip_request *dst,struct sip_request *src)
2751 offset = ((void *)dst) - ((void *)src);
2752 /* First copy stuff */
2753 memcpy(dst, src, sizeof(*dst));
2754 /* Now fix pointer arithmetic */
2755 for (x=0;x<src->headers;x++)
2756 dst->header[x] += offset;
2757 for (x=0;x<src->lines;x++)
2758 dst->line[x] += offset;
2761 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans)
2763 struct sip_request resp;
2765 if (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1) {
2766 ast_log(LOG_WARNING, "Unable to get seqno from '%s'\n", get_header(req, "CSeq"));
2769 respprep(&resp, p, msg, req);
2770 add_sdp(&resp, p, NULL, NULL);
2771 return send_response(p, &resp, retrans, seqno);
2774 static int determine_firstline_parts( struct sip_request *req ) {
2779 cmd= req->header[0];
2780 while(*cmd && (*cmd < 33)) {
2787 while(*e && (*e > 32)) {
2790 /* Get the command */
2796 while( *e && ( *e < 33 ) ) {
2803 if ( !strcasecmp(cmd, "SIP/2.0") ) {
2804 /* We have a response */
2806 len= strlen( req->rlPart2 );
2807 if( len < 2 ) { return -1; }
2809 while( *e && *e<33 ) {
2814 /* We have a request */
2817 if( !*e ) { return -1; }
2820 if( ( e= strrchr( req->rlPart2, 'S' ) ) == NULL ) {
2823 while( isspace( *(--e) ) ) {}
2833 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2835 struct sip_request req;
2836 if (p->canreinvite == REINVITE_UPDATE)
2837 reqprep(&req, p, "UPDATE", 0);
2840 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
2841 reqprep(&req, p, "INVITE", 0);
2843 add_header(&req, "Allow", ALLOWED_METHODS);
2844 add_sdp(&req, p, rtp, vrtp);
2845 /* Use this as the basis */
2846 copy_request(&p->initreq, &req);
2848 determine_firstline_parts(&p->initreq);
2849 p->lastinvite = p->ocseq;
2851 return send_request(p, &req, 1, p->ocseq);
2854 static void extract_uri(struct sip_pvt *p, struct sip_request *req)
2856 char stripped[256]="";
2858 strncpy(stripped, get_header(req, "Contact"), sizeof(stripped) - 1);
2859 c = strchr(stripped, '<');
2871 strncpy(p->uri, c, sizeof(p->uri) - 1);
2874 static void build_contact(struct sip_pvt *p)
2876 /* Construct Contact: header */
2877 if (ourport != 5060)
2878 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s:%d>", p->exten, inet_ntoa(p->ourip), ourport);
2880 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s>", p->exten, inet_ntoa(p->ourip));
2883 static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, char *vxml_url)
2890 char *l = callerid, *n=NULL;
2892 snprintf(p->lastmsg, sizeof(p->lastmsg), "Init: %s", cmd);
2894 if (p->owner && p->owner->callerid) {
2895 strcpy(cid, p->owner->callerid);
2896 ast_callerid_parse(cid, &n, &l);
2898 ast_shrink_phone_number(l);
2899 if (!l || !ast_isphonenumber(l))
2902 /* if user want's his callerid restricted */
2904 l = CALLERID_UNKNOWN;
2905 if (!n || !strlen(n))
2907 /* Allow user to be overridden */
2908 if (strlen(p->fromuser))
2911 if ((ourport != 5060) && !strlen(p->fromdomain))
2912 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);
2914 snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=as%08x", n, l, strlen(p->fromdomain) ? p->fromdomain : inet_ntoa(p->ourip), p->tag);
2916 if (strlen(p->username)) {
2917 if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2918 snprintf(invite, sizeof(invite), "sip:%s@%s:%d",p->username, p->tohost, ntohs(p->sa.sin_port));
2920 snprintf(invite, sizeof(invite), "sip:%s@%s",p->username, p->tohost);
2922 } else if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2923 snprintf(invite, sizeof(invite), "sip:%s:%d", p->tohost, ntohs(p->sa.sin_port));
2925 snprintf(invite, sizeof(invite), "sip:%s", p->tohost);
2927 strncpy(p->uri, invite, sizeof(p->uri) - 1);
2928 /* If there is a VXML URL append it to the SIP URL */
2931 snprintf(to, sizeof(to), "<%s>;%s", invite, vxml_url);
2935 snprintf(to, sizeof(to), "<%s>", invite );
2937 memset(req, 0, sizeof(struct sip_request));
2938 init_req(req, cmd, invite);
2939 snprintf(tmp, sizeof(tmp), "%d %s", ++p->ocseq, cmd);
2941 add_header(req, "Via", p->via);
2942 /* SLD: FIXME?: do Route: here too? I think not cos this is the first request.
2943 * OTOH, then we won't have anything in p->route anyway */
2944 add_header(req, "From", from);
2945 strncpy(p->exten, l, sizeof(p->exten) - 1);
2947 add_header(req, "To", to);
2948 add_header(req, "Contact", p->our_contact);
2949 add_header(req, "Call-ID", p->callid);
2950 add_header(req, "CSeq", tmp);
2951 add_header(req, "User-Agent", "Asterisk PBX");
2954 static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, char *authheader, char *vxml_url, char *distinctive_ring, int init)
2956 struct sip_request req;
2959 initreqprep(&req, p, cmd, vxml_url);
2961 reqprep(&req, p, cmd, 0);
2964 add_header(&req, authheader, auth);
2966 if (!strcasecmp(cmd, "REFER")) {
2967 if (strlen(p->refer_to))
2968 add_header(&req, "Refer-To", p->refer_to);
2969 if (strlen(p->referred_by))
2970 add_header(&req, "Referred-By", p->referred_by);
2973 if (distinctive_ring)
2975 add_header(&req, "Alert-info",distinctive_ring);
2977 add_header(&req, "Allow", ALLOWED_METHODS);
2979 add_sdp(&req, p, NULL, NULL);
2981 add_header(&req, "Content-Length", "0");
2982 add_blank_header(&req);
2985 if (!p->initreq.headers) {
2986 /* Use this as the basis */
2987 copy_request(&p->initreq, &req);
2989 determine_firstline_parts(&p->initreq);
2991 p->lastinvite = p->ocseq;
2992 return send_request(p, &req, 1, p->ocseq);
2995 static int transmit_state_notify(struct sip_pvt *p, int state, int full)
2998 char from[256], to[256];
3001 struct sip_request req;
3004 strncpy(from, get_header(&p->initreq, "From"), sizeof(from)-1);
3006 c = ditch_braces(from);
3007 if (strncmp(c, "sip:", 4)) {
3008 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
3011 if ((a = strchr(c, ';'))) {
3016 reqprep(&req, p, "NOTIFY", 0);
3018 if (p->subscribed == 1) {
3019 strncpy(to, get_header(&p->initreq, "To"), sizeof(to)-1);
3021 c = ditch_braces(to);
3022 if (strncmp(c, "sip:", 4)) {
3023 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
3026 if ((a = strchr(c, ';'))) {
3031 add_header(&req, "Content-Type", "application/xpidf+xml");
3033 if ((state==AST_EXTENSION_UNAVAILABLE) || (state==AST_EXTENSION_BUSY))
3035 else if (state==AST_EXTENSION_INUSE)
3041 sprintf(t, "<?xml version=\"1.0\"?>\n");
3042 t = tmp + strlen(tmp);
3043 sprintf(t, "<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n");
3044 t = tmp + strlen(tmp);
3045 sprintf(t, "<presence>\n");
3046 t = tmp + strlen(tmp);
3047 sprintf(t, "<presentity uri=\"%s;method=SUBSCRIBE\" />\n", mfrom);
3048 t = tmp + strlen(tmp);
3049 sprintf(t, "<atom id=\"%s\">\n", p->exten);
3050 t = tmp + strlen(tmp);
3051 sprintf(t, "<address uri=\"%s;user=ip\" priority=\"0,800000\">\n", mto);
3052 t = tmp + strlen(tmp);
3053 sprintf(t, "<status status=\"%s\" />\n", !state ? "open" : (state==1) ? "inuse" : "closed");
3054 t = tmp + strlen(tmp);
3055 sprintf(t, "<msnsubstatus substatus=\"%s\" />\n", !state ? "online" : (state==1) ? "onthephone" : "offline");
3056 t = tmp + strlen(tmp);
3057 sprintf(t, "</address>\n</atom>\n</presence>\n");
3059 add_header(&req, "Event", "dialog");
3060 add_header(&req, "Content-Type", "application/dialog-info+xml");
3063 sprintf(t, "<?xml version=\"1.0\"?>\n");
3064 t = tmp + strlen(tmp);
3065 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);
3066 t = tmp + strlen(tmp);
3067 sprintf(t, "<dialog id=\"%s\">\n", p->exten);
3068 t = tmp + strlen(tmp);
3069 sprintf(t, "<state>%s</state>\n", state ? "confirmed" : "terminated");
3070 t = tmp + strlen(tmp);
3071 sprintf(t, "</dialog>\n</dialog-info>\n");
3073 if (t > tmp + sizeof(tmp))
3074 ast_log(LOG_WARNING, "Buffer overflow detected!! (Please file a&