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 static ast_mutex_t sip_reload_lock = AST_MUTEX_INITIALIZER;
364 static int sip_reloading = 0;
366 #define REG_STATE_UNREGISTERED 0
367 #define REG_STATE_REGSENT 1
368 #define REG_STATE_AUTHSENT 2
369 #define REG_STATE_REGISTERED 3
370 #define REG_STATE_REJECTED 4
371 #define REG_STATE_TIMEOUT 5
372 #define REG_STATE_NOAUTH 6
374 struct sip_registry {
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;
409 } regl = { NULL, AST_MUTEX_INITIALIZER };
412 #define REINVITE_INVITE 1
413 #define REINVITE_UPDATE 2
415 static int __sip_do_register(struct sip_registry *r);
417 static int sipsock = -1;
418 static int globalnat = 0;
419 static int globalcanreinvite = REINVITE_INVITE;
422 static struct sockaddr_in bindaddr;
423 static struct sockaddr_in localnet;
424 static struct sockaddr_in localmask;
425 static struct sockaddr_in externip;
427 static struct ast_frame *sip_read(struct ast_channel *ast);
428 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req);
429 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
430 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *rand, int reliable);
431 static int transmit_request(struct sip_pvt *p, char *msg, int inc, int reliable);
432 static int transmit_request_with_auth(struct sip_pvt *p, char *msg, int inc, int reliable);
433 static int transmit_invite(struct sip_pvt *p, char *msg, int sendsdp, char *auth, char *authheader, char *vxml_url,char *distinctive_ring, int init);
434 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp);
435 static int transmit_info_with_digit(struct sip_pvt *p, char digit);
436 static int transmit_message_with_text(struct sip_pvt *p, char *text);
437 static int transmit_refer(struct sip_pvt *p, char *dest);
438 static struct sip_peer *temp_peer(char *name);
439 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req, char *header, char *respheader, char *msg, int init);
440 // static char *getsipuri(char *header);
441 static void free_old_route(struct sip_route *route);
442 static int build_reply_digest(struct sip_pvt *p, char *orig_header, char *digest, int digest_len);
443 static int find_user(struct sip_pvt *fup, int event);
444 static void prune_peers(void);
445 static int sip_do_reload(void);
447 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
451 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->recv, sizeof(struct sockaddr_in));
453 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->sa, sizeof(struct sockaddr_in));
455 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));
460 static void sip_destroy(struct sip_pvt *p);
462 static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
465 check to see if them is contained in our localnet/mask,
466 if not, use our externip for us, otherwise use the
467 real internal address in bindaddr
469 if (localnet.sin_addr.s_addr && externip.sin_addr.s_addr &&
470 ((htonl(them->s_addr) & htonl(localnet.sin_addr.s_addr)) != htonl(localnet.sin_addr.s_addr)))
471 memcpy(us, &externip.sin_addr, sizeof(struct in_addr));
472 else if (bindaddr.sin_addr.s_addr)
473 memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr));
475 return ast_ouraddrfor(them, us);
479 static int retrans_pkt(void *data)
481 struct sip_pkt *pkt=data;
483 ast_mutex_lock(&pkt->owner->lock);
484 if (pkt->retrans < MAX_RETRANS) {
488 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));
490 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));
492 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
495 ast_log(LOG_WARNING, "Maximum retries exceeded on call %s for seqno %d (%s)\n", pkt->owner->callid, pkt->seqno, pkt->resp ? "Response" : "Request");
497 while(pkt->owner->owner && ast_mutex_trylock(&pkt->owner->owner->lock)) {
498 ast_mutex_unlock(&pkt->owner->lock);
500 ast_mutex_lock(&pkt->owner->lock);
502 if (pkt->owner->owner) {
503 /* XXX Potential deadlocK?? XXX */
504 ast_queue_hangup(pkt->owner->owner, 0);
505 ast_mutex_unlock(&pkt->owner->owner->lock);
507 /* If no owner, destroy now */
508 pkt->owner->needdestroy = 1;
512 ast_mutex_unlock(&pkt->owner->lock);
516 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len)
519 pkt = malloc(sizeof(struct sip_pkt) + len);
522 memset(pkt, 0, sizeof(struct sip_pkt));
523 memcpy(pkt->data, data, len);
524 pkt->packetlen = len;
525 pkt->next = p->packets;
529 /* Schedule retransmission */
530 pkt->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, pkt);
531 pkt->next = p->packets;
533 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
534 if (!strncasecmp(pkt->data, "INVITE", 6)) {
535 /* Note this is a pending invite */
536 p->pendinginvite = seqno;
541 static int __sip_autodestruct(void *data)
543 struct sip_pvt *p = data;
545 ast_log(LOG_DEBUG, "Auto destroying call '%s'\n", p->callid);
547 ast_log(LOG_WARNING, "Autodestruct on call '%s' with owner in place\n", p->callid);
548 ast_queue_hangup(p->owner, 0);
555 static int sip_scheddestroy(struct sip_pvt *p, int ms)
557 if (p->autokillid > -1)
558 ast_sched_del(sched, p->autokillid);
559 p->autokillid = ast_sched_add(sched, ms, __sip_autodestruct, p);
563 static int sip_cancel_destroy(struct sip_pvt *p)
565 if (p->autokillid > -1)
566 ast_sched_del(sched, p->autokillid);
571 static int __sip_ack(struct sip_pvt *p, int seqno, int resp)
573 struct sip_pkt *cur, *prev = NULL;
578 if ((cur->seqno == seqno) && (cur->resp == resp)) {
579 if (!resp && (seqno == p->pendinginvite)) {
580 ast_log(LOG_DEBUG, "Acked pending invite %d\n", p->pendinginvite);
581 p->pendinginvite = 0;
584 /* this is our baby */
586 prev->next = cur->next;
588 p->packets = cur->next;
589 if (cur->retransid > -1)
590 ast_sched_del(sched, cur->retransid);
598 ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
602 static int __sip_semi_ack(struct sip_pvt *p, int seqno, int resp)
608 if ((cur->seqno == seqno) && (cur->resp == resp)) {
609 /* this is our baby */
610 if (cur->retransid > -1)
611 ast_sched_del(sched, cur->retransid);
618 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");
622 static int send_response(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
627 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));
629 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));
632 res = __sip_reliable_xmit(p, seqno, 1, req->data, req->len);
634 res = __sip_xmit(p, req->data, req->len);
640 static int send_request(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
645 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));
647 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));
650 res = __sip_reliable_xmit(p, seqno, 0, req->data, req->len);
652 res = __sip_xmit(p, req->data, req->len);
656 static char *ditch_braces(char *tmp)
660 if ((n = strchr(tmp, '<')) ) {
662 while(*c && *c != '>') c++;
664 ast_log(LOG_WARNING, "No closing brace in '%s'\n", tmp);
673 static int sip_sendtext(struct ast_channel *ast, char *text)
675 struct sip_pvt *p = ast->pvt->pvt;
677 ast_verbose("Sending text %s on %s\n", text, ast->name);
680 if (!text || !strlen(text))
683 ast_verbose("Really sending text %s on %s\n", text, ast->name);
684 transmit_message_with_text(p, text);
690 static void mysql_update_peer(char *peer, struct sockaddr_in *sin)
692 if (mysql && (strlen(peer) < 128)) {
696 name = alloca(strlen(peer) * 2 + 1);
698 mysql_real_escape_string(mysql, name, peer, strlen(peer));
699 snprintf(query, sizeof(query), "UPDATE sipfriends SET ipaddr=\"%s\", port=\"%d\", regseconds=\"%ld\" WHERE name=\"%s\"",
700 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), nowtime, name);
701 ast_mutex_lock(&mysqllock);
702 if (mysql_real_query(mysql, query, strlen(query)))
703 ast_log(LOG_WARNING, "Unable to update database\n");
705 ast_mutex_unlock(&mysqllock);
709 static struct sip_peer *mysql_peer(char *peer, struct sockaddr_in *sin)
714 p = malloc(sizeof(struct sip_peer));
715 memset(p, 0, sizeof(struct sip_peer));
716 if (mysql && (!peer || (strlen(peer) < 128))) {
721 time_t regseconds, nowtime;
726 name = alloca(strlen(peer) * 2 + 1);
727 mysql_real_escape_string(mysql, name, peer, strlen(peer));
730 snprintf(query, sizeof(query), "SELECT * FROM sipfriends WHERE ipaddr=\"%s\" AND port=\"%d\"", inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
732 snprintf(query, sizeof(query), "SELECT * FROM sipfriends WHERE name=\"%s\"", name);
733 ast_mutex_lock(&mysqllock);
734 mysql_query(mysql, query);
735 if ((result = mysql_store_result(mysql))) {
736 if ((rowval = mysql_fetch_row(result))) {
737 numfields = mysql_num_fields(result);
738 fields = mysql_fetch_fields(result);
740 for (x=0;x<numfields;x++) {
742 if (!strcasecmp(fields[x].name, "secret")) {
743 strncpy(p->secret, rowval[x], sizeof(p->secret));
744 } else if (!strcasecmp(fields[x].name, "name")) {
745 strncpy(p->name, rowval[x], sizeof(p->name) - 1);
746 } else if (!strcasecmp(fields[x].name, "context")) {
747 strncpy(p->context, rowval[x], sizeof(p->context) - 1);
748 } else if (!strcasecmp(fields[x].name, "ipaddr")) {
749 inet_aton(rowval[x], &p->addr.sin_addr);
750 } else if (!strcasecmp(fields[x].name, "port")) {
751 if (sscanf(rowval[x], "%i", &port) != 1)
753 p->addr.sin_port = htons(port);
754 } else if (!strcasecmp(fields[x].name, "regseconds")) {
755 if (sscanf(rowval[x], "%li", ®seconds) != 1)
761 if ((nowtime - regseconds) > default_expiry)
762 memset(&p->addr, 0, sizeof(p->addr));
764 mysql_free_result(result);
767 ast_mutex_unlock(&mysqllock);
774 p->capability = capability;
776 p->dtmfmode = globaldtmfmode;
784 #endif /* MYSQL_FRIENDS */
786 static int create_addr(struct sip_pvt *r, char *peer)
793 char host[256], *hostn;
795 r->sa.sin_family = AF_INET;
796 ast_mutex_lock(&peerl.lock);
799 if (!strcasecmp(p->name, peer))
805 p = mysql_peer(peer, NULL);
810 r->capability = p->capability;
813 ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", r->nat);
814 ast_rtp_setnat(r->rtp, r->nat);
817 ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", r->nat);
818 ast_rtp_setnat(r->vrtp, r->nat);
820 strncpy(r->peername, p->username, sizeof(r->peername)-1);
821 strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1);
822 strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1);
823 strncpy(r->username, p->username, sizeof(r->username)-1);
824 strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1);
825 if (!strlen(r->tohost)) {
826 if (p->addr.sin_addr.s_addr)
827 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->addr.sin_addr));
829 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->defaddr.sin_addr));
831 if (strlen(p->fromdomain))
832 strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1);
833 if (strlen(p->fromuser))
834 strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1);
835 r->insecure = p->insecure;
836 r->canreinvite = p->canreinvite;
837 r->maxtime = p->maxms;
838 r->callgroup = p->callgroup;
839 r->pickupgroup = p->pickupgroup;
841 r->dtmfmode = p->dtmfmode;
842 if (r->dtmfmode & SIP_DTMF_RFC2833)
843 r->noncodeccapability |= AST_RTP_DTMF;
845 r->noncodeccapability &= ~AST_RTP_DTMF;
847 strncpy(r->context, p->context,sizeof(r->context)-1);
848 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
849 (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) {
850 if (p->addr.sin_addr.s_addr) {
851 r->sa.sin_addr = p->addr.sin_addr;
852 r->sa.sin_port = p->addr.sin_port;
854 r->sa.sin_addr = p->defaddr.sin_addr;
855 r->sa.sin_port = p->defaddr.sin_port;
857 memcpy(&r->recv, &r->sa, sizeof(r->recv));
861 ast_mutex_unlock(&peerl.lock);
863 if ((port=strchr(peer, ':'))) {
871 portno = DEFAULT_SIP_PORT;
876 snprintf(service, sizeof(service), "_sip._udp.%s", peer);
877 ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service);
883 hp = gethostbyname(hostn);
885 strncpy(r->tohost, peer, sizeof(r->tohost) - 1);
886 memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr));
887 r->sa.sin_port = htons(portno);
888 memcpy(&r->recv, &r->sa, sizeof(r->recv));
891 ast_log(LOG_WARNING, "No such host: %s\n", peer);
903 static int auto_congest(void *nothing)
905 struct sip_pvt *p = nothing;
906 ast_mutex_lock(&p->lock);
909 if (!ast_mutex_trylock(&p->owner->lock)) {
910 ast_log(LOG_NOTICE, "Auto-congesting %s\n", p->owner->name);
911 ast_queue_control(p->owner, AST_CONTROL_CONGESTION, 0);
912 ast_mutex_unlock(&p->owner->lock);
915 ast_mutex_unlock(&p->lock);
919 static void sip_prefs_free(void)
921 struct sip_codec_pref *cur, *next;
931 static void sip_pref_remove(int format)
933 struct sip_codec_pref *cur, *prev=NULL;
936 if (cur->codec == format) {
938 prev->next = cur->next;
949 static int sip_pref_append(int format)
951 struct sip_codec_pref *cur, *tmp;
952 sip_pref_remove(format);
953 tmp = (struct sip_codec_pref *)malloc(sizeof(struct sip_codec_pref));
956 memset(tmp, 0, sizeof(struct sip_codec_pref));
968 static int sip_codec_choose(int formats)
970 struct sip_codec_pref *cur;
971 formats &= (AST_FORMAT_MAX_AUDIO - 1);
974 if (formats & cur->codec)
978 return ast_best_codec(formats);
981 static int sip_call(struct ast_channel *ast, char *dest, int timeout)
985 char *vxml_url = NULL;
986 char *distinctive_ring = NULL;
987 struct varshead *headp;
988 struct ast_var_t *current;
991 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
992 ast_log(LOG_WARNING, "sip_call called on %s, neither down nor reserved\n", ast->name);
995 /* Check whether there is vxml_url, distinctive ring variables */
997 headp=&ast->varshead;
998 AST_LIST_TRAVERSE(headp,current,entries) {
999 /* Check whether there is a VXML_URL variable */
1000 if (strcasecmp(ast_var_name(current),"VXML_URL")==0)
1002 vxml_url = ast_var_value(current);
1005 /* Check whether there is a ALERT_INFO variable */
1006 if (strcasecmp(ast_var_name(current),"ALERT_INFO")==0)
1008 distinctive_ring = ast_var_value(current);
1015 ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
1016 res = find_user(p,INC_OUT_USE);
1018 p->restrictcid = ast->restrictcid;
1019 p->jointcapability = p->capability;
1020 transmit_invite(p, "INVITE", 1, NULL, NULL, vxml_url,distinctive_ring, 1);
1022 /* Initialize auto-congest time */
1023 p->initid = ast_sched_add(sched, p->maxtime * 4, auto_congest, p);
1029 static void __sip_destroy(struct sip_pvt *p, int lockowner)
1031 struct sip_pvt *cur, *prev = NULL;
1034 ast_log(LOG_DEBUG, "Destroying call '%s'\n", p->callid);
1035 if (p->stateid > -1)
1036 ast_extension_state_del(p->stateid, NULL);
1038 ast_sched_del(sched, p->initid);
1039 if (p->autokillid > -1)
1040 ast_sched_del(sched, p->autokillid);
1043 ast_rtp_destroy(p->rtp);
1046 ast_rtp_destroy(p->vrtp);
1049 free_old_route(p->route);
1053 /* Carefully unlink from registry */
1054 struct sip_registry *reg;
1055 ast_mutex_lock(®l.lock);
1056 reg = regl.registrations;
1058 if ((reg == p->registry) && (p->registry->call == p))
1059 p->registry->call=NULL;
1062 ast_mutex_unlock(®l.lock);
1064 /* Unlink us from the owner if we have one */
1067 ast_mutex_lock(&p->owner->lock);
1068 ast_log(LOG_DEBUG, "Detaching from %s\n", p->owner->name);
1069 p->owner->pvt->pvt = NULL;
1071 ast_mutex_unlock(&p->owner->lock);
1077 prev->next = cur->next;
1086 ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
1089 ast_sched_del(sched, p->initid);
1090 while((cp = p->packets)) {
1091 p->packets = p->packets->next;
1092 if (cp->retransid > -1)
1093 ast_sched_del(sched, cp->retransid);
1100 static int find_user(struct sip_pvt *fup, int event)
1102 char name[256] = "";
1104 strncpy(name, fup->username, sizeof(name) - 1);
1105 ast_mutex_lock(&userl.lock);
1108 if (!strcasecmp(u->name, name)) {
1114 ast_log(LOG_DEBUG, "%s is not a local user\n", name);
1115 ast_mutex_unlock(&userl.lock);
1119 /* incoming and outgoing affects the inUse counter */
1122 if ( u->inUse > 0 ) {
1130 if (u->incominglimit > 0 ) {
1131 if (u->inUse >= u->incominglimit) {
1132 ast_log(LOG_ERROR, "Call from user '%s' rejected due to usage limit of %d\n", u->name, u->incominglimit);
1133 ast_mutex_unlock(&userl.lock);
1134 /* inc inUse as well */
1135 if ( event == INC_OUT_USE ) {
1142 ast_log(LOG_DEBUG, "Call from user '%s' is %d out of %d\n", u->name, u->inUse, u->incominglimit);
1144 /* we don't use these anymore
1146 if ( u->outUse > 0 ) {
1153 if ( u->outgoinglimit > 0 ) {
1154 if ( u->outUse >= u->outgoinglimit ) {
1155 ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
1156 ast_mutex_unlock(&userl.lock);
1164 ast_log(LOG_ERROR, "find_user(%s,%d) called with no event!\n",u->name,event);
1166 ast_mutex_unlock(&userl.lock);
1170 static void sip_destroy(struct sip_pvt *p)
1172 ast_mutex_lock(&iflock);
1173 __sip_destroy(p, 1);
1174 ast_mutex_unlock(&iflock);
1177 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req);
1179 static int hangup_sip2cause(int cause)
1184 return AST_CAUSE_BUSY;
1186 return AST_CAUSE_NORMAL;
1192 static char *hangup_cause2sip(int cause)
1196 case AST_CAUSE_BUSY:
1205 static int sip_hangup(struct ast_channel *ast)
1207 struct sip_pvt *p = ast->pvt->pvt;
1209 int needdestroy = 0;
1211 ast_log(LOG_DEBUG, "sip_hangup(%s)\n", ast->name);
1212 if (!ast->pvt->pvt) {
1213 ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
1216 ast_mutex_lock(&p->lock);
1217 if ( p->outgoing ) {
1218 ast_log(LOG_DEBUG, "find_user(%s) - decrement outUse counter\n", p->username);
1219 find_user(p, DEC_OUT_USE);
1221 ast_log(LOG_DEBUG, "find_user(%s) - decrement inUse counter\n", p->username);
1222 find_user(p, DEC_IN_USE);
1224 /* Determine how to disconnect */
1225 if (p->owner != ast) {
1226 ast_log(LOG_WARNING, "Huh? We aren't the owner?\n");
1227 ast_mutex_unlock(&p->lock);
1230 if (!ast || (ast->_state != AST_STATE_UP))
1235 ast_dsp_free(p->vad);
1238 ast->pvt->pvt = NULL;
1240 ast_mutex_lock(&usecnt_lock);
1242 ast_mutex_unlock(&usecnt_lock);
1243 ast_update_use_count();
1246 /* Start the process if it's not already started */
1247 if (!p->alreadygone && strlen(p->initreq.data)) {
1250 transmit_request_with_auth(p, "CANCEL", p->ocseq, 1);
1251 /* Actually don't destroy us yet, wait for the 487 on our original
1252 INVITE, but do set an autodestruct just in case. */
1254 sip_scheddestroy(p, 15000);
1255 if ( p->initid != -1 ) {
1256 /* channel still up - reverse dec of inUse counter
1257 only if the channel is not auto-congested */
1258 if ( p->outgoing ) {
1259 find_user(p, INC_OUT_USE);
1262 find_user(p, INC_IN_USE);
1267 if (ast->hangupcause && ((res = hangup_cause2sip(ast->hangupcause)))) {
1268 transmit_response_reliable(p, res, &p->initreq);
1270 transmit_response_reliable(p, "403 Forbidden", &p->initreq);
1273 if (!p->pendinginvite) {
1275 transmit_request_with_auth(p, "BYE", 0, 1);
1277 /* Note we will need a BYE when this all settles out
1278 but we can't send one while we have "INVITE" outstanding. */
1283 p->needdestroy = needdestroy;
1284 ast_mutex_unlock(&p->lock);
1288 static int sip_answer(struct ast_channel *ast)
1292 struct sip_pvt *p = ast->pvt->pvt;
1295 if (ast->_state != AST_STATE_UP) {
1299 codec=pbx_builtin_getvar_helper(p->owner,"SIP_CODEC");
1301 fmt=ast_getformatbyname(codec);
1303 ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
1304 p->jointcapability=fmt;
1305 } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n",codec);
1308 ast_setstate(ast, AST_STATE_UP);
1310 ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
1311 res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
1316 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
1318 struct sip_pvt *p = ast->pvt->pvt;
1320 if (frame->frametype == AST_FRAME_VOICE) {
1321 if (!(frame->subclass & ast->nativeformats)) {
1322 ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
1323 frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
1327 ast_mutex_lock(&p->lock);
1329 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1330 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1333 res = ast_rtp_write(p->rtp, frame);
1335 ast_mutex_unlock(&p->lock);
1337 } else if (frame->frametype == AST_FRAME_VIDEO) {
1339 ast_mutex_lock(&p->lock);
1341 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1342 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1345 res = ast_rtp_write(p->vrtp, frame);
1347 ast_mutex_unlock(&p->lock);
1349 } else if (frame->frametype == AST_FRAME_IMAGE) {
1352 ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", frame->frametype);
1359 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
1361 struct sip_pvt *p = newchan->pvt->pvt;
1362 ast_mutex_lock(&p->lock);
1363 if (p->owner != oldchan) {
1364 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
1365 ast_mutex_unlock(&p->lock);
1369 ast_mutex_unlock(&p->lock);
1373 static int sip_senddigit(struct ast_channel *ast, char digit)
1375 struct sip_pvt *p = ast->pvt->pvt;
1376 if (p && (p->dtmfmode & SIP_DTMF_INFO)) {
1377 transmit_info_with_digit(p, digit);
1379 if (p && p->rtp && (p->dtmfmode & SIP_DTMF_RFC2833)) {
1380 ast_rtp_senddigit(p->rtp, digit);
1382 /* If in-band DTMF is desired, send that */
1383 if (p->dtmfmode & SIP_DTMF_INBAND)
1388 static int sip_transfer(struct ast_channel *ast, char *dest)
1390 struct sip_pvt *p = ast->pvt->pvt;
1392 res = transmit_refer(p, dest);
1396 static int sip_indicate(struct ast_channel *ast, int condition)
1398 struct sip_pvt *p = ast->pvt->pvt;
1400 case AST_CONTROL_RINGING:
1401 if (ast->_state == AST_STATE_RING) {
1402 if (!p->progress && !p->ringing) {
1403 transmit_response(p, "180 Ringing", &p->initreq);
1407 /* Oops, we've sent progress tones. Let Asterisk do it instead */
1411 case AST_CONTROL_BUSY:
1412 if (ast->_state != AST_STATE_UP) {
1413 transmit_response(p, "486 Busy Here", &p->initreq);
1415 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1419 case AST_CONTROL_CONGESTION:
1420 if (ast->_state != AST_STATE_UP) {
1421 transmit_response(p, "503 Service Unavailable", &p->initreq);
1423 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1427 case AST_CONTROL_PROGRESS:
1428 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1429 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1437 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
1445 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
1447 struct ast_channel *tmp;
1449 tmp = ast_channel_alloc(1);
1451 /* Select our native format based on codec preference until we receive
1452 something from another device to the contrary. */
1453 if (i->jointcapability)
1454 tmp->nativeformats = sip_codec_choose(i->jointcapability);
1455 else if (i->capability)
1456 tmp->nativeformats = sip_codec_choose(i->capability);
1458 tmp->nativeformats = sip_codec_choose(capability);
1459 fmt = ast_best_codec(tmp->nativeformats);
1461 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
1463 if (strchr(i->fromdomain,':'))
1465 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(i));
1469 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(i));
1472 if (i->dtmfmode & SIP_DTMF_INBAND) {
1473 i->vad = ast_dsp_new();
1474 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
1476 tmp->fds[0] = ast_rtp_fd(i->rtp);
1477 tmp->fds[1] = ast_rtcp_fd(i->rtp);
1479 tmp->fds[2] = ast_rtp_fd(i->vrtp);
1480 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
1482 ast_setstate(tmp, state);
1483 if (state == AST_STATE_RING)
1485 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
1486 tmp->writeformat = fmt;
1487 tmp->pvt->rawwriteformat = fmt;
1488 tmp->readformat = fmt;
1489 tmp->pvt->rawreadformat = fmt;
1491 tmp->pvt->send_text = sip_sendtext;
1492 tmp->pvt->call = sip_call;
1493 tmp->pvt->hangup = sip_hangup;
1494 tmp->pvt->answer = sip_answer;
1495 tmp->pvt->read = sip_read;
1496 tmp->pvt->write = sip_write;
1497 tmp->pvt->write_video = sip_write;
1498 tmp->pvt->indicate = sip_indicate;
1499 tmp->pvt->transfer = sip_transfer;
1500 tmp->pvt->fixup = sip_fixup;
1501 tmp->pvt->send_digit = sip_senddigit;
1503 tmp->pvt->bridge = ast_rtp_bridge;
1505 tmp->callgroup = i->callgroup;
1506 tmp->pickupgroup = i->pickupgroup;
1507 tmp->restrictcid = i->restrictcid;
1508 if (strlen(i->accountcode))
1509 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
1511 tmp->amaflags = i->amaflags;
1512 if (strlen(i->language))
1513 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
1515 ast_mutex_lock(&usecnt_lock);
1517 ast_mutex_unlock(&usecnt_lock);
1518 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
1519 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
1520 if (strlen(i->callerid))
1521 tmp->callerid = strdup(i->callerid);
1522 if (strlen(i->rdnis))
1523 tmp->rdnis = strdup(i->rdnis);
1525 if (strlen(i->domain)) {
1526 pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
1529 if (state != AST_STATE_DOWN) {
1530 if (ast_pbx_start(tmp)) {
1531 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
1537 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
1541 static struct cfalias {
1545 { "Content-Type", "c" },
1546 { "Content-Encoding", "e" },
1550 { "Content-Length", "l" },
1556 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
1557 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
1558 char* r = line + nameLen + 1;
1559 while (*r && (*r < 33)) ++r;
1566 static char *get_sdp(struct sip_request *req, char *name) {
1568 int len = strlen(name);
1571 for (x=0; x<req->lines; x++) {
1572 r = get_sdp_by_line(req->line[x], name, len);
1573 if (r[0] != '\0') return r;
1578 static void sdpLineNum_iterator_init(int* iterator) {
1582 static char* get_sdp_iterate(int* iterator,
1583 struct sip_request *req, char *name) {
1584 int len = strlen(name);
1586 while (*iterator < req->lines) {
1587 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
1588 if (r[0] != '\0') return r;
1593 static char *__get_header(struct sip_request *req, char *name, int *start)
1596 int len = strlen(name);
1598 for (x=*start;x<req->headers;x++) {
1599 if (!strncasecmp(req->header[x], name, len) &&
1600 (req->header[x][len] == ':')) {
1601 r = req->header[x] + len + 1;
1602 while(*r && (*r < 33))
1609 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
1610 if (!strcasecmp(aliases[x].fullname, name))
1611 return __get_header(req, aliases[x].shortname, start);
1613 /* Don't return NULL, so get_header is always a valid pointer */
1617 static char *get_header(struct sip_request *req, char *name)
1620 return __get_header(req, name, &start);
1623 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
1625 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
1626 struct ast_frame *f;
1627 static struct ast_frame null_frame = { AST_FRAME_NULL, };
1630 f = ast_rtp_read(p->rtp);
1633 f = ast_rtcp_read(p->rtp);
1636 f = ast_rtp_read(p->vrtp);
1639 f = ast_rtcp_read(p->vrtp);
1644 /* Don't send RFC2833 if we're not supposed to */
1645 if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & SIP_DTMF_RFC2833))
1648 /* We already hold the channel lock */
1649 if (f->frametype == AST_FRAME_VOICE) {
1650 if (f->subclass != p->owner->nativeformats) {
1651 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
1652 p->owner->nativeformats = f->subclass;
1653 ast_set_read_format(p->owner, p->owner->readformat);
1654 ast_set_write_format(p->owner, p->owner->writeformat);
1656 if (p->dtmfmode & SIP_DTMF_INBAND) {
1657 f = ast_dsp_process(p->owner,p->vad,f,0);
1664 static struct ast_frame *sip_read(struct ast_channel *ast)
1666 struct ast_frame *fr;
1667 struct sip_pvt *p = ast->pvt->pvt;
1668 ast_mutex_lock(&p->lock);
1669 fr = sip_rtp_read(ast, p);
1670 ast_mutex_unlock(&p->lock);
1674 static void build_callid(char *callid, int len, struct in_addr ourip)
1681 res = snprintf(callid, len, "%08x", val);
1685 /* It's not important that we really use our right IP here... */
1686 snprintf(callid, len, "@%s", inet_ntoa(ourip));
1689 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobalnat)
1693 p = malloc(sizeof(struct sip_pvt));
1696 /* Keep track of stuff */
1697 memset(p, 0, sizeof(struct sip_pvt));
1701 p->rtp = ast_rtp_new(sched, io, 1, 0);
1703 p->vrtp = ast_rtp_new(sched, io, 1, 0);
1707 /* Start with 101 instead of 1 */
1710 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
1714 ast_rtp_settos(p->rtp, tos);
1716 ast_rtp_settos(p->vrtp, tos);
1717 if (useglobalnat && sin) {
1718 /* Setup NAT structure according to global settings if we have an address */
1720 memcpy(&p->recv, sin, sizeof(p->recv));
1721 ast_rtp_setnat(p->rtp, p->nat);
1723 ast_rtp_setnat(p->vrtp, p->nat);
1725 ast_mutex_init(&p->lock);
1728 memcpy(&p->sa, sin, sizeof(p->sa));
1729 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
1730 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1732 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1734 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
1735 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
1737 build_callid(p->callid, sizeof(p->callid), p->ourip);
1739 strncpy(p->callid, callid, sizeof(p->callid) - 1);
1740 /* Assume reinvite OK and via INVITE */
1741 p->canreinvite = globalcanreinvite;
1742 p->dtmfmode = globaldtmfmode;
1743 p->capability = capability;
1744 if (p->dtmfmode & SIP_DTMF_RFC2833)
1745 p->noncodeccapability |= AST_RTP_DTMF;
1746 strncpy(p->context, context, sizeof(p->context) - 1);
1747 strncpy(p->fromdomain, fromdomain, sizeof(p->fromdomain) - 1);
1749 ast_mutex_lock(&iflock);
1752 ast_mutex_unlock(&iflock);
1754 ast_log(LOG_DEBUG, "Allocating new SIP call for %s\n", callid);
1758 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin)
1766 callid = get_header(req, "Call-ID");
1768 if (pedanticsipchecking) {
1769 /* In principle Call-ID's uniquely identify a call, however some vendors
1770 (i.e. Pingtel) send multiple calls with the same Call-ID and different
1771 tags in order to simplify billing. The RFC does state that we have to
1772 compare tags in addition to the call-id, but this generate substantially
1773 more overhead which is totally unnecessary for the vast majority of sane
1774 SIP implementations, and thus Asterisk does not enable this behavior
1775 by default. Short version: You'll need this option to support conferencing
1777 strncpy(tmp, req->header[0], sizeof(tmp) - 1);
1779 c = strchr(tmp, ' ');
1782 if (!strcasecmp(cmd, "SIP/2.0")) {
1788 strncpy(tmp, get_header(req, "From"), sizeof(tmp) - 1);
1790 strncpy(tmp, get_header(req, "To"), sizeof(tmp) - 1);
1791 tag = strstr(tmp, "tag=");
1794 c = strchr(tag, ';');
1801 if (!strlen(callid)) {
1802 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", inet_ntoa(sin->sin_addr));
1805 ast_mutex_lock(&iflock);
1808 if (!strcmp(p->callid, callid) &&
1809 (!pedanticsipchecking || !tag || !strlen(p->theirtag) || !strcmp(p->theirtag, tag))) {
1810 /* Found the call */
1811 ast_mutex_lock(&p->lock);
1812 ast_mutex_unlock(&iflock);
1817 ast_mutex_unlock(&iflock);
1818 p = sip_alloc(callid, sin, 1);
1820 ast_mutex_lock(&p->lock);
1824 static int sip_register(char *value, int lineno)
1826 struct sip_registry *reg;
1827 char copy[256] = "";
1828 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
1836 strncpy(copy, value, sizeof(copy)-1);
1839 hostname = strrchr(stringp, '@');
1844 if (!username || !strlen(username) || !hostname || !strlen(hostname)) {
1845 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d", lineno);
1849 username = strsep(&stringp, ":");
1851 secret = strsep(&stringp, ":");
1853 authuser = strsep(&stringp, ":");
1856 hostname = strsep(&stringp, "/");
1858 contact = strsep(&stringp, "/");
1859 if (!contact || !strlen(contact))
1862 hostname = strsep(&stringp, ":");
1863 porta = strsep(&stringp, ":");
1865 if (porta && !atoi(porta)) {
1866 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
1869 hp = gethostbyname(hostname);
1871 ast_log(LOG_WARNING, "Host '%s' not found at line %d\n", hostname, lineno);
1874 reg = malloc(sizeof(struct sip_registry));
1876 memset(reg, 0, sizeof(struct sip_registry));
1877 strncpy(reg->contact, contact, sizeof(reg->contact) - 1);
1879 strncpy(reg->username, username, sizeof(reg->username)-1);
1881 strncpy(reg->hostname, hostname, sizeof(reg->hostname)-1);
1883 strncpy(reg->authuser, authuser, sizeof(reg->authuser)-1);
1885 strncpy(reg->secret, secret, sizeof(reg->secret)-1);
1888 reg->refresh = default_expiry;
1889 reg->addr.sin_family = AF_INET;
1890 memcpy(®->addr.sin_addr, hp->h_addr, sizeof(®->addr.sin_addr));
1891 reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT);
1892 reg->callid_valid = 0;
1894 ast_mutex_lock(®l.lock);
1895 reg->next = regl.registrations;
1896 regl.registrations = reg;
1897 ast_mutex_unlock(®l.lock);
1899 ast_log(LOG_ERROR, "Out of memory\n");
1905 static void parse(struct sip_request *req)
1907 /* Divide fields by NULL's */
1912 /* First header starts immediately */
1916 /* We've got a new header */
1920 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
1922 if (!strlen(req->header[f])) {
1923 /* Line by itself means we're now in content */
1927 if (f >= SIP_MAX_HEADERS - 1) {
1928 ast_log(LOG_WARNING, "Too many SIP headers...\n");
1931 req->header[f] = c + 1;
1932 } else if (*c == '\r') {
1933 /* Ignore but eliminate \r's */
1938 /* Check for last header */
1939 if (strlen(req->header[f]))
1942 /* Now we process any mime content */
1947 /* We've got a new line */
1950 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
1952 if (f >= SIP_MAX_LINES - 1) {
1953 ast_log(LOG_WARNING, "Too many SDP lines...\n");
1956 req->line[f] = c + 1;
1957 } else if (*c == '\r') {
1958 /* Ignore and eliminate \r's */
1963 /* Check for last line */
1964 if (strlen(req->line[f]))
1968 ast_verbose("%d headers, %d lines\n", req->headers, req->lines);
1970 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
1973 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
1982 int peercapability, peernoncodeccapability;
1983 int vpeercapability=0, vpeernoncodeccapability=0;
1984 struct sockaddr_in sin;
1992 /* Get codec and RTP info from SDP */
1993 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
1994 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
1997 m = get_sdp(req, "m");
1998 c = get_sdp(req, "c");
1999 if (!strlen(m) || !strlen(c)) {
2000 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
2003 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2004 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
2007 /* XXX This could block for a long time, and block the main thread! XXX */
2008 hp = gethostbyname(host);
2010 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
2013 sdpLineNum_iterator_init(&iterator);
2014 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
2015 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) {
2017 // Scan through the RTP payload types specified in a "m=" line:
2018 ast_rtp_pt_clear(p->rtp);
2020 while(strlen(codecs)) {
2021 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2022 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2026 ast_verbose("Found audio format %s\n", ast_getformatname(codec));
2027 ast_rtp_set_m_type(p->rtp, codec);
2029 /* Skip over any whitespace */
2030 while(*codecs && (*codecs < 33)) codecs++;
2033 if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
2035 // Scan through the RTP payload types specified in a "m=" line:
2036 ast_rtp_pt_clear(p->vrtp);
2038 while(strlen(codecs)) {
2039 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2040 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2044 ast_verbose("Found video format %s\n", ast_getformatname(codec));
2045 ast_rtp_set_m_type(p->vrtp, codec);
2047 /* Skip over any whitespace */
2048 while(*codecs && (*codecs < 33)) codecs++;
2052 sin.sin_family = AF_INET;
2053 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
2054 /* Setup audio port number */
2055 sin.sin_port = htons(portno);
2056 if (p->rtp && sin.sin_port)
2057 ast_rtp_set_peer(p->rtp, &sin);
2058 /* Setup video port number */
2059 sin.sin_port = htons(vportno);
2060 if (p->vrtp && sin.sin_port)
2061 ast_rtp_set_peer(p->vrtp, &sin);
2063 printf("Peer RTP is at port %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
2065 // Next, scan through each "a=rtpmap:" line, noting each
2066 // specified RTP payload type (with corresponding MIME subtype):
2067 sdpLineNum_iterator_init(&iterator);
2068 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
2069 char* mimeSubtype = ast_strdupa(a); // ensures we have enough space
2070 if (!strcasecmp(a, "sendonly")) {
2074 if (!strcasecmp(a, "sendrecv")) {
2077 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
2079 ast_verbose("Found description format %s\n", mimeSubtype);
2080 // Note: should really look at the 'freq' and '#chans' params too
2081 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
2083 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
2086 // Now gather all of the codecs that were asked for:
2087 ast_rtp_get_current_formats(p->rtp,
2088 &peercapability, &peernoncodeccapability);
2090 ast_rtp_get_current_formats(p->vrtp,
2091 &vpeercapability, &vpeernoncodeccapability);
2092 p->jointcapability = p->capability & (peercapability | vpeercapability);
2093 p->noncodeccapability = noncodeccapability & (peernoncodeccapability | vpeernoncodeccapability);
2096 ast_verbose("Capabilities: us - %d, them - %d/%d, combined - %d\n",
2097 p->capability, peercapability, vpeercapability, p->jointcapability);
2098 ast_verbose("Non-codec capabilities: us - %d, them - %d, combined - %d\n",
2099 noncodeccapability, peernoncodeccapability,
2100 p->noncodeccapability);
2102 if (!p->jointcapability) {
2103 ast_log(LOG_WARNING, "No compatible codecs!\n");
2107 if (!(p->owner->nativeformats & p->jointcapability)) {
2108 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);
2109 p->owner->nativeformats = sip_codec_choose(p->jointcapability);
2110 ast_set_read_format(p->owner, p->owner->readformat);
2111 ast_set_write_format(p->owner, p->owner->writeformat);
2113 if (p->owner->bridge) {
2114 /* Turn on/off music on hold if we are holding/unholding */
2115 if (sin.sin_addr.s_addr && !sendonly) {
2116 ast_moh_stop(p->owner->bridge);
2118 ast_moh_start(p->owner->bridge, NULL);
2126 static int add_header(struct sip_request *req, char *var, char *value)
2128 if (req->len >= sizeof(req->data) - 4) {
2129 ast_log(LOG_WARNING, "Out of space, can't add anymore (%s:%s)\n", var, value);
2133 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2136 req->header[req->headers] = req->data + req->len;
2137 snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", var, value);
2138 req->len += strlen(req->header[req->headers]);
2139 if (req->headers < SIP_MAX_HEADERS)
2142 ast_log(LOG_WARNING, "Out of header space\n");
2148 static int add_blank_header(struct sip_request *req)
2150 if (req->len >= sizeof(req->data) - 4) {
2151 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2155 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2158 req->header[req->headers] = req->data + req->len;
2159 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "\r\n");
2160 req->len += strlen(req->header[req->headers]);
2161 if (req->headers < SIP_MAX_HEADERS)
2164 ast_log(LOG_WARNING, "Out of header space\n");
2170 static int add_line(struct sip_request *req, char *line)
2172 if (req->len >= sizeof(req->data) - 4) {
2173 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2177 /* Add extra empty return */
2178 snprintf(req->data + req->len, sizeof(req->data) - req->len, "\r\n");
2179 req->len += strlen(req->data + req->len);
2181 req->line[req->lines] = req->data + req->len;
2182 snprintf(req->line[req->lines], sizeof(req->data) - req->len, "%s", line);
2183 req->len += strlen(req->line[req->lines]);
2184 if (req->lines < SIP_MAX_LINES)
2187 ast_log(LOG_WARNING, "Out of line space\n");
2193 static int copy_header(struct sip_request *req, struct sip_request *orig, char *field)
2196 tmp = get_header(orig, field);
2198 /* Add what we're responding to */
2199 return add_header(req, field, tmp);
2201 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2205 static int copy_all_header(struct sip_request *req, struct sip_request *orig, char *field)
2211 tmp = __get_header(orig, field, &start);
2213 /* Add what we're responding to */
2214 add_header(req, field, tmp);
2219 return copied ? 0 : -1;
2222 static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct sip_request *orig, char *field)
2229 tmp = __get_header(orig, field, &start);
2231 if (!copied && p->nat) {
2232 #ifdef THE_SIP_AUTHORS_CAN_SUCK_MY_GONADS
2233 /* SLD: FIXME: Nice try, but the received= should not have a port */
2234 /* SLD: FIXME: See RFC2543 BNF in Section 6.40.5 */
2235 /* MAS: Yup, RFC says you can't do it. No way to indicate PAT...
2237 if (ntohs(p->recv.sin_port) != DEFAULT_SIP_PORT)
2238 snprintf(new, sizeof(new), "%s;received=%s:%d", tmp, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
2241 snprintf(new, sizeof(new), "%s;received=%s", tmp, inet_ntoa(p->recv.sin_addr));
2242 add_header(req, field, new);
2244 /* Add what we're responding to */
2245 add_header(req, field, tmp);
2252 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2258 /* Add Route: header into request per learned route */
2259 static void add_route(struct sip_request *req, struct sip_route *route)
2262 int n, rem = 255; /* sizeof(r)-1: Room for terminating 0 */
2268 n = strlen(route->hop);
2269 if ((n+3)>rem) break;
2275 strcpy(p, route->hop); p += n;
2278 route = route->next;
2281 add_header(req, "Route", r);
2284 static void set_destination(struct sip_pvt *p, char *uri)
2286 char *h, *maddr, hostname[256];
2290 /* Parse uri to h (host) and port - uri is already just the part inside the <> */
2291 /* general form we are expecting is sip[s]:username[:password]@host[:port][;...] */
2294 ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
2296 /* Find and parse hostname */
2297 h = strchr(uri, '@');
2302 if (strncmp(h, "sip:", 4) == 0)
2304 else if (strncmp(h, "sips:", 5) == 0)
2307 hn = strcspn(h, ":;>");
2309 strncpy(hostname, h, hn); hostname[hn] = '\0';
2312 /* Is "port" present? if not default to 5060 */
2316 port = strtol(h, &h, 10);
2321 /* Got the hostname:port - but maybe there's a "maddr=" to override address? */
2322 maddr = strstr(h, "maddr=");
2325 hn = strspn(maddr, "0123456789.");
2327 strncpy(hostname, maddr, hn); hostname[hn] = '\0';
2330 hp = gethostbyname(hostname);
2332 ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
2335 p->sa.sin_family = AF_INET;
2336 memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr));
2337 p->sa.sin_port = htons(port);
2339 ast_verbose("set_destination: set destination to %s, port %d\n", inet_ntoa(p->sa.sin_addr), port);
2342 static int init_resp(struct sip_request *req, char *resp, struct sip_request *orig)
2344 /* Initialize a response */
2345 if (req->headers || req->len) {
2346 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2349 req->header[req->headers] = req->data + req->len;
2350 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "SIP/2.0 %s\r\n", resp);
2351 req->len += strlen(req->header[req->headers]);
2352 if (req->headers < SIP_MAX_HEADERS)
2355 ast_log(LOG_WARNING, "Out of header space\n");
2359 static int init_req(struct sip_request *req, char *resp, char *recip)
2361 /* Initialize a response */
2362 if (req->headers || req->len) {
2363 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2366 req->header[req->headers] = req->data + req->len;
2367 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "%s %s SIP/2.0\r\n", resp, recip);
2368 req->len += strlen(req->header[req->headers]);
2369 if (req->headers < SIP_MAX_HEADERS)
2372 ast_log(LOG_WARNING, "Out of header space\n");
2376 static int respprep(struct sip_request *resp, struct sip_pvt *p, char *msg, struct sip_request *req)
2378 char newto[256] = "", *ot;
2379 memset(resp, 0, sizeof(*resp));
2380 init_resp(resp, msg, req);
2381 copy_via_headers(p, resp, req, "Via");
2382 if (msg[0] == '2') copy_all_header(resp, req, "Record-Route");
2383 copy_header(resp, req, "From");
2384 ot = get_header(req, "To");
2385 if (!strstr(ot, "tag=")) {
2386 /* Add the proper tag if we don't have it already. If they have specified
2387 their tag, use it. Otherwise, use our own tag */
2388 if (strlen(p->theirtag) && p->outgoing)
2389 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2390 else if (p->tag && !p->outgoing)
2391 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2393 strncpy(newto, ot, sizeof(newto) - 1);
2396 add_header(resp, "To", ot);
2397 copy_header(resp, req, "Call-ID");
2398 copy_header(resp, req, "CSeq");
2399 add_header(resp, "User-Agent", "Asterisk PBX");
2400 add_header(resp, "Allow", ALLOWED_METHODS);
2402 /* For registration responses, we also need expiry and
2406 snprintf(contact, sizeof(contact), "%s;expires=%d", p->our_contact, p->expiry);
2407 snprintf(tmp, sizeof(tmp), "%d", p->expiry);
2408 add_header(resp, "Expires", tmp);
2409 add_header(resp, "Contact", contact);
2411 add_header(resp, "Contact", p->our_contact);
2416 static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int seqno)
2418 struct sip_request *orig = &p->initreq;
2419 char stripped[80] ="";
2425 memset(req, 0, sizeof(struct sip_request));
2427 snprintf(p->lastmsg, sizeof(p->lastmsg), "Tx: %s", msg);
2434 if (strlen(p->uri)) {
2438 strncpy(stripped, get_header(orig, "To"), sizeof(stripped) - 1);
2440 strncpy(stripped, get_header(orig, "From"), sizeof(stripped) - 1);
2442 c = strchr(stripped, '<');
2454 init_req(req, msg, c);
2456 snprintf(tmp, sizeof(tmp), "%d %s", seqno, msg);
2458 add_header(req, "Via", p->via);
2460 set_destination(p, p->route->hop);
2461 add_route(req, p->route->next);
2464 ot = get_header(orig, "To");
2465 of = get_header(orig, "From");
2467 /* Add tag *unless* this is a CANCEL, in which case we need to send it exactly
2468 as our original request, including tag (or presumably lack thereof) */
2469 if (!strstr(ot, "tag=") && strcasecmp(msg, "CANCEL")) {
2470 /* Add the proper tag if we don't have it already. If they have specified
2471 their tag, use it. Otherwise, use our own tag */
2472 if (p->outgoing && strlen(p->theirtag))
2473 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2474 else if (!p->outgoing)
2475 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2477 snprintf(newto, sizeof(newto), "%s", ot);
2482 add_header(req, "From", of);
2483 add_header(req, "To", ot);
2485 add_header(req, "From", ot);
2486 add_header(req, "To", of);
2488 add_header(req, "Contact", p->our_contact);
2489 copy_header(req, orig, "Call-ID");
2490 add_header(req, "CSeq", tmp);
2492 add_header(req, "User-Agent", "Asterisk PBX");
2496 static int __transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2498 struct sip_request resp;
2500 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2501 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2504 respprep(&resp, p, msg, req);
2505 add_header(&resp, "Content-Length", "0");
2506 add_blank_header(&resp);
2507 return send_response(p, &resp, reliable, seqno);
2510 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req)
2512 return __transmit_response(p, msg, req, 0);
2514 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req)
2516 return __transmit_response(p, msg, req, 1);
2519 static void append_date(struct sip_request *req)
2526 strftime(tmpdat, sizeof(tmpdat), "%a, %d %b %Y %T GMT", &tm);
2527 add_header(req, "Date", tmpdat);
2530 static int transmit_response_with_date(struct sip_pvt *p, char *msg, struct sip_request *req)
2532 struct sip_request resp;
2533 respprep(&resp, p, msg, req);
2535 add_header(&resp, "Content-Length", "0");
2536 add_blank_header(&resp);
2537 return send_response(p, &resp, 0, 0);
2540 static int transmit_response_with_allow(struct sip_pvt *p, char *msg, struct sip_request *req)
2542 struct sip_request resp;
2543 respprep(&resp, p, msg, req);
2544 add_header(&resp, "Accept", "application/sdp");
2545 add_header(&resp, "Content-Length", "0");
2546 add_blank_header(&resp);
2547 return send_response(p, &resp, 0, 0);
2550 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *randdata, int reliable)
2552 struct sip_request resp;
2555 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2556 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2559 snprintf(tmp, sizeof(tmp), "Digest realm=\"asterisk\", nonce=\"%s\"", randdata);
2560 respprep(&resp, p, msg, req);
2561 add_header(&resp, "Proxy-Authenticate", tmp);
2562 add_header(&resp, "Content-Length", "0");
2563 add_blank_header(&resp);
2564 return send_response(p, &resp, reliable, seqno);
2567 static int add_text(struct sip_request *req, char *text)
2569 /* XXX Convert \n's to \r\n's XXX */
2570 int len = strlen(text);
2572 snprintf(clen, sizeof(clen), "%d", len);
2573 add_header(req, "Content-Type", "text/plain");
2574 add_header(req, "Content-Length", clen);
2575 add_line(req, text);
2579 static int add_digit(struct sip_request *req, char digit)
2584 snprintf(tmp, sizeof(tmp), "Signal=%c\r\nDuration=250\r\n", digit);
2586 snprintf(clen, sizeof(clen), "%d", len);
2587 add_header(req, "Content-Type", "application/dtmf-relay");
2588 add_header(req, "Content-Length", clen);
2593 static int add_sdp(struct sip_request *resp, struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2597 int alreadysent = 0;
2599 struct sockaddr_in sin;
2600 struct sockaddr_in vsin;
2601 struct sip_codec_pref *cur;
2612 struct sockaddr_in dest;
2613 struct sockaddr_in vdest;
2614 /* XXX We break with the "recommendation" and send our IP, in order that our
2615 peer doesn't have to gethostbyname() us XXX */
2618 ast_log(LOG_WARNING, "No way to add SDP without an RTP structure\n");
2621 if (!p->sessionid) {
2622 p->sessionid = getpid();
2623 p->sessionversion = p->sessionid;
2625 p->sessionversion++;
2626 ast_rtp_get_us(p->rtp, &sin);
2628 ast_rtp_get_us(p->vrtp, &vsin);
2630 if (p->redirip.sin_addr.s_addr) {
2631 dest.sin_port = p->redirip.sin_port;
2632 dest.sin_addr = p->redirip.sin_addr;
2634 ast_rtp_get_peer(rtp, &dest);
2636 dest.sin_addr = p->ourip;
2637 dest.sin_port = sin.sin_port;
2640 /* Determine video destination */
2642 if (p->vredirip.sin_addr.s_addr) {
2643 vdest.sin_port = p->vredirip.sin_port;
2644 vdest.sin_addr = p->vredirip.sin_addr;
2646 ast_rtp_get_peer(vrtp, &vdest);
2648 vdest.sin_addr = p->ourip;
2649 vdest.sin_port = vsin.sin_port;
2653 ast_verbose("We're at %s port %d\n", inet_ntoa(p->ourip), ntohs(sin.sin_port));
2654 if (sipdebug && p->vrtp)
2655 ast_verbose("Video is at %s port %d\n", inet_ntoa(p->ourip), ntohs(vsin.sin_port));
2656 snprintf(v, sizeof(v), "v=0\r\n");
2657 snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, inet_ntoa(dest.sin_addr));
2658 snprintf(s, sizeof(s), "s=session\r\n");
2659 snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", inet_ntoa(dest.sin_addr));
2660 snprintf(t, sizeof(t), "t=0 0\r\n");
2661 snprintf(m, sizeof(m), "m=audio %d RTP/AVP", ntohs(dest.sin_port));
2662 snprintf(m2, sizeof(m2), "m=video %d RTP/AVP", ntohs(vdest.sin_port));
2663 /* Start by sending our preferred codecs */
2666 if (p->jointcapability & cur->codec) {
2668 ast_verbose("Answering with preferred capability %d\n", cur->codec);
2669 codec = ast_rtp_lookup_code(p->rtp, 1, cur->codec);
2671 snprintf(costr, sizeof(costr), " %d", codec);
2672 if (cur->codec < AST_FORMAT_MAX_AUDIO) {
2673 strncat(m, costr, sizeof(m) - strlen(m));
2674 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2675 strncat(a, costr, sizeof(a));
2677 strncat(m2, costr, sizeof(m2) - strlen(m2));
2678 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2679 strncat(a2, costr, sizeof(a2));
2683 alreadysent |= cur->codec;
2686 /* Now send any other common codecs, and non-codec formats: */
2687 for (x = 1; x <= AST_FORMAT_MAX_AUDIO; x <<= 1) {
2688 if ((p->jointcapability & x) && !(alreadysent & x)) {
2690 ast_verbose("Answering with capability %d\n", x);
2691 codec = ast_rtp_lookup_code(p->rtp, 1, x);
2693 snprintf(costr, sizeof(costr), " %d", codec);
2694 if (x < AST_FORMAT_MAX_AUDIO) {
2695 strncat(m, costr, sizeof(m) - strlen(m));
2696 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2697 strncat(a, costr, sizeof(a) - strlen(a));
2699 strncat(m2, costr, sizeof(m2) - strlen(m2));
2700 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2701 strncat(a2, costr, sizeof(a2) - strlen(a2));
2706 for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
2707 if (p->noncodeccapability & x) {
2709 ast_verbose("Answering with non-codec capability %d\n", x);
2710 codec = ast_rtp_lookup_code(p->rtp, 0, x);
2712 snprintf(costr, sizeof(costr), " %d", codec);
2713 strncat(m, costr, sizeof(m) - strlen(m));
2714 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(0, x));
2715 strncat(a, costr, sizeof(a) - strlen(a));
2716 if (x == AST_RTP_DTMF) {
2717 /* Indicate we support DTMF... Not sure about 16, but MSN supports it so dang it, we will too... */
2718 snprintf(costr, sizeof costr, "a=fmtp:%d 0-16\r\n",
2720 strncat(a, costr, sizeof(a) - strlen(a));
2725 if (strlen(m) < sizeof(m) - 2)
2727 if (strlen(m2) < sizeof(m2) - 2)
2729 if ((sizeof(m) <= strlen(m) - 2) || (sizeof(m2) <= strlen(m2) - 2) || (sizeof(a) == strlen(a)) || (sizeof(a2) == strlen(a2)))
2730 ast_log(LOG_WARNING, "SIP SDP may be truncated due to undersized buffer!!\n");
2731 len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m) + strlen(a);
2733 len += strlen(m2) + strlen(a2);
2734 snprintf(costr, sizeof(costr), "%d", len);
2735 add_header(resp, "Content-Type", "application/sdp");
2736 add_header(resp, "Content-Length", costr);
2751 static void copy_request(struct sip_request *dst,struct sip_request *src)
2755 offset = ((void *)dst) - ((void *)src);
2756 /* First copy stuff */
2757 memcpy(dst, src, sizeof(*dst));
2758 /* Now fix pointer arithmetic */
2759 for (x=0;x<src->headers;x++)
2760 dst->header[x] += offset;
2761 for (x=0;x<src->lines;x++)
2762 dst->line[x] += offset;
2765 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans)
2767 struct sip_request resp;
2769 if (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1) {
2770 ast_log(LOG_WARNING, "Unable to get seqno from '%s'\n", get_header(req, "CSeq"));
2773 respprep(&resp, p, msg, req);
2774 add_sdp(&resp, p, NULL, NULL);
2775 return send_response(p, &resp, retrans, seqno);
2778 static int determine_firstline_parts( struct sip_request *req ) {
2783 cmd= req->header[0];
2784 while(*cmd && (*cmd < 33)) {
2791 while(*e && (*e > 32)) {
2794 /* Get the command */
2800 while( *e && ( *e < 33 ) ) {
2807 if ( !strcasecmp(cmd, "SIP/2.0") ) {
2808 /* We have a response */
2810 len= strlen( req->rlPart2 );
2811 if( len < 2 ) { return -1; }
2813 while( *e && *e<33 ) {
2818 /* We have a request */
2821 if( !*e ) { return -1; }
2824 if( ( e= strrchr( req->rlPart2, 'S' ) ) == NULL ) {
2827 while( isspace( *(--e) ) ) {}
2837 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2839 struct sip_request req;
2840 if (p->canreinvite == REINVITE_UPDATE)
2841 reqprep(&req, p, "UPDATE", 0);
2844 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
2845 reqprep(&req, p, "INVITE", 0);
2847 add_header(&req, "Allow", ALLOWED_METHODS);
2848 add_sdp(&req, p, rtp, vrtp);
2849 /* Use this as the basis */
2850 copy_request(&p->initreq, &req);
2852 determine_firstline_parts(&p->initreq);
2853 p->lastinvite = p->ocseq;
2855 return send_request(p, &req, 1, p->ocseq);
2858 static void extract_uri(struct sip_pvt *p, struct sip_request *req)
2860 char stripped[256]="";
2862 strncpy(stripped, get_header(req, "Contact"), sizeof(stripped) - 1);
2863 c = strchr(stripped, '<');
2875 strncpy(p->uri, c, sizeof(p->uri) - 1);
2878 static void build_contact(struct sip_pvt *p)
2880 /* Construct Contact: header */
2881 if (ourport != 5060)
2882 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s:%d>", p->exten, inet_ntoa(p->ourip), ourport);
2884 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s>", p->exten, inet_ntoa(p->ourip));
2887 static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, char *vxml_url)
2894 char *l = callerid, *n=NULL;
2896 snprintf(p->lastmsg, sizeof(p->lastmsg), "Init: %s", cmd);
2898 if (p->owner && p->owner->callerid) {
2899 strcpy(cid, p->owner->callerid);
2900 ast_callerid_parse(cid, &n, &l);
2902 ast_shrink_phone_number(l);
2903 if (!l || !ast_isphonenumber(l))
2906 /* if user want's his callerid restricted */
2908 l = CALLERID_UNKNOWN;
2909 if (!n || !strlen(n))
2911 /* Allow user to be overridden */
2912 if (strlen(p->fromuser))
2915 if ((ourport != 5060) && !strlen(p->fromdomain))
2916 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);
2918 snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=as%08x", n, l, strlen(p->fromdomain) ? p->fromdomain : inet_ntoa(p->ourip), p->tag);
2920 if (strlen(p->username)) {
2921 if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2922 snprintf(invite, sizeof(invite), "sip:%s@%s:%d",p->username, p->tohost, ntohs(p->sa.sin_port));
2924 snprintf(invite, sizeof(invite), "sip:%s@%s",p->username, p->tohost);
2926 } else if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2927 snprintf(invite, sizeof(invite), "sip:%s:%d", p->tohost, ntohs(p->sa.sin_port));
2929 snprintf(invite, sizeof(invite), "sip:%s", p->tohost);
2931 strncpy(p->uri, invite, sizeof(p->uri) - 1);
2932 /* If there is a VXML URL append it to the SIP URL */
2935 snprintf(to, sizeof(to), "<%s>;%s", invite, vxml_url);
2939 snprintf(to, sizeof(to), "<%s>", invite );
2941 memset(req, 0, sizeof(struct sip_request));
2942 init_req(req, cmd, invite);
2943 snprintf(tmp, sizeof(tmp), "%d %s", ++p->ocseq, cmd);
2945 add_header(req, "Via", p->via);
2946 /* SLD: FIXME?: do Route: here too? I think not cos this is the first request.
2947 * OTOH, then we won't have anything in p->route anyway */
2948 add_header(req, "From", from);
2949 strncpy(p->exten, l, sizeof(p->exten) - 1);
2951 add_header(req, "To", to);
2952 add_header(req, "Contact", p->our_contact);
2953 add_header(req, "Call-ID", p->callid);
2954 add_header(req, "CSeq", tmp);
2955 add_header(req, "User-Agent", "Asterisk PBX");
2958 static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, char *authheader, char *vxml_url, char *distinctive_ring, int init)
2960 struct sip_request req;
2963 initreqprep(&req, p, cmd, vxml_url);
2965 reqprep(&req, p, cmd, 0);
2968 add_header(&req, authheader, auth);
2970 if (!strcasecmp(cmd, "REFER")) {
2971 if (strlen(p->refer_to))
2972 add_header(&req, "Refer-To", p->refer_to);
2973 if (strlen(p->referred_by))
2974 add_header(&req, "Referred-By", p->referred_by);
2977 if (distinctive_ring)
2979 add_header(&req, "Alert-info",distinctive_ring);
2981 add_header(&req, "Allow", ALLOWED_METHODS);
2983 add_sdp(&req, p, NULL, NULL);
2985 add_header(&req, "Content-Length", "0");
2986 add_blank_header(&req);
2989 if (!p->initreq.headers) {
2990 /* Use this as the basis */
2991 copy_request(&p->initreq, &req);
2993 determine_firstline_parts(&p->initreq);
2995 p->lastinvite = p->ocseq;
2996 return send_request(p, &req, 1, p->ocseq);
2999 static int transmit_state_notify(struct sip_pvt *p, int state, int full)
3002 char from[256], to[256];
3005 struct sip_request req;
3008 strncpy(from, get_header(&p->initreq, "From"), sizeof(from)-1);
3010 c = ditch_braces(from);
3011 if (strncmp(c, "sip:", 4)) {
3012 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
3015 if ((a = strchr(c, ';'))) {
3020 reqprep(&req, p, "NOTIFY", 0);
3022 if (p->subscribed == 1) {
3023 strncpy(to, get_header(&p->initreq, "To"), sizeof(to)-1);
3025 c = ditch_braces(to);
3026 if (strncmp(c, "sip:", 4)) {
3027 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
3030 if ((a = strchr(c, ';'))) {
3035 add_header(&req, "Content-Type", "application/xpidf+xml");
3037 if ((state==AST_EXTENSION_UNAVAILABLE) || (state==AST_EXTENSION_BUSY))
3039 else if (state==AST_EXTENSION_INUSE)
3045 sprintf(t, "<?xml version=\"1.0\"?>\n");
3046 t = tmp + strlen(tmp);
3047 sprintf(t, "<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n");
3048 t = tmp + strlen(tmp);
3049 sprintf(t, "<presence>\n");
3050 t = tmp + strlen(tmp);
3051 sprintf(t, "<presentity uri=\"%s;method=SUBSCRIBE\" />\n", mfrom);
3052 t = tmp + strlen(tmp);
3053 sprintf(t, "<atom id=\"%s\">\n", p->exten);
3054 t = tmp + strlen(tmp);
3055 sprintf(t, "<address uri=\"%s;user=ip\" priority=\"0,800000\">\n", mto);
3056 t = tmp + strlen(tmp);
3057 sprintf(t, "<status status=\"%s\" />\n", !state ? "open" : (state==1) ? "inuse" : "closed");
3058 t = tmp + strlen(tmp);
3059 sprintf(t, "<msnsubstatus substatus=\"%s\" />\n", !state ? "online" : (state==1) ? "onthephone" : "offline");
3060 t = tmp + strlen(tmp);
3061 sprintf(t, "</address>\n</atom>\n</presence>\n");
3063 add_header(&req, "Event", "dialog");
3064 add_header(&req, "Content-Type", "application/dialog-info+xml");
3067 sprintf(t, "<?xml version=\"1.0\"?>\n");
3068 t = tmp + strlen(tmp);
3069 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);
3070 t = tmp + strlen(tmp);
3071 sprintf(t, "<dialog id=\"%s\">\n", p->exten);
3072 t = tmp + strlen(tmp);
3073 sprintf(t, "<state>%s</state>\n", state ? "confirmed" : "terminated");
3074 t = tmp + strlen(tmp);