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, char *username, int expiry)
692 if (mysql && (strlen(peer) < 128)) {
697 name = alloca(strlen(peer) * 2 + 1);
698 uname = alloca(strlen(username) * 2 + 1);
700 mysql_real_escape_string(mysql, name, peer, strlen(peer));
701 mysql_real_escape_string(mysql, uname, username, strlen(username));
702 snprintf(query, sizeof(query), "UPDATE sipfriends SET ipaddr=\"%s\", port=\"%d\", regseconds=\"%ld\", username=\"%s\" WHERE name=\"%s\"",
703 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), nowtime + expiry, uname, name);
704 ast_mutex_lock(&mysqllock);
705 if (mysql_real_query(mysql, query, strlen(query)))
706 ast_log(LOG_WARNING, "Unable to update database\n");
708 ast_mutex_unlock(&mysqllock);
712 static struct sip_peer *mysql_peer(char *peer, struct sockaddr_in *sin)
717 p = malloc(sizeof(struct sip_peer));
718 memset(p, 0, sizeof(struct sip_peer));
719 if (mysql && (!peer || (strlen(peer) < 128))) {
724 time_t regseconds, nowtime;
729 name = alloca(strlen(peer) * 2 + 1);
730 mysql_real_escape_string(mysql, name, peer, strlen(peer));
733 snprintf(query, sizeof(query), "SELECT * FROM sipfriends WHERE ipaddr=\"%s\" AND port=\"%d\"", inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
735 snprintf(query, sizeof(query), "SELECT * FROM sipfriends WHERE name=\"%s\"", name);
736 ast_mutex_lock(&mysqllock);
737 mysql_query(mysql, query);
738 if ((result = mysql_store_result(mysql))) {
739 if ((rowval = mysql_fetch_row(result))) {
740 numfields = mysql_num_fields(result);
741 fields = mysql_fetch_fields(result);
743 for (x=0;x<numfields;x++) {
745 if (!strcasecmp(fields[x].name, "secret")) {
746 strncpy(p->secret, rowval[x], sizeof(p->secret));
747 } else if (!strcasecmp(fields[x].name, "name")) {
748 strncpy(p->name, rowval[x], sizeof(p->name) - 1);
749 } else if (!strcasecmp(fields[x].name, "context")) {
750 strncpy(p->context, rowval[x], sizeof(p->context) - 1);
751 } else if (!strcasecmp(fields[x].name, "username")) {
752 strncpy(p->username, rowval[x], sizeof(p->username) - 1);
753 } else if (!strcasecmp(fields[x].name, "ipaddr")) {
754 inet_aton(rowval[x], &p->addr.sin_addr);
755 } else if (!strcasecmp(fields[x].name, "port")) {
756 if (sscanf(rowval[x], "%i", &port) != 1)
758 p->addr.sin_port = htons(port);
759 } else if (!strcasecmp(fields[x].name, "regseconds")) {
760 if (sscanf(rowval[x], "%li", ®seconds) != 1)
766 if (nowtime > regseconds)
767 memset(&p->addr, 0, sizeof(p->addr));
769 mysql_free_result(result);
772 ast_mutex_unlock(&mysqllock);
779 p->capability = capability;
781 p->dtmfmode = globaldtmfmode;
789 #endif /* MYSQL_FRIENDS */
791 static int create_addr(struct sip_pvt *r, char *peer)
798 char host[256], *hostn;
800 r->sa.sin_family = AF_INET;
801 ast_mutex_lock(&peerl.lock);
804 if (!strcasecmp(p->name, peer))
810 p = mysql_peer(peer, NULL);
815 r->capability = p->capability;
818 ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", r->nat);
819 ast_rtp_setnat(r->rtp, r->nat);
822 ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", r->nat);
823 ast_rtp_setnat(r->vrtp, r->nat);
825 strncpy(r->peername, p->username, sizeof(r->peername)-1);
826 strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1);
827 strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1);
828 strncpy(r->username, p->username, sizeof(r->username)-1);
829 strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1);
830 if (!strlen(r->tohost)) {
831 if (p->addr.sin_addr.s_addr)
832 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->addr.sin_addr));
834 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->defaddr.sin_addr));
836 if (strlen(p->fromdomain))
837 strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1);
838 if (strlen(p->fromuser))
839 strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1);
840 r->insecure = p->insecure;
841 r->canreinvite = p->canreinvite;
842 r->maxtime = p->maxms;
843 r->callgroup = p->callgroup;
844 r->pickupgroup = p->pickupgroup;
846 r->dtmfmode = p->dtmfmode;
847 if (r->dtmfmode & SIP_DTMF_RFC2833)
848 r->noncodeccapability |= AST_RTP_DTMF;
850 r->noncodeccapability &= ~AST_RTP_DTMF;
852 strncpy(r->context, p->context,sizeof(r->context)-1);
853 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
854 (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) {
855 if (p->addr.sin_addr.s_addr) {
856 r->sa.sin_addr = p->addr.sin_addr;
857 r->sa.sin_port = p->addr.sin_port;
859 r->sa.sin_addr = p->defaddr.sin_addr;
860 r->sa.sin_port = p->defaddr.sin_port;
862 memcpy(&r->recv, &r->sa, sizeof(r->recv));
869 ast_mutex_unlock(&peerl.lock);
871 if ((port=strchr(peer, ':'))) {
879 portno = DEFAULT_SIP_PORT;
884 snprintf(service, sizeof(service), "_sip._udp.%s", peer);
885 ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service);
891 hp = gethostbyname(hostn);
893 strncpy(r->tohost, peer, sizeof(r->tohost) - 1);
894 memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr));
895 r->sa.sin_port = htons(portno);
896 memcpy(&r->recv, &r->sa, sizeof(r->recv));
899 ast_log(LOG_WARNING, "No such host: %s\n", peer);
911 static int auto_congest(void *nothing)
913 struct sip_pvt *p = nothing;
914 ast_mutex_lock(&p->lock);
917 if (!ast_mutex_trylock(&p->owner->lock)) {
918 ast_log(LOG_NOTICE, "Auto-congesting %s\n", p->owner->name);
919 ast_queue_control(p->owner, AST_CONTROL_CONGESTION, 0);
920 ast_mutex_unlock(&p->owner->lock);
923 ast_mutex_unlock(&p->lock);
927 static void sip_prefs_free(void)
929 struct sip_codec_pref *cur, *next;
939 static void sip_pref_remove(int format)
941 struct sip_codec_pref *cur, *prev=NULL;
944 if (cur->codec == format) {
946 prev->next = cur->next;
957 static int sip_pref_append(int format)
959 struct sip_codec_pref *cur, *tmp;
960 sip_pref_remove(format);
961 tmp = (struct sip_codec_pref *)malloc(sizeof(struct sip_codec_pref));
964 memset(tmp, 0, sizeof(struct sip_codec_pref));
976 static int sip_codec_choose(int formats)
978 struct sip_codec_pref *cur;
979 formats &= (AST_FORMAT_MAX_AUDIO - 1);
982 if (formats & cur->codec)
986 return ast_best_codec(formats);
989 static int sip_call(struct ast_channel *ast, char *dest, int timeout)
993 char *vxml_url = NULL;
994 char *distinctive_ring = NULL;
995 struct varshead *headp;
996 struct ast_var_t *current;
999 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
1000 ast_log(LOG_WARNING, "sip_call called on %s, neither down nor reserved\n", ast->name);
1003 /* Check whether there is vxml_url, distinctive ring variables */
1005 headp=&ast->varshead;
1006 AST_LIST_TRAVERSE(headp,current,entries) {
1007 /* Check whether there is a VXML_URL variable */
1008 if (strcasecmp(ast_var_name(current),"VXML_URL")==0)
1010 vxml_url = ast_var_value(current);
1013 /* Check whether there is a ALERT_INFO variable */
1014 if (strcasecmp(ast_var_name(current),"ALERT_INFO")==0)
1016 distinctive_ring = ast_var_value(current);
1023 ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
1024 res = find_user(p,INC_OUT_USE);
1026 p->restrictcid = ast->restrictcid;
1027 p->jointcapability = p->capability;
1028 transmit_invite(p, "INVITE", 1, NULL, NULL, vxml_url,distinctive_ring, 1);
1030 /* Initialize auto-congest time */
1031 p->initid = ast_sched_add(sched, p->maxtime * 4, auto_congest, p);
1037 static void __sip_destroy(struct sip_pvt *p, int lockowner)
1039 struct sip_pvt *cur, *prev = NULL;
1042 ast_log(LOG_DEBUG, "Destroying call '%s'\n", p->callid);
1043 if (p->stateid > -1)
1044 ast_extension_state_del(p->stateid, NULL);
1046 ast_sched_del(sched, p->initid);
1047 if (p->autokillid > -1)
1048 ast_sched_del(sched, p->autokillid);
1051 ast_rtp_destroy(p->rtp);
1054 ast_rtp_destroy(p->vrtp);
1057 free_old_route(p->route);
1061 /* Carefully unlink from registry */
1062 struct sip_registry *reg;
1063 ast_mutex_lock(®l.lock);
1064 reg = regl.registrations;
1066 if ((reg == p->registry) && (p->registry->call == p))
1067 p->registry->call=NULL;
1070 ast_mutex_unlock(®l.lock);
1072 /* Unlink us from the owner if we have one */
1075 ast_mutex_lock(&p->owner->lock);
1076 ast_log(LOG_DEBUG, "Detaching from %s\n", p->owner->name);
1077 p->owner->pvt->pvt = NULL;
1079 ast_mutex_unlock(&p->owner->lock);
1085 prev->next = cur->next;
1094 ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
1097 ast_sched_del(sched, p->initid);
1098 while((cp = p->packets)) {
1099 p->packets = p->packets->next;
1100 if (cp->retransid > -1)
1101 ast_sched_del(sched, cp->retransid);
1108 static int find_user(struct sip_pvt *fup, int event)
1110 char name[256] = "";
1112 strncpy(name, fup->username, sizeof(name) - 1);
1113 ast_mutex_lock(&userl.lock);
1116 if (!strcasecmp(u->name, name)) {
1122 ast_log(LOG_DEBUG, "%s is not a local user\n", name);
1123 ast_mutex_unlock(&userl.lock);
1127 /* incoming and outgoing affects the inUse counter */
1130 if ( u->inUse > 0 ) {
1138 if (u->incominglimit > 0 ) {
1139 if (u->inUse >= u->incominglimit) {
1140 ast_log(LOG_ERROR, "Call from user '%s' rejected due to usage limit of %d\n", u->name, u->incominglimit);
1141 ast_mutex_unlock(&userl.lock);
1142 /* inc inUse as well */
1143 if ( event == INC_OUT_USE ) {
1150 ast_log(LOG_DEBUG, "Call from user '%s' is %d out of %d\n", u->name, u->inUse, u->incominglimit);
1152 /* we don't use these anymore
1154 if ( u->outUse > 0 ) {
1161 if ( u->outgoinglimit > 0 ) {
1162 if ( u->outUse >= u->outgoinglimit ) {
1163 ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
1164 ast_mutex_unlock(&userl.lock);
1172 ast_log(LOG_ERROR, "find_user(%s,%d) called with no event!\n",u->name,event);
1174 ast_mutex_unlock(&userl.lock);
1178 static void sip_destroy(struct sip_pvt *p)
1180 ast_mutex_lock(&iflock);
1181 __sip_destroy(p, 1);
1182 ast_mutex_unlock(&iflock);
1185 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req);
1187 static int hangup_sip2cause(int cause)
1192 return AST_CAUSE_BUSY;
1194 return AST_CAUSE_NORMAL;
1200 static char *hangup_cause2sip(int cause)
1204 case AST_CAUSE_BUSY:
1213 static int sip_hangup(struct ast_channel *ast)
1215 struct sip_pvt *p = ast->pvt->pvt;
1217 int needdestroy = 0;
1219 ast_log(LOG_DEBUG, "sip_hangup(%s)\n", ast->name);
1220 if (!ast->pvt->pvt) {
1221 ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
1224 ast_mutex_lock(&p->lock);
1225 if ( p->outgoing ) {
1226 ast_log(LOG_DEBUG, "find_user(%s) - decrement outUse counter\n", p->username);
1227 find_user(p, DEC_OUT_USE);
1229 ast_log(LOG_DEBUG, "find_user(%s) - decrement inUse counter\n", p->username);
1230 find_user(p, DEC_IN_USE);
1232 /* Determine how to disconnect */
1233 if (p->owner != ast) {
1234 ast_log(LOG_WARNING, "Huh? We aren't the owner?\n");
1235 ast_mutex_unlock(&p->lock);
1238 if (!ast || (ast->_state != AST_STATE_UP))
1243 ast_dsp_free(p->vad);
1246 ast->pvt->pvt = NULL;
1248 ast_mutex_lock(&usecnt_lock);
1250 ast_mutex_unlock(&usecnt_lock);
1251 ast_update_use_count();
1254 /* Start the process if it's not already started */
1255 if (!p->alreadygone && strlen(p->initreq.data)) {
1258 transmit_request_with_auth(p, "CANCEL", p->ocseq, 1);
1259 /* Actually don't destroy us yet, wait for the 487 on our original
1260 INVITE, but do set an autodestruct just in case. */
1262 sip_scheddestroy(p, 15000);
1263 if ( p->initid != -1 ) {
1264 /* channel still up - reverse dec of inUse counter
1265 only if the channel is not auto-congested */
1266 if ( p->outgoing ) {
1267 find_user(p, INC_OUT_USE);
1270 find_user(p, INC_IN_USE);
1275 if (ast->hangupcause && ((res = hangup_cause2sip(ast->hangupcause)))) {
1276 transmit_response_reliable(p, res, &p->initreq);
1278 transmit_response_reliable(p, "403 Forbidden", &p->initreq);
1281 if (!p->pendinginvite) {
1283 transmit_request_with_auth(p, "BYE", 0, 1);
1285 /* Note we will need a BYE when this all settles out
1286 but we can't send one while we have "INVITE" outstanding. */
1291 p->needdestroy = needdestroy;
1292 ast_mutex_unlock(&p->lock);
1296 static int sip_answer(struct ast_channel *ast)
1300 struct sip_pvt *p = ast->pvt->pvt;
1303 if (ast->_state != AST_STATE_UP) {
1307 codec=pbx_builtin_getvar_helper(p->owner,"SIP_CODEC");
1309 fmt=ast_getformatbyname(codec);
1311 ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
1312 p->jointcapability=fmt;
1313 } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n",codec);
1316 ast_setstate(ast, AST_STATE_UP);
1318 ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
1319 res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
1324 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
1326 struct sip_pvt *p = ast->pvt->pvt;
1328 if (frame->frametype == AST_FRAME_VOICE) {
1329 if (!(frame->subclass & ast->nativeformats)) {
1330 ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
1331 frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
1335 ast_mutex_lock(&p->lock);
1337 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1338 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1341 res = ast_rtp_write(p->rtp, frame);
1343 ast_mutex_unlock(&p->lock);
1345 } else if (frame->frametype == AST_FRAME_VIDEO) {
1347 ast_mutex_lock(&p->lock);
1349 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1350 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1353 res = ast_rtp_write(p->vrtp, frame);
1355 ast_mutex_unlock(&p->lock);
1357 } else if (frame->frametype == AST_FRAME_IMAGE) {
1360 ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", frame->frametype);
1367 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, int needlock)
1369 struct sip_pvt *p = newchan->pvt->pvt;
1371 ast_mutex_lock(&p->lock);
1372 if (p->owner != oldchan) {
1373 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
1375 ast_mutex_unlock(&p->lock);
1380 ast_mutex_unlock(&p->lock);
1384 static int sip_senddigit(struct ast_channel *ast, char digit)
1386 struct sip_pvt *p = ast->pvt->pvt;
1387 if (p && (p->dtmfmode & SIP_DTMF_INFO)) {
1388 transmit_info_with_digit(p, digit);
1390 if (p && p->rtp && (p->dtmfmode & SIP_DTMF_RFC2833)) {
1391 ast_rtp_senddigit(p->rtp, digit);
1393 /* If in-band DTMF is desired, send that */
1394 if (p->dtmfmode & SIP_DTMF_INBAND)
1399 static int sip_transfer(struct ast_channel *ast, char *dest)
1401 struct sip_pvt *p = ast->pvt->pvt;
1403 res = transmit_refer(p, dest);
1407 static int sip_indicate(struct ast_channel *ast, int condition)
1409 struct sip_pvt *p = ast->pvt->pvt;
1411 case AST_CONTROL_RINGING:
1412 if (ast->_state == AST_STATE_RING) {
1413 if (!p->progress && !p->ringing) {
1414 transmit_response(p, "180 Ringing", &p->initreq);
1418 /* Oops, we've sent progress tones. Let Asterisk do it instead */
1422 case AST_CONTROL_BUSY:
1423 if (ast->_state != AST_STATE_UP) {
1424 transmit_response(p, "486 Busy Here", &p->initreq);
1426 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1430 case AST_CONTROL_CONGESTION:
1431 if (ast->_state != AST_STATE_UP) {
1432 transmit_response(p, "503 Service Unavailable", &p->initreq);
1434 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1438 case AST_CONTROL_PROGRESS:
1439 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1440 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1448 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
1456 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
1458 struct ast_channel *tmp;
1460 tmp = ast_channel_alloc(1);
1462 /* Select our native format based on codec preference until we receive
1463 something from another device to the contrary. */
1464 if (i->jointcapability)
1465 tmp->nativeformats = sip_codec_choose(i->jointcapability);
1466 else if (i->capability)
1467 tmp->nativeformats = sip_codec_choose(i->capability);
1469 tmp->nativeformats = sip_codec_choose(capability);
1470 fmt = ast_best_codec(tmp->nativeformats);
1472 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
1474 if (strchr(i->fromdomain,':'))
1476 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(i));
1480 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(i));
1483 if (i->dtmfmode & SIP_DTMF_INBAND) {
1484 i->vad = ast_dsp_new();
1485 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
1487 tmp->fds[0] = ast_rtp_fd(i->rtp);
1488 tmp->fds[1] = ast_rtcp_fd(i->rtp);
1490 tmp->fds[2] = ast_rtp_fd(i->vrtp);
1491 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
1493 ast_setstate(tmp, state);
1494 if (state == AST_STATE_RING)
1496 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
1497 tmp->writeformat = fmt;
1498 tmp->pvt->rawwriteformat = fmt;
1499 tmp->readformat = fmt;
1500 tmp->pvt->rawreadformat = fmt;
1502 tmp->pvt->send_text = sip_sendtext;
1503 tmp->pvt->call = sip_call;
1504 tmp->pvt->hangup = sip_hangup;
1505 tmp->pvt->answer = sip_answer;
1506 tmp->pvt->read = sip_read;
1507 tmp->pvt->write = sip_write;
1508 tmp->pvt->write_video = sip_write;
1509 tmp->pvt->indicate = sip_indicate;
1510 tmp->pvt->transfer = sip_transfer;
1511 tmp->pvt->fixup = sip_fixup;
1512 tmp->pvt->send_digit = sip_senddigit;
1514 tmp->pvt->bridge = ast_rtp_bridge;
1516 tmp->callgroup = i->callgroup;
1517 tmp->pickupgroup = i->pickupgroup;
1518 tmp->restrictcid = i->restrictcid;
1519 if (strlen(i->accountcode))
1520 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
1522 tmp->amaflags = i->amaflags;
1523 if (strlen(i->language))
1524 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
1526 ast_mutex_lock(&usecnt_lock);
1528 ast_mutex_unlock(&usecnt_lock);
1529 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
1530 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
1531 if (strlen(i->callerid))
1532 tmp->callerid = strdup(i->callerid);
1533 if (strlen(i->rdnis))
1534 tmp->rdnis = strdup(i->rdnis);
1536 if (strlen(i->domain)) {
1537 pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
1540 if (state != AST_STATE_DOWN) {
1541 if (ast_pbx_start(tmp)) {
1542 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
1548 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
1552 static struct cfalias {
1556 { "Content-Type", "c" },
1557 { "Content-Encoding", "e" },
1561 { "Content-Length", "l" },
1567 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
1568 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
1569 char* r = line + nameLen + 1;
1570 while (*r && (*r < 33)) ++r;
1577 static char *get_sdp(struct sip_request *req, char *name) {
1579 int len = strlen(name);
1582 for (x=0; x<req->lines; x++) {
1583 r = get_sdp_by_line(req->line[x], name, len);
1584 if (r[0] != '\0') return r;
1589 static void sdpLineNum_iterator_init(int* iterator) {
1593 static char* get_sdp_iterate(int* iterator,
1594 struct sip_request *req, char *name) {
1595 int len = strlen(name);
1597 while (*iterator < req->lines) {
1598 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
1599 if (r[0] != '\0') return r;
1604 static char *__get_header(struct sip_request *req, char *name, int *start)
1607 int len = strlen(name);
1609 for (x=*start;x<req->headers;x++) {
1610 if (!strncasecmp(req->header[x], name, len) &&
1611 (req->header[x][len] == ':')) {
1612 r = req->header[x] + len + 1;
1613 while(*r && (*r < 33))
1620 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
1621 if (!strcasecmp(aliases[x].fullname, name))
1622 return __get_header(req, aliases[x].shortname, start);
1624 /* Don't return NULL, so get_header is always a valid pointer */
1628 static char *get_header(struct sip_request *req, char *name)
1631 return __get_header(req, name, &start);
1634 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
1636 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
1637 struct ast_frame *f;
1638 static struct ast_frame null_frame = { AST_FRAME_NULL, };
1641 f = ast_rtp_read(p->rtp);
1644 f = ast_rtcp_read(p->rtp);
1647 f = ast_rtp_read(p->vrtp);
1650 f = ast_rtcp_read(p->vrtp);
1655 /* Don't send RFC2833 if we're not supposed to */
1656 if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & SIP_DTMF_RFC2833))
1659 /* We already hold the channel lock */
1660 if (f->frametype == AST_FRAME_VOICE) {
1661 if (f->subclass != p->owner->nativeformats) {
1662 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
1663 p->owner->nativeformats = f->subclass;
1664 ast_set_read_format(p->owner, p->owner->readformat);
1665 ast_set_write_format(p->owner, p->owner->writeformat);
1667 if (p->dtmfmode & SIP_DTMF_INBAND) {
1668 f = ast_dsp_process(p->owner,p->vad,f,0);
1675 static struct ast_frame *sip_read(struct ast_channel *ast)
1677 struct ast_frame *fr;
1678 struct sip_pvt *p = ast->pvt->pvt;
1679 ast_mutex_lock(&p->lock);
1680 fr = sip_rtp_read(ast, p);
1681 ast_mutex_unlock(&p->lock);
1685 static void build_callid(char *callid, int len, struct in_addr ourip)
1692 res = snprintf(callid, len, "%08x", val);
1696 /* It's not important that we really use our right IP here... */
1697 snprintf(callid, len, "@%s", inet_ntoa(ourip));
1700 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobalnat)
1704 p = malloc(sizeof(struct sip_pvt));
1707 /* Keep track of stuff */
1708 memset(p, 0, sizeof(struct sip_pvt));
1712 p->rtp = ast_rtp_new(sched, io, 1, 0);
1714 p->vrtp = ast_rtp_new(sched, io, 1, 0);
1718 /* Start with 101 instead of 1 */
1721 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
1725 ast_rtp_settos(p->rtp, tos);
1727 ast_rtp_settos(p->vrtp, tos);
1728 if (useglobalnat && sin) {
1729 /* Setup NAT structure according to global settings if we have an address */
1731 memcpy(&p->recv, sin, sizeof(p->recv));
1732 ast_rtp_setnat(p->rtp, p->nat);
1734 ast_rtp_setnat(p->vrtp, p->nat);
1736 ast_mutex_init(&p->lock);
1739 memcpy(&p->sa, sin, sizeof(p->sa));
1740 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
1741 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1743 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1745 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
1746 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
1748 build_callid(p->callid, sizeof(p->callid), p->ourip);
1750 strncpy(p->callid, callid, sizeof(p->callid) - 1);
1751 /* Assume reinvite OK and via INVITE */
1752 p->canreinvite = globalcanreinvite;
1753 p->dtmfmode = globaldtmfmode;
1754 p->capability = capability;
1755 if (p->dtmfmode & SIP_DTMF_RFC2833)
1756 p->noncodeccapability |= AST_RTP_DTMF;
1757 strncpy(p->context, context, sizeof(p->context) - 1);
1758 strncpy(p->fromdomain, fromdomain, sizeof(p->fromdomain) - 1);
1760 ast_mutex_lock(&iflock);
1763 ast_mutex_unlock(&iflock);
1765 ast_log(LOG_DEBUG, "Allocating new SIP call for %s\n", callid);
1769 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin)
1777 callid = get_header(req, "Call-ID");
1779 if (pedanticsipchecking) {
1780 /* In principle Call-ID's uniquely identify a call, however some vendors
1781 (i.e. Pingtel) send multiple calls with the same Call-ID and different
1782 tags in order to simplify billing. The RFC does state that we have to
1783 compare tags in addition to the call-id, but this generate substantially
1784 more overhead which is totally unnecessary for the vast majority of sane
1785 SIP implementations, and thus Asterisk does not enable this behavior
1786 by default. Short version: You'll need this option to support conferencing
1788 strncpy(tmp, req->header[0], sizeof(tmp) - 1);
1790 c = strchr(tmp, ' ');
1793 if (!strcasecmp(cmd, "SIP/2.0")) {
1799 strncpy(tmp, get_header(req, "From"), sizeof(tmp) - 1);
1801 strncpy(tmp, get_header(req, "To"), sizeof(tmp) - 1);
1802 tag = strstr(tmp, "tag=");
1805 c = strchr(tag, ';');
1812 if (!strlen(callid)) {
1813 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", inet_ntoa(sin->sin_addr));
1816 ast_mutex_lock(&iflock);
1819 if (!strcmp(p->callid, callid) &&
1820 (!pedanticsipchecking || !tag || !strlen(p->theirtag) || !strcmp(p->theirtag, tag))) {
1821 /* Found the call */
1822 ast_mutex_lock(&p->lock);
1823 ast_mutex_unlock(&iflock);
1828 ast_mutex_unlock(&iflock);
1829 p = sip_alloc(callid, sin, 1);
1831 ast_mutex_lock(&p->lock);
1835 static int sip_register(char *value, int lineno)
1837 struct sip_registry *reg;
1838 char copy[256] = "";
1839 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
1847 strncpy(copy, value, sizeof(copy)-1);
1850 hostname = strrchr(stringp, '@');
1855 if (!username || !strlen(username) || !hostname || !strlen(hostname)) {
1856 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d", lineno);
1860 username = strsep(&stringp, ":");
1862 secret = strsep(&stringp, ":");
1864 authuser = strsep(&stringp, ":");
1867 hostname = strsep(&stringp, "/");
1869 contact = strsep(&stringp, "/");
1870 if (!contact || !strlen(contact))
1873 hostname = strsep(&stringp, ":");
1874 porta = strsep(&stringp, ":");
1876 if (porta && !atoi(porta)) {
1877 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
1880 hp = gethostbyname(hostname);
1882 ast_log(LOG_WARNING, "Host '%s' not found at line %d\n", hostname, lineno);
1885 reg = malloc(sizeof(struct sip_registry));
1887 memset(reg, 0, sizeof(struct sip_registry));
1888 strncpy(reg->contact, contact, sizeof(reg->contact) - 1);
1890 strncpy(reg->username, username, sizeof(reg->username)-1);
1892 strncpy(reg->hostname, hostname, sizeof(reg->hostname)-1);
1894 strncpy(reg->authuser, authuser, sizeof(reg->authuser)-1);
1896 strncpy(reg->secret, secret, sizeof(reg->secret)-1);
1899 reg->refresh = default_expiry;
1900 reg->addr.sin_family = AF_INET;
1901 memcpy(®->addr.sin_addr, hp->h_addr, sizeof(®->addr.sin_addr));
1902 reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT);
1903 reg->callid_valid = 0;
1905 ast_mutex_lock(®l.lock);
1906 reg->next = regl.registrations;
1907 regl.registrations = reg;
1908 ast_mutex_unlock(®l.lock);
1910 ast_log(LOG_ERROR, "Out of memory\n");
1916 static void parse(struct sip_request *req)
1918 /* Divide fields by NULL's */
1923 /* First header starts immediately */
1927 /* We've got a new header */
1931 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
1933 if (!strlen(req->header[f])) {
1934 /* Line by itself means we're now in content */
1938 if (f >= SIP_MAX_HEADERS - 1) {
1939 ast_log(LOG_WARNING, "Too many SIP headers...\n");
1942 req->header[f] = c + 1;
1943 } else if (*c == '\r') {
1944 /* Ignore but eliminate \r's */
1949 /* Check for last header */
1950 if (strlen(req->header[f]))
1953 /* Now we process any mime content */
1958 /* We've got a new line */
1961 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
1963 if (f >= SIP_MAX_LINES - 1) {
1964 ast_log(LOG_WARNING, "Too many SDP lines...\n");
1967 req->line[f] = c + 1;
1968 } else if (*c == '\r') {
1969 /* Ignore and eliminate \r's */
1974 /* Check for last line */
1975 if (strlen(req->line[f]))
1979 ast_verbose("%d headers, %d lines\n", req->headers, req->lines);
1981 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
1984 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
1993 int peercapability, peernoncodeccapability;
1994 int vpeercapability=0, vpeernoncodeccapability=0;
1995 struct sockaddr_in sin;
2003 /* Get codec and RTP info from SDP */
2004 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
2005 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
2008 m = get_sdp(req, "m");
2009 c = get_sdp(req, "c");
2010 if (!strlen(m) || !strlen(c)) {
2011 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
2014 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2015 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
2018 /* XXX This could block for a long time, and block the main thread! XXX */
2019 hp = gethostbyname(host);
2021 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
2024 sdpLineNum_iterator_init(&iterator);
2025 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
2026 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) {
2028 // Scan through the RTP payload types specified in a "m=" line:
2029 ast_rtp_pt_clear(p->rtp);
2031 while(strlen(codecs)) {
2032 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2033 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2037 ast_verbose("Found audio format %s\n", ast_getformatname(codec));
2038 ast_rtp_set_m_type(p->rtp, codec);
2040 /* Skip over any whitespace */
2041 while(*codecs && (*codecs < 33)) codecs++;
2044 if (p->vrtp && (sscanf(m, "video %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->vrtp);
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 video format %s\n", ast_getformatname(codec));
2056 ast_rtp_set_m_type(p->vrtp, codec);
2058 /* Skip over any whitespace */
2059 while(*codecs && (*codecs < 33)) codecs++;
2063 sin.sin_family = AF_INET;
2064 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
2065 /* Setup audio port number */
2066 sin.sin_port = htons(portno);
2067 if (p->rtp && sin.sin_port)
2068 ast_rtp_set_peer(p->rtp, &sin);
2069 /* Setup video port number */
2070 sin.sin_port = htons(vportno);
2071 if (p->vrtp && sin.sin_port)
2072 ast_rtp_set_peer(p->vrtp, &sin);
2074 printf("Peer RTP is at port %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
2076 // Next, scan through each "a=rtpmap:" line, noting each
2077 // specified RTP payload type (with corresponding MIME subtype):
2078 sdpLineNum_iterator_init(&iterator);
2079 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
2080 char* mimeSubtype = ast_strdupa(a); // ensures we have enough space
2081 if (!strcasecmp(a, "sendonly")) {
2085 if (!strcasecmp(a, "sendrecv")) {
2088 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
2090 ast_verbose("Found description format %s\n", mimeSubtype);
2091 // Note: should really look at the 'freq' and '#chans' params too
2092 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
2094 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
2097 // Now gather all of the codecs that were asked for:
2098 ast_rtp_get_current_formats(p->rtp,
2099 &peercapability, &peernoncodeccapability);
2101 ast_rtp_get_current_formats(p->vrtp,
2102 &vpeercapability, &vpeernoncodeccapability);
2103 p->jointcapability = p->capability & (peercapability | vpeercapability);
2104 p->noncodeccapability = noncodeccapability & (peernoncodeccapability | vpeernoncodeccapability);
2107 ast_verbose("Capabilities: us - %d, them - %d/%d, combined - %d\n",
2108 p->capability, peercapability, vpeercapability, p->jointcapability);
2109 ast_verbose("Non-codec capabilities: us - %d, them - %d, combined - %d\n",
2110 noncodeccapability, peernoncodeccapability,
2111 p->noncodeccapability);
2113 if (!p->jointcapability) {
2114 ast_log(LOG_WARNING, "No compatible codecs!\n");
2118 if (!(p->owner->nativeformats & p->jointcapability)) {
2119 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);
2120 p->owner->nativeformats = sip_codec_choose(p->jointcapability);
2121 ast_set_read_format(p->owner, p->owner->readformat);
2122 ast_set_write_format(p->owner, p->owner->writeformat);
2124 if (p->owner->bridge) {
2125 /* Turn on/off music on hold if we are holding/unholding */
2126 if (sin.sin_addr.s_addr && !sendonly) {
2127 ast_moh_stop(p->owner->bridge);
2129 ast_moh_start(p->owner->bridge, NULL);
2137 static int add_header(struct sip_request *req, char *var, char *value)
2139 if (req->len >= sizeof(req->data) - 4) {
2140 ast_log(LOG_WARNING, "Out of space, can't add anymore (%s:%s)\n", var, value);
2144 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2147 req->header[req->headers] = req->data + req->len;
2148 snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", var, value);
2149 req->len += strlen(req->header[req->headers]);
2150 if (req->headers < SIP_MAX_HEADERS)
2153 ast_log(LOG_WARNING, "Out of header space\n");
2159 static int add_blank_header(struct sip_request *req)
2161 if (req->len >= sizeof(req->data) - 4) {
2162 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2166 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2169 req->header[req->headers] = req->data + req->len;
2170 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "\r\n");
2171 req->len += strlen(req->header[req->headers]);
2172 if (req->headers < SIP_MAX_HEADERS)
2175 ast_log(LOG_WARNING, "Out of header space\n");
2181 static int add_line(struct sip_request *req, char *line)
2183 if (req->len >= sizeof(req->data) - 4) {
2184 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2188 /* Add extra empty return */
2189 snprintf(req->data + req->len, sizeof(req->data) - req->len, "\r\n");
2190 req->len += strlen(req->data + req->len);
2192 req->line[req->lines] = req->data + req->len;
2193 snprintf(req->line[req->lines], sizeof(req->data) - req->len, "%s", line);
2194 req->len += strlen(req->line[req->lines]);
2195 if (req->lines < SIP_MAX_LINES)
2198 ast_log(LOG_WARNING, "Out of line space\n");
2204 static int copy_header(struct sip_request *req, struct sip_request *orig, char *field)
2207 tmp = get_header(orig, field);
2209 /* Add what we're responding to */
2210 return add_header(req, field, tmp);
2212 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2216 static int copy_all_header(struct sip_request *req, struct sip_request *orig, char *field)
2222 tmp = __get_header(orig, field, &start);
2224 /* Add what we're responding to */
2225 add_header(req, field, tmp);
2230 return copied ? 0 : -1;
2233 static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct sip_request *orig, char *field)
2240 tmp = __get_header(orig, field, &start);
2242 if (!copied && p->nat) {
2243 #ifdef THE_SIP_AUTHORS_CAN_SUCK_MY_GONADS
2244 /* SLD: FIXME: Nice try, but the received= should not have a port */
2245 /* SLD: FIXME: See RFC2543 BNF in Section 6.40.5 */
2246 /* MAS: Yup, RFC says you can't do it. No way to indicate PAT...
2248 if (ntohs(p->recv.sin_port) != DEFAULT_SIP_PORT)
2249 snprintf(new, sizeof(new), "%s;received=%s:%d", tmp, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
2252 snprintf(new, sizeof(new), "%s;received=%s", tmp, inet_ntoa(p->recv.sin_addr));
2253 add_header(req, field, new);
2255 /* Add what we're responding to */
2256 add_header(req, field, tmp);
2263 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2269 /* Add Route: header into request per learned route */
2270 static void add_route(struct sip_request *req, struct sip_route *route)
2273 int n, rem = 255; /* sizeof(r)-1: Room for terminating 0 */
2279 n = strlen(route->hop);
2280 if ((n+3)>rem) break;
2286 strcpy(p, route->hop); p += n;
2289 route = route->next;
2292 add_header(req, "Route", r);
2295 static void set_destination(struct sip_pvt *p, char *uri)
2297 char *h, *maddr, hostname[256];
2301 /* Parse uri to h (host) and port - uri is already just the part inside the <> */
2302 /* general form we are expecting is sip[s]:username[:password]@host[:port][;...] */
2305 ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
2307 /* Find and parse hostname */
2308 h = strchr(uri, '@');
2313 if (strncmp(h, "sip:", 4) == 0)
2315 else if (strncmp(h, "sips:", 5) == 0)
2318 hn = strcspn(h, ":;>");
2320 strncpy(hostname, h, hn); hostname[hn] = '\0';
2323 /* Is "port" present? if not default to 5060 */
2327 port = strtol(h, &h, 10);
2332 /* Got the hostname:port - but maybe there's a "maddr=" to override address? */
2333 maddr = strstr(h, "maddr=");
2336 hn = strspn(maddr, "0123456789.");
2338 strncpy(hostname, maddr, hn); hostname[hn] = '\0';
2341 hp = gethostbyname(hostname);
2343 ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
2346 p->sa.sin_family = AF_INET;
2347 memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr));
2348 p->sa.sin_port = htons(port);
2350 ast_verbose("set_destination: set destination to %s, port %d\n", inet_ntoa(p->sa.sin_addr), port);
2353 static int init_resp(struct sip_request *req, char *resp, struct sip_request *orig)
2355 /* Initialize a response */
2356 if (req->headers || req->len) {
2357 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2360 req->header[req->headers] = req->data + req->len;
2361 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "SIP/2.0 %s\r\n", resp);
2362 req->len += strlen(req->header[req->headers]);
2363 if (req->headers < SIP_MAX_HEADERS)
2366 ast_log(LOG_WARNING, "Out of header space\n");
2370 static int init_req(struct sip_request *req, char *resp, char *recip)
2372 /* Initialize a response */
2373 if (req->headers || req->len) {
2374 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2377 req->header[req->headers] = req->data + req->len;
2378 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "%s %s SIP/2.0\r\n", resp, recip);
2379 req->len += strlen(req->header[req->headers]);
2380 if (req->headers < SIP_MAX_HEADERS)
2383 ast_log(LOG_WARNING, "Out of header space\n");
2387 static int respprep(struct sip_request *resp, struct sip_pvt *p, char *msg, struct sip_request *req)
2389 char newto[256] = "", *ot;
2390 memset(resp, 0, sizeof(*resp));
2391 init_resp(resp, msg, req);
2392 copy_via_headers(p, resp, req, "Via");
2393 if (msg[0] == '2') copy_all_header(resp, req, "Record-Route");
2394 copy_header(resp, req, "From");
2395 ot = get_header(req, "To");
2396 if (!strstr(ot, "tag=")) {
2397 /* Add the proper tag if we don't have it already. If they have specified
2398 their tag, use it. Otherwise, use our own tag */
2399 if (strlen(p->theirtag) && p->outgoing)
2400 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2401 else if (p->tag && !p->outgoing)
2402 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2404 strncpy(newto, ot, sizeof(newto) - 1);
2407 add_header(resp, "To", ot);
2408 copy_header(resp, req, "Call-ID");
2409 copy_header(resp, req, "CSeq");
2410 add_header(resp, "User-Agent", "Asterisk PBX");
2411 add_header(resp, "Allow", ALLOWED_METHODS);
2413 /* For registration responses, we also need expiry and
2417 snprintf(contact, sizeof(contact), "%s;expires=%d", p->our_contact, p->expiry);
2418 snprintf(tmp, sizeof(tmp), "%d", p->expiry);
2419 add_header(resp, "Expires", tmp);
2420 add_header(resp, "Contact", contact);
2422 add_header(resp, "Contact", p->our_contact);
2427 static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int seqno)
2429 struct sip_request *orig = &p->initreq;
2430 char stripped[80] ="";
2436 memset(req, 0, sizeof(struct sip_request));
2438 snprintf(p->lastmsg, sizeof(p->lastmsg), "Tx: %s", msg);
2445 if (strlen(p->uri)) {
2449 strncpy(stripped, get_header(orig, "To"), sizeof(stripped) - 1);
2451 strncpy(stripped, get_header(orig, "From"), sizeof(stripped) - 1);
2453 c = strchr(stripped, '<');
2465 init_req(req, msg, c);
2467 snprintf(tmp, sizeof(tmp), "%d %s", seqno, msg);
2469 add_header(req, "Via", p->via);
2471 set_destination(p, p->route->hop);
2472 add_route(req, p->route->next);
2475 ot = get_header(orig, "To");
2476 of = get_header(orig, "From");
2478 /* Add tag *unless* this is a CANCEL, in which case we need to send it exactly
2479 as our original request, including tag (or presumably lack thereof) */
2480 if (!strstr(ot, "tag=") && strcasecmp(msg, "CANCEL")) {
2481 /* Add the proper tag if we don't have it already. If they have specified
2482 their tag, use it. Otherwise, use our own tag */
2483 if (p->outgoing && strlen(p->theirtag))
2484 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2485 else if (!p->outgoing)
2486 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2488 snprintf(newto, sizeof(newto), "%s", ot);
2493 add_header(req, "From", of);
2494 add_header(req, "To", ot);
2496 add_header(req, "From", ot);
2497 add_header(req, "To", of);
2499 add_header(req, "Contact", p->our_contact);
2500 copy_header(req, orig, "Call-ID");
2501 add_header(req, "CSeq", tmp);
2503 add_header(req, "User-Agent", "Asterisk PBX");
2507 static int __transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2509 struct sip_request resp;
2511 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2512 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2515 respprep(&resp, p, msg, req);
2516 add_header(&resp, "Content-Length", "0");
2517 add_blank_header(&resp);
2518 return send_response(p, &resp, reliable, seqno);
2521 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req)
2523 return __transmit_response(p, msg, req, 0);
2525 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req)
2527 return __transmit_response(p, msg, req, 1);
2530 static void append_date(struct sip_request *req)
2537 strftime(tmpdat, sizeof(tmpdat), "%a, %d %b %Y %T GMT", &tm);
2538 add_header(req, "Date", tmpdat);
2541 static int transmit_response_with_date(struct sip_pvt *p, char *msg, struct sip_request *req)
2543 struct sip_request resp;
2544 respprep(&resp, p, msg, req);
2546 add_header(&resp, "Content-Length", "0");
2547 add_blank_header(&resp);
2548 return send_response(p, &resp, 0, 0);
2551 static int transmit_response_with_allow(struct sip_pvt *p, char *msg, struct sip_request *req)
2553 struct sip_request resp;
2554 respprep(&resp, p, msg, req);
2555 add_header(&resp, "Accept", "application/sdp");
2556 add_header(&resp, "Content-Length", "0");
2557 add_blank_header(&resp);
2558 return send_response(p, &resp, 0, 0);
2561 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *randdata, int reliable)
2563 struct sip_request resp;
2566 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2567 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2570 snprintf(tmp, sizeof(tmp), "Digest realm=\"asterisk\", nonce=\"%s\"", randdata);
2571 respprep(&resp, p, msg, req);
2572 add_header(&resp, "Proxy-Authenticate", tmp);
2573 add_header(&resp, "Content-Length", "0");
2574 add_blank_header(&resp);
2575 return send_response(p, &resp, reliable, seqno);
2578 static int add_text(struct sip_request *req, char *text)
2580 /* XXX Convert \n's to \r\n's XXX */
2581 int len = strlen(text);
2583 snprintf(clen, sizeof(clen), "%d", len);
2584 add_header(req, "Content-Type", "text/plain");
2585 add_header(req, "Content-Length", clen);
2586 add_line(req, text);
2590 static int add_digit(struct sip_request *req, char digit)
2595 snprintf(tmp, sizeof(tmp), "Signal=%c\r\nDuration=250\r\n", digit);
2597 snprintf(clen, sizeof(clen), "%d", len);
2598 add_header(req, "Content-Type", "application/dtmf-relay");
2599 add_header(req, "Content-Length", clen);
2604 static int add_sdp(struct sip_request *resp, struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2608 int alreadysent = 0;
2610 struct sockaddr_in sin;
2611 struct sockaddr_in vsin;
2612 struct sip_codec_pref *cur;
2623 struct sockaddr_in dest;
2624 struct sockaddr_in vdest;
2625 /* XXX We break with the "recommendation" and send our IP, in order that our
2626 peer doesn't have to gethostbyname() us XXX */
2629 ast_log(LOG_WARNING, "No way to add SDP without an RTP structure\n");
2632 if (!p->sessionid) {
2633 p->sessionid = getpid();
2634 p->sessionversion = p->sessionid;
2636 p->sessionversion++;
2637 ast_rtp_get_us(p->rtp, &sin);
2639 ast_rtp_get_us(p->vrtp, &vsin);
2641 if (p->redirip.sin_addr.s_addr) {
2642 dest.sin_port = p->redirip.sin_port;
2643 dest.sin_addr = p->redirip.sin_addr;
2645 ast_rtp_get_peer(rtp, &dest);
2647 dest.sin_addr = p->ourip;
2648 dest.sin_port = sin.sin_port;
2651 /* Determine video destination */
2653 if (p->vredirip.sin_addr.s_addr) {
2654 vdest.sin_port = p->vredirip.sin_port;
2655 vdest.sin_addr = p->vredirip.sin_addr;
2657 ast_rtp_get_peer(vrtp, &vdest);
2659 vdest.sin_addr = p->ourip;
2660 vdest.sin_port = vsin.sin_port;
2664 ast_verbose("We're at %s port %d\n", inet_ntoa(p->ourip), ntohs(sin.sin_port));
2665 if (sipdebug && p->vrtp)
2666 ast_verbose("Video is at %s port %d\n", inet_ntoa(p->ourip), ntohs(vsin.sin_port));
2667 snprintf(v, sizeof(v), "v=0\r\n");
2668 snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, inet_ntoa(dest.sin_addr));
2669 snprintf(s, sizeof(s), "s=session\r\n");
2670 snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", inet_ntoa(dest.sin_addr));
2671 snprintf(t, sizeof(t), "t=0 0\r\n");
2672 snprintf(m, sizeof(m), "m=audio %d RTP/AVP", ntohs(dest.sin_port));
2673 snprintf(m2, sizeof(m2), "m=video %d RTP/AVP", ntohs(vdest.sin_port));
2674 /* Start by sending our preferred codecs */
2677 if (p->jointcapability & cur->codec) {
2679 ast_verbose("Answering with preferred capability %d\n", cur->codec);
2680 codec = ast_rtp_lookup_code(p->rtp, 1, cur->codec);
2682 snprintf(costr, sizeof(costr), " %d", codec);
2683 if (cur->codec < AST_FORMAT_MAX_AUDIO) {
2684 strncat(m, costr, sizeof(m) - strlen(m));
2685 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2686 strncat(a, costr, sizeof(a));
2688 strncat(m2, costr, sizeof(m2) - strlen(m2));
2689 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2690 strncat(a2, costr, sizeof(a2));
2694 alreadysent |= cur->codec;
2697 /* Now send any other common codecs, and non-codec formats: */
2698 for (x = 1; x <= (videosupport ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO); x <<= 1) {
2699 if ((p->jointcapability & x) && !(alreadysent & x)) {
2701 ast_verbose("Answering with capability %d\n", x);
2702 codec = ast_rtp_lookup_code(p->rtp, 1, x);
2704 snprintf(costr, sizeof(costr), " %d", codec);
2705 if (x < 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, x));
2708 strncat(a, costr, sizeof(a) - strlen(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, x));
2712 strncat(a2, costr, sizeof(a2) - strlen(a2));
2717 for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
2718 if (p->noncodeccapability & x) {
2720 ast_verbose("Answering with non-codec capability %d\n", x);
2721 codec = ast_rtp_lookup_code(p->rtp, 0, x);
2723 snprintf(costr, sizeof(costr), " %d", codec);
2724 strncat(m, costr, sizeof(m) - strlen(m));
2725 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(0, x));
2726 strncat(a, costr, sizeof(a) - strlen(a));
2727 if (x == AST_RTP_DTMF) {
2728 /* Indicate we support DTMF... Not sure about 16, but MSN supports it so dang it, we will too... */
2729 snprintf(costr, sizeof costr, "a=fmtp:%d 0-16\r\n",
2731 strncat(a, costr, sizeof(a) - strlen(a));
2736 strncat(a, "a=silenceSupp:off - - - -\r\n", sizeof(a) - strlen(a));
2737 if (strlen(m) < sizeof(m) - 2)
2739 if (strlen(m2) < sizeof(m2) - 2)
2741 if ((sizeof(m) <= strlen(m) - 2) || (sizeof(m2) <= strlen(m2) - 2) || (sizeof(a) == strlen(a)) || (sizeof(a2) == strlen(a2)))
2742 ast_log(LOG_WARNING, "SIP SDP may be truncated due to undersized buffer!!\n");
2743 len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m) + strlen(a);
2745 len += strlen(m2) + strlen(a2);
2746 snprintf(costr, sizeof(costr), "%d", len);
2747 add_header(resp, "Content-Type", "application/sdp");
2748 add_header(resp, "Content-Length", costr);
2763 static void copy_request(struct sip_request *dst,struct sip_request *src)
2767 offset = ((void *)dst) - ((void *)src);
2768 /* First copy stuff */
2769 memcpy(dst, src, sizeof(*dst));
2770 /* Now fix pointer arithmetic */
2771 for (x=0;x<src->headers;x++)
2772 dst->header[x] += offset;
2773 for (x=0;x<src->lines;x++)
2774 dst->line[x] += offset;
2777 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans)
2779 struct sip_request resp;
2781 if (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1) {
2782 ast_log(LOG_WARNING, "Unable to get seqno from '%s'\n", get_header(req, "CSeq"));
2785 respprep(&resp, p, msg, req);
2786 add_sdp(&resp, p, NULL, NULL);
2787 return send_response(p, &resp, retrans, seqno);
2790 static int determine_firstline_parts( struct sip_request *req ) {
2795 cmd= req->header[0];
2796 while(*cmd && (*cmd < 33)) {
2803 while(*e && (*e > 32)) {
2806 /* Get the command */
2812 while( *e && ( *e < 33 ) ) {
2819 if ( !strcasecmp(cmd, "SIP/2.0") ) {
2820 /* We have a response */
2822 len= strlen( req->rlPart2 );
2823 if( len < 2 ) { return -1; }
2825 while( *e && *e<33 ) {
2830 /* We have a request */
2833 if( !*e ) { return -1; }
2836 if( ( e= strrchr( req->rlPart2, 'S' ) ) == NULL ) {
2839 while( isspace( *(--e) ) ) {}
2849 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2851 struct sip_request req;
2852 if (p->canreinvite == REINVITE_UPDATE)
2853 reqprep(&req, p, "UPDATE", 0);
2856 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
2857 reqprep(&req, p, "INVITE", 0);
2859 add_header(&req, "Allow", ALLOWED_METHODS);
2860 add_sdp(&req, p, rtp, vrtp);
2861 /* Use this as the basis */
2862 copy_request(&p->initreq, &req);
2864 determine_firstline_parts(&p->initreq);
2865 p->lastinvite = p->ocseq;
2867 return send_request(p, &req, 1, p->ocseq);
2870 static void extract_uri(struct sip_pvt *p, struct sip_request *req)
2872 char stripped[256]="";
2874 strncpy(stripped, get_header(req, "Contact"), sizeof(stripped) - 1);
2875 c = strchr(stripped, '<');
2887 strncpy(p->uri, c, sizeof(p->uri) - 1);
2890 static void build_contact(struct sip_pvt *p)
2892 /* Construct Contact: header */
2893 if (ourport != 5060)
2894 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s:%d>", p->exten, inet_ntoa(p->ourip), ourport);
2896 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s>", p->exten, inet_ntoa(p->ourip));
2899 static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, char *vxml_url)
2906 char *l = callerid, *n=NULL;
2908 snprintf(p->lastmsg, sizeof(p->lastmsg), "Init: %s", cmd);
2910 if (p->owner && p->owner->callerid) {
2911 strcpy(cid, p->owner->callerid);
2912 ast_callerid_parse(cid, &n, &l);
2914 ast_shrink_phone_number(l);
2915 if (!l || !ast_isphonenumber(l))
2918 /* if user want's his callerid restricted */
2920 l = CALLERID_UNKNOWN;
2921 if (!n || !strlen(n))
2923 /* Allow user to be overridden */
2924 if (strlen(p->fromuser))
2927 if ((ourport != 5060) && !strlen(p->fromdomain))
2928 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);
2930 snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=as%08x", n, l, strlen(p->fromdomain) ? p->fromdomain : inet_ntoa(p->ourip), p->tag);
2932 if (strlen(p->username)) {
2933 if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2934 snprintf(invite, sizeof(invite), "sip:%s@%s:%d",p->username, p->tohost, ntohs(p->sa.sin_port));
2936 snprintf(invite, sizeof(invite), "sip:%s@%s",p->username, p->tohost);
2938 } else if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2939 snprintf(invite, sizeof(invite), "sip:%s:%d", p->tohost, ntohs(p->sa.sin_port));
2941 snprintf(invite, sizeof(invite), "sip:%s", p->tohost);
2943 strncpy(p->uri, invite, sizeof(p->uri) - 1);
2944 /* If there is a VXML URL append it to the SIP URL */
2947 snprintf(to, sizeof(to), "<%s>;%s", invite, vxml_url);
2951 snprintf(to, sizeof(to), "<%s>", invite );
2953 memset(req, 0, sizeof(struct sip_request));
2954 init_req(req, cmd, invite);
2955 snprintf(tmp, sizeof(tmp), "%d %s", ++p->ocseq, cmd);
2957 add_header(req, "Via", p->via);
2958 /* SLD: FIXME?: do Route: here too? I think not cos this is the first request.
2959 * OTOH, then we won't have anything in p->route anyway */
2960 add_header(req, "From", from);
2961 strncpy(p->exten, l, sizeof(p->exten) - 1);
2963 add_header(req, "To", to);
2964 add_header(req, "Contact", p->our_contact);
2965 add_header(req, "Call-ID", p->callid);
2966 add_header(req, "CSeq", tmp);
2967 add_header(req, "User-Agent", "Asterisk PBX");
2970 static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, char *authheader, char *vxml_url, char *distinctive_ring, int init)
2972 struct sip_request req;
2975 initreqprep(&req, p, cmd, vxml_url);
2977 reqprep(&req, p, cmd, 0);
2980 add_header(&req, authheader, auth);
2982 if (!strcasecmp(cmd, "REFER")) {
2983 if (strlen(p->refer_to))
2984 add_header(&req, "Refer-To", p->refer_to);
2985 if (strlen(p->referred_by))
2986 add_header(&req, "Referred-By", p->referred_by);
2989 if (distinctive_ring)
2991 add_header(&req, "Alert-info",distinctive_ring);
2993 add_header(&req, "Allow", ALLOWED_METHODS);
2995 add_sdp(&req, p, NULL, NULL);
2997 add_header(&req, "Content-Length", "0");
2998 add_blank_header(&req);
3001 if (!p->initreq.headers) {
3002 /* Use this as the basis */
3003 copy_request(&p->initreq, &req);
3005 determine_firstline_parts(&p->initreq);
3007 p->lastinvite = p->ocseq;
3008 return send_request(p, &req, 1, p->ocseq);
3011 static int transmit_state_notify(struct sip_pvt *p, int state, int full)
3014 char from[256], to[256];
3017 struct sip_request req;
3020 strncpy(from, get_header(&p->initreq, "From"), sizeof(from)-1);
3022 c = ditch_braces(from);
3023 if (strncmp(c, "sip:", 4)) {
3024 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
3027 if ((a = strchr(c, ';'))) {
3032 reqprep(&req, p, "NOTIFY", 0);
3034 if (p->subscribed == 1) {
3035 strncpy(to, get_header(&p->initreq, "To"), sizeof(to)-1);
3037 c = ditch_braces(to);
3038 if (strncmp(c, "sip:", 4)) {
3039 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
3042 if ((a = strchr(c, ';'))) {
3047 add_header(&req, "Content-Type", "application/xpidf+xml");
3049 if ((state==AST_EXTENSION_UNAVAILABLE) || (state==AST_EXTENSION_BUSY))
3051 else if (state==AST_EXTENSION_INUSE)
3057 sprintf(t, "<?xml version=\"1.0\"?>\n");
3058 t = tmp + strlen(tmp);
3059 sprintf(t, "<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n");
3060 t = tmp + strlen(tmp);
3061 sprintf(t, "<presence>\n");
3062 t = tmp + strlen(tmp);
3063 sprintf(t, "<presentity uri=\"%s;method=SUBSCRIBE\" />\n", mfrom);
3064 t = tmp + strlen(tmp);
3065 sprintf(t, "<atom id=\"%s\">\n", p->exten);
3066 t = tmp + strlen(tmp);
3067 sprintf(t, "<address uri=\"%s;user=ip\" priority=\"0,800000\">\n", mto);
3068 t = tmp + strlen(tmp);
3069 sprintf(t, "<status status=\"%s\" />\n", !state ? "open" : (state==1) ? "inuse" : "closed");
3070 t = tmp + strlen(tmp);