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)
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, 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) > default_expiry)
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)
1369 struct sip_pvt *p = newchan->pvt->pvt;
1370 ast_mutex_lock(&p->lock);
1371 if (p->owner != oldchan) {
1372 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
1373 ast_mutex_unlock(&p->lock);
1377 ast_mutex_unlock(&p->lock);
1381 static int sip_senddigit(struct ast_channel *ast, char digit)
1383 struct sip_pvt *p = ast->pvt->pvt;
1384 if (p && (p->dtmfmode & SIP_DTMF_INFO)) {
1385 transmit_info_with_digit(p, digit);
1387 if (p && p->rtp && (p->dtmfmode & SIP_DTMF_RFC2833)) {
1388 ast_rtp_senddigit(p->rtp, digit);
1390 /* If in-band DTMF is desired, send that */
1391 if (p->dtmfmode & SIP_DTMF_INBAND)
1396 static int sip_transfer(struct ast_channel *ast, char *dest)
1398 struct sip_pvt *p = ast->pvt->pvt;
1400 res = transmit_refer(p, dest);
1404 static int sip_indicate(struct ast_channel *ast, int condition)
1406 struct sip_pvt *p = ast->pvt->pvt;
1408 case AST_CONTROL_RINGING:
1409 if (ast->_state == AST_STATE_RING) {
1410 if (!p->progress && !p->ringing) {
1411 transmit_response(p, "180 Ringing", &p->initreq);
1415 /* Oops, we've sent progress tones. Let Asterisk do it instead */
1419 case AST_CONTROL_BUSY:
1420 if (ast->_state != AST_STATE_UP) {
1421 transmit_response(p, "486 Busy Here", &p->initreq);
1423 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1427 case AST_CONTROL_CONGESTION:
1428 if (ast->_state != AST_STATE_UP) {
1429 transmit_response(p, "503 Service Unavailable", &p->initreq);
1431 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1435 case AST_CONTROL_PROGRESS:
1436 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1437 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1445 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
1453 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
1455 struct ast_channel *tmp;
1457 tmp = ast_channel_alloc(1);
1459 /* Select our native format based on codec preference until we receive
1460 something from another device to the contrary. */
1461 if (i->jointcapability)
1462 tmp->nativeformats = sip_codec_choose(i->jointcapability);
1463 else if (i->capability)
1464 tmp->nativeformats = sip_codec_choose(i->capability);
1466 tmp->nativeformats = sip_codec_choose(capability);
1467 fmt = ast_best_codec(tmp->nativeformats);
1469 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
1471 if (strchr(i->fromdomain,':'))
1473 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(i));
1477 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(i));
1480 if (i->dtmfmode & SIP_DTMF_INBAND) {
1481 i->vad = ast_dsp_new();
1482 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
1484 tmp->fds[0] = ast_rtp_fd(i->rtp);
1485 tmp->fds[1] = ast_rtcp_fd(i->rtp);
1487 tmp->fds[2] = ast_rtp_fd(i->vrtp);
1488 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
1490 ast_setstate(tmp, state);
1491 if (state == AST_STATE_RING)
1493 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
1494 tmp->writeformat = fmt;
1495 tmp->pvt->rawwriteformat = fmt;
1496 tmp->readformat = fmt;
1497 tmp->pvt->rawreadformat = fmt;
1499 tmp->pvt->send_text = sip_sendtext;
1500 tmp->pvt->call = sip_call;
1501 tmp->pvt->hangup = sip_hangup;
1502 tmp->pvt->answer = sip_answer;
1503 tmp->pvt->read = sip_read;
1504 tmp->pvt->write = sip_write;
1505 tmp->pvt->write_video = sip_write;
1506 tmp->pvt->indicate = sip_indicate;
1507 tmp->pvt->transfer = sip_transfer;
1508 tmp->pvt->fixup = sip_fixup;
1509 tmp->pvt->send_digit = sip_senddigit;
1511 tmp->pvt->bridge = ast_rtp_bridge;
1513 tmp->callgroup = i->callgroup;
1514 tmp->pickupgroup = i->pickupgroup;
1515 tmp->restrictcid = i->restrictcid;
1516 if (strlen(i->accountcode))
1517 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
1519 tmp->amaflags = i->amaflags;
1520 if (strlen(i->language))
1521 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
1523 ast_mutex_lock(&usecnt_lock);
1525 ast_mutex_unlock(&usecnt_lock);
1526 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
1527 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
1528 if (strlen(i->callerid))
1529 tmp->callerid = strdup(i->callerid);
1530 if (strlen(i->rdnis))
1531 tmp->rdnis = strdup(i->rdnis);
1533 if (strlen(i->domain)) {
1534 pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
1537 if (state != AST_STATE_DOWN) {
1538 if (ast_pbx_start(tmp)) {
1539 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
1545 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
1549 static struct cfalias {
1553 { "Content-Type", "c" },
1554 { "Content-Encoding", "e" },
1558 { "Content-Length", "l" },
1564 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
1565 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
1566 char* r = line + nameLen + 1;
1567 while (*r && (*r < 33)) ++r;
1574 static char *get_sdp(struct sip_request *req, char *name) {
1576 int len = strlen(name);
1579 for (x=0; x<req->lines; x++) {
1580 r = get_sdp_by_line(req->line[x], name, len);
1581 if (r[0] != '\0') return r;
1586 static void sdpLineNum_iterator_init(int* iterator) {
1590 static char* get_sdp_iterate(int* iterator,
1591 struct sip_request *req, char *name) {
1592 int len = strlen(name);
1594 while (*iterator < req->lines) {
1595 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
1596 if (r[0] != '\0') return r;
1601 static char *__get_header(struct sip_request *req, char *name, int *start)
1604 int len = strlen(name);
1606 for (x=*start;x<req->headers;x++) {
1607 if (!strncasecmp(req->header[x], name, len) &&
1608 (req->header[x][len] == ':')) {
1609 r = req->header[x] + len + 1;
1610 while(*r && (*r < 33))
1617 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
1618 if (!strcasecmp(aliases[x].fullname, name))
1619 return __get_header(req, aliases[x].shortname, start);
1621 /* Don't return NULL, so get_header is always a valid pointer */
1625 static char *get_header(struct sip_request *req, char *name)
1628 return __get_header(req, name, &start);
1631 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
1633 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
1634 struct ast_frame *f;
1635 static struct ast_frame null_frame = { AST_FRAME_NULL, };
1638 f = ast_rtp_read(p->rtp);
1641 f = ast_rtcp_read(p->rtp);
1644 f = ast_rtp_read(p->vrtp);
1647 f = ast_rtcp_read(p->vrtp);
1652 /* Don't send RFC2833 if we're not supposed to */
1653 if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & SIP_DTMF_RFC2833))
1656 /* We already hold the channel lock */
1657 if (f->frametype == AST_FRAME_VOICE) {
1658 if (f->subclass != p->owner->nativeformats) {
1659 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
1660 p->owner->nativeformats = f->subclass;
1661 ast_set_read_format(p->owner, p->owner->readformat);
1662 ast_set_write_format(p->owner, p->owner->writeformat);
1664 if (p->dtmfmode & SIP_DTMF_INBAND) {
1665 f = ast_dsp_process(p->owner,p->vad,f,0);
1672 static struct ast_frame *sip_read(struct ast_channel *ast)
1674 struct ast_frame *fr;
1675 struct sip_pvt *p = ast->pvt->pvt;
1676 ast_mutex_lock(&p->lock);
1677 fr = sip_rtp_read(ast, p);
1678 ast_mutex_unlock(&p->lock);
1682 static void build_callid(char *callid, int len, struct in_addr ourip)
1689 res = snprintf(callid, len, "%08x", val);
1693 /* It's not important that we really use our right IP here... */
1694 snprintf(callid, len, "@%s", inet_ntoa(ourip));
1697 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobalnat)
1701 p = malloc(sizeof(struct sip_pvt));
1704 /* Keep track of stuff */
1705 memset(p, 0, sizeof(struct sip_pvt));
1709 p->rtp = ast_rtp_new(sched, io, 1, 0);
1711 p->vrtp = ast_rtp_new(sched, io, 1, 0);
1715 /* Start with 101 instead of 1 */
1718 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
1722 ast_rtp_settos(p->rtp, tos);
1724 ast_rtp_settos(p->vrtp, tos);
1725 if (useglobalnat && sin) {
1726 /* Setup NAT structure according to global settings if we have an address */
1728 memcpy(&p->recv, sin, sizeof(p->recv));
1729 ast_rtp_setnat(p->rtp, p->nat);
1731 ast_rtp_setnat(p->vrtp, p->nat);
1733 ast_mutex_init(&p->lock);
1736 memcpy(&p->sa, sin, sizeof(p->sa));
1737 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
1738 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1740 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1742 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
1743 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
1745 build_callid(p->callid, sizeof(p->callid), p->ourip);
1747 strncpy(p->callid, callid, sizeof(p->callid) - 1);
1748 /* Assume reinvite OK and via INVITE */
1749 p->canreinvite = globalcanreinvite;
1750 p->dtmfmode = globaldtmfmode;
1751 p->capability = capability;
1752 if (p->dtmfmode & SIP_DTMF_RFC2833)
1753 p->noncodeccapability |= AST_RTP_DTMF;
1754 strncpy(p->context, context, sizeof(p->context) - 1);
1755 strncpy(p->fromdomain, fromdomain, sizeof(p->fromdomain) - 1);
1757 ast_mutex_lock(&iflock);
1760 ast_mutex_unlock(&iflock);
1762 ast_log(LOG_DEBUG, "Allocating new SIP call for %s\n", callid);
1766 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin)
1774 callid = get_header(req, "Call-ID");
1776 if (pedanticsipchecking) {
1777 /* In principle Call-ID's uniquely identify a call, however some vendors
1778 (i.e. Pingtel) send multiple calls with the same Call-ID and different
1779 tags in order to simplify billing. The RFC does state that we have to
1780 compare tags in addition to the call-id, but this generate substantially
1781 more overhead which is totally unnecessary for the vast majority of sane
1782 SIP implementations, and thus Asterisk does not enable this behavior
1783 by default. Short version: You'll need this option to support conferencing
1785 strncpy(tmp, req->header[0], sizeof(tmp) - 1);
1787 c = strchr(tmp, ' ');
1790 if (!strcasecmp(cmd, "SIP/2.0")) {
1796 strncpy(tmp, get_header(req, "From"), sizeof(tmp) - 1);
1798 strncpy(tmp, get_header(req, "To"), sizeof(tmp) - 1);
1799 tag = strstr(tmp, "tag=");
1802 c = strchr(tag, ';');
1809 if (!strlen(callid)) {
1810 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", inet_ntoa(sin->sin_addr));
1813 ast_mutex_lock(&iflock);
1816 if (!strcmp(p->callid, callid) &&
1817 (!pedanticsipchecking || !tag || !strlen(p->theirtag) || !strcmp(p->theirtag, tag))) {
1818 /* Found the call */
1819 ast_mutex_lock(&p->lock);
1820 ast_mutex_unlock(&iflock);
1825 ast_mutex_unlock(&iflock);
1826 p = sip_alloc(callid, sin, 1);
1828 ast_mutex_lock(&p->lock);
1832 static int sip_register(char *value, int lineno)
1834 struct sip_registry *reg;
1835 char copy[256] = "";
1836 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
1844 strncpy(copy, value, sizeof(copy)-1);
1847 hostname = strrchr(stringp, '@');
1852 if (!username || !strlen(username) || !hostname || !strlen(hostname)) {
1853 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d", lineno);
1857 username = strsep(&stringp, ":");
1859 secret = strsep(&stringp, ":");
1861 authuser = strsep(&stringp, ":");
1864 hostname = strsep(&stringp, "/");
1866 contact = strsep(&stringp, "/");
1867 if (!contact || !strlen(contact))
1870 hostname = strsep(&stringp, ":");
1871 porta = strsep(&stringp, ":");
1873 if (porta && !atoi(porta)) {
1874 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
1877 hp = gethostbyname(hostname);
1879 ast_log(LOG_WARNING, "Host '%s' not found at line %d\n", hostname, lineno);
1882 reg = malloc(sizeof(struct sip_registry));
1884 memset(reg, 0, sizeof(struct sip_registry));
1885 strncpy(reg->contact, contact, sizeof(reg->contact) - 1);
1887 strncpy(reg->username, username, sizeof(reg->username)-1);
1889 strncpy(reg->hostname, hostname, sizeof(reg->hostname)-1);
1891 strncpy(reg->authuser, authuser, sizeof(reg->authuser)-1);
1893 strncpy(reg->secret, secret, sizeof(reg->secret)-1);
1896 reg->refresh = default_expiry;
1897 reg->addr.sin_family = AF_INET;
1898 memcpy(®->addr.sin_addr, hp->h_addr, sizeof(®->addr.sin_addr));
1899 reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT);
1900 reg->callid_valid = 0;
1902 ast_mutex_lock(®l.lock);
1903 reg->next = regl.registrations;
1904 regl.registrations = reg;
1905 ast_mutex_unlock(®l.lock);
1907 ast_log(LOG_ERROR, "Out of memory\n");
1913 static void parse(struct sip_request *req)
1915 /* Divide fields by NULL's */
1920 /* First header starts immediately */
1924 /* We've got a new header */
1928 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
1930 if (!strlen(req->header[f])) {
1931 /* Line by itself means we're now in content */
1935 if (f >= SIP_MAX_HEADERS - 1) {
1936 ast_log(LOG_WARNING, "Too many SIP headers...\n");
1939 req->header[f] = c + 1;
1940 } else if (*c == '\r') {
1941 /* Ignore but eliminate \r's */
1946 /* Check for last header */
1947 if (strlen(req->header[f]))
1950 /* Now we process any mime content */
1955 /* We've got a new line */
1958 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
1960 if (f >= SIP_MAX_LINES - 1) {
1961 ast_log(LOG_WARNING, "Too many SDP lines...\n");
1964 req->line[f] = c + 1;
1965 } else if (*c == '\r') {
1966 /* Ignore and eliminate \r's */
1971 /* Check for last line */
1972 if (strlen(req->line[f]))
1976 ast_verbose("%d headers, %d lines\n", req->headers, req->lines);
1978 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
1981 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
1990 int peercapability, peernoncodeccapability;
1991 int vpeercapability=0, vpeernoncodeccapability=0;
1992 struct sockaddr_in sin;
2000 /* Get codec and RTP info from SDP */
2001 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
2002 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
2005 m = get_sdp(req, "m");
2006 c = get_sdp(req, "c");
2007 if (!strlen(m) || !strlen(c)) {
2008 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
2011 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2012 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
2015 /* XXX This could block for a long time, and block the main thread! XXX */
2016 hp = gethostbyname(host);
2018 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
2021 sdpLineNum_iterator_init(&iterator);
2022 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
2023 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) {
2025 // Scan through the RTP payload types specified in a "m=" line:
2026 ast_rtp_pt_clear(p->rtp);
2028 while(strlen(codecs)) {
2029 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2030 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2034 ast_verbose("Found audio format %s\n", ast_getformatname(codec));
2035 ast_rtp_set_m_type(p->rtp, codec);
2037 /* Skip over any whitespace */
2038 while(*codecs && (*codecs < 33)) codecs++;
2041 if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
2043 // Scan through the RTP payload types specified in a "m=" line:
2044 ast_rtp_pt_clear(p->vrtp);
2046 while(strlen(codecs)) {
2047 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2048 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2052 ast_verbose("Found video format %s\n", ast_getformatname(codec));
2053 ast_rtp_set_m_type(p->vrtp, codec);
2055 /* Skip over any whitespace */
2056 while(*codecs && (*codecs < 33)) codecs++;
2060 sin.sin_family = AF_INET;
2061 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
2062 /* Setup audio port number */
2063 sin.sin_port = htons(portno);
2064 if (p->rtp && sin.sin_port)
2065 ast_rtp_set_peer(p->rtp, &sin);
2066 /* Setup video port number */
2067 sin.sin_port = htons(vportno);
2068 if (p->vrtp && sin.sin_port)
2069 ast_rtp_set_peer(p->vrtp, &sin);
2071 printf("Peer RTP is at port %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
2073 // Next, scan through each "a=rtpmap:" line, noting each
2074 // specified RTP payload type (with corresponding MIME subtype):
2075 sdpLineNum_iterator_init(&iterator);
2076 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
2077 char* mimeSubtype = ast_strdupa(a); // ensures we have enough space
2078 if (!strcasecmp(a, "sendonly")) {
2082 if (!strcasecmp(a, "sendrecv")) {
2085 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
2087 ast_verbose("Found description format %s\n", mimeSubtype);
2088 // Note: should really look at the 'freq' and '#chans' params too
2089 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
2091 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
2094 // Now gather all of the codecs that were asked for:
2095 ast_rtp_get_current_formats(p->rtp,
2096 &peercapability, &peernoncodeccapability);
2098 ast_rtp_get_current_formats(p->vrtp,
2099 &vpeercapability, &vpeernoncodeccapability);
2100 p->jointcapability = p->capability & (peercapability | vpeercapability);
2101 p->noncodeccapability = noncodeccapability & (peernoncodeccapability | vpeernoncodeccapability);
2104 ast_verbose("Capabilities: us - %d, them - %d/%d, combined - %d\n",
2105 p->capability, peercapability, vpeercapability, p->jointcapability);
2106 ast_verbose("Non-codec capabilities: us - %d, them - %d, combined - %d\n",
2107 noncodeccapability, peernoncodeccapability,
2108 p->noncodeccapability);
2110 if (!p->jointcapability) {
2111 ast_log(LOG_WARNING, "No compatible codecs!\n");
2115 if (!(p->owner->nativeformats & p->jointcapability)) {
2116 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);
2117 p->owner->nativeformats = sip_codec_choose(p->jointcapability);
2118 ast_set_read_format(p->owner, p->owner->readformat);
2119 ast_set_write_format(p->owner, p->owner->writeformat);
2121 if (p->owner->bridge) {
2122 /* Turn on/off music on hold if we are holding/unholding */
2123 if (sin.sin_addr.s_addr && !sendonly) {
2124 ast_moh_stop(p->owner->bridge);
2126 ast_moh_start(p->owner->bridge, NULL);
2134 static int add_header(struct sip_request *req, char *var, char *value)
2136 if (req->len >= sizeof(req->data) - 4) {
2137 ast_log(LOG_WARNING, "Out of space, can't add anymore (%s:%s)\n", var, value);
2141 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2144 req->header[req->headers] = req->data + req->len;
2145 snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", var, value);
2146 req->len += strlen(req->header[req->headers]);
2147 if (req->headers < SIP_MAX_HEADERS)
2150 ast_log(LOG_WARNING, "Out of header space\n");
2156 static int add_blank_header(struct sip_request *req)
2158 if (req->len >= sizeof(req->data) - 4) {
2159 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2163 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2166 req->header[req->headers] = req->data + req->len;
2167 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "\r\n");
2168 req->len += strlen(req->header[req->headers]);
2169 if (req->headers < SIP_MAX_HEADERS)
2172 ast_log(LOG_WARNING, "Out of header space\n");
2178 static int add_line(struct sip_request *req, char *line)
2180 if (req->len >= sizeof(req->data) - 4) {
2181 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2185 /* Add extra empty return */
2186 snprintf(req->data + req->len, sizeof(req->data) - req->len, "\r\n");
2187 req->len += strlen(req->data + req->len);
2189 req->line[req->lines] = req->data + req->len;
2190 snprintf(req->line[req->lines], sizeof(req->data) - req->len, "%s", line);
2191 req->len += strlen(req->line[req->lines]);
2192 if (req->lines < SIP_MAX_LINES)
2195 ast_log(LOG_WARNING, "Out of line space\n");
2201 static int copy_header(struct sip_request *req, struct sip_request *orig, char *field)
2204 tmp = get_header(orig, field);
2206 /* Add what we're responding to */
2207 return add_header(req, field, tmp);
2209 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2213 static int copy_all_header(struct sip_request *req, struct sip_request *orig, char *field)
2219 tmp = __get_header(orig, field, &start);
2221 /* Add what we're responding to */
2222 add_header(req, field, tmp);
2227 return copied ? 0 : -1;
2230 static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct sip_request *orig, char *field)
2237 tmp = __get_header(orig, field, &start);
2239 if (!copied && p->nat) {
2240 #ifdef THE_SIP_AUTHORS_CAN_SUCK_MY_GONADS
2241 /* SLD: FIXME: Nice try, but the received= should not have a port */
2242 /* SLD: FIXME: See RFC2543 BNF in Section 6.40.5 */
2243 /* MAS: Yup, RFC says you can't do it. No way to indicate PAT...
2245 if (ntohs(p->recv.sin_port) != DEFAULT_SIP_PORT)
2246 snprintf(new, sizeof(new), "%s;received=%s:%d", tmp, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
2249 snprintf(new, sizeof(new), "%s;received=%s", tmp, inet_ntoa(p->recv.sin_addr));
2250 add_header(req, field, new);
2252 /* Add what we're responding to */
2253 add_header(req, field, tmp);
2260 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2266 /* Add Route: header into request per learned route */
2267 static void add_route(struct sip_request *req, struct sip_route *route)
2270 int n, rem = 255; /* sizeof(r)-1: Room for terminating 0 */
2276 n = strlen(route->hop);
2277 if ((n+3)>rem) break;
2283 strcpy(p, route->hop); p += n;
2286 route = route->next;
2289 add_header(req, "Route", r);
2292 static void set_destination(struct sip_pvt *p, char *uri)
2294 char *h, *maddr, hostname[256];
2298 /* Parse uri to h (host) and port - uri is already just the part inside the <> */
2299 /* general form we are expecting is sip[s]:username[:password]@host[:port][;...] */
2302 ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
2304 /* Find and parse hostname */
2305 h = strchr(uri, '@');
2310 if (strncmp(h, "sip:", 4) == 0)
2312 else if (strncmp(h, "sips:", 5) == 0)
2315 hn = strcspn(h, ":;>");
2317 strncpy(hostname, h, hn); hostname[hn] = '\0';
2320 /* Is "port" present? if not default to 5060 */
2324 port = strtol(h, &h, 10);
2329 /* Got the hostname:port - but maybe there's a "maddr=" to override address? */
2330 maddr = strstr(h, "maddr=");
2333 hn = strspn(maddr, "0123456789.");
2335 strncpy(hostname, maddr, hn); hostname[hn] = '\0';
2338 hp = gethostbyname(hostname);
2340 ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
2343 p->sa.sin_family = AF_INET;
2344 memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr));
2345 p->sa.sin_port = htons(port);
2347 ast_verbose("set_destination: set destination to %s, port %d\n", inet_ntoa(p->sa.sin_addr), port);
2350 static int init_resp(struct sip_request *req, char *resp, struct sip_request *orig)
2352 /* Initialize a response */
2353 if (req->headers || req->len) {
2354 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2357 req->header[req->headers] = req->data + req->len;
2358 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "SIP/2.0 %s\r\n", resp);
2359 req->len += strlen(req->header[req->headers]);
2360 if (req->headers < SIP_MAX_HEADERS)
2363 ast_log(LOG_WARNING, "Out of header space\n");
2367 static int init_req(struct sip_request *req, char *resp, char *recip)
2369 /* Initialize a response */
2370 if (req->headers || req->len) {
2371 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2374 req->header[req->headers] = req->data + req->len;
2375 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "%s %s SIP/2.0\r\n", resp, recip);
2376 req->len += strlen(req->header[req->headers]);
2377 if (req->headers < SIP_MAX_HEADERS)
2380 ast_log(LOG_WARNING, "Out of header space\n");
2384 static int respprep(struct sip_request *resp, struct sip_pvt *p, char *msg, struct sip_request *req)
2386 char newto[256] = "", *ot;
2387 memset(resp, 0, sizeof(*resp));
2388 init_resp(resp, msg, req);
2389 copy_via_headers(p, resp, req, "Via");
2390 if (msg[0] == '2') copy_all_header(resp, req, "Record-Route");
2391 copy_header(resp, req, "From");
2392 ot = get_header(req, "To");
2393 if (!strstr(ot, "tag=")) {
2394 /* Add the proper tag if we don't have it already. If they have specified
2395 their tag, use it. Otherwise, use our own tag */
2396 if (strlen(p->theirtag) && p->outgoing)
2397 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2398 else if (p->tag && !p->outgoing)
2399 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2401 strncpy(newto, ot, sizeof(newto) - 1);
2404 add_header(resp, "To", ot);
2405 copy_header(resp, req, "Call-ID");
2406 copy_header(resp, req, "CSeq");
2407 add_header(resp, "User-Agent", "Asterisk PBX");
2408 add_header(resp, "Allow", ALLOWED_METHODS);
2410 /* For registration responses, we also need expiry and
2414 snprintf(contact, sizeof(contact), "%s;expires=%d", p->our_contact, p->expiry);
2415 snprintf(tmp, sizeof(tmp), "%d", p->expiry);
2416 add_header(resp, "Expires", tmp);
2417 add_header(resp, "Contact", contact);
2419 add_header(resp, "Contact", p->our_contact);
2424 static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int seqno)
2426 struct sip_request *orig = &p->initreq;
2427 char stripped[80] ="";
2433 memset(req, 0, sizeof(struct sip_request));
2435 snprintf(p->lastmsg, sizeof(p->lastmsg), "Tx: %s", msg);
2442 if (strlen(p->uri)) {
2446 strncpy(stripped, get_header(orig, "To"), sizeof(stripped) - 1);
2448 strncpy(stripped, get_header(orig, "From"), sizeof(stripped) - 1);
2450 c = strchr(stripped, '<');
2462 init_req(req, msg, c);
2464 snprintf(tmp, sizeof(tmp), "%d %s", seqno, msg);
2466 add_header(req, "Via", p->via);
2468 set_destination(p, p->route->hop);
2469 add_route(req, p->route->next);
2472 ot = get_header(orig, "To");
2473 of = get_header(orig, "From");
2475 /* Add tag *unless* this is a CANCEL, in which case we need to send it exactly
2476 as our original request, including tag (or presumably lack thereof) */
2477 if (!strstr(ot, "tag=") && strcasecmp(msg, "CANCEL")) {
2478 /* Add the proper tag if we don't have it already. If they have specified
2479 their tag, use it. Otherwise, use our own tag */
2480 if (p->outgoing && strlen(p->theirtag))
2481 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2482 else if (!p->outgoing)
2483 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2485 snprintf(newto, sizeof(newto), "%s", ot);
2490 add_header(req, "From", of);
2491 add_header(req, "To", ot);
2493 add_header(req, "From", ot);
2494 add_header(req, "To", of);
2496 add_header(req, "Contact", p->our_contact);
2497 copy_header(req, orig, "Call-ID");
2498 add_header(req, "CSeq", tmp);
2500 add_header(req, "User-Agent", "Asterisk PBX");
2504 static int __transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2506 struct sip_request resp;
2508 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2509 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2512 respprep(&resp, p, msg, req);
2513 add_header(&resp, "Content-Length", "0");
2514 add_blank_header(&resp);
2515 return send_response(p, &resp, reliable, seqno);
2518 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req)
2520 return __transmit_response(p, msg, req, 0);
2522 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req)
2524 return __transmit_response(p, msg, req, 1);
2527 static void append_date(struct sip_request *req)
2534 strftime(tmpdat, sizeof(tmpdat), "%a, %d %b %Y %T GMT", &tm);
2535 add_header(req, "Date", tmpdat);
2538 static int transmit_response_with_date(struct sip_pvt *p, char *msg, struct sip_request *req)
2540 struct sip_request resp;
2541 respprep(&resp, p, msg, req);
2543 add_header(&resp, "Content-Length", "0");
2544 add_blank_header(&resp);
2545 return send_response(p, &resp, 0, 0);
2548 static int transmit_response_with_allow(struct sip_pvt *p, char *msg, struct sip_request *req)
2550 struct sip_request resp;
2551 respprep(&resp, p, msg, req);
2552 add_header(&resp, "Accept", "application/sdp");
2553 add_header(&resp, "Content-Length", "0");
2554 add_blank_header(&resp);
2555 return send_response(p, &resp, 0, 0);
2558 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *randdata, int reliable)
2560 struct sip_request resp;
2563 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2564 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2567 snprintf(tmp, sizeof(tmp), "Digest realm=\"asterisk\", nonce=\"%s\"", randdata);
2568 respprep(&resp, p, msg, req);
2569 add_header(&resp, "Proxy-Authenticate", tmp);
2570 add_header(&resp, "Content-Length", "0");
2571 add_blank_header(&resp);
2572 return send_response(p, &resp, reliable, seqno);
2575 static int add_text(struct sip_request *req, char *text)
2577 /* XXX Convert \n's to \r\n's XXX */
2578 int len = strlen(text);
2580 snprintf(clen, sizeof(clen), "%d", len);
2581 add_header(req, "Content-Type", "text/plain");
2582 add_header(req, "Content-Length", clen);
2583 add_line(req, text);
2587 static int add_digit(struct sip_request *req, char digit)
2592 snprintf(tmp, sizeof(tmp), "Signal=%c\r\nDuration=250\r\n", digit);
2594 snprintf(clen, sizeof(clen), "%d", len);
2595 add_header(req, "Content-Type", "application/dtmf-relay");
2596 add_header(req, "Content-Length", clen);
2601 static int add_sdp(struct sip_request *resp, struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2605 int alreadysent = 0;
2607 struct sockaddr_in sin;
2608 struct sockaddr_in vsin;
2609 struct sip_codec_pref *cur;
2620 struct sockaddr_in dest;
2621 struct sockaddr_in vdest;
2622 /* XXX We break with the "recommendation" and send our IP, in order that our
2623 peer doesn't have to gethostbyname() us XXX */
2626 ast_log(LOG_WARNING, "No way to add SDP without an RTP structure\n");
2629 if (!p->sessionid) {
2630 p->sessionid = getpid();
2631 p->sessionversion = p->sessionid;
2633 p->sessionversion++;
2634 ast_rtp_get_us(p->rtp, &sin);
2636 ast_rtp_get_us(p->vrtp, &vsin);
2638 if (p->redirip.sin_addr.s_addr) {
2639 dest.sin_port = p->redirip.sin_port;
2640 dest.sin_addr = p->redirip.sin_addr;
2642 ast_rtp_get_peer(rtp, &dest);
2644 dest.sin_addr = p->ourip;
2645 dest.sin_port = sin.sin_port;
2648 /* Determine video destination */
2650 if (p->vredirip.sin_addr.s_addr) {
2651 vdest.sin_port = p->vredirip.sin_port;
2652 vdest.sin_addr = p->vredirip.sin_addr;
2654 ast_rtp_get_peer(vrtp, &vdest);
2656 vdest.sin_addr = p->ourip;
2657 vdest.sin_port = vsin.sin_port;
2661 ast_verbose("We're at %s port %d\n", inet_ntoa(p->ourip), ntohs(sin.sin_port));
2662 if (sipdebug && p->vrtp)
2663 ast_verbose("Video is at %s port %d\n", inet_ntoa(p->ourip), ntohs(vsin.sin_port));
2664 snprintf(v, sizeof(v), "v=0\r\n");
2665 snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, inet_ntoa(dest.sin_addr));
2666 snprintf(s, sizeof(s), "s=session\r\n");
2667 snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", inet_ntoa(dest.sin_addr));
2668 snprintf(t, sizeof(t), "t=0 0\r\n");
2669 snprintf(m, sizeof(m), "m=audio %d RTP/AVP", ntohs(dest.sin_port));
2670 snprintf(m2, sizeof(m2), "m=video %d RTP/AVP", ntohs(vdest.sin_port));
2671 /* Start by sending our preferred codecs */
2674 if (p->jointcapability & cur->codec) {
2676 ast_verbose("Answering with preferred capability %d\n", cur->codec);
2677 codec = ast_rtp_lookup_code(p->rtp, 1, cur->codec);
2679 snprintf(costr, sizeof(costr), " %d", codec);
2680 if (cur->codec < AST_FORMAT_MAX_AUDIO) {
2681 strncat(m, costr, sizeof(m) - strlen(m));
2682 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2683 strncat(a, costr, sizeof(a));
2685 strncat(m2, costr, sizeof(m2) - strlen(m2));
2686 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2687 strncat(a2, costr, sizeof(a2));
2691 alreadysent |= cur->codec;
2694 /* Now send any other common codecs, and non-codec formats: */
2695 for (x = 1; x <= AST_FORMAT_MAX_AUDIO; x <<= 1) {
2696 if ((p->jointcapability & x) && !(alreadysent & x)) {
2698 ast_verbose("Answering with capability %d\n", x);
2699 codec = ast_rtp_lookup_code(p->rtp, 1, x);
2701 snprintf(costr, sizeof(costr), " %d", codec);
2702 if (x < AST_FORMAT_MAX_AUDIO) {
2703 strncat(m, costr, sizeof(m) - strlen(m));
2704 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2705 strncat(a, costr, sizeof(a) - strlen(a));
2707 strncat(m2, costr, sizeof(m2) - strlen(m2));
2708 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2709 strncat(a2, costr, sizeof(a2) - strlen(a2));
2714 for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
2715 if (p->noncodeccapability & x) {
2717 ast_verbose("Answering with non-codec capability %d\n", x);
2718 codec = ast_rtp_lookup_code(p->rtp, 0, x);
2720 snprintf(costr, sizeof(costr), " %d", codec);
2721 strncat(m, costr, sizeof(m) - strlen(m));
2722 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(0, x));
2723 strncat(a, costr, sizeof(a) - strlen(a));
2724 if (x == AST_RTP_DTMF) {
2725 /* Indicate we support DTMF... Not sure about 16, but MSN supports it so dang it, we will too... */
2726 snprintf(costr, sizeof costr, "a=fmtp:%d 0-16\r\n",
2728 strncat(a, costr, sizeof(a) - strlen(a));
2733 if (strlen(m) < sizeof(m) - 2)
2735 if (strlen(m2) < sizeof(m2) - 2)
2737 if ((sizeof(m) <= strlen(m) - 2) || (sizeof(m2) <= strlen(m2) - 2) || (sizeof(a) == strlen(a)) || (sizeof(a2) == strlen(a2)))
2738 ast_log(LOG_WARNING, "SIP SDP may be truncated due to undersized buffer!!\n");
2739 len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m) + strlen(a);
2741 len += strlen(m2) + strlen(a2);
2742 snprintf(costr, sizeof(costr), "%d", len);
2743 add_header(resp, "Content-Type", "application/sdp");
2744 add_header(resp, "Content-Length", costr);
2759 static void copy_request(struct sip_request *dst,struct sip_request *src)
2763 offset = ((void *)dst) - ((void *)src);
2764 /* First copy stuff */
2765 memcpy(dst, src, sizeof(*dst));
2766 /* Now fix pointer arithmetic */
2767 for (x=0;x<src->headers;x++)
2768 dst->header[x] += offset;
2769 for (x=0;x<src->lines;x++)
2770 dst->line[x] += offset;
2773 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans)
2775 struct sip_request resp;
2777 if (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1) {
2778 ast_log(LOG_WARNING, "Unable to get seqno from '%s'\n", get_header(req, "CSeq"));
2781 respprep(&resp, p, msg, req);
2782 add_sdp(&resp, p, NULL, NULL);
2783 return send_response(p, &resp, retrans, seqno);
2786 static int determine_firstline_parts( struct sip_request *req ) {
2791 cmd= req->header[0];
2792 while(*cmd && (*cmd < 33)) {
2799 while(*e && (*e > 32)) {
2802 /* Get the command */
2808 while( *e && ( *e < 33 ) ) {
2815 if ( !strcasecmp(cmd, "SIP/2.0") ) {
2816 /* We have a response */
2818 len= strlen( req->rlPart2 );
2819 if( len < 2 ) { return -1; }
2821 while( *e && *e<33 ) {
2826 /* We have a request */
2829 if( !*e ) { return -1; }
2832 if( ( e= strrchr( req->rlPart2, 'S' ) ) == NULL ) {
2835 while( isspace( *(--e) ) ) {}
2845 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2847 struct sip_request req;
2848 if (p->canreinvite == REINVITE_UPDATE)
2849 reqprep(&req, p, "UPDATE", 0);
2852 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
2853 reqprep(&req, p, "INVITE", 0);
2855 add_header(&req, "Allow", ALLOWED_METHODS);
2856 add_sdp(&req, p, rtp, vrtp);
2857 /* Use this as the basis */
2858 copy_request(&p->initreq, &req);
2860 determine_firstline_parts(&p->initreq);
2861 p->lastinvite = p->ocseq;
2863 return send_request(p, &req, 1, p->ocseq);
2866 static void extract_uri(struct sip_pvt *p, struct sip_request *req)
2868 char stripped[256]="";
2870 strncpy(stripped, get_header(req, "Contact"), sizeof(stripped) - 1);
2871 c = strchr(stripped, '<');
2883 strncpy(p->uri, c, sizeof(p->uri) - 1);
2886 static void build_contact(struct sip_pvt *p)
2888 /* Construct Contact: header */
2889 if (ourport != 5060)
2890 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s:%d>", p->exten, inet_ntoa(p->ourip), ourport);
2892 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s>", p->exten, inet_ntoa(p->ourip));
2895 static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, char *vxml_url)
2902 char *l = callerid, *n=NULL;
2904 snprintf(p->lastmsg, sizeof(p->lastmsg), "Init: %s", cmd);
2906 if (p->owner && p->owner->callerid) {
2907 strcpy(cid, p->owner->callerid);
2908 ast_callerid_parse(cid, &n, &l);
2910 ast_shrink_phone_number(l);
2911 if (!l || !ast_isphonenumber(l))
2914 /* if user want's his callerid restricted */
2916 l = CALLERID_UNKNOWN;
2917 if (!n || !strlen(n))
2919 /* Allow user to be overridden */
2920 if (strlen(p->fromuser))
2923 if ((ourport != 5060) && !strlen(p->fromdomain))
2924 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);
2926 snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=as%08x", n, l, strlen(p->fromdomain) ? p->fromdomain : inet_ntoa(p->ourip), p->tag);
2928 if (strlen(p->username)) {
2929 if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2930 snprintf(invite, sizeof(invite), "sip:%s@%s:%d",p->username, p->tohost, ntohs(p->sa.sin_port));
2932 snprintf(invite, sizeof(invite), "sip:%s@%s",p->username, p->tohost);
2934 } else if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
2935 snprintf(invite, sizeof(invite), "sip:%s:%d", p->tohost, ntohs(p->sa.sin_port));
2937 snprintf(invite, sizeof(invite), "sip:%s", p->tohost);
2939 strncpy(p->uri, invite, sizeof(p->uri) - 1);
2940 /* If there is a VXML URL append it to the SIP URL */
2943 snprintf(to, sizeof(to), "<%s>;%s", invite, vxml_url);
2947 snprintf(to, sizeof(to), "<%s>", invite );
2949 memset(req, 0, sizeof(struct sip_request));
2950 init_req(req, cmd, invite);
2951 snprintf(tmp, sizeof(tmp), "%d %s", ++p->ocseq, cmd);
2953 add_header(req, "Via", p->via);
2954 /* SLD: FIXME?: do Route: here too? I think not cos this is the first request.
2955 * OTOH, then we won't have anything in p->route anyway */
2956 add_header(req, "From", from);
2957 strncpy(p->exten, l, sizeof(p->exten) - 1);
2959 add_header(req, "To", to);
2960 add_header(req, "Contact", p->our_contact);
2961 add_header(req, "Call-ID", p->callid);
2962 add_header(req, "CSeq", tmp);
2963 add_header(req, "User-Agent", "Asterisk PBX");
2966 static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, char *authheader, char *vxml_url, char *distinctive_ring, int init)
2968 struct sip_request req;
2971 initreqprep(&req, p, cmd, vxml_url);
2973 reqprep(&req, p, cmd, 0);
2976 add_header(&req, authheader, auth);
2978 if (!strcasecmp(cmd, "REFER")) {
2979 if (strlen(p->refer_to))
2980 add_header(&req, "Refer-To", p->refer_to);
2981 if (strlen(p->referred_by))
2982 add_header(&req, "Referred-By", p->referred_by);
2985 if (distinctive_ring)
2987 add_header(&req, "Alert-info",distinctive_ring);
2989 add_header(&req, "Allow", ALLOWED_METHODS);
2991 add_sdp(&req, p, NULL, NULL);
2993 add_header(&req, "Content-Length", "0");
2994 add_blank_header(&req);
2997 if (!p->initreq.headers) {
2998 /* Use this as the basis */
2999 copy_request(&p->initreq, &req);
3001 determine_firstline_parts(&p->initreq);
3003 p->lastinvite = p->ocseq;
3004 return send_request(p, &req, 1, p->ocseq);
3007 static int transmit_state_notify(struct sip_pvt *p, int state, int full)
3010 char from[256], to[256];
3013 struct sip_request req;
3016 strncpy(from, get_header(&p->initreq, "From"), sizeof(from)-1);
3018 c = ditch_braces(from);
3019 if (strncmp(c, "sip:", 4)) {
3020 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
3023 if ((a = strchr(c, ';'))) {
3028 reqprep(&req, p, "NOTIFY", 0);
3030 if (p->subscribed == 1) {
3031 strncpy(to, get_header(&p->initreq, "To"), sizeof(to)-1);
3033 c = ditch_braces(to);
3034 if (strncmp(c, "sip:", 4)) {
3035 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
3038 if ((a = strchr(c, ';'))) {
3043 add_header(&req, "Content-Type", "application/xpidf+xml");
3045 if ((state==AST_EXTENSION_UNAVAILABLE) || (state==AST_EXTENSION_BUSY))
3047 else if (state==AST_EXTENSION_INUSE)
3053 sprintf(t, "<?xml version=\"1.0\"?>\n");
3054 t = tmp + strlen(tmp);
3055 sprintf(t, "<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n");
3056 t = tmp + strlen(tmp);
3057 sprintf(t, "<presence>\n");
3058 t = tmp + strlen(tmp);
3059 sprintf(t, "<presentity uri=\"%s;method=SUBSCRIBE\" />\n", mfrom);
3060 t = tmp + strlen(tmp);
3061 sprintf(t, "<atom id=\"%s\">\n", p->exten);
3062 t = tmp + strlen(tmp);
3063 sprintf(t, "<address uri=\"%s;user=ip\" priority=\"0,800000\">\n", mto);
3064 t = tmp + strlen(tmp);
3065 sprintf(t, "<status status=\"%s\" />\n", !state ? "open" : (state==1) ? "inuse" : "closed");
3066 t = tmp + strlen(tmp);
3067 sprintf(t, "<msnsubstatus substatus=\"%s\" />\n", !state ? "online" : (state==1) ? "onthephone" : "offline");
3068 t = tmp + strlen(tmp);
3069 sprintf(t, "</address>\n</atom>\n</presence>\n");
3071 add_header(&req, "Event", "dialog");
3072 add_header(&req, "Content-Type", "application/dialog-info+xml");