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>
57 #ifdef SIP_MYSQL_FRIENDS
59 #include <mysql/mysql.h>
62 #define VIDEO_CODEC_MASK 0x1fc0000 // Video codecs from H.261 thru AST_FORMAT_MAX_VIDEO
64 #define IPTOS_MINCOST 0x02
67 /* #define VOCAL_DATA_HACK */
70 #define DEFAULT_DEFAULT_EXPIRY 120
71 #define DEFAULT_MAX_EXPIRY 3600
72 #define EXPIRY_GUARD_SECS 15
74 #define CALLERID_UNKNOWN "Unknown"
76 #define SIP_DTMF_RFC2833 (1 << 0)
77 #define SIP_DTMF_INBAND (1 << 1)
78 #define SIP_DTMF_INFO (1 << 2)
80 static int max_expiry = DEFAULT_MAX_EXPIRY;
81 static int default_expiry = DEFAULT_DEFAULT_EXPIRY;
83 #define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
84 #define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
85 #define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
87 #define DEFAULT_RETRANS 1000 /* How frequently to retransmit */
88 #define MAX_RETRANS 5 /* Try only 5 times for retransmissions */
91 static ast_mutex_t mysqllock = AST_MUTEX_INITIALIZER;
93 static char mydbuser[80];
94 static char mydbpass[80];
95 static char mydbhost[80];
96 static char mydbname[80];
99 static char *desc = "Session Initiation Protocol (SIP)";
100 static char *type = "SIP";
101 static char *tdesc = "Session Initiation Protocol (SIP)";
102 static char *config = "sip.conf";
104 #define DEFAULT_SIP_PORT 5060 /* From RFC 2543 */
105 #define SIP_MAX_PACKET 1500 /* Also from RFC 2543, should sub headers tho */
107 #define ALLOWED_METHODS "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER"
109 static char context[AST_MAX_EXTENSION] = "default";
111 static char language[MAX_LANGUAGE] = "";
113 static char callerid[AST_MAX_EXTENSION] = "asterisk";
115 static char fromdomain[AST_MAX_EXTENSION] = "";
117 static char notifymime[AST_MAX_EXTENSION] = "application/simple-message-summary";
119 static int srvlookup = 0;
121 static int pedanticsipchecking = 0;
123 static int autocreatepeer = 0;
125 static int usecnt =0;
126 static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
128 /* Protect the interface list (of sip_pvt's) */
129 static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
131 /* Protect the monitoring thread, so only one process can kill or start it, and not
132 when it's doing something critical. */
133 static ast_mutex_t netlock = AST_MUTEX_INITIALIZER;
135 static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
137 /* This is the thread for the monitor which checks for input on the channels
138 which are not currently in use. */
139 static pthread_t monitor_thread = AST_PTHREADT_NULL;
141 static int restart_monitor(void);
143 /* Codecs that we support by default: */
144 static int capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263;
145 static int noncodeccapability = AST_RTP_DTMF;
147 static char ourhost[256];
148 static struct in_addr __ourip;
151 static int sipdebug = 0;
155 static int videosupport = 0;
157 static int globaldtmfmode = SIP_DTMF_RFC2833;
160 static int expiry = 900;
162 static struct sched_context *sched;
163 static struct io_context *io;
164 /* The private structures of the sip channels are linked for
165 selecting outgoing channels */
167 #define SIP_MAX_HEADERS 64
168 #define SIP_MAX_LINES 64
172 #define DEC_OUT_USE 2
173 #define INC_OUT_USE 3
175 static struct sip_codec_pref {
177 struct sip_codec_pref *next;
181 char *rlPart1; /* SIP Method Name or "SIP/2.0" protocol version */
182 char *rlPart2; /* The Request URI or Response Status */
184 int headers; /* SIP Headers */
185 char *header[SIP_MAX_HEADERS];
186 int lines; /* SDP Content */
187 char *line[SIP_MAX_LINES];
188 char data[SIP_MAX_PACKET];
194 struct sip_route *next;
198 static struct sip_pvt {
199 ast_mutex_t lock; /* Channel private lock */
200 char callid[80]; /* Global CallID */
201 char randdata[80]; /* Random data */
202 unsigned int ocseq; /* Current outgoing seqno */
203 unsigned int icseq; /* Current incoming seqno */
204 unsigned int callgroup;
205 unsigned int pickupgroup;
206 int lastinvite; /* Last Cseq of invite */
207 int alreadygone; /* Whether or not we've already been destroyed by or peer */
208 int needdestroy; /* if we need to be destroyed */
209 int capability; /* Special capability */
210 int jointcapability; /* Supported capability at both ends */
211 int prefcodec; /* Preferred codec (outbound only) */
212 int noncodeccapability;
213 int outgoing; /* Outgoing or incoming call? */
214 int authtries; /* Times we've tried to authenticate */
215 int insecure; /* Don't check source port/ip */
216 int expiry; /* How long we take to expire */
217 int branch; /* One random number */
218 int canreinvite; /* Do we support reinvite */
219 int ringing; /* Have sent 180 ringing */
220 int progress; /* Have sent 183 message progress */
221 int tag; /* Another random number */
222 int nat; /* Whether to try to support NAT */
223 int sessionid; /* SDP Session ID */
224 int sessionversion; /* SDP Session Version */
225 struct sockaddr_in sa; /* Our peer */
226 struct sockaddr_in redirip; /* Where our RTP should be going if not to us */
227 struct sockaddr_in vredirip; /* Where our Video RTP should be going if not to us */
228 struct sockaddr_in recv; /* Received as */
229 struct in_addr ourip; /* Our IP */
230 struct ast_channel *owner; /* Who owns us */
231 char exten[AST_MAX_EXTENSION]; /* Extention where to start */
232 char refer_to[AST_MAX_EXTENSION]; /* Place to store REFER-TO extension */
233 char referred_by[AST_MAX_EXTENSION];/* Place to store REFERRED-BY extension */
234 char refer_contact[AST_MAX_EXTENSION];/* Place to store Contact info from a REFER extension */
235 struct sip_pvt *refer_call; /* Call we are referring */
236 struct sip_route *route; /* Head of linked list of routing steps (fm Record-Route) */
237 char remote_party_id[256];
239 char context[AST_MAX_EXTENSION];
240 char fromdomain[AST_MAX_EXTENSION]; /* Domain to show in the from field */
241 char fromuser[AST_MAX_EXTENSION]; /* Domain to show in the user field */
242 char tohost[AST_MAX_EXTENSION]; /* Host we should put in the "to" field */
243 char language[MAX_LANGUAGE];
244 char rdnis[256]; /* Referring DNIS */
245 char theirtag[256]; /* Their tag */
248 char uri[256]; /* Original requested URI */
249 char peersecret[256];
250 char peermd5secret[256];
251 char callerid[256]; /* Caller*ID */
252 int restrictcid; /* hide presentation from remote user */
254 char accountcode[20]; /* Account code */
255 char our_contact[256]; /* Our contact header */
256 char realm[256]; /* Authorization realm */
257 char nonce[256]; /* Authorization nonce */
258 char opaque[256]; /* Opaque nonsense */
259 char domain[256]; /* Authorization nonce */
260 char lastmsg[256]; /* Last Message sent/received */
261 int amaflags; /* AMA Flags */
262 int pendinginvite; /* Any pending invite */
263 int pendingbye; /* Need to send bye after we ack? */
264 int gotrefer; /* Got a refer? */
265 struct sip_request initreq; /* Initial request */
267 int maxtime; /* Max time for first response */
268 int initid; /* Auto-congest ID if appropriate */
269 int autokillid; /* Auto-kill ID */
278 struct sip_peer *peerpoke; /* If this calls is to poke a peer, which one */
279 struct sip_registry *registry; /* If this is a REGISTER call, to which registry */
280 struct ast_rtp *rtp; /* RTP Session */
281 struct ast_rtp *vrtp; /* Video RTP session */
282 struct sip_pkt *packets; /* Packets scheduled for re-transmission */
283 struct sip_pvt *next;
286 #define FLAG_RESPONSE (1 << 0)
287 #define FLAG_FATAL (1 << 1)
290 struct sip_pkt *next; /* Next packet */
291 int retrans; /* Retransmission number */
292 int seqno; /* Sequence number */
293 int flags; /* non-zero if this is a response packet (e.g. 200 OK) */
294 struct sip_pvt *owner; /* Owner call */
295 int retransid; /* Retransmission ID */
296 int packetlen; /* Length of packet */
301 /* Users who can access various contexts */
308 char accountcode[20];
309 char language[MAX_LANGUAGE];
310 unsigned int callgroup;
311 unsigned int pickupgroup;
325 struct sip_user *next;
332 char context[80]; /* JK02: peers need context too to allow parking etc */
338 char mailbox[AST_MAX_EXTENSION];
348 unsigned int callgroup;
349 unsigned int pickupgroup;
351 struct sockaddr_in addr;
355 struct sip_pvt *call; /* Call pointer */
356 int pokeexpire; /* When to expire poke */
357 int lastms; /* How long last response took (in ms), or -1 for no response */
358 int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
359 struct timeval ps; /* Ping send time */
361 struct sockaddr_in defaddr;
367 struct sip_peer *next;
370 static ast_mutex_t sip_reload_lock = AST_MUTEX_INITIALIZER;
371 static int sip_reloading = 0;
373 #define REG_STATE_UNREGISTERED 0
374 #define REG_STATE_REGSENT 1
375 #define REG_STATE_AUTHSENT 2
376 #define REG_STATE_REGISTERED 3
377 #define REG_STATE_REJECTED 4
378 #define REG_STATE_TIMEOUT 5
379 #define REG_STATE_NOAUTH 6
381 struct sip_registry {
382 struct sockaddr_in addr; /* Who we connect to for registration purposes */
383 char username[80]; /* Who we are registering as */
384 char authuser[80]; /* Who we *authenticate* as */
386 char secret[80]; /* Password or key name in []'s */
388 char contact[80]; /* Contact extension */
390 int expire; /* Sched ID of expiration */
391 int timeout; /* sched id of sip_reg_timeout */
392 int refresh; /* How often to refresh */
393 struct sip_pvt *call; /* create a sip_pvt structure for each outbound "registration call" in progress */
395 int callid_valid; /* 0 means we haven't chosen callid for this registry yet. */
396 char callid[80]; /* Global CallID for this registry */
397 unsigned int ocseq; /* Sequence number we got to for REGISTERs for this registry */
398 struct sockaddr_in us; /* Who the server thinks we are */
399 struct sip_registry *next;
402 static struct ast_user_list {
403 struct sip_user *users;
405 } userl = { NULL, AST_MUTEX_INITIALIZER };
407 static struct ast_peer_list {
408 struct sip_peer *peers;
410 } peerl = { NULL, AST_MUTEX_INITIALIZER };
412 static struct ast_register_list {
413 struct sip_registry *registrations;
416 } regl = { NULL, AST_MUTEX_INITIALIZER };
419 #define REINVITE_INVITE 1
420 #define REINVITE_UPDATE 2
422 static int __sip_do_register(struct sip_registry *r);
424 static int sipsock = -1;
425 static int globalnat = 0;
426 static int globalcanreinvite = REINVITE_INVITE;
429 static struct sockaddr_in bindaddr;
430 static struct sockaddr_in localnet;
431 static struct sockaddr_in localmask;
432 static struct sockaddr_in externip;
434 static struct ast_frame *sip_read(struct ast_channel *ast);
435 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req);
436 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
437 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *rand, int reliable);
438 static int transmit_request(struct sip_pvt *p, char *msg, int inc, int reliable, int newbranch);
439 static int transmit_request_with_auth(struct sip_pvt *p, char *msg, int inc, int reliable, int newbranch);
440 static int transmit_invite(struct sip_pvt *p, char *msg, int sendsdp, char *auth, char *authheader, char *vxml_url,char *distinctive_ring, int init);
441 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp);
442 static int transmit_info_with_digit(struct sip_pvt *p, char digit);
443 static int transmit_message_with_text(struct sip_pvt *p, char *text);
444 static int transmit_refer(struct sip_pvt *p, char *dest);
445 static struct sip_peer *temp_peer(char *name);
446 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req, char *header, char *respheader, char *msg, int init);
447 // static char *getsipuri(char *header);
448 static void free_old_route(struct sip_route *route);
449 static int build_reply_digest(struct sip_pvt *p, char *orig_header, char *digest, int digest_len);
450 static int find_user(struct sip_pvt *fup, int event);
451 static void prune_peers(void);
452 static int sip_do_reload(void);
454 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
458 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->recv, sizeof(struct sockaddr_in));
460 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->sa, sizeof(struct sockaddr_in));
462 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));
467 static void sip_destroy(struct sip_pvt *p);
469 static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
472 check to see if them is contained in our localnet/mask,
473 if not, use our externip for us, otherwise use the
474 real internal address in bindaddr
476 if (localnet.sin_addr.s_addr && externip.sin_addr.s_addr &&
477 ((htonl(them->s_addr) & htonl(localnet.sin_addr.s_addr)) != htonl(localnet.sin_addr.s_addr)))
478 memcpy(us, &externip.sin_addr, sizeof(struct in_addr));
479 else if (bindaddr.sin_addr.s_addr)
480 memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr));
482 return ast_ouraddrfor(them, us);
486 static int retrans_pkt(void *data)
488 struct sip_pkt *pkt=data;
490 ast_mutex_lock(&pkt->owner->lock);
491 if (pkt->retrans < MAX_RETRANS) {
495 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));
497 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));
499 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
502 ast_log(LOG_WARNING, "Maximum retries exceeded on call %s for seqno %d (%s %s)\n", pkt->owner->callid, pkt->seqno, (pkt->flags & FLAG_FATAL) ? "Critical" : "Non-critical", (pkt->flags & FLAG_RESPONSE) ? "Response" : "Request");
504 if (pkt->flags & FLAG_FATAL) {
505 while(pkt->owner->owner && ast_mutex_trylock(&pkt->owner->owner->lock)) {
506 ast_mutex_unlock(&pkt->owner->lock);
508 ast_mutex_lock(&pkt->owner->lock);
510 if (pkt->owner->owner) {
511 /* XXX Potential deadlocK?? XXX */
512 ast_queue_hangup(pkt->owner->owner, 0);
513 ast_mutex_unlock(&pkt->owner->owner->lock);
515 /* If no owner, destroy now */
516 pkt->owner->needdestroy = 1;
519 /* Okay, it's not fatal, just continue. XXX If we were nice, we'd free it now, rather than wait for the
520 end of the call XXX */
524 ast_mutex_unlock(&pkt->owner->lock);
528 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len, int fatal)
531 pkt = malloc(sizeof(struct sip_pkt) + len);
534 memset(pkt, 0, sizeof(struct sip_pkt));
535 memcpy(pkt->data, data, len);
536 pkt->packetlen = len;
537 pkt->next = p->packets;
542 pkt->flags |= FLAG_FATAL;
543 /* Schedule retransmission */
544 pkt->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, pkt);
545 pkt->next = p->packets;
547 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
548 if (!strncasecmp(pkt->data, "INVITE", 6)) {
549 /* Note this is a pending invite */
550 p->pendinginvite = seqno;
555 static int __sip_autodestruct(void *data)
557 struct sip_pvt *p = data;
559 ast_log(LOG_DEBUG, "Auto destroying call '%s'\n", p->callid);
561 ast_log(LOG_WARNING, "Autodestruct on call '%s' with owner in place\n", p->callid);
562 ast_queue_hangup(p->owner, 0);
569 static int sip_scheddestroy(struct sip_pvt *p, int ms)
572 ast_verbose("Scheduling destruction of call '%s' in %d ms\n", p->callid, ms);
573 if (p->autokillid > -1)
574 ast_sched_del(sched, p->autokillid);
575 p->autokillid = ast_sched_add(sched, ms, __sip_autodestruct, p);
579 static int sip_cancel_destroy(struct sip_pvt *p)
581 if (p->autokillid > -1)
582 ast_sched_del(sched, p->autokillid);
587 static int __sip_ack(struct sip_pvt *p, int seqno, int resp)
589 struct sip_pkt *cur, *prev = NULL;
594 if ((cur->seqno == seqno) && ((cur->flags & FLAG_RESPONSE) == resp)) {
595 if (!resp && (seqno == p->pendinginvite)) {
596 ast_log(LOG_DEBUG, "Acked pending invite %d\n", p->pendinginvite);
597 p->pendinginvite = 0;
600 /* this is our baby */
602 prev->next = cur->next;
604 p->packets = cur->next;
605 if (cur->retransid > -1)
606 ast_sched_del(sched, cur->retransid);
614 ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
618 static int __sip_semi_ack(struct sip_pvt *p, int seqno, int resp)
624 if ((cur->seqno == seqno) && ((cur->flags & FLAG_RESPONSE) == resp)) {
625 /* this is our baby */
626 if (cur->retransid > -1)
627 ast_sched_del(sched, cur->retransid);
634 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");
638 static int send_response(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
643 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));
645 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));
648 res = __sip_reliable_xmit(p, seqno, 1, req->data, req->len, (reliable > 1));
650 res = __sip_xmit(p, req->data, req->len);
656 static int send_request(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
661 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));
663 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));
666 res = __sip_reliable_xmit(p, seqno, 0, req->data, req->len, (reliable > 1));
668 res = __sip_xmit(p, req->data, req->len);
672 static char *ditch_braces(char *tmp)
676 if ((n = strchr(tmp, '<')) ) {
678 while(*c && *c != '>') c++;
680 ast_log(LOG_WARNING, "No closing brace in '%s'\n", tmp);
689 static int sip_sendtext(struct ast_channel *ast, char *text)
691 struct sip_pvt *p = ast->pvt->pvt;
693 ast_verbose("Sending text %s on %s\n", text, ast->name);
696 if (!text || !strlen(text))
699 ast_verbose("Really sending text %s on %s\n", text, ast->name);
700 transmit_message_with_text(p, text);
706 static void mysql_update_peer(char *peer, struct sockaddr_in *sin, char *username, int expiry)
708 if (mysql && (strlen(peer) < 128)) {
713 name = alloca(strlen(peer) * 2 + 1);
714 uname = alloca(strlen(username) * 2 + 1);
716 mysql_real_escape_string(mysql, name, peer, strlen(peer));
717 mysql_real_escape_string(mysql, uname, username, strlen(username));
718 snprintf(query, sizeof(query), "UPDATE sipfriends SET ipaddr=\"%s\", port=\"%d\", regseconds=\"%ld\", username=\"%s\" WHERE name=\"%s\"",
719 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), nowtime + expiry, uname, name);
720 ast_mutex_lock(&mysqllock);
721 if (mysql_real_query(mysql, query, strlen(query)))
722 ast_log(LOG_WARNING, "Unable to update database\n");
724 ast_mutex_unlock(&mysqllock);
728 static struct sip_peer *mysql_peer(char *peer, struct sockaddr_in *sin)
733 p = malloc(sizeof(struct sip_peer));
734 memset(p, 0, sizeof(struct sip_peer));
735 if (mysql && (!peer || (strlen(peer) < 128))) {
740 time_t regseconds, nowtime;
745 name = alloca(strlen(peer) * 2 + 1);
746 mysql_real_escape_string(mysql, name, peer, strlen(peer));
749 snprintf(query, sizeof(query), "SELECT * FROM sipfriends WHERE ipaddr=\"%s\" AND port=\"%d\"", inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
751 snprintf(query, sizeof(query), "SELECT * FROM sipfriends WHERE name=\"%s\"", name);
752 ast_mutex_lock(&mysqllock);
753 mysql_query(mysql, query);
754 if ((result = mysql_store_result(mysql))) {
755 if ((rowval = mysql_fetch_row(result))) {
756 numfields = mysql_num_fields(result);
757 fields = mysql_fetch_fields(result);
759 for (x=0;x<numfields;x++) {
761 if (!strcasecmp(fields[x].name, "secret")) {
762 strncpy(p->secret, rowval[x], sizeof(p->secret));
763 } else if (!strcasecmp(fields[x].name, "name")) {
764 strncpy(p->name, rowval[x], sizeof(p->name) - 1);
765 } else if (!strcasecmp(fields[x].name, "context")) {
766 strncpy(p->context, rowval[x], sizeof(p->context) - 1);
767 } else if (!strcasecmp(fields[x].name, "username")) {
768 strncpy(p->username, rowval[x], sizeof(p->username) - 1);
769 } else if (!strcasecmp(fields[x].name, "ipaddr")) {
770 inet_aton(rowval[x], &p->addr.sin_addr);
771 } else if (!strcasecmp(fields[x].name, "port")) {
772 if (sscanf(rowval[x], "%i", &port) != 1)
774 p->addr.sin_port = htons(port);
775 } else if (!strcasecmp(fields[x].name, "regseconds")) {
776 if (sscanf(rowval[x], "%li", ®seconds) != 1)
782 if (nowtime > regseconds)
783 memset(&p->addr, 0, sizeof(p->addr));
785 mysql_free_result(result);
788 ast_mutex_unlock(&mysqllock);
795 p->capability = capability;
797 p->dtmfmode = globaldtmfmode;
805 #endif /* MYSQL_FRIENDS */
807 static int create_addr(struct sip_pvt *r, char *peer)
814 char host[256], *hostn;
816 r->sa.sin_family = AF_INET;
817 ast_mutex_lock(&peerl.lock);
820 if (!strcasecmp(p->name, peer))
826 p = mysql_peer(peer, NULL);
831 r->capability = p->capability;
834 ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", r->nat);
835 ast_rtp_setnat(r->rtp, r->nat);
838 ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", r->nat);
839 ast_rtp_setnat(r->vrtp, r->nat);
841 strncpy(r->peername, p->username, sizeof(r->peername)-1);
842 strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1);
843 strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1);
844 strncpy(r->username, p->username, sizeof(r->username)-1);
845 strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1);
846 if (!strlen(r->tohost)) {
847 if (p->addr.sin_addr.s_addr)
848 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->addr.sin_addr));
850 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->defaddr.sin_addr));
852 if (strlen(p->fromdomain))
853 strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1);
854 if (strlen(p->fromuser))
855 strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1);
856 r->insecure = p->insecure;
857 r->canreinvite = p->canreinvite;
858 r->maxtime = p->maxms;
859 r->callgroup = p->callgroup;
860 r->pickupgroup = p->pickupgroup;
862 r->dtmfmode = p->dtmfmode;
863 if (r->dtmfmode & SIP_DTMF_RFC2833)
864 r->noncodeccapability |= AST_RTP_DTMF;
866 r->noncodeccapability &= ~AST_RTP_DTMF;
868 strncpy(r->context, p->context,sizeof(r->context)-1);
869 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
870 (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) {
871 if (p->addr.sin_addr.s_addr) {
872 r->sa.sin_addr = p->addr.sin_addr;
873 r->sa.sin_port = p->addr.sin_port;
875 r->sa.sin_addr = p->defaddr.sin_addr;
876 r->sa.sin_port = p->defaddr.sin_port;
878 memcpy(&r->recv, &r->sa, sizeof(r->recv));
885 ast_mutex_unlock(&peerl.lock);
887 if ((port=strchr(peer, ':'))) {
895 portno = DEFAULT_SIP_PORT;
900 snprintf(service, sizeof(service), "_sip._udp.%s", peer);
901 ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service);
907 hp = gethostbyname(hostn);
909 strncpy(r->tohost, peer, sizeof(r->tohost) - 1);
910 memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr));
911 r->sa.sin_port = htons(portno);
912 memcpy(&r->recv, &r->sa, sizeof(r->recv));
915 ast_log(LOG_WARNING, "No such host: %s\n", peer);
927 static int auto_congest(void *nothing)
929 struct sip_pvt *p = nothing;
930 ast_mutex_lock(&p->lock);
933 if (!ast_mutex_trylock(&p->owner->lock)) {
934 ast_log(LOG_NOTICE, "Auto-congesting %s\n", p->owner->name);
935 ast_queue_control(p->owner, AST_CONTROL_CONGESTION, 0);
936 ast_mutex_unlock(&p->owner->lock);
939 ast_mutex_unlock(&p->lock);
943 static void sip_prefs_free(void)
945 struct sip_codec_pref *cur, *next;
955 static void sip_pref_remove(int format)
957 struct sip_codec_pref *cur, *prev=NULL;
960 if (cur->codec == format) {
962 prev->next = cur->next;
973 static int sip_pref_append(int format)
975 struct sip_codec_pref *cur, *tmp;
976 sip_pref_remove(format);
977 tmp = (struct sip_codec_pref *)malloc(sizeof(struct sip_codec_pref));
980 memset(tmp, 0, sizeof(struct sip_codec_pref));
992 static int sip_codec_choose(int formats)
994 struct sip_codec_pref *cur;
995 formats &= ((AST_FORMAT_MAX_AUDIO << 1) - 1);
998 if (formats & cur->codec)
1002 return ast_best_codec(formats);
1005 static int sip_call(struct ast_channel *ast, char *dest, int timeout)
1009 char *vxml_url = NULL;
1010 char *distinctive_ring = NULL;
1011 struct varshead *headp;
1012 struct ast_var_t *current;
1015 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
1016 ast_log(LOG_WARNING, "sip_call called on %s, neither down nor reserved\n", ast->name);
1019 /* Check whether there is vxml_url, distinctive ring variables */
1021 headp=&ast->varshead;
1022 AST_LIST_TRAVERSE(headp,current,entries) {
1023 /* Check whether there is a VXML_URL variable */
1024 if (strcasecmp(ast_var_name(current),"VXML_URL")==0)
1026 vxml_url = ast_var_value(current);
1029 /* Check whether there is a ALERT_INFO variable */
1030 if (strcasecmp(ast_var_name(current),"ALERT_INFO")==0)
1032 distinctive_ring = ast_var_value(current);
1039 ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
1040 res = find_user(p,INC_OUT_USE);
1042 p->restrictcid = ast->restrictcid;
1043 p->jointcapability = p->capability;
1044 transmit_invite(p, "INVITE", 1, NULL, NULL, vxml_url,distinctive_ring, 1);
1046 /* Initialize auto-congest time */
1047 p->initid = ast_sched_add(sched, p->maxtime * 4, auto_congest, p);
1053 static void __sip_destroy(struct sip_pvt *p, int lockowner)
1055 struct sip_pvt *cur, *prev = NULL;
1058 ast_verbose("Destroying call '%s'\n", p->callid);
1059 if (p->stateid > -1)
1060 ast_extension_state_del(p->stateid, NULL);
1062 ast_sched_del(sched, p->initid);
1063 if (p->autokillid > -1)
1064 ast_sched_del(sched, p->autokillid);
1067 ast_rtp_destroy(p->rtp);
1070 ast_rtp_destroy(p->vrtp);
1073 free_old_route(p->route);
1077 /* Carefully unlink from registry */
1078 struct sip_registry *reg;
1079 ast_mutex_lock(®l.lock);
1080 reg = regl.registrations;
1082 if ((reg == p->registry) && (p->registry->call == p))
1083 p->registry->call=NULL;
1086 ast_mutex_unlock(®l.lock);
1088 /* Unlink us from the owner if we have one */
1091 ast_mutex_lock(&p->owner->lock);
1092 ast_log(LOG_DEBUG, "Detaching from %s\n", p->owner->name);
1093 p->owner->pvt->pvt = NULL;
1095 ast_mutex_unlock(&p->owner->lock);
1101 prev->next = cur->next;
1110 ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
1113 ast_sched_del(sched, p->initid);
1114 while((cp = p->packets)) {
1115 p->packets = p->packets->next;
1116 if (cp->retransid > -1)
1117 ast_sched_del(sched, cp->retransid);
1124 static int find_user(struct sip_pvt *fup, int event)
1126 char name[256] = "";
1128 strncpy(name, fup->username, sizeof(name) - 1);
1129 ast_mutex_lock(&userl.lock);
1132 if (!strcasecmp(u->name, name)) {
1138 ast_log(LOG_DEBUG, "%s is not a local user\n", name);
1139 ast_mutex_unlock(&userl.lock);
1143 /* incoming and outgoing affects the inUse counter */
1146 if ( u->inUse > 0 ) {
1154 if (u->incominglimit > 0 ) {
1155 if (u->inUse >= u->incominglimit) {
1156 ast_log(LOG_ERROR, "Call from user '%s' rejected due to usage limit of %d\n", u->name, u->incominglimit);
1157 ast_mutex_unlock(&userl.lock);
1158 /* inc inUse as well */
1159 if ( event == INC_OUT_USE ) {
1166 ast_log(LOG_DEBUG, "Call from user '%s' is %d out of %d\n", u->name, u->inUse, u->incominglimit);
1168 /* we don't use these anymore
1170 if ( u->outUse > 0 ) {
1177 if ( u->outgoinglimit > 0 ) {
1178 if ( u->outUse >= u->outgoinglimit ) {
1179 ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
1180 ast_mutex_unlock(&userl.lock);
1188 ast_log(LOG_ERROR, "find_user(%s,%d) called with no event!\n",u->name,event);
1190 ast_mutex_unlock(&userl.lock);
1194 static void sip_destroy(struct sip_pvt *p)
1196 ast_mutex_lock(&iflock);
1197 __sip_destroy(p, 1);
1198 ast_mutex_unlock(&iflock);
1201 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req, int fatal);
1203 static int hangup_sip2cause(int cause)
1208 return AST_CAUSE_BUSY;
1210 return AST_CAUSE_NORMAL;
1216 static char *hangup_cause2sip(int cause)
1220 case AST_CAUSE_BUSY:
1229 static int sip_hangup(struct ast_channel *ast)
1231 struct sip_pvt *p = ast->pvt->pvt;
1233 int needdestroy = 0;
1235 ast_log(LOG_DEBUG, "sip_hangup(%s)\n", ast->name);
1236 if (!ast->pvt->pvt) {
1237 ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
1240 ast_mutex_lock(&p->lock);
1241 if ( p->outgoing ) {
1242 ast_log(LOG_DEBUG, "find_user(%s) - decrement outUse counter\n", p->username);
1243 find_user(p, DEC_OUT_USE);
1245 ast_log(LOG_DEBUG, "find_user(%s) - decrement inUse counter\n", p->username);
1246 find_user(p, DEC_IN_USE);
1248 /* Determine how to disconnect */
1249 if (p->owner != ast) {
1250 ast_log(LOG_WARNING, "Huh? We aren't the owner?\n");
1251 ast_mutex_unlock(&p->lock);
1254 if (!ast || (ast->_state != AST_STATE_UP))
1259 ast_dsp_free(p->vad);
1262 ast->pvt->pvt = NULL;
1264 ast_mutex_lock(&usecnt_lock);
1266 ast_mutex_unlock(&usecnt_lock);
1267 ast_update_use_count();
1270 /* Start the process if it's not already started */
1271 if (!p->alreadygone && strlen(p->initreq.data)) {
1274 transmit_request_with_auth(p, "CANCEL", p->ocseq, 1, 0);
1275 /* Actually don't destroy us yet, wait for the 487 on our original
1276 INVITE, but do set an autodestruct just in case. */
1278 sip_scheddestroy(p, 15000);
1279 if ( p->initid != -1 ) {
1280 /* channel still up - reverse dec of inUse counter
1281 only if the channel is not auto-congested */
1282 if ( p->outgoing ) {
1283 find_user(p, INC_OUT_USE);
1286 find_user(p, INC_IN_USE);
1291 if (ast->hangupcause && ((res = hangup_cause2sip(ast->hangupcause)))) {
1292 transmit_response_reliable(p, res, &p->initreq, 1);
1294 transmit_response_reliable(p, "403 Forbidden", &p->initreq, 1);
1297 if (!p->pendinginvite) {
1299 transmit_request_with_auth(p, "BYE", 0, 1, 1);
1301 /* Note we will need a BYE when this all settles out
1302 but we can't send one while we have "INVITE" outstanding. */
1307 p->needdestroy = needdestroy;
1308 ast_mutex_unlock(&p->lock);
1312 static int sip_answer(struct ast_channel *ast)
1316 struct sip_pvt *p = ast->pvt->pvt;
1319 if (ast->_state != AST_STATE_UP) {
1323 codec=pbx_builtin_getvar_helper(p->owner,"SIP_CODEC");
1325 fmt=ast_getformatbyname(codec);
1327 ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
1328 p->jointcapability=fmt;
1329 } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n",codec);
1332 ast_setstate(ast, AST_STATE_UP);
1334 ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
1335 res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
1340 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
1342 struct sip_pvt *p = ast->pvt->pvt;
1344 if (frame->frametype == AST_FRAME_VOICE) {
1345 if (!(frame->subclass & ast->nativeformats)) {
1346 ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
1347 frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
1351 ast_mutex_lock(&p->lock);
1353 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1354 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1357 res = ast_rtp_write(p->rtp, frame);
1359 ast_mutex_unlock(&p->lock);
1361 } else if (frame->frametype == AST_FRAME_VIDEO) {
1363 ast_mutex_lock(&p->lock);
1365 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1366 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1369 res = ast_rtp_write(p->vrtp, frame);
1371 ast_mutex_unlock(&p->lock);
1373 } else if (frame->frametype == AST_FRAME_IMAGE) {
1376 ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", frame->frametype);
1383 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, int needlock)
1385 struct sip_pvt *p = newchan->pvt->pvt;
1387 ast_mutex_lock(&p->lock);
1388 if (p->owner != oldchan) {
1389 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
1391 ast_mutex_unlock(&p->lock);
1396 ast_mutex_unlock(&p->lock);
1400 static int sip_senddigit(struct ast_channel *ast, char digit)
1402 struct sip_pvt *p = ast->pvt->pvt;
1403 if (p && (p->dtmfmode & SIP_DTMF_INFO)) {
1404 transmit_info_with_digit(p, digit);
1406 if (p && p->rtp && (p->dtmfmode & SIP_DTMF_RFC2833)) {
1407 ast_rtp_senddigit(p->rtp, digit);
1409 /* If in-band DTMF is desired, send that */
1410 if (p->dtmfmode & SIP_DTMF_INBAND)
1415 static int sip_transfer(struct ast_channel *ast, char *dest)
1417 struct sip_pvt *p = ast->pvt->pvt;
1419 res = transmit_refer(p, dest);
1423 static int sip_indicate(struct ast_channel *ast, int condition)
1425 struct sip_pvt *p = ast->pvt->pvt;
1427 case AST_CONTROL_RINGING:
1428 if (ast->_state == AST_STATE_RING) {
1430 transmit_response(p, "180 Ringing", &p->initreq);
1434 /* Oops, we've sent progress tones. Let Asterisk do it instead */
1438 case AST_CONTROL_BUSY:
1439 if (ast->_state != AST_STATE_UP) {
1440 transmit_response(p, "486 Busy Here", &p->initreq);
1442 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1446 case AST_CONTROL_CONGESTION:
1447 if (ast->_state != AST_STATE_UP) {
1448 transmit_response(p, "503 Service Unavailable", &p->initreq);
1450 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1454 case AST_CONTROL_PROGRESS:
1455 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1456 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1464 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
1472 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
1474 struct ast_channel *tmp;
1476 tmp = ast_channel_alloc(1);
1478 /* Select our native format based on codec preference until we receive
1479 something from another device to the contrary. */
1480 if (i->jointcapability)
1481 tmp->nativeformats = sip_codec_choose(i->jointcapability);
1482 else if (i->capability)
1483 tmp->nativeformats = sip_codec_choose(i->capability);
1485 tmp->nativeformats = sip_codec_choose(capability);
1486 fmt = ast_best_codec(tmp->nativeformats);
1488 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
1490 if (strchr(i->fromdomain,':'))
1492 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(i));
1496 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(i));
1499 if (i->dtmfmode & SIP_DTMF_INBAND) {
1500 i->vad = ast_dsp_new();
1501 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
1503 tmp->fds[0] = ast_rtp_fd(i->rtp);
1504 tmp->fds[1] = ast_rtcp_fd(i->rtp);
1506 tmp->fds[2] = ast_rtp_fd(i->vrtp);
1507 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
1509 ast_setstate(tmp, state);
1510 if (state == AST_STATE_RING)
1512 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
1513 tmp->writeformat = fmt;
1514 tmp->pvt->rawwriteformat = fmt;
1515 tmp->readformat = fmt;
1516 tmp->pvt->rawreadformat = fmt;
1518 tmp->pvt->send_text = sip_sendtext;
1519 tmp->pvt->call = sip_call;
1520 tmp->pvt->hangup = sip_hangup;
1521 tmp->pvt->answer = sip_answer;
1522 tmp->pvt->read = sip_read;
1523 tmp->pvt->write = sip_write;
1524 tmp->pvt->write_video = sip_write;
1525 tmp->pvt->indicate = sip_indicate;
1526 tmp->pvt->transfer = sip_transfer;
1527 tmp->pvt->fixup = sip_fixup;
1528 tmp->pvt->send_digit = sip_senddigit;
1530 tmp->pvt->bridge = ast_rtp_bridge;
1532 tmp->callgroup = i->callgroup;
1533 tmp->pickupgroup = i->pickupgroup;
1534 tmp->restrictcid = i->restrictcid;
1535 if (strlen(i->accountcode))
1536 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
1538 tmp->amaflags = i->amaflags;
1539 if (strlen(i->language))
1540 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
1542 ast_mutex_lock(&usecnt_lock);
1544 ast_mutex_unlock(&usecnt_lock);
1545 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
1546 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
1547 if (strlen(i->callerid))
1548 tmp->callerid = strdup(i->callerid);
1549 if (strlen(i->rdnis))
1550 tmp->rdnis = strdup(i->rdnis);
1551 if (strlen(i->exten) && strcmp(i->exten, "s"))
1552 tmp->dnid = strdup(i->exten);
1554 if (strlen(i->domain)) {
1555 pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
1558 if (state != AST_STATE_DOWN) {
1559 if (ast_pbx_start(tmp)) {
1560 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
1566 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
1570 static struct cfalias {
1574 { "Content-Type", "c" },
1575 { "Content-Encoding", "e" },
1579 { "Content-Length", "l" },
1585 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
1586 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
1587 char* r = line + nameLen + 1;
1588 while (*r && (*r < 33)) ++r;
1595 static char *get_sdp(struct sip_request *req, char *name) {
1597 int len = strlen(name);
1600 for (x=0; x<req->lines; x++) {
1601 r = get_sdp_by_line(req->line[x], name, len);
1602 if (r[0] != '\0') return r;
1607 static void sdpLineNum_iterator_init(int* iterator) {
1611 static char* get_sdp_iterate(int* iterator,
1612 struct sip_request *req, char *name) {
1613 int len = strlen(name);
1615 while (*iterator < req->lines) {
1616 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
1617 if (r[0] != '\0') return r;
1622 static char *__get_header(struct sip_request *req, char *name, int *start)
1625 int len = strlen(name);
1627 for (x=*start;x<req->headers;x++) {
1628 if (!strncasecmp(req->header[x], name, len) &&
1629 (req->header[x][len] == ':')) {
1630 r = req->header[x] + len + 1;
1631 while(*r && (*r < 33))
1638 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
1639 if (!strcasecmp(aliases[x].fullname, name))
1640 return __get_header(req, aliases[x].shortname, start);
1642 /* Don't return NULL, so get_header is always a valid pointer */
1646 static char *get_header(struct sip_request *req, char *name)
1649 return __get_header(req, name, &start);
1652 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
1654 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
1655 struct ast_frame *f;
1656 static struct ast_frame null_frame = { AST_FRAME_NULL, };
1659 f = ast_rtp_read(p->rtp);
1662 f = ast_rtcp_read(p->rtp);
1665 f = ast_rtp_read(p->vrtp);
1668 f = ast_rtcp_read(p->vrtp);
1673 /* Don't send RFC2833 if we're not supposed to */
1674 if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & SIP_DTMF_RFC2833))
1677 /* We already hold the channel lock */
1678 if (f->frametype == AST_FRAME_VOICE) {
1679 if (f->subclass != p->owner->nativeformats) {
1680 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
1681 p->owner->nativeformats = f->subclass;
1682 ast_set_read_format(p->owner, p->owner->readformat, 0);
1683 ast_set_write_format(p->owner, p->owner->writeformat, 0);
1685 if ((p->dtmfmode & SIP_DTMF_INBAND) && p->vad) {
1686 f = ast_dsp_process(p->owner,p->vad,f,0);
1693 static struct ast_frame *sip_read(struct ast_channel *ast)
1695 struct ast_frame *fr;
1696 struct sip_pvt *p = ast->pvt->pvt;
1697 ast_mutex_lock(&p->lock);
1698 fr = sip_rtp_read(ast, p);
1699 ast_mutex_unlock(&p->lock);
1703 static void build_callid(char *callid, int len, struct in_addr ourip)
1710 res = snprintf(callid, len, "%08x", val);
1714 /* It's not important that we really use our right IP here... */
1715 snprintf(callid, len, "@%s", inet_ntoa(ourip));
1718 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobalnat)
1722 p = malloc(sizeof(struct sip_pvt));
1725 /* Keep track of stuff */
1726 memset(p, 0, sizeof(struct sip_pvt));
1730 p->rtp = ast_rtp_new(sched, io, 1, 0);
1732 p->vrtp = ast_rtp_new(sched, io, 1, 0);
1736 /* Start with 101 instead of 1 */
1739 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
1743 ast_rtp_settos(p->rtp, tos);
1745 ast_rtp_settos(p->vrtp, tos);
1746 if (useglobalnat && sin) {
1747 /* Setup NAT structure according to global settings if we have an address */
1749 memcpy(&p->recv, sin, sizeof(p->recv));
1750 ast_rtp_setnat(p->rtp, p->nat);
1752 ast_rtp_setnat(p->vrtp, p->nat);
1754 ast_mutex_init(&p->lock);
1757 memcpy(&p->sa, sin, sizeof(p->sa));
1758 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
1759 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1761 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1763 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
1764 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
1766 build_callid(p->callid, sizeof(p->callid), p->ourip);
1768 strncpy(p->callid, callid, sizeof(p->callid) - 1);
1769 /* Assume reinvite OK and via INVITE */
1770 p->canreinvite = globalcanreinvite;
1771 p->dtmfmode = globaldtmfmode;
1772 p->capability = capability;
1773 if (p->dtmfmode & SIP_DTMF_RFC2833)
1774 p->noncodeccapability |= AST_RTP_DTMF;
1775 strncpy(p->context, context, sizeof(p->context) - 1);
1776 strncpy(p->fromdomain, fromdomain, sizeof(p->fromdomain) - 1);
1778 ast_mutex_lock(&iflock);
1781 ast_mutex_unlock(&iflock);
1783 ast_log(LOG_DEBUG, "Allocating new SIP call for %s\n", callid);
1787 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin)
1795 callid = get_header(req, "Call-ID");
1797 if (pedanticsipchecking) {
1798 /* In principle Call-ID's uniquely identify a call, however some vendors
1799 (i.e. Pingtel) send multiple calls with the same Call-ID and different
1800 tags in order to simplify billing. The RFC does state that we have to
1801 compare tags in addition to the call-id, but this generate substantially
1802 more overhead which is totally unnecessary for the vast majority of sane
1803 SIP implementations, and thus Asterisk does not enable this behavior
1804 by default. Short version: You'll need this option to support conferencing
1806 strncpy(tmp, req->header[0], sizeof(tmp) - 1);
1808 c = strchr(tmp, ' ');
1811 if (!strcasecmp(cmd, "SIP/2.0")) {
1817 strncpy(tmp, get_header(req, "From"), sizeof(tmp) - 1);
1819 strncpy(tmp, get_header(req, "To"), sizeof(tmp) - 1);
1820 tag = strstr(tmp, "tag=");
1823 c = strchr(tag, ';');
1830 if (!strlen(callid)) {
1831 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", inet_ntoa(sin->sin_addr));
1834 ast_mutex_lock(&iflock);
1837 if (!strcmp(p->callid, callid) &&
1838 (!pedanticsipchecking || !tag || !strlen(p->theirtag) || !strcmp(p->theirtag, tag))) {
1839 /* Found the call */
1840 ast_mutex_lock(&p->lock);
1841 ast_mutex_unlock(&iflock);
1846 ast_mutex_unlock(&iflock);
1847 p = sip_alloc(callid, sin, 1);
1849 ast_mutex_lock(&p->lock);
1853 static int sip_register(char *value, int lineno)
1855 struct sip_registry *reg;
1856 char copy[256] = "";
1857 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
1865 strncpy(copy, value, sizeof(copy)-1);
1868 hostname = strrchr(stringp, '@');
1873 if (!username || !strlen(username) || !hostname || !strlen(hostname)) {
1874 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d", lineno);
1878 username = strsep(&stringp, ":");
1880 secret = strsep(&stringp, ":");
1882 authuser = strsep(&stringp, ":");
1885 hostname = strsep(&stringp, "/");
1887 contact = strsep(&stringp, "/");
1888 if (!contact || !strlen(contact))
1891 hostname = strsep(&stringp, ":");
1892 porta = strsep(&stringp, ":");
1894 if (porta && !atoi(porta)) {
1895 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
1898 hp = gethostbyname(hostname);
1900 ast_log(LOG_WARNING, "Host '%s' not found at line %d\n", hostname, lineno);
1903 reg = malloc(sizeof(struct sip_registry));
1905 memset(reg, 0, sizeof(struct sip_registry));
1906 strncpy(reg->contact, contact, sizeof(reg->contact) - 1);
1908 strncpy(reg->username, username, sizeof(reg->username)-1);
1910 strncpy(reg->hostname, hostname, sizeof(reg->hostname)-1);
1912 strncpy(reg->authuser, authuser, sizeof(reg->authuser)-1);
1914 strncpy(reg->secret, secret, sizeof(reg->secret)-1);
1917 reg->refresh = default_expiry;
1918 reg->addr.sin_family = AF_INET;
1919 memcpy(®->addr.sin_addr, hp->h_addr, sizeof(®->addr.sin_addr));
1920 reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT);
1921 reg->callid_valid = 0;
1923 ast_mutex_lock(®l.lock);
1924 reg->next = regl.registrations;
1925 regl.registrations = reg;
1926 ast_mutex_unlock(®l.lock);
1928 ast_log(LOG_ERROR, "Out of memory\n");
1934 static void parse(struct sip_request *req)
1936 /* Divide fields by NULL's */
1941 /* First header starts immediately */
1945 /* We've got a new header */
1949 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
1951 if (!strlen(req->header[f])) {
1952 /* Line by itself means we're now in content */
1956 if (f >= SIP_MAX_HEADERS - 1) {
1957 ast_log(LOG_WARNING, "Too many SIP headers...\n");
1960 req->header[f] = c + 1;
1961 } else if (*c == '\r') {
1962 /* Ignore but eliminate \r's */
1967 /* Check for last header */
1968 if (strlen(req->header[f]))
1971 /* Now we process any mime content */
1976 /* We've got a new line */
1979 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
1981 if (f >= SIP_MAX_LINES - 1) {
1982 ast_log(LOG_WARNING, "Too many SDP lines...\n");
1985 req->line[f] = c + 1;
1986 } else if (*c == '\r') {
1987 /* Ignore and eliminate \r's */
1992 /* Check for last line */
1993 if (strlen(req->line[f]))
1997 ast_verbose("%d headers, %d lines\n", req->headers, req->lines);
1999 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
2002 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
2011 int peercapability, peernoncodeccapability;
2012 int vpeercapability=0, vpeernoncodeccapability=0;
2013 struct sockaddr_in sin;
2021 /* Get codec and RTP info from SDP */
2022 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
2023 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
2026 m = get_sdp(req, "m");
2027 c = get_sdp(req, "c");
2028 if (!strlen(m) || !strlen(c)) {
2029 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
2032 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2033 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
2036 /* XXX This could block for a long time, and block the main thread! XXX */
2037 hp = gethostbyname(host);
2039 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
2042 sdpLineNum_iterator_init(&iterator);
2043 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
2044 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) {
2046 // Scan through the RTP payload types specified in a "m=" line:
2047 ast_rtp_pt_clear(p->rtp);
2049 while(strlen(codecs)) {
2050 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2051 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2055 ast_verbose("Found audio format %s\n", ast_getformatname(codec));
2056 ast_rtp_set_m_type(p->rtp, codec);
2058 /* Skip over any whitespace */
2059 while(*codecs && (*codecs < 33)) codecs++;
2063 ast_rtp_pt_clear(p->vrtp); // Must be cleared in case no m=video line exists
2065 if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
2067 // Scan through the RTP payload types specified in a "m=" line:
2069 while(strlen(codecs)) {
2070 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2071 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2075 ast_verbose("Found video format %s\n", ast_getformatname(codec));
2076 ast_rtp_set_m_type(p->vrtp, codec);
2078 /* Skip over any whitespace */
2079 while(*codecs && (*codecs < 33)) codecs++;
2083 sin.sin_family = AF_INET;
2084 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
2085 /* Setup audio port number */
2086 sin.sin_port = htons(portno);
2087 if (p->rtp && sin.sin_port)
2088 ast_rtp_set_peer(p->rtp, &sin);
2089 /* Setup video port number */
2090 sin.sin_port = htons(vportno);
2091 if (p->vrtp && sin.sin_port)
2092 ast_rtp_set_peer(p->vrtp, &sin);
2094 printf("Peer RTP is at port %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
2096 // Next, scan through each "a=rtpmap:" line, noting each
2097 // specified RTP payload type (with corresponding MIME subtype):
2098 sdpLineNum_iterator_init(&iterator);
2099 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
2100 char* mimeSubtype = ast_strdupa(a); // ensures we have enough space
2101 if (!strcasecmp(a, "sendonly")) {
2105 if (!strcasecmp(a, "sendrecv")) {
2108 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
2110 ast_verbose("Found description format %s\n", mimeSubtype);
2111 // Note: should really look at the 'freq' and '#chans' params too
2112 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
2114 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
2117 // Now gather all of the codecs that were asked for:
2118 ast_rtp_get_current_formats(p->rtp,
2119 &peercapability, &peernoncodeccapability);
2121 ast_rtp_get_current_formats(p->vrtp,
2122 &vpeercapability, &vpeernoncodeccapability);
2123 p->jointcapability = p->capability & (peercapability | vpeercapability);
2124 p->noncodeccapability = noncodeccapability & (peernoncodeccapability | vpeernoncodeccapability);
2127 ast_verbose("Capabilities: us - %d, them - %d/%d, combined - %d\n",
2128 p->capability, peercapability, vpeercapability, p->jointcapability);
2129 ast_verbose("Non-codec capabilities: us - %d, them - %d, combined - %d\n",
2130 noncodeccapability, peernoncodeccapability,
2131 p->noncodeccapability);
2133 if (!p->jointcapability) {
2134 ast_log(LOG_WARNING, "No compatible codecs!\n");
2138 if (!(p->owner->nativeformats & p->jointcapability)) {
2139 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);
2140 p->owner->nativeformats = sip_codec_choose(p->jointcapability);
2141 ast_set_read_format(p->owner, p->owner->readformat, 0);
2142 ast_set_write_format(p->owner, p->owner->writeformat, 0);
2144 if (p->owner->bridge) {
2145 /* Turn on/off music on hold if we are holding/unholding */
2146 if (sin.sin_addr.s_addr && !sendonly) {
2147 ast_moh_stop(p->owner->bridge);
2149 ast_moh_start(p->owner->bridge, NULL);
2157 static int add_header(struct sip_request *req, char *var, char *value)
2159 if (req->len >= sizeof(req->data) - 4) {
2160 ast_log(LOG_WARNING, "Out of space, can't add anymore (%s:%s)\n", var, value);
2164 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2167 req->header[req->headers] = req->data + req->len;
2168 snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", var, value);
2169 req->len += strlen(req->header[req->headers]);
2170 if (req->headers < SIP_MAX_HEADERS)
2173 ast_log(LOG_WARNING, "Out of header space\n");
2179 static int add_blank_header(struct sip_request *req)
2181 if (req->len >= sizeof(req->data) - 4) {
2182 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2186 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2189 req->header[req->headers] = req->data + req->len;
2190 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "\r\n");
2191 req->len += strlen(req->header[req->headers]);
2192 if (req->headers < SIP_MAX_HEADERS)
2195 ast_log(LOG_WARNING, "Out of header space\n");
2201 static int add_line(struct sip_request *req, char *line)
2203 if (req->len >= sizeof(req->data) - 4) {
2204 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2208 /* Add extra empty return */
2209 snprintf(req->data + req->len, sizeof(req->data) - req->len, "\r\n");
2210 req->len += strlen(req->data + req->len);
2212 req->line[req->lines] = req->data + req->len;
2213 snprintf(req->line[req->lines], sizeof(req->data) - req->len, "%s", line);
2214 req->len += strlen(req->line[req->lines]);
2215 if (req->lines < SIP_MAX_LINES)
2218 ast_log(LOG_WARNING, "Out of line space\n");
2224 static int copy_header(struct sip_request *req, struct sip_request *orig, char *field)
2227 tmp = get_header(orig, field);
2229 /* Add what we're responding to */
2230 return add_header(req, field, tmp);
2232 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2236 static int copy_all_header(struct sip_request *req, struct sip_request *orig, char *field)
2242 tmp = __get_header(orig, field, &start);
2244 /* Add what we're responding to */
2245 add_header(req, field, tmp);
2250 return copied ? 0 : -1;
2253 static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct sip_request *orig, char *field)
2260 tmp = __get_header(orig, field, &start);
2262 if (!copied && p->nat) {
2263 #ifdef THE_SIP_AUTHORS_CAN_SUCK_MY_GONADS
2264 /* SLD: FIXME: Nice try, but the received= should not have a port */
2265 /* SLD: FIXME: See RFC2543 BNF in Section 6.40.5 */
2266 /* MAS: Yup, RFC says you can't do it. No way to indicate PAT...
2268 if (ntohs(p->recv.sin_port) != DEFAULT_SIP_PORT)
2269 snprintf(new, sizeof(new), "%s;received=%s:%d", tmp, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
2272 snprintf(new, sizeof(new), "%s;received=%s", tmp, inet_ntoa(p->recv.sin_addr));
2273 add_header(req, field, new);
2275 /* Add what we're responding to */
2276 add_header(req, field, tmp);
2283 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2289 /* Add Route: header into request per learned route */
2290 static void add_route(struct sip_request *req, struct sip_route *route)
2293 int n, rem = 255; /* sizeof(r)-1: Room for terminating 0 */
2299 n = strlen(route->hop);
2300 if ((n+3)>rem) break;
2306 strcpy(p, route->hop); p += n;
2309 route = route->next;
2312 add_header(req, "Route", r);
2315 static void set_destination(struct sip_pvt *p, char *uri)
2317 char *h, *maddr, hostname[256];
2321 /* Parse uri to h (host) and port - uri is already just the part inside the <> */
2322 /* general form we are expecting is sip[s]:username[:password]@host[:port][;...] */
2325 ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
2327 /* Find and parse hostname */
2328 h = strchr(uri, '@');
2333 if (strncmp(h, "sip:", 4) == 0)
2335 else if (strncmp(h, "sips:", 5) == 0)
2338 hn = strcspn(h, ":;>");
2340 strncpy(hostname, h, hn); hostname[hn] = '\0';
2343 /* Is "port" present? if not default to 5060 */
2347 port = strtol(h, &h, 10);
2352 /* Got the hostname:port - but maybe there's a "maddr=" to override address? */
2353 maddr = strstr(h, "maddr=");
2356 hn = strspn(maddr, "0123456789.");
2358 strncpy(hostname, maddr, hn); hostname[hn] = '\0';
2361 hp = gethostbyname(hostname);
2363 ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
2366 p->sa.sin_family = AF_INET;
2367 memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr));
2368 p->sa.sin_port = htons(port);
2370 ast_verbose("set_destination: set destination to %s, port %d\n", inet_ntoa(p->sa.sin_addr), port);
2373 static int init_resp(struct sip_request *req, char *resp, struct sip_request *orig)
2375 /* Initialize a response */
2376 if (req->headers || req->len) {
2377 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2380 req->header[req->headers] = req->data + req->len;
2381 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "SIP/2.0 %s\r\n", resp);
2382 req->len += strlen(req->header[req->headers]);
2383 if (req->headers < SIP_MAX_HEADERS)
2386 ast_log(LOG_WARNING, "Out of header space\n");
2390 static int init_req(struct sip_request *req, char *resp, char *recip)
2392 /* Initialize a response */
2393 if (req->headers || req->len) {
2394 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2397 req->header[req->headers] = req->data + req->len;
2398 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "%s %s SIP/2.0\r\n", resp, recip);
2399 req->len += strlen(req->header[req->headers]);
2400 if (req->headers < SIP_MAX_HEADERS)
2403 ast_log(LOG_WARNING, "Out of header space\n");
2407 static int respprep(struct sip_request *resp, struct sip_pvt *p, char *msg, struct sip_request *req)
2409 char newto[256] = "", *ot;
2410 memset(resp, 0, sizeof(*resp));
2411 init_resp(resp, msg, req);
2412 copy_via_headers(p, resp, req, "Via");
2413 if (msg[0] == '2') copy_all_header(resp, req, "Record-Route");
2414 copy_header(resp, req, "From");
2415 ot = get_header(req, "To");
2416 if (!strstr(ot, "tag=")) {
2417 /* Add the proper tag if we don't have it already. If they have specified
2418 their tag, use it. Otherwise, use our own tag */
2419 if (strlen(p->theirtag) && p->outgoing)
2420 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2421 else if (p->tag && !p->outgoing)
2422 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2424 strncpy(newto, ot, sizeof(newto) - 1);
2427 add_header(resp, "To", ot);
2428 copy_header(resp, req, "Call-ID");
2429 copy_header(resp, req, "CSeq");
2430 add_header(resp, "User-Agent", "Asterisk PBX");
2431 add_header(resp, "Allow", ALLOWED_METHODS);
2433 /* For registration responses, we also need expiry and
2437 snprintf(contact, sizeof(contact), "%s;expires=%d", p->our_contact, p->expiry);
2438 snprintf(tmp, sizeof(tmp), "%d", p->expiry);
2439 add_header(resp, "Expires", tmp);
2440 add_header(resp, "Contact", contact);
2442 add_header(resp, "Contact", p->our_contact);
2447 static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int seqno, int newbranch)
2449 struct sip_request *orig = &p->initreq;
2450 char stripped[80] ="";
2456 memset(req, 0, sizeof(struct sip_request));
2458 snprintf(p->lastmsg, sizeof(p->lastmsg), "Tx: %s", msg);
2466 p->branch ^= rand();
2467 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
2470 if (strlen(p->uri)) {
2474 strncpy(stripped, get_header(orig, "To"), sizeof(stripped) - 1);
2476 strncpy(stripped, get_header(orig, "From"), sizeof(stripped) - 1);
2478 c = strchr(stripped, '<');
2490 init_req(req, msg, c);
2492 snprintf(tmp, sizeof(tmp), "%d %s", seqno, msg);
2494 add_header(req, "Via", p->via);
2496 set_destination(p, p->route->hop);
2497 add_route(req, p->route->next);
2500 ot = get_header(orig, "To");
2501 of = get_header(orig, "From");
2503 /* Add tag *unless* this is a CANCEL, in which case we need to send it exactly
2504 as our original request, including tag (or presumably lack thereof) */
2505 if (!strstr(ot, "tag=") && strcasecmp(msg, "CANCEL")) {
2506 /* Add the proper tag if we don't have it already. If they have specified
2507 their tag, use it. Otherwise, use our own tag */
2508 if (p->outgoing && strlen(p->theirtag))
2509 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2510 else if (!p->outgoing)
2511 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2513 snprintf(newto, sizeof(newto), "%s", ot);
2518 add_header(req, "From", of);
2519 add_header(req, "To", ot);
2521 add_header(req, "From", ot);
2522 add_header(req, "To", of);
2524 add_header(req, "Contact", p->our_contact);
2525 copy_header(req, orig, "Call-ID");
2526 add_header(req, "CSeq", tmp);
2528 add_header(req, "User-Agent", "Asterisk PBX");
2532 static int __transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2534 struct sip_request resp;
2536 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2537 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2540 respprep(&resp, p, msg, req);
2541 add_header(&resp, "Content-Length", "0");
2542 add_blank_header(&resp);
2543 return send_response(p, &resp, reliable, seqno);
2546 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req)
2548 return __transmit_response(p, msg, req, 0);
2550 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req, int fatal)
2552 return __transmit_response(p, msg, req, fatal ? 2 : 1);
2555 static void append_date(struct sip_request *req)
2562 strftime(tmpdat, sizeof(tmpdat), "%a, %d %b %Y %T GMT", &tm);
2563 add_header(req, "Date", tmpdat);
2566 static int transmit_response_with_date(struct sip_pvt *p, char *msg, struct sip_request *req)
2568 struct sip_request resp;
2569 respprep(&resp, p, msg, req);
2571 add_header(&resp, "Content-Length", "0");
2572 add_blank_header(&resp);
2573 return send_response(p, &resp, 0, 0);
2576 static int transmit_response_with_allow(struct sip_pvt *p, char *msg, struct sip_request *req)
2578 struct sip_request resp;
2579 respprep(&resp, p, msg, req);
2580 add_header(&resp, "Accept", "application/sdp");
2581 add_header(&resp, "Content-Length", "0");
2582 add_blank_header(&resp);
2583 return send_response(p, &resp, 0, 0);
2586 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *randdata, int reliable)
2588 struct sip_request resp;
2591 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2592 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2595 snprintf(tmp, sizeof(tmp), "Digest realm=\"asterisk\", nonce=\"%s\"", randdata);
2596 respprep(&resp, p, msg, req);
2597 add_header(&resp, "Proxy-Authenticate", tmp);
2598 add_header(&resp, "Content-Length", "0");
2599 add_blank_header(&resp);
2600 return send_response(p, &resp, reliable, seqno);
2603 static int add_text(struct sip_request *req, char *text)
2605 /* XXX Convert \n's to \r\n's XXX */
2606 int len = strlen(text);
2608 snprintf(clen, sizeof(clen), "%d", len);
2609 add_header(req, "Content-Type", "text/plain");
2610 add_header(req, "Content-Length", clen);
2611 add_line(req, text);
2615 static int add_digit(struct sip_request *req, char digit)
2620 snprintf(tmp, sizeof(tmp), "Signal=%c\r\nDuration=250\r\n", digit);
2622 snprintf(clen, sizeof(clen), "%d", len);
2623 add_header(req, "Content-Type", "application/dtmf-relay");
2624 add_header(req, "Content-Length", clen);
2629 static int add_sdp(struct sip_request *resp, struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2633 int alreadysent = 0;
2635 struct sockaddr_in sin;
2636 struct sockaddr_in vsin;
2637 struct sip_codec_pref *cur;
2648 struct sockaddr_in dest;
2649 struct sockaddr_in vdest = { 0, };
2650 /* XXX We break with the "recommendation" and send our IP, in order that our
2651 peer doesn't have to gethostbyname() us XXX */
2654 ast_log(LOG_WARNING, "No way to add SDP without an RTP structure\n");
2657 if (!p->sessionid) {
2658 p->sessionid = getpid();
2659 p->sessionversion = p->sessionid;
2661 p->sessionversion++;
2662 ast_rtp_get_us(p->rtp, &sin);
2664 ast_rtp_get_us(p->vrtp, &vsin);
2666 if (p->redirip.sin_addr.s_addr) {
2667 dest.sin_port = p->redirip.sin_port;
2668 dest.sin_addr = p->redirip.sin_addr;
2670 ast_rtp_get_peer(rtp, &dest);
2672 dest.sin_addr = p->ourip;
2673 dest.sin_port = sin.sin_port;
2676 /* Determine video destination */
2678 if (p->vredirip.sin_addr.s_addr) {
2679 vdest.sin_port = p->vredirip.sin_port;
2680 vdest.sin_addr = p->vredirip.sin_addr;
2682 ast_rtp_get_peer(vrtp, &vdest);
2684 vdest.sin_addr = p->ourip;
2685 vdest.sin_port = vsin.sin_port;
2689 ast_verbose("We're at %s port %d\n", inet_ntoa(p->ourip), ntohs(sin.sin_port));
2690 if (sipdebug && p->vrtp)
2691 ast_verbose("Video is at %s port %d\n", inet_ntoa(p->ourip), ntohs(vsin.sin_port));
2692 snprintf(v, sizeof(v), "v=0\r\n");
2693 snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, inet_ntoa(dest.sin_addr));
2694 snprintf(s, sizeof(s), "s=session\r\n");
2695 snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", inet_ntoa(dest.sin_addr));
2696 snprintf(t, sizeof(t), "t=0 0\r\n");
2697 snprintf(m, sizeof(m), "m=audio %d RTP/AVP", ntohs(dest.sin_port));
2698 snprintf(m2, sizeof(m2), "m=video %d RTP/AVP", ntohs(vdest.sin_port));
2699 if (p->jointcapability & p->prefcodec) {
2701 ast_verbose("Answering/Requesting with root capability %d\n", p->prefcodec);
2702 codec = ast_rtp_lookup_code(p->rtp, 1, p->prefcodec);
2704 snprintf(costr, sizeof(costr), " %d", codec);
2705 if (p->prefcodec <= AST_FORMAT_MAX_AUDIO) {
2706 strncat(m, costr, sizeof(m) - strlen(m));
2707 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, p->prefcodec));
2708 strncat(a, costr, sizeof(a));
2710 strncat(m2, costr, sizeof(m2) - strlen(m2));
2711 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, p->prefcodec));
2712 strncat(a2, costr, sizeof(a2));
2715 alreadysent |= p->prefcodec;
2717 /* Start by sending our preferred codecs */
2720 if (p->jointcapability & cur->codec) {
2722 ast_verbose("Answering/Requesting with preferred capability %d\n", cur->codec);
2723 codec = ast_rtp_lookup_code(p->rtp, 1, cur->codec);
2725 snprintf(costr, sizeof(costr), " %d", codec);
2726 if (cur->codec <= AST_FORMAT_MAX_AUDIO) {
2727 strncat(m, costr, sizeof(m) - strlen(m));
2728 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2729 strncat(a, costr, sizeof(a));
2731 strncat(m2, costr, sizeof(m2) - strlen(m2));
2732 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2733 strncat(a2, costr, sizeof(a2));
2737 alreadysent |= cur->codec;
2740 /* Now send any other common codecs, and non-codec formats: */
2741 for (x = 1; x <= (videosupport ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO); x <<= 1) {
2742 if ((p->jointcapability & x) && !(alreadysent & x)) {
2744 ast_verbose("Answering with capability %d\n", x);
2745 codec = ast_rtp_lookup_code(p->rtp, 1, x);
2747 snprintf(costr, sizeof(costr), " %d", codec);
2748 if (x <= AST_FORMAT_MAX_AUDIO) {
2749 strncat(m, costr, sizeof(m) - strlen(m));
2750 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2751 strncat(a, costr, sizeof(a) - strlen(a));
2753 strncat(m2, costr, sizeof(m2) - strlen(m2));
2754 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2755 strncat(a2, costr, sizeof(a2) - strlen(a2));
2760 for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
2761 if (p->noncodeccapability & x) {
2763 ast_verbose("Answering with non-codec capability %d\n", x);
2764 codec = ast_rtp_lookup_code(p->rtp, 0, x);
2766 snprintf(costr, sizeof(costr), " %d", codec);
2767 strncat(m, costr, sizeof(m) - strlen(m));
2768 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(0, x));
2769 strncat(a, costr, sizeof(a) - strlen(a));
2770 if (x == AST_RTP_DTMF) {
2771 /* Indicate we support DTMF... Not sure about 16, but MSN supports it so dang it, we will too... */
2772 snprintf(costr, sizeof costr, "a=fmtp:%d 0-16\r\n",
2774 strncat(a, costr, sizeof(a) - strlen(a));
2779 strncat(a, "a=silenceSupp:off - - - -\r\n", sizeof(a) - strlen(a));
2780 if (strlen(m) < sizeof(m) - 2)
2782 if (strlen(m2) < sizeof(m2) - 2)
2784 if ((sizeof(m) <= strlen(m) - 2) || (sizeof(m2) <= strlen(m2) - 2) || (sizeof(a) == strlen(a)) || (sizeof(a2) == strlen(a2)))
2785 ast_log(LOG_WARNING, "SIP SDP may be truncated due to undersized buffer!!\n");
2786 len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m) + strlen(a);
2787 if ((p->vrtp) && (p->jointcapability & VIDEO_CODEC_MASK)) // only if video response is appropriate
2788 len += strlen(m2) + strlen(a2);
2789 snprintf(costr, sizeof(costr), "%d", len);
2790 add_header(resp, "Content-Type", "application/sdp");
2791 add_header(resp, "Content-Length", costr);
2799 if ((p->vrtp) && (p->jointcapability & VIDEO_CODEC_MASK)) { // only if video response is appropriate
2806 static void copy_request(struct sip_request *dst,struct sip_request *src)
2810 offset = ((void *)dst) - ((void *)src);
2811 /* First copy stuff */
2812 memcpy(dst, src, sizeof(*dst));
2813 /* Now fix pointer arithmetic */
2814 for (x=0;x<src->headers;x++)
2815 dst->header[x] += offset;
2816 for (x=0;x<src->lines;x++)
2817 dst->line[x] += offset;
2820 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans)
2822 struct sip_request resp;
2824 if (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1) {
2825 ast_log(LOG_WARNING, "Unable to get seqno from '%s'\n", get_header(req, "CSeq"));
2828 respprep(&resp, p, msg, req);
2829 add_sdp(&resp, p, NULL, NULL);
2830 return send_response(p, &resp, retrans, seqno);
2833 static int determine_firstline_parts( struct sip_request *req ) {
2838 cmd= req->header[0];
2839 while(*cmd && (*cmd < 33)) {
2846 while(*e && (*e > 32)) {
2849 /* Get the command */
2855 while( *e && ( *e < 33 ) ) {
2862 if ( !strcasecmp(cmd, "SIP/2.0") ) {
2863 /* We have a response */
2865 len= strlen( req->rlPart2 );
2866 if( len < 2 ) { return -1; }
2868 while( *e && *e<33 ) {
2873 /* We have a request */
2876 if( !*e ) { return -1; }
2879 if( ( e= strrchr( req->rlPart2, 'S' ) ) == NULL ) {
2882 while( isspace( *(--e) ) ) {}
2892 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2894 struct sip_request req;
2895 if (p->canreinvite == REINVITE_UPDATE)
2896 reqprep(&req, p, "UPDATE", 0, 1);
2898 reqprep(&req, p, "INVITE", 0, 1);
2900 add_header(&req, "Allow", ALLOWED_METHODS);
2901 add_sdp(&req, p, rtp, vrtp);
2902 /* Use this as the basis */
2903 copy_request(&p->initreq, &req);
2905 determine_firstline_parts(&p->initreq);
2906 p->lastinvite = p->ocseq;
2908 return send_request(p, &req, 1, p->ocseq);
2911 static void extract_uri(struct sip_pvt *p, struct sip_request *req)
2913 char stripped[256]="";
2915 strncpy(stripped, get_header(req, "Contact"), sizeof(stripped) - 1);
2916 c = strchr(stripped, '<');
2928 strncpy(p->uri, c, sizeof(p->uri) - 1);
2931 static void build_contact(struct sip_pvt *p)
2933 /* Construct Contact: header */
2934 if (ourport != 5060)
2935 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s:%d>", p->exten, inet_ntoa(p->ourip), ourport);
2937 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s>", p->exten, inet_ntoa(p->ourip));
2940 static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, char *vxml_url)
2947 char *l = callerid, *n=NULL;
2949 snprintf(p->lastmsg, sizeof(p->lastmsg), "Init: %s", cmd);
2951 if (p->owner && p->owner->callerid) {
2952 strcpy(cid, p->owner->callerid);
2953 ast_callerid_parse(cid, &n, &l);
2955 ast_shrink_phone_number(l);
2956 if (!l || !ast_isphonenumber(l))
2959 /* if user want's his callerid restricted */
2960 if (p->restrictcid) {
2961 l = CALLERID_UNKNOWN;
2964 if (!n || !strlen(n))
2966 /* Allow user to be overridden */
2967 if (strlen(p->fromuser))
2970 if ((ourport != 5060) && !strlen(p->fromdomain))
2971 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);
2973 snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=as%08x", n, l, strlen(p->fromdomain) ? p->fromdomain : inet_ntoa(p->ourip), p->tag);
2975 if (strlen(p->username)) {
2976 if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2977 snprintf(invite, sizeof(invite), "sip:%s@%s:%d",p->username, p->tohost, ntohs(p->sa.sin_port));
2979 snprintf(invite, sizeof(invite), "sip:%s@%s",p->username, p->tohost);
2981 } else if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2982 snprintf(invite, sizeof(invite), "sip:%s:%d", p->tohost, ntohs(p->sa.sin_port));
2984 snprintf(invite, sizeof(invite), "sip:%s", p->tohost);
2986 strncpy(p->uri, invite, sizeof(p->uri) - 1);
2987 /* If there is a VXML URL append it to the SIP URL */
2990 snprintf(to, sizeof(to), "<%s>;%s", invite, vxml_url);
2994 snprintf(to, sizeof(to), "<%s>", invite );
2996 memset(req, 0, sizeof(struct sip_request));
2997 init_req(req, cmd, invite);
2998 snprintf(tmp, sizeof(tmp), "%d %s", ++p->ocseq, cmd);
3000 add_header(req, "Via", p->via);
3001 /* SLD: FIXME?: do Route: here too? I think not cos this is the first request.
3002 * OTOH, then we won't have anything in p->route anyway */
3003 add_header(req, "From", from);
3004 strncpy(p->exten, l, sizeof(p->exten) - 1);
3006 add_header(req, "To", to);
3007 add_header(req, "Contact", p->our_contact);
3008 add_header(req, "Call-ID", p->callid);
3009 add_header(req, "CSeq", tmp);
3010 add_header(req, "User-Agent", "Asterisk PBX");
3013 static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, char *authheader, char *vxml_url, char *distinctive_ring, int init)
3015 struct sip_request req;
3018 initreqprep(&req, p, cmd, vxml_url);
3020 reqprep(&req, p, cmd, 0, 1);
3023 add_header(&req, authheader, auth);
3025 if (!strcasecmp(cmd, "REFER")) {
3026 if (strlen(p->refer_to))
3027 add_header(&req, "Refer-To", p->refer_to);
3028 if (strlen(p->referred_by))
3029 add_header(&req, "Referred-By", p->referred_by);
3032 if (distinctive_ring)
3034 add_header(&req, "Alert-info",distinctive_ring);
3036 add_header(&req, "Allow", ALLOWED_METHODS);
3038 add_sdp(&req, p, NULL, NULL);
3040 add_header(&req, "Content-Length", "0");
3041 add_blank_header(&req);
3044 if (!p->initreq.headers) {
3045 /* Use this as the basis */
3046 copy_request(&p->initreq, &req);
3048 determine_firstline_parts(&p->initreq);
3050 p->lastinvite = p->ocseq;
3051 return send_request(p, &req, init ? 2 : 1, p->ocseq);
3054 static int transmit_state_notify(struct sip_pvt *p, int state, int full)
3057 char from[256], to[256];