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 <asterisk/utils.h>
43 #include <sys/socket.h>
44 #include <sys/ioctl.h>
51 #include <arpa/inet.h>
54 #include <sys/signal.h>
55 #include <netinet/in_systm.h>
56 #include <netinet/ip.h>
58 #ifdef SIP_MYSQL_FRIENDS
60 #include <mysql/mysql.h>
63 #define VIDEO_CODEC_MASK 0x1fc0000 /* Video codecs from H.261 thru AST_FORMAT_MAX_VIDEO */
65 #define IPTOS_MINCOST 0x02
68 /* #define VOCAL_DATA_HACK */
71 #define DEFAULT_DEFAULT_EXPIRY 120
72 #define DEFAULT_MAX_EXPIRY 3600
74 /* guard limit must be larger than guard secs */
75 /* guard min must be < 1000, and should be >= 250 */
76 #define EXPIRY_GUARD_SECS 15 /* How long before expiry do we reregister */
77 #define EXPIRY_GUARD_LIMIT 30 /* Below here, we use EXPIRY_GUARD_PCT instead of EXPIRY_GUARD_SECS */
78 #define EXPIRY_GUARD_MIN 500 /* This is the minimum guard time applied. If GUARD_PCT turns out
79 to be lower than this, it will use this time instead. This is in
81 #define EXPIRY_GUARD_PCT 0.20 /* Percentage of expires timeout to use when below EXPIRY_GUARD_LIMIT */
84 #define MAX(a,b) ((a) > (b) ? (a) : (b))
87 #define CALLERID_UNKNOWN "Unknown"
89 #define SIP_DTMF_RFC2833 (1 << 0)
90 #define SIP_DTMF_INBAND (1 << 1)
91 #define SIP_DTMF_INFO (1 << 2)
93 static int max_expiry = DEFAULT_MAX_EXPIRY;
94 static int default_expiry = DEFAULT_DEFAULT_EXPIRY;
96 #define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
97 #define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
98 #define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
100 #define DEFAULT_RETRANS 1000 /* How frequently to retransmit */
101 #define MAX_RETRANS 5 /* Try only 5 times for retransmissions */
104 static ast_mutex_t mysqllock = AST_MUTEX_INITIALIZER;
106 static char mydbuser[80];
107 static char mydbpass[80];
108 static char mydbhost[80];
109 static char mydbname[80];
113 #define DEBUG_READ 0 /* Recieved data */
114 #define DEBUG_SEND 1 /* Transmit data */
116 static char *desc = "Session Initiation Protocol (SIP)";
117 static char *type = "SIP";
118 static char *tdesc = "Session Initiation Protocol (SIP)";
119 static char *config = "sip.conf";
121 #define DEFAULT_SIP_PORT 5060 /* From RFC 2543 */
122 #define SIP_MAX_PACKET 1500 /* Also from RFC 2543, should sub headers tho */
124 #define ALLOWED_METHODS "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER"
126 static char context[AST_MAX_EXTENSION] = "default";
128 static char language[MAX_LANGUAGE] = "";
130 static char callerid[AST_MAX_EXTENSION] = "asterisk";
132 static char fromdomain[AST_MAX_EXTENSION] = "";
134 static char notifymime[AST_MAX_EXTENSION] = "application/simple-message-summary";
136 static int srvlookup = 0;
138 static int pedanticsipchecking = 0;
140 static int autocreatepeer = 0;
142 static int relaxdtmf = 0;
144 static int usecnt =0;
145 static ast_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
147 /* Protect the interface list (of sip_pvt's) */
148 static ast_mutex_t iflock = AST_MUTEX_INITIALIZER;
150 /* Protect the monitoring thread, so only one process can kill or start it, and not
151 when it's doing something critical. */
152 static ast_mutex_t netlock = AST_MUTEX_INITIALIZER;
154 static ast_mutex_t monlock = AST_MUTEX_INITIALIZER;
156 /* This is the thread for the monitor which checks for input on the channels
157 which are not currently in use. */
158 static pthread_t monitor_thread = AST_PTHREADT_NULL;
160 static int restart_monitor(void);
162 /* Codecs that we support by default: */
163 static int capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263;
164 static int noncodeccapability = AST_RTP_DTMF;
166 static char ourhost[256];
167 static struct in_addr __ourip;
170 static int sipdebug = 0;
171 static struct sockaddr_in debugaddr;
175 static int videosupport = 0;
177 static int globaldtmfmode = SIP_DTMF_RFC2833;
178 static char globalmusicclass[MAX_LANGUAGE] = ""; /* Global music on hold class */
179 static char global_realm[AST_MAX_EXTENSION] = "asterisk"; /* Default realm */
182 static int expiry = 900;
184 static struct sched_context *sched;
185 static struct io_context *io;
186 /* The private structures of the sip channels are linked for
187 selecting outgoing channels */
189 #define SIP_MAX_HEADERS 64
190 #define SIP_MAX_LINES 64
194 #define DEC_OUT_USE 2
195 #define INC_OUT_USE 3
197 static struct sip_codec_pref {
199 struct sip_codec_pref *next;
203 char *rlPart1; /* SIP Method Name or "SIP/2.0" protocol version */
204 char *rlPart2; /* The Request URI or Response Status */
206 int headers; /* SIP Headers */
207 char *header[SIP_MAX_HEADERS];
208 int lines; /* SDP Content */
209 char *line[SIP_MAX_LINES];
210 char data[SIP_MAX_PACKET];
216 struct sip_route *next;
220 static struct sip_pvt {
221 ast_mutex_t lock; /* Channel private lock */
222 char callid[80]; /* Global CallID */
223 char randdata[80]; /* Random data */
224 unsigned int ocseq; /* Current outgoing seqno */
225 unsigned int icseq; /* Current incoming seqno */
226 unsigned int callgroup;
227 unsigned int pickupgroup;
228 int lastinvite; /* Last Cseq of invite */
229 int alreadygone; /* Whether or not we've already been destroyed by or peer */
230 int needdestroy; /* if we need to be destroyed */
231 int capability; /* Special capability */
232 int jointcapability; /* Supported capability at both ends */
233 int prefcodec; /* Preferred codec (outbound only) */
234 int noncodeccapability;
235 int outgoing; /* Outgoing or incoming call? */
236 int authtries; /* Times we've tried to authenticate */
237 int insecure; /* Don't check source port/ip */
238 int expiry; /* How long we take to expire */
239 int branch; /* One random number */
240 int canreinvite; /* Do we support reinvite */
241 int ringing; /* Have sent 180 ringing */
242 int progress; /* Have sent 183 message progress */
243 int tag; /* Another random number */
244 int nat; /* Whether to try to support NAT */
245 int sessionid; /* SDP Session ID */
246 int sessionversion; /* SDP Session Version */
247 struct sockaddr_in sa; /* Our peer */
248 struct sockaddr_in redirip; /* Where our RTP should be going if not to us */
249 struct sockaddr_in vredirip; /* Where our Video RTP should be going if not to us */
250 struct sockaddr_in recv; /* Received as */
251 struct in_addr ourip; /* Our IP */
252 struct ast_channel *owner; /* Who owns us */
253 char exten[AST_MAX_EXTENSION]; /* Extention where to start */
254 char refer_to[AST_MAX_EXTENSION]; /* Place to store REFER-TO extension */
255 char referred_by[AST_MAX_EXTENSION];/* Place to store REFERRED-BY extension */
256 char refer_contact[AST_MAX_EXTENSION];/* Place to store Contact info from a REFER extension */
257 struct sip_pvt *refer_call; /* Call we are referring */
258 struct sip_route *route; /* Head of linked list of routing steps (fm Record-Route) */
259 int route_persistant; /* Is this the "real" route? */
260 char remote_party_id[256];
262 char context[AST_MAX_EXTENSION];
263 char fromdomain[AST_MAX_EXTENSION]; /* Domain to show in the from field */
264 char fromuser[AST_MAX_EXTENSION]; /* Domain to show in the user field */
265 char tohost[AST_MAX_EXTENSION]; /* Host we should put in the "to" field */
266 char language[MAX_LANGUAGE];
267 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
268 char rdnis[256]; /* Referring DNIS */
269 char theirtag[256]; /* Their tag */
272 char authname[256]; /* Who we use for authentication */
273 char uri[256]; /* Original requested URI */
274 char peersecret[256];
275 char peermd5secret[256];
276 char callerid[256]; /* Caller*ID */
277 int restrictcid; /* hide presentation from remote user */
279 char accountcode[20]; /* Account code */
280 char our_contact[256]; /* Our contact header */
281 char realm[256]; /* Authorization realm */
282 char nonce[256]; /* Authorization nonce */
283 char opaque[256]; /* Opaque nonsense */
284 char qop[80]; /* Quality of Protection, since SIP wasn't complicated enough yet. */
285 char domain[256]; /* Authorization nonce */
286 char lastmsg[256]; /* Last Message sent/received */
287 int amaflags; /* AMA Flags */
288 int pendinginvite; /* Any pending invite */
289 int pendingbye; /* Need to send bye after we ack? */
290 int gotrefer; /* Got a refer? */
291 struct sip_request initreq; /* Initial request */
293 int maxtime; /* Max time for first response */
294 int initid; /* Auto-congest ID if appropriate */
295 int autokillid; /* Auto-kill ID */
304 struct sip_peer *peerpoke; /* If this calls is to poke a peer, which one */
305 struct sip_registry *registry; /* If this is a REGISTER call, to which registry */
306 struct ast_rtp *rtp; /* RTP Session */
307 struct ast_rtp *vrtp; /* Video RTP session */
308 struct sip_pkt *packets; /* Packets scheduled for re-transmission */
309 struct sip_pvt *next;
312 #define FLAG_RESPONSE (1 << 0)
313 #define FLAG_FATAL (1 << 1)
316 struct sip_pkt *next; /* Next packet */
317 int retrans; /* Retransmission number */
318 int seqno; /* Sequence number */
319 int flags; /* non-zero if this is a response packet (e.g. 200 OK) */
320 struct sip_pvt *owner; /* Owner call */
321 int retransid; /* Retransmission ID */
322 int packetlen; /* Length of packet */
327 /* Users who can access various contexts */
334 char accountcode[20];
335 char language[MAX_LANGUAGE];
336 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
337 unsigned int callgroup;
338 unsigned int pickupgroup;
352 struct sip_user *next;
359 char context[80]; /* JK02: peers need context too to allow parking etc */
365 char mailbox[AST_MAX_EXTENSION];
366 char language[MAX_LANGUAGE];
367 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
377 unsigned int callgroup;
378 unsigned int pickupgroup;
380 struct sockaddr_in addr;
384 struct sip_pvt *call; /* Call pointer */
385 int pokeexpire; /* When to expire poke */
386 int lastms; /* How long last response took (in ms), or -1 for no response */
387 int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
388 struct timeval ps; /* Ping send time */
390 struct sockaddr_in defaddr;
396 struct sip_peer *next;
399 static ast_mutex_t sip_reload_lock = AST_MUTEX_INITIALIZER;
400 static int sip_reloading = 0;
402 #define REG_STATE_UNREGISTERED 0
403 #define REG_STATE_REGSENT 1
404 #define REG_STATE_AUTHSENT 2
405 #define REG_STATE_REGISTERED 3
406 #define REG_STATE_REJECTED 4
407 #define REG_STATE_TIMEOUT 5
408 #define REG_STATE_NOAUTH 6
410 struct sip_registry {
411 struct sockaddr_in addr; /* Who we connect to for registration purposes */
412 char username[80]; /* Who we are registering as */
413 char authuser[80]; /* Who we *authenticate* as */
415 char secret[80]; /* Password or key name in []'s */
417 char contact[80]; /* Contact extension */
419 int expire; /* Sched ID of expiration */
420 int timeout; /* sched id of sip_reg_timeout */
421 int refresh; /* How often to refresh */
422 struct sip_pvt *call; /* create a sip_pvt structure for each outbound "registration call" in progress */
424 int callid_valid; /* 0 means we haven't chosen callid for this registry yet. */
425 char callid[80]; /* Global CallID for this registry */
426 unsigned int ocseq; /* Sequence number we got to for REGISTERs for this registry */
427 struct sockaddr_in us; /* Who the server thinks we are */
428 struct sip_registry *next;
431 static struct ast_user_list {
432 struct sip_user *users;
434 } userl = { NULL, AST_MUTEX_INITIALIZER };
436 static struct ast_peer_list {
437 struct sip_peer *peers;
439 } peerl = { NULL, AST_MUTEX_INITIALIZER };
441 static struct ast_register_list {
442 struct sip_registry *registrations;
445 } regl = { NULL, AST_MUTEX_INITIALIZER };
448 #define REINVITE_INVITE 1
449 #define REINVITE_UPDATE 2
451 static int __sip_do_register(struct sip_registry *r);
453 static int sipsock = -1;
454 static int globalnat = 0;
455 static int globalcanreinvite = REINVITE_INVITE;
458 static struct sockaddr_in bindaddr;
459 static struct sockaddr_in localnet;
460 static struct sockaddr_in externip;
461 static struct ast_ha *localaddr;
463 static struct ast_frame *sip_read(struct ast_channel *ast);
464 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req);
465 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
466 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *rand, int reliable);
467 static int transmit_request(struct sip_pvt *p, char *msg, int inc, int reliable, int newbranch);
468 static int transmit_request_with_auth(struct sip_pvt *p, char *msg, int inc, int reliable, int newbranch);
469 static int transmit_invite(struct sip_pvt *p, char *msg, int sendsdp, char *auth, char *authheader, char *vxml_url,char *distinctive_ring, int init);
470 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp);
471 static int transmit_info_with_digit(struct sip_pvt *p, char digit);
472 static int transmit_message_with_text(struct sip_pvt *p, char *text);
473 static int transmit_refer(struct sip_pvt *p, char *dest);
474 static struct sip_peer *temp_peer(char *name);
475 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req, char *header, char *respheader, char *msg, int init);
476 /* static char *getsipuri(char *header); */
477 static void free_old_route(struct sip_route *route);
478 static int build_reply_digest(struct sip_pvt *p, char *orig_header, char *digest, int digest_len);
479 static int update_user_counter(struct sip_pvt *fup, int event);
480 static void prune_peers(void);
481 static int sip_do_reload(void);
482 static int sip_debug_test_addr(struct sockaddr_in *addr);
483 static int sip_debug_test_pvt(struct sip_pvt *p);
485 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
489 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->recv, sizeof(struct sockaddr_in));
491 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->sa, sizeof(struct sockaddr_in));
493 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));
498 static void sip_destroy(struct sip_pvt *p);
500 static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
503 * Using the localaddr structure built up with localnet statements
504 * apply it to their address to see if we need to substitute our
505 * externip or can get away with our internal bindaddr
507 struct sockaddr_in theirs;
508 theirs.sin_addr = *them;
509 if (localaddr && externip.sin_addr.s_addr &&
510 ast_apply_ha(localaddr, &theirs)) {
512 memcpy(us, &externip.sin_addr, sizeof(struct in_addr));
513 strcpy(t, inet_ntoa(*(struct in_addr *)&them->s_addr));
514 ast_log(LOG_DEBUG, "Target address %s is not local, substituting externip\n", t);
516 else if (bindaddr.sin_addr.s_addr)
517 memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr));
519 return ast_ouraddrfor(them, us);
523 static int retrans_pkt(void *data)
525 struct sip_pkt *pkt=data;
527 ast_mutex_lock(&pkt->owner->lock);
528 if (pkt->retrans < MAX_RETRANS) {
530 if (sip_debug_test_pvt(pkt->owner)) {
532 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));
534 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));
536 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
539 ast_log(LOG_WARNING, "Maximum retries exceeded on call %s for seqno %d (%s %s)\n", pkt->owner->callid, pkt->seqno, (pkt->flags & FLAG_FATAL) ? "Critical" : "Non-critical", (pkt->flags & FLAG_RESPONSE) ? "Response" : "Request");
541 if (pkt->flags & FLAG_FATAL) {
542 while(pkt->owner->owner && ast_mutex_trylock(&pkt->owner->owner->lock)) {
543 ast_mutex_unlock(&pkt->owner->lock);
545 ast_mutex_lock(&pkt->owner->lock);
547 if (pkt->owner->owner) {
548 /* XXX Potential deadlocK?? XXX */
549 ast_queue_hangup(pkt->owner->owner);
550 ast_mutex_unlock(&pkt->owner->owner->lock);
552 /* If no owner, destroy now */
553 pkt->owner->needdestroy = 1;
556 /* Okay, it's not fatal, just continue. XXX If we were nice, we'd free it now, rather than wait for the
557 end of the call XXX */
561 ast_mutex_unlock(&pkt->owner->lock);
565 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len, int fatal)
568 pkt = malloc(sizeof(struct sip_pkt) + len);
571 memset(pkt, 0, sizeof(struct sip_pkt));
572 memcpy(pkt->data, data, len);
573 pkt->packetlen = len;
574 pkt->next = p->packets;
579 pkt->flags |= FLAG_FATAL;
580 /* Schedule retransmission */
581 pkt->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, pkt);
582 pkt->next = p->packets;
584 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
585 if (!strncasecmp(pkt->data, "INVITE", 6)) {
586 /* Note this is a pending invite */
587 p->pendinginvite = seqno;
592 static int __sip_autodestruct(void *data)
594 struct sip_pvt *p = data;
596 ast_log(LOG_DEBUG, "Auto destroying call '%s'\n", p->callid);
598 ast_log(LOG_WARNING, "Autodestruct on call '%s' with owner in place\n", p->callid);
599 ast_queue_hangup(p->owner);
606 static int sip_scheddestroy(struct sip_pvt *p, int ms)
608 if (sip_debug_test_pvt(p))
609 ast_verbose("Scheduling destruction of call '%s' in %d ms\n", p->callid, ms);
610 if (p->autokillid > -1)
611 ast_sched_del(sched, p->autokillid);
612 p->autokillid = ast_sched_add(sched, ms, __sip_autodestruct, p);
616 static int sip_cancel_destroy(struct sip_pvt *p)
618 if (p->autokillid > -1)
619 ast_sched_del(sched, p->autokillid);
624 static int __sip_ack(struct sip_pvt *p, int seqno, int resp)
626 struct sip_pkt *cur, *prev = NULL;
631 if ((cur->seqno == seqno) && ((cur->flags & FLAG_RESPONSE) == resp)) {
632 if (!resp && (seqno == p->pendinginvite)) {
633 ast_log(LOG_DEBUG, "Acked pending invite %d\n", p->pendinginvite);
634 p->pendinginvite = 0;
637 /* this is our baby */
639 prev->next = cur->next;
641 p->packets = cur->next;
642 if (cur->retransid > -1)
643 ast_sched_del(sched, cur->retransid);
651 ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
655 static int __sip_semi_ack(struct sip_pvt *p, int seqno, int resp)
661 if ((cur->seqno == seqno) && ((cur->flags & FLAG_RESPONSE) == resp)) {
662 /* this is our baby */
663 if (cur->retransid > -1)
664 ast_sched_del(sched, cur->retransid);
671 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");
675 static int send_response(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
678 if (sip_debug_test_pvt(p)) {
680 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));
682 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));
685 res = __sip_reliable_xmit(p, seqno, 1, req->data, req->len, (reliable > 1));
687 res = __sip_xmit(p, req->data, req->len);
693 static int send_request(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
696 if (sip_debug_test_pvt(p)) {
698 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));
700 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));
703 res = __sip_reliable_xmit(p, seqno, 0, req->data, req->len, (reliable > 1));
705 res = __sip_xmit(p, req->data, req->len);
709 static char *ditch_braces(char *tmp)
713 if ((n = strchr(tmp, '<')) ) {
715 while(*c && *c != '>') c++;
717 ast_log(LOG_WARNING, "No closing brace in '%s'\n", tmp);
726 static int sip_sendtext(struct ast_channel *ast, char *text)
728 struct sip_pvt *p = ast->pvt->pvt;
729 if (sip_debug_test_pvt(p))
730 ast_verbose("Sending text %s on %s\n", text, ast->name);
733 if (!text || ast_strlen_zero(text))
735 if (sip_debug_test_pvt(p))
736 ast_verbose("Really sending text %s on %s\n", text, ast->name);
737 transmit_message_with_text(p, text);
743 static void mysql_update_peer(char *peer, struct sockaddr_in *sin, char *username, int expiry)
745 if (mysql && (strlen(peer) < 128)) {
750 name = alloca(strlen(peer) * 2 + 1);
751 uname = alloca(strlen(username) * 2 + 1);
753 mysql_real_escape_string(mysql, name, peer, strlen(peer));
754 mysql_real_escape_string(mysql, uname, username, strlen(username));
755 snprintf(query, sizeof(query), "UPDATE sipfriends SET ipaddr=\"%s\", port=\"%d\", regseconds=\"%ld\", username=\"%s\" WHERE name=\"%s\"",
756 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), nowtime + expiry, uname, name);
757 ast_mutex_lock(&mysqllock);
758 if (mysql_real_query(mysql, query, strlen(query)))
759 ast_log(LOG_WARNING, "Unable to update database\n");
761 ast_mutex_unlock(&mysqllock);
765 static struct sip_peer *mysql_peer(char *peer, struct sockaddr_in *sin)
770 p = malloc(sizeof(struct sip_peer));
771 memset(p, 0, sizeof(struct sip_peer));
772 if (mysql && (!peer || (strlen(peer) < 128))) {
777 time_t regseconds, nowtime;
782 name = alloca(strlen(peer) * 2 + 1);
783 mysql_real_escape_string(mysql, name, peer, strlen(peer));
786 snprintf(query, sizeof(query), "SELECT name, secret, context, username, ipaddr, port, regseconds FROM sipfriends WHERE ipaddr=\"%s\" AND port=\"%d\"", inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
788 snprintf(query, sizeof(query), "SELECT name, secret, context, username, ipaddr, port, regseconds FROM sipfriends WHERE name=\"%s\"", name);
789 ast_mutex_lock(&mysqllock);
790 mysql_query(mysql, query);
791 if ((result = mysql_store_result(mysql))) {
792 if ((rowval = mysql_fetch_row(result))) {
793 numfields = mysql_num_fields(result);
794 fields = mysql_fetch_fields(result);
796 for (x=0;x<numfields;x++) {
798 if (!strcasecmp(fields[x].name, "secret")) {
799 strncpy(p->secret, rowval[x], sizeof(p->secret));
800 } else if (!strcasecmp(fields[x].name, "name")) {
801 strncpy(p->name, rowval[x], sizeof(p->name) - 1);
802 } else if (!strcasecmp(fields[x].name, "context")) {
803 strncpy(p->context, rowval[x], sizeof(p->context) - 1);
804 } else if (!strcasecmp(fields[x].name, "username")) {
805 strncpy(p->username, rowval[x], sizeof(p->username) - 1);
806 } else if (!strcasecmp(fields[x].name, "ipaddr")) {
807 inet_aton(rowval[x], &p->addr.sin_addr);
808 } else if (!strcasecmp(fields[x].name, "port")) {
809 if (sscanf(rowval[x], "%i", &port) != 1)
811 p->addr.sin_port = htons(port);
812 } else if (!strcasecmp(fields[x].name, "regseconds")) {
813 if (sscanf(rowval[x], "%li", ®seconds) != 1)
819 if (nowtime > regseconds)
820 memset(&p->addr, 0, sizeof(p->addr));
822 mysql_free_result(result);
825 ast_mutex_unlock(&mysqllock);
832 p->capability = capability;
834 p->dtmfmode = globaldtmfmode;
842 #endif /* MYSQL_FRIENDS */
844 static void update_peer(struct sip_peer *p, int expiry)
848 mysql_update_peer(p->name, &p->addr, p->username, expiry);
853 static struct sip_peer *find_peer(char *peer, struct sockaddr_in *sin)
855 struct sip_peer *p = NULL;
859 /* Find by peer name */
861 if (!strcasecmp(p->name, peer)) {
870 if (!inaddrcmp(&p->addr, sin) ||
872 (p->addr.sin_addr.s_addr == sin->sin_addr.s_addr))) {
881 p = mysql_peer(peer, sin);
888 static struct sip_user *find_user(char *name)
890 struct sip_user *u = NULL;
894 if (!strcasecmp(u->name, name)) {
903 static int sip_debug_test_addr(struct sockaddr_in *addr) {
904 /* See if we pass debug IP filter */
905 if (sipdebug == 0) return 0;
906 if (debugaddr.sin_addr.s_addr) {
907 if (((ntohs(debugaddr.sin_port) != 0) &&
908 (debugaddr.sin_port != addr->sin_port)) ||
909 (debugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
915 static int sip_debug_test_pvt(struct sip_pvt *p) {
916 return (sipdebug && sip_debug_test_addr((p->nat ? &p->recv : &p->sa)));
919 static int create_addr(struct sip_pvt *r, char *peer)
922 struct ast_hostent ahp;
927 char host[256], *hostn;
929 r->sa.sin_family = AF_INET;
930 ast_mutex_lock(&peerl.lock);
931 p = find_peer(peer, NULL);
935 r->capability = p->capability;
938 ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", r->nat);
939 ast_rtp_setnat(r->rtp, r->nat);
942 ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", r->nat);
943 ast_rtp_setnat(r->vrtp, r->nat);
945 strncpy(r->peername, p->username, sizeof(r->peername)-1);
946 strncpy(r->authname, p->username, sizeof(r->authname)-1);
947 strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1);
948 strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1);
949 strncpy(r->username, p->username, sizeof(r->username)-1);
950 strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1);
951 if (ast_strlen_zero(r->tohost)) {
952 if (p->addr.sin_addr.s_addr)
953 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->addr.sin_addr));
955 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->defaddr.sin_addr));
957 if (!ast_strlen_zero(p->fromdomain))
958 strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1);
959 if (!ast_strlen_zero(p->fromuser))
960 strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1);
961 r->insecure = p->insecure;
962 r->canreinvite = p->canreinvite;
963 r->maxtime = p->maxms;
964 r->callgroup = p->callgroup;
965 r->pickupgroup = p->pickupgroup;
967 r->dtmfmode = p->dtmfmode;
968 if (r->dtmfmode & SIP_DTMF_RFC2833)
969 r->noncodeccapability |= AST_RTP_DTMF;
971 r->noncodeccapability &= ~AST_RTP_DTMF;
973 strncpy(r->context, p->context,sizeof(r->context)-1);
974 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
975 (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) {
976 if (p->addr.sin_addr.s_addr) {
977 r->sa.sin_addr = p->addr.sin_addr;
978 r->sa.sin_port = p->addr.sin_port;
980 r->sa.sin_addr = p->defaddr.sin_addr;
981 r->sa.sin_port = p->defaddr.sin_port;
983 memcpy(&r->recv, &r->sa, sizeof(r->recv));
994 ast_mutex_unlock(&peerl.lock);
996 if ((port=strchr(peer, ':'))) {
1002 portno = atoi(port);
1004 portno = DEFAULT_SIP_PORT;
1009 snprintf(service, sizeof(service), "_sip._udp.%s", peer);
1010 ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service);
1016 hp = ast_gethostbyname(hostn, &ahp);
1018 strncpy(r->tohost, peer, sizeof(r->tohost) - 1);
1019 memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr));
1020 r->sa.sin_port = htons(portno);
1021 memcpy(&r->recv, &r->sa, sizeof(r->recv));
1024 ast_log(LOG_WARNING, "No such host: %s\n", peer);
1040 static int auto_congest(void *nothing)
1042 struct sip_pvt *p = nothing;
1043 ast_mutex_lock(&p->lock);
1046 if (!ast_mutex_trylock(&p->owner->lock)) {
1047 ast_log(LOG_NOTICE, "Auto-congesting %s\n", p->owner->name);
1048 ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
1049 ast_mutex_unlock(&p->owner->lock);
1052 ast_mutex_unlock(&p->lock);
1056 static void sip_prefs_free(void)
1058 struct sip_codec_pref *cur, *next;
1068 static void sip_pref_remove(int format)
1070 struct sip_codec_pref *cur, *prev=NULL;
1073 if (cur->codec == format) {
1075 prev->next = cur->next;
1086 static int sip_pref_append(int format)
1088 struct sip_codec_pref *cur, *tmp;
1089 sip_pref_remove(format);
1090 tmp = (struct sip_codec_pref *)malloc(sizeof(struct sip_codec_pref));
1093 memset(tmp, 0, sizeof(struct sip_codec_pref));
1094 tmp->codec = format;
1105 static int sip_codec_choose(int formats)
1107 struct sip_codec_pref *cur;
1108 formats &= ((AST_FORMAT_MAX_AUDIO << 1) - 1);
1111 if (formats & cur->codec)
1115 return ast_best_codec(formats);
1118 static int sip_call(struct ast_channel *ast, char *dest, int timeout)
1122 char *vxml_url = NULL;
1123 char *distinctive_ring = NULL;
1124 struct varshead *headp;
1125 struct ast_var_t *current;
1128 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
1129 ast_log(LOG_WARNING, "sip_call called on %s, neither down nor reserved\n", ast->name);
1132 /* Check whether there is vxml_url, distinctive ring variables */
1134 headp=&ast->varshead;
1135 AST_LIST_TRAVERSE(headp,current,entries) {
1136 /* Check whether there is a VXML_URL variable */
1137 if (strcasecmp(ast_var_name(current),"VXML_URL")==0)
1139 vxml_url = ast_var_value(current);
1142 /* Check whether there is a ALERT_INFO variable */
1143 if (strcasecmp(ast_var_name(current),"ALERT_INFO")==0)
1145 distinctive_ring = ast_var_value(current);
1152 ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
1153 res = update_user_counter(p,INC_OUT_USE);
1155 p->restrictcid = ast->restrictcid;
1156 p->jointcapability = p->capability;
1157 transmit_invite(p, "INVITE", 1, NULL, NULL, vxml_url,distinctive_ring, 1);
1159 /* Initialize auto-congest time */
1160 p->initid = ast_sched_add(sched, p->maxtime * 4, auto_congest, p);
1166 static void __sip_destroy(struct sip_pvt *p, int lockowner)
1168 struct sip_pvt *cur, *prev = NULL;
1170 if (sip_debug_test_pvt(p))
1171 ast_verbose("Destroying call '%s'\n", p->callid);
1172 if (p->stateid > -1)
1173 ast_extension_state_del(p->stateid, NULL);
1175 ast_sched_del(sched, p->initid);
1176 if (p->autokillid > -1)
1177 ast_sched_del(sched, p->autokillid);
1180 ast_rtp_destroy(p->rtp);
1183 ast_rtp_destroy(p->vrtp);
1186 free_old_route(p->route);
1190 /* Carefully unlink from registry */
1191 struct sip_registry *reg;
1192 ast_mutex_lock(®l.lock);
1193 reg = regl.registrations;
1195 if ((reg == p->registry) && (p->registry->call == p))
1196 p->registry->call=NULL;
1199 ast_mutex_unlock(®l.lock);
1201 /* Unlink us from the owner if we have one */
1204 ast_mutex_lock(&p->owner->lock);
1205 ast_log(LOG_DEBUG, "Detaching from %s\n", p->owner->name);
1206 p->owner->pvt->pvt = NULL;
1208 ast_mutex_unlock(&p->owner->lock);
1214 prev->next = cur->next;
1223 ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
1226 ast_sched_del(sched, p->initid);
1227 while((cp = p->packets)) {
1228 p->packets = p->packets->next;
1229 if (cp->retransid > -1)
1230 ast_sched_del(sched, cp->retransid);
1237 static int update_user_counter(struct sip_pvt *fup, int event)
1239 char name[256] = "";
1241 strncpy(name, fup->username, sizeof(name) - 1);
1242 ast_mutex_lock(&userl.lock);
1243 u = find_user(name);
1245 ast_log(LOG_DEBUG, "%s is not a local user\n", name);
1246 ast_mutex_unlock(&userl.lock);
1250 /* incoming and outgoing affects the inUse counter */
1253 if ( u->inUse > 0 ) {
1261 if (u->incominglimit > 0 ) {
1262 if (u->inUse >= u->incominglimit) {
1263 ast_log(LOG_ERROR, "Call from user '%s' rejected due to usage limit of %d\n", u->name, u->incominglimit);
1264 /* inc inUse as well */
1265 if ( event == INC_OUT_USE ) {
1268 ast_mutex_unlock(&userl.lock);
1273 ast_log(LOG_DEBUG, "Call from user '%s' is %d out of %d\n", u->name, u->inUse, u->incominglimit);
1275 /* we don't use these anymore
1277 if ( u->outUse > 0 ) {
1284 if ( u->outgoinglimit > 0 ) {
1285 if ( u->outUse >= u->outgoinglimit ) {
1286 ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
1287 ast_mutex_unlock(&userl.lock);
1295 ast_log(LOG_ERROR, "update_user_counter(%s,%d) called with no event!\n",u->name,event);
1297 ast_mutex_unlock(&userl.lock);
1301 static void sip_destroy(struct sip_pvt *p)
1303 ast_mutex_lock(&iflock);
1304 __sip_destroy(p, 1);
1305 ast_mutex_unlock(&iflock);
1308 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req, int fatal);
1310 static int hangup_sip2cause(int cause)
1315 return AST_CAUSE_BUSY;
1317 return AST_CAUSE_NORMAL;
1323 static char *hangup_cause2sip(int cause)
1327 case AST_CAUSE_BUSY:
1336 static int sip_hangup(struct ast_channel *ast)
1338 struct sip_pvt *p = ast->pvt->pvt;
1340 int needdestroy = 0;
1342 ast_log(LOG_DEBUG, "sip_hangup(%s)\n", ast->name);
1343 if (!ast->pvt->pvt) {
1344 ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
1347 ast_mutex_lock(&p->lock);
1348 if ( p->outgoing ) {
1349 ast_log(LOG_DEBUG, "update_user_counter(%s) - decrement outUse counter\n", p->username);
1350 update_user_counter(p, DEC_OUT_USE);
1352 ast_log(LOG_DEBUG, "update_user_counter(%s) - decrement inUse counter\n", p->username);
1353 update_user_counter(p, DEC_IN_USE);
1355 /* Determine how to disconnect */
1356 if (p->owner != ast) {
1357 ast_log(LOG_WARNING, "Huh? We aren't the owner?\n");
1358 ast_mutex_unlock(&p->lock);
1361 if (!ast || (ast->_state != AST_STATE_UP))
1366 ast_dsp_free(p->vad);
1369 ast->pvt->pvt = NULL;
1371 ast_mutex_lock(&usecnt_lock);
1373 ast_mutex_unlock(&usecnt_lock);
1374 ast_update_use_count();
1377 /* Start the process if it's not already started */
1378 if (!p->alreadygone && !ast_strlen_zero(p->initreq.data)) {
1381 transmit_request_with_auth(p, "CANCEL", p->ocseq, 1, 0);
1382 /* Actually don't destroy us yet, wait for the 487 on our original
1383 INVITE, but do set an autodestruct just in case. */
1385 sip_scheddestroy(p, 15000);
1386 if ( p->initid != -1 ) {
1387 /* channel still up - reverse dec of inUse counter
1388 only if the channel is not auto-congested */
1389 if ( p->outgoing ) {
1390 update_user_counter(p, INC_OUT_USE);
1393 update_user_counter(p, INC_IN_USE);
1398 if (ast->hangupcause && ((res = hangup_cause2sip(ast->hangupcause)))) {
1399 transmit_response_reliable(p, res, &p->initreq, 1);
1401 transmit_response_reliable(p, "403 Forbidden", &p->initreq, 1);
1404 if (!p->pendinginvite) {
1406 transmit_request_with_auth(p, "BYE", 0, 1, 1);
1408 /* Note we will need a BYE when this all settles out
1409 but we can't send one while we have "INVITE" outstanding. */
1414 p->needdestroy = needdestroy;
1415 ast_mutex_unlock(&p->lock);
1419 static int sip_answer(struct ast_channel *ast)
1423 struct sip_pvt *p = ast->pvt->pvt;
1426 if (ast->_state != AST_STATE_UP) {
1430 codec=pbx_builtin_getvar_helper(p->owner,"SIP_CODEC");
1432 fmt=ast_getformatbyname(codec);
1434 ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
1435 p->jointcapability=fmt;
1436 } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n",codec);
1439 ast_setstate(ast, AST_STATE_UP);
1441 ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
1442 res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
1447 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
1449 struct sip_pvt *p = ast->pvt->pvt;
1451 if (frame->frametype == AST_FRAME_VOICE) {
1452 if (!(frame->subclass & ast->nativeformats)) {
1453 ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
1454 frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
1458 ast_mutex_lock(&p->lock);
1460 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1461 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1464 res = ast_rtp_write(p->rtp, frame);
1466 ast_mutex_unlock(&p->lock);
1468 } else if (frame->frametype == AST_FRAME_VIDEO) {
1470 ast_mutex_lock(&p->lock);
1472 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1473 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1476 res = ast_rtp_write(p->vrtp, frame);
1478 ast_mutex_unlock(&p->lock);
1480 } else if (frame->frametype == AST_FRAME_IMAGE) {
1483 ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", frame->frametype);
1490 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
1492 struct sip_pvt *p = newchan->pvt->pvt;
1493 ast_mutex_lock(&p->lock);
1494 if (p->owner != oldchan) {
1495 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
1496 ast_mutex_unlock(&p->lock);
1500 ast_mutex_unlock(&p->lock);
1504 static int sip_senddigit(struct ast_channel *ast, char digit)
1506 struct sip_pvt *p = ast->pvt->pvt;
1507 if (p && (p->dtmfmode & SIP_DTMF_INFO)) {
1508 transmit_info_with_digit(p, digit);
1510 if (p && p->rtp && (p->dtmfmode & SIP_DTMF_RFC2833)) {
1511 ast_rtp_senddigit(p->rtp, digit);
1513 /* If in-band DTMF is desired, send that */
1514 if (p->dtmfmode & SIP_DTMF_INBAND)
1519 static int sip_transfer(struct ast_channel *ast, char *dest)
1521 struct sip_pvt *p = ast->pvt->pvt;
1523 res = transmit_refer(p, dest);
1527 static int sip_indicate(struct ast_channel *ast, int condition)
1529 struct sip_pvt *p = ast->pvt->pvt;
1531 case AST_CONTROL_RINGING:
1532 if (ast->_state == AST_STATE_RING) {
1534 transmit_response(p, "180 Ringing", &p->initreq);
1538 /* Oops, we've sent progress tones. Let Asterisk do it instead */
1542 case AST_CONTROL_BUSY:
1543 if (ast->_state != AST_STATE_UP) {
1544 transmit_response(p, "486 Busy Here", &p->initreq);
1546 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1550 case AST_CONTROL_CONGESTION:
1551 if (ast->_state != AST_STATE_UP) {
1552 transmit_response(p, "503 Service Unavailable", &p->initreq);
1554 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1558 case AST_CONTROL_PROGRESS:
1559 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1560 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1568 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
1576 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
1578 struct ast_channel *tmp;
1580 tmp = ast_channel_alloc(1);
1582 /* Select our native format based on codec preference until we receive
1583 something from another device to the contrary. */
1584 if (i->jointcapability)
1585 tmp->nativeformats = sip_codec_choose(i->jointcapability);
1586 else if (i->capability)
1587 tmp->nativeformats = sip_codec_choose(i->capability);
1589 tmp->nativeformats = sip_codec_choose(capability);
1590 fmt = ast_best_codec(tmp->nativeformats);
1592 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
1594 if (strchr(i->fromdomain,':'))
1596 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(i));
1600 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(i));
1603 if (i->dtmfmode & SIP_DTMF_INBAND) {
1604 i->vad = ast_dsp_new();
1605 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
1607 ast_dsp_digitmode(i->vad, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF);
1609 tmp->fds[0] = ast_rtp_fd(i->rtp);
1610 tmp->fds[1] = ast_rtcp_fd(i->rtp);
1612 tmp->fds[2] = ast_rtp_fd(i->vrtp);
1613 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
1615 if (state == AST_STATE_RING)
1617 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
1618 tmp->writeformat = fmt;
1619 tmp->pvt->rawwriteformat = fmt;
1620 tmp->readformat = fmt;
1621 tmp->pvt->rawreadformat = fmt;
1623 tmp->pvt->send_text = sip_sendtext;
1624 tmp->pvt->call = sip_call;
1625 tmp->pvt->hangup = sip_hangup;
1626 tmp->pvt->answer = sip_answer;
1627 tmp->pvt->read = sip_read;
1628 tmp->pvt->write = sip_write;
1629 tmp->pvt->write_video = sip_write;
1630 tmp->pvt->indicate = sip_indicate;
1631 tmp->pvt->transfer = sip_transfer;
1632 tmp->pvt->fixup = sip_fixup;
1633 tmp->pvt->send_digit = sip_senddigit;
1635 tmp->pvt->bridge = ast_rtp_bridge;
1637 tmp->callgroup = i->callgroup;
1638 tmp->pickupgroup = i->pickupgroup;
1639 tmp->restrictcid = i->restrictcid;
1640 if (!ast_strlen_zero(i->accountcode))
1641 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
1643 tmp->amaflags = i->amaflags;
1644 if (!ast_strlen_zero(i->language))
1645 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
1646 if (!ast_strlen_zero(i->musicclass))
1647 strncpy(tmp->musicclass, i->musicclass, sizeof(tmp->musicclass)-1);
1649 ast_mutex_lock(&usecnt_lock);
1651 ast_mutex_unlock(&usecnt_lock);
1652 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
1653 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
1654 if (!ast_strlen_zero(i->callerid))
1655 tmp->callerid = strdup(i->callerid);
1656 if (!ast_strlen_zero(i->rdnis))
1657 tmp->rdnis = strdup(i->rdnis);
1658 if (!ast_strlen_zero(i->exten) && strcmp(i->exten, "s"))
1659 tmp->dnid = strdup(i->exten);
1661 if (!ast_strlen_zero(i->domain)) {
1662 pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
1664 ast_setstate(tmp, state);
1665 if (state != AST_STATE_DOWN) {
1666 if (ast_pbx_start(tmp)) {
1667 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
1673 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
1677 static struct cfalias {
1681 { "Content-Type", "c" },
1682 { "Content-Encoding", "e" },
1686 { "Content-Length", "l" },
1692 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
1693 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
1694 char* r = line + nameLen + 1;
1695 while (*r && (*r < 33)) ++r;
1702 static char *get_sdp(struct sip_request *req, char *name) {
1704 int len = strlen(name);
1707 for (x=0; x<req->lines; x++) {
1708 r = get_sdp_by_line(req->line[x], name, len);
1709 if (r[0] != '\0') return r;
1714 static void sdpLineNum_iterator_init(int* iterator) {
1718 static char* get_sdp_iterate(int* iterator,
1719 struct sip_request *req, char *name) {
1720 int len = strlen(name);
1722 while (*iterator < req->lines) {
1723 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
1724 if (r[0] != '\0') return r;
1729 static char *__get_header(struct sip_request *req, char *name, int *start)
1732 int len = strlen(name);
1734 for (x=*start;x<req->headers;x++) {
1735 if (!strncasecmp(req->header[x], name, len) &&
1736 (req->header[x][len] == ':')) {
1737 r = req->header[x] + len + 1;
1738 while(*r && (*r < 33))
1745 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
1746 if (!strcasecmp(aliases[x].fullname, name))
1747 return __get_header(req, aliases[x].shortname, start);
1749 /* Don't return NULL, so get_header is always a valid pointer */
1753 static char *get_header(struct sip_request *req, char *name)
1756 return __get_header(req, name, &start);
1759 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
1761 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
1762 struct ast_frame *f;
1763 static struct ast_frame null_frame = { AST_FRAME_NULL, };
1766 f = ast_rtp_read(p->rtp);
1769 f = ast_rtcp_read(p->rtp);
1772 f = ast_rtp_read(p->vrtp);
1775 f = ast_rtcp_read(p->vrtp);
1780 /* Don't send RFC2833 if we're not supposed to */
1781 if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & SIP_DTMF_RFC2833))
1784 /* We already hold the channel lock */
1785 if (f->frametype == AST_FRAME_VOICE) {
1786 if (f->subclass != p->owner->nativeformats) {
1787 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
1788 p->owner->nativeformats = f->subclass;
1789 ast_set_read_format(p->owner, p->owner->readformat);
1790 ast_set_write_format(p->owner, p->owner->writeformat);
1792 if ((p->dtmfmode & SIP_DTMF_INBAND) && p->vad) {
1793 f = ast_dsp_process(p->owner,p->vad,f);
1794 if (f && (f->frametype == AST_FRAME_DTMF))
1795 ast_log(LOG_DEBUG, "Detected DTMF '%c'\n", f->subclass);
1802 static struct ast_frame *sip_read(struct ast_channel *ast)
1804 struct ast_frame *fr;
1805 struct sip_pvt *p = ast->pvt->pvt;
1806 ast_mutex_lock(&p->lock);
1807 fr = sip_rtp_read(ast, p);
1808 ast_mutex_unlock(&p->lock);
1812 static void build_callid(char *callid, int len, struct in_addr ourip)
1819 res = snprintf(callid, len, "%08x", val);
1823 /* It's not important that we really use our right IP here... */
1824 snprintf(callid, len, "@%s", inet_ntoa(ourip));
1827 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobalnat)
1831 p = malloc(sizeof(struct sip_pvt));
1834 /* Keep track of stuff */
1835 memset(p, 0, sizeof(struct sip_pvt));
1839 p->rtp = ast_rtp_new(sched, io, 1, 0);
1841 p->vrtp = ast_rtp_new(sched, io, 1, 0);
1845 /* Start with 101 instead of 1 */
1848 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
1852 ast_rtp_settos(p->rtp, tos);
1854 ast_rtp_settos(p->vrtp, tos);
1855 if (useglobalnat && sin) {
1856 /* Setup NAT structure according to global settings if we have an address */
1858 memcpy(&p->recv, sin, sizeof(p->recv));
1859 ast_rtp_setnat(p->rtp, p->nat);
1861 ast_rtp_setnat(p->vrtp, p->nat);
1863 ast_mutex_init(&p->lock);
1866 memcpy(&p->sa, sin, sizeof(p->sa));
1867 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
1868 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1870 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1872 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
1873 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
1875 build_callid(p->callid, sizeof(p->callid), p->ourip);
1877 strncpy(p->callid, callid, sizeof(p->callid) - 1);
1878 /* Assume reinvite OK and via INVITE */
1879 p->canreinvite = globalcanreinvite;
1880 /* Assign default music on hold class */
1881 strncpy(p->musicclass, globalmusicclass, sizeof(p->musicclass));
1882 p->dtmfmode = globaldtmfmode;
1883 p->capability = capability;
1884 if (p->dtmfmode & SIP_DTMF_RFC2833)
1885 p->noncodeccapability |= AST_RTP_DTMF;
1886 strncpy(p->context, context, sizeof(p->context) - 1);
1887 strncpy(p->fromdomain, fromdomain, sizeof(p->fromdomain) - 1);
1889 ast_mutex_lock(&iflock);
1892 ast_mutex_unlock(&iflock);
1894 ast_log(LOG_DEBUG, "Allocating new SIP call for %s\n", callid);
1898 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin)
1906 callid = get_header(req, "Call-ID");
1908 if (pedanticsipchecking) {
1909 /* In principle Call-ID's uniquely identify a call, however some vendors
1910 (i.e. Pingtel) send multiple calls with the same Call-ID and different
1911 tags in order to simplify billing. The RFC does state that we have to
1912 compare tags in addition to the call-id, but this generate substantially
1913 more overhead which is totally unnecessary for the vast majority of sane
1914 SIP implementations, and thus Asterisk does not enable this behavior
1915 by default. Short version: You'll need this option to support conferencing
1917 strncpy(tmp, req->header[0], sizeof(tmp) - 1);
1919 c = strchr(tmp, ' ');
1922 if (!strcasecmp(cmd, "SIP/2.0")) {
1928 strncpy(tmp, get_header(req, "From"), sizeof(tmp) - 1);
1930 strncpy(tmp, get_header(req, "To"), sizeof(tmp) - 1);
1931 tag = strstr(tmp, "tag=");
1934 c = strchr(tag, ';');
1941 if (ast_strlen_zero(callid)) {
1942 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", inet_ntoa(sin->sin_addr));
1945 ast_mutex_lock(&iflock);
1948 if (!strcmp(p->callid, callid) &&
1949 (!pedanticsipchecking || !tag || ast_strlen_zero(p->theirtag) || !strcmp(p->theirtag, tag))) {
1950 /* Found the call */
1951 ast_mutex_lock(&p->lock);
1952 ast_mutex_unlock(&iflock);
1957 ast_mutex_unlock(&iflock);
1958 p = sip_alloc(callid, sin, 1);
1960 ast_mutex_lock(&p->lock);
1964 static int sip_register(char *value, int lineno)
1966 struct sip_registry *reg;
1967 char copy[256] = "";
1968 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
1974 struct ast_hostent ahp;
1977 strncpy(copy, value, sizeof(copy)-1);
1980 hostname = strrchr(stringp, '@');
1985 if (!username || ast_strlen_zero(username) || !hostname || ast_strlen_zero(hostname)) {
1986 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d", lineno);
1990 username = strsep(&stringp, ":");
1992 secret = strsep(&stringp, ":");
1994 authuser = strsep(&stringp, ":");
1997 hostname = strsep(&stringp, "/");
1999 contact = strsep(&stringp, "/");
2000 if (!contact || ast_strlen_zero(contact))
2003 hostname = strsep(&stringp, ":");
2004 porta = strsep(&stringp, ":");
2006 if (porta && !atoi(porta)) {
2007 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
2010 hp = ast_gethostbyname(hostname, &ahp);
2012 ast_log(LOG_WARNING, "Host '%s' not found at line %d\n", hostname, lineno);
2015 reg = malloc(sizeof(struct sip_registry));
2017 memset(reg, 0, sizeof(struct sip_registry));
2018 strncpy(reg->contact, contact, sizeof(reg->contact) - 1);
2020 strncpy(reg->username, username, sizeof(reg->username)-1);
2022 strncpy(reg->hostname, hostname, sizeof(reg->hostname)-1);
2024 strncpy(reg->authuser, authuser, sizeof(reg->authuser)-1);
2026 strncpy(reg->secret, secret, sizeof(reg->secret)-1);
2029 reg->refresh = default_expiry;
2030 reg->addr.sin_family = AF_INET;
2031 memcpy(®->addr.sin_addr, hp->h_addr, sizeof(®->addr.sin_addr));
2032 reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT);
2033 reg->callid_valid = 0;
2035 ast_mutex_lock(®l.lock);
2036 reg->next = regl.registrations;
2037 regl.registrations = reg;
2038 ast_mutex_unlock(®l.lock);
2040 ast_log(LOG_ERROR, "Out of memory\n");
2046 static int lws2sws(char *msgbuf, int len)
2052 /* Eliminate all CRs */
2053 if (msgbuf[h] == '\r') {
2057 /* Check for end-of-line */
2058 if (msgbuf[h] == '\n') {
2059 /* Check for end-of-message */
2062 /* Check for a continuation line */
2063 if (msgbuf[h + 1] == ' ') {
2064 /* Merge continuation line */
2068 /* Propagate LF and start new line */
2069 msgbuf[t++] = msgbuf[h++];
2074 if (msgbuf[h] == ' ' || msgbuf[h] == '\t') {
2079 msgbuf[t++] = msgbuf[h++];
2083 msgbuf[t++] = msgbuf[h++];
2091 static void parse(struct sip_request *req)
2093 /* Divide fields by NULL's */
2098 /* First header starts immediately */
2102 /* We've got a new header */
2106 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
2108 if (ast_strlen_zero(req->header[f])) {
2109 /* Line by itself means we're now in content */
2113 if (f >= SIP_MAX_HEADERS - 1) {
2114 ast_log(LOG_WARNING, "Too many SIP headers...\n");
2117 req->header[f] = c + 1;
2118 } else if (*c == '\r') {
2119 /* Ignore but eliminate \r's */
2124 /* Check for last header */
2125 if (!ast_strlen_zero(req->header[f]))
2128 /* Now we process any mime content */
2133 /* We've got a new line */
2136 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
2138 if (f >= SIP_MAX_LINES - 1) {
2139 ast_log(LOG_WARNING, "Too many SDP lines...\n");
2142 req->line[f] = c + 1;
2143 } else if (*c == '\r') {
2144 /* Ignore and eliminate \r's */
2149 /* Check for last line */
2150 if (!ast_strlen_zero(req->line[f]))
2154 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
2157 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
2166 int peercapability, peernoncodeccapability;
2167 int vpeercapability=0, vpeernoncodeccapability=0;
2168 struct sockaddr_in sin;
2171 struct ast_hostent ahp;
2177 /* Get codec and RTP info from SDP */
2178 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
2179 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
2182 m = get_sdp(req, "m");
2183 c = get_sdp(req, "c");
2184 if (ast_strlen_zero(m) || ast_strlen_zero(c)) {
2185 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
2188 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2189 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
2192 /* XXX This could block for a long time, and block the main thread! XXX */
2193 hp = ast_gethostbyname(host, &ahp);
2195 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
2198 sdpLineNum_iterator_init(&iterator);
2199 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
2200 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) {
2202 /* Scan through the RTP payload types specified in a "m=" line: */
2203 ast_rtp_pt_clear(p->rtp);
2205 while(!ast_strlen_zero(codecs)) {
2206 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2207 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2210 if (sip_debug_test_pvt(p))
2211 ast_verbose("Found RTP audio format %d\n", codec);
2212 ast_rtp_set_m_type(p->rtp, codec);
2214 /* Skip over any whitespace */
2215 while(*codecs && (*codecs < 33)) codecs++;
2219 ast_rtp_pt_clear(p->vrtp); /* Must be cleared in case no m=video line exists */
2221 if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
2223 /* Scan through the RTP payload types specified in a "m=" line: */
2225 while(!ast_strlen_zero(codecs)) {
2226 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2227 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2230 if (sip_debug_test_pvt(p))
2231 ast_verbose("Found video format %s\n", ast_getformatname(codec));
2232 ast_rtp_set_m_type(p->vrtp, codec);
2234 /* Skip over any whitespace */
2235 while(*codecs && (*codecs < 33)) codecs++;
2239 sin.sin_family = AF_INET;
2240 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
2241 /* Setup audio port number */
2242 sin.sin_port = htons(portno);
2243 if (p->rtp && sin.sin_port)
2244 ast_rtp_set_peer(p->rtp, &sin);
2245 /* Setup video port number */
2246 sin.sin_port = htons(vportno);
2247 if (p->vrtp && sin.sin_port)
2248 ast_rtp_set_peer(p->vrtp, &sin);
2250 printf("Peer RTP is at port %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
2252 /* Next, scan through each "a=rtpmap:" line, noting each
2253 * specified RTP payload type (with corresponding MIME subtype):
2255 sdpLineNum_iterator_init(&iterator);
2256 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
2257 char* mimeSubtype = ast_strdupa(a); /* ensures we have enough space */
2258 if (!strcasecmp(a, "sendonly")) {
2262 if (!strcasecmp(a, "sendrecv")) {
2265 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
2266 if (sip_debug_test_pvt(p))
2267 ast_verbose("Found description format %s\n", mimeSubtype);
2268 /* Note: should really look at the 'freq' and '#chans' params too */
2269 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
2271 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
2274 /* Now gather all of the codecs that were asked for: */
2275 ast_rtp_get_current_formats(p->rtp,
2276 &peercapability, &peernoncodeccapability);
2278 ast_rtp_get_current_formats(p->vrtp,
2279 &vpeercapability, &vpeernoncodeccapability);
2280 p->jointcapability = p->capability & (peercapability | vpeercapability);
2281 p->noncodeccapability = noncodeccapability & (peernoncodeccapability | vpeernoncodeccapability);
2283 if (sip_debug_test_pvt(p)) {
2284 ast_verbose("Capabilities: us - %d, them - %d/%d, combined - %d\n",
2285 p->capability, peercapability, vpeercapability, p->jointcapability);
2286 ast_verbose("Non-codec capabilities: us - %d, them - %d, combined - %d\n",
2287 noncodeccapability, peernoncodeccapability,
2288 p->noncodeccapability);
2290 if (!p->jointcapability) {
2291 ast_log(LOG_WARNING, "No compatible codecs!\n");
2295 if (!(p->owner->nativeformats & p->jointcapability)) {
2296 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);
2297 p->owner->nativeformats = sip_codec_choose(p->jointcapability);
2298 ast_set_read_format(p->owner, p->owner->readformat);
2299 ast_set_write_format(p->owner, p->owner->writeformat);
2301 if (p->owner->bridge) {
2302 /* Turn on/off music on hold if we are holding/unholding */
2303 if (sin.sin_addr.s_addr && !sendonly) {
2304 ast_moh_stop(p->owner->bridge);
2306 ast_moh_start(p->owner->bridge, NULL);
2314 static int add_header(struct sip_request *req, char *var, char *value)
2316 if (req->len >= sizeof(req->data) - 4) {
2317 ast_log(LOG_WARNING, "Out of space, can't add anymore (%s:%s)\n", var, value);
2321 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2324 req->header[req->headers] = req->data + req->len;
2325 snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", var, value);
2326 req->len += strlen(req->header[req->headers]);
2327 if (req->headers < SIP_MAX_HEADERS)
2330 ast_log(LOG_WARNING, "Out of header space\n");
2336 static int add_blank_header(struct sip_request *req)
2338 if (req->len >= sizeof(req->data) - 4) {
2339 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2343 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2346 req->header[req->headers] = req->data + req->len;
2347 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "\r\n");
2348 req->len += strlen(req->header[req->headers]);
2349 if (req->headers < SIP_MAX_HEADERS)
2352 ast_log(LOG_WARNING, "Out of header space\n");
2358 static int add_line(struct sip_request *req, char *line)
2360 if (req->len >= sizeof(req->data) - 4) {
2361 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2365 /* Add extra empty return */
2366 snprintf(req->data + req->len, sizeof(req->data) - req->len, "\r\n");
2367 req->len += strlen(req->data + req->len);
2369 req->line[req->lines] = req->data + req->len;
2370 snprintf(req->line[req->lines], sizeof(req->data) - req->len, "%s", line);
2371 req->len += strlen(req->line[req->lines]);
2372 if (req->lines < SIP_MAX_LINES)
2375 ast_log(LOG_WARNING, "Out of line space\n");
2381 static int copy_header(struct sip_request *req, struct sip_request *orig, char *field)
2384 tmp = get_header(orig, field);
2385 if (!ast_strlen_zero(tmp)) {
2386 /* Add what we're responding to */
2387 return add_header(req, field, tmp);
2389 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2393 static int copy_all_header(struct sip_request *req, struct sip_request *orig, char *field)
2399 tmp = __get_header(orig, field, &start);
2400 if (!ast_strlen_zero(tmp)) {
2401 /* Add what we're responding to */
2402 add_header(req, field, tmp);
2407 return copied ? 0 : -1;
2410 static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct sip_request *orig, char *field)
2417 tmp = __get_header(orig, field, &start);
2418 if (!ast_strlen_zero(tmp)) {
2419 if (!copied && p->nat) {
2420 #ifdef THE_SIP_AUTHORS_CAN_SUCK_MY_GONADS
2421 /* SLD: FIXME: Nice try, but the received= should not have a port */
2422 /* SLD: FIXME: See RFC2543 BNF in Section 6.40.5 */
2423 /* MAS: Yup, RFC says you can't do it. No way to indicate PAT...
2425 if (ntohs(p->recv.sin_port) != DEFAULT_SIP_PORT)
2426 snprintf(new, sizeof(new), "%s;received=%s:%d", tmp, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
2429 snprintf(new, sizeof(new), "%s;received=%s", tmp, inet_ntoa(p->recv.sin_addr));
2430 add_header(req, field, new);
2432 /* Add what we're responding to */
2433 add_header(req, field, tmp);
2440 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2446 /* Add Route: header into request per learned route */
2447 static void add_route(struct sip_request *req, struct sip_route *route)
2450 int n, rem = 255; /* sizeof(r)-1: Room for terminating 0 */
2456 n = strlen(route->hop);
2457 if ((n+3)>rem) break;
2463 strcpy(p, route->hop); p += n;
2466 route = route->next;
2469 add_header(req, "Route", r);
2472 static void set_destination(struct sip_pvt *p, char *uri)
2474 char *h, *maddr, hostname[256];
2477 struct ast_hostent ahp;
2479 /* Parse uri to h (host) and port - uri is already just the part inside the <> */
2480 /* general form we are expecting is sip[s]:username[:password]@host[:port][;...] */
2482 if (sip_debug_test_pvt(p))
2483 ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
2485 /* Find and parse hostname */
2486 h = strchr(uri, '@');
2491 if (strncmp(h, "sip:", 4) == 0)
2493 else if (strncmp(h, "sips:", 5) == 0)
2496 hn = strcspn(h, ":;>");
2498 strncpy(hostname, h, hn); hostname[hn] = '\0';
2501 /* Is "port" present? if not default to 5060 */
2505 port = strtol(h, &h, 10);
2510 /* Got the hostname:port - but maybe there's a "maddr=" to override address? */
2511 maddr = strstr(h, "maddr=");
2514 hn = strspn(maddr, "0123456789.");
2516 strncpy(hostname, maddr, hn); hostname[hn] = '\0';
2519 hp = ast_gethostbyname(hostname, &ahp);
2521 ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
2524 p->sa.sin_family = AF_INET;
2525 memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr));
2526 p->sa.sin_port = htons(port);
2527 if (sip_debug_test_pvt(p))
2528 ast_verbose("set_destination: set destination to %s, port %d\n", inet_ntoa(p->sa.sin_addr), port);
2531 static int init_resp(struct sip_request *req, char *resp, struct sip_request *orig)
2533 /* Initialize a response */
2534 if (req->headers || req->len) {
2535 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2538 req->header[req->headers] = req->data + req->len;
2539 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "SIP/2.0 %s\r\n", resp);
2540 req->len += strlen(req->header[req->headers]);
2541 if (req->headers < SIP_MAX_HEADERS)
2544 ast_log(LOG_WARNING, "Out of header space\n");
2548 static int init_req(struct sip_request *req, char *resp, char *recip)
2550 /* Initialize a response */
2551 if (req->headers || req->len) {
2552 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2555 req->header[req->headers] = req->data + req->len;
2556 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "%s %s SIP/2.0\r\n", resp, recip);
2557 req->len += strlen(req->header[req->headers]);
2558 if (req->headers < SIP_MAX_HEADERS)
2561 ast_log(LOG_WARNING, "Out of header space\n");
2565 static int respprep(struct sip_request *resp, struct sip_pvt *p, char *msg, struct sip_request *req)
2567 char newto[256] = "", *ot;
2568 memset(resp, 0, sizeof(*resp));
2569 init_resp(resp, msg, req);
2570 copy_via_headers(p, resp, req, "Via");
2571 if (msg[0] == '2') copy_all_header(resp, req, "Record-Route");
2572 copy_header(resp, req, "From");
2573 ot = get_header(req, "To");
2574 if (!strstr(ot, "tag=")) {
2575 /* Add the proper tag if we don't have it already. If they have specified
2576 their tag, use it. Otherwise, use our own tag */
2577 if (!ast_strlen_zero(p->theirtag) && p->outgoing)
2578 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2579 else if (p->tag && !p->outgoing)
2580 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2582 strncpy(newto, ot, sizeof(newto) - 1);
2585 add_header(resp, "To", ot);
2586 copy_header(resp, req, "Call-ID");
2587 copy_header(resp, req, "CSeq");
2588 add_header(resp, "User-Agent", "Asterisk PBX");
2589 add_header(resp, "Allow", ALLOWED_METHODS);
2591 /* For registration responses, we also need expiry and
2595 snprintf(contact, sizeof(contact), "%s;expires=%d", p->our_contact, p->expiry);
2596 snprintf(tmp, sizeof(tmp), "%d", p->expiry);
2597 add_header(resp, "Expires", tmp);
2598 add_header(resp, "Contact", contact);
2600 add_header(resp, "Contact", p->our_contact);
2605 static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int seqno, int newbranch)
2607 struct sip_request *orig = &p->initreq;
2608 char stripped[80] ="";
2614 memset(req, 0, sizeof(struct sip_request));
2616 snprintf(p->lastmsg, sizeof(p->lastmsg), "Tx: %s", msg);
2624 p->branch ^= rand();
2625 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
2628 if (!ast_strlen_zero(p->uri)) {
2632 strncpy(stripped, get_header(orig, "To"), sizeof(stripped) - 1);
2634 strncpy(stripped, get_header(orig, "From"), sizeof(stripped) - 1);
2636 c = strchr(stripped, '<');
2648 init_req(req, msg, c);
2650 snprintf(tmp, sizeof(tmp), "%d %s", seqno, msg);
2652 add_header(req, "Via", p->via);
2654 set_destination(p, p->route->hop);
2655 add_route(req, p->route->next);
2658 ot = get_header(orig, "To");
2659 of = get_header(orig, "From");
2661 /* Add tag *unless* this is a CANCEL, in which case we need to send it exactly
2662 as our original request, including tag (or presumably lack thereof) */
2663 if (!strstr(ot, "tag=") && strcasecmp(msg, "CANCEL")) {
2664 /* Add the proper tag if we don't have it already. If they have specified
2665 their tag, use it. Otherwise, use our own tag */
2666 if (p->outgoing && !ast_strlen_zero(p->theirtag))
2667 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2668 else if (!p->outgoing)
2669 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2671 snprintf(newto, sizeof(newto), "%s", ot);
2676 add_header(req, "From", of);
2677 add_header(req, "To", ot);
2679 add_header(req, "From", ot);
2680 add_header(req, "To", of);
2682 add_header(req, "Contact", p->our_contact);
2683 copy_header(req, orig, "Call-ID");
2684 add_header(req, "CSeq", tmp);
2686 add_header(req, "User-Agent", "Asterisk PBX");
2690 static int __transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2692 struct sip_request resp;
2694 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2695 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2698 respprep(&resp, p, msg, req);
2699 add_header(&resp, "Content-Length", "0");
2700 add_blank_header(&resp);
2701 return send_response(p, &resp, reliable, seqno);
2704 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req)
2706 return __transmit_response(p, msg, req, 0);
2708 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req, int fatal)
2710 return __transmit_response(p, msg, req, fatal ? 2 : 1);
2713 static void append_date(struct sip_request *req)
2720 strftime(tmpdat, sizeof(tmpdat), "%a, %d %b %Y %T GMT", &tm);
2721 add_header(req, "Date", tmpdat);
2724 static int transmit_response_with_date(struct sip_pvt *p, char *msg, struct sip_request *req)
2726 struct sip_request resp;
2727 respprep(&resp, p, msg, req);
2729 add_header(&resp, "Content-Length", "0");
2730 add_blank_header(&resp);
2731 return send_response(p, &resp, 0, 0);
2734 static int transmit_response_with_allow(struct sip_pvt *p, char *msg, struct sip_request *req)
2736 struct sip_request resp;
2737 respprep(&resp, p, msg, req);
2738 add_header(&resp, "Accept", "application/sdp");
2739 add_header(&resp, "Content-Length", "0");
2740 add_blank_header(&resp);
2741 return send_response(p, &resp, 0, 0);
2744 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *randdata, int reliable)
2746 struct sip_request resp;
2749 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2750 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2753 snprintf(tmp, sizeof(tmp), "Digest realm=\"%s\", nonce=\"%s\"", global_realm, randdata);
2754 respprep(&resp, p, msg, req);
2755 add_header(&resp, "Proxy-Authenticate", tmp);
2756 add_header(&resp, "Content-Length", "0");
2757 add_blank_header(&resp);
2758 return send_response(p, &resp, reliable, seqno);
2761 static int add_text(struct sip_request *req, char *text)
2763 /* XXX Convert \n's to \r\n's XXX */
2764 int len = strlen(text);
2766 snprintf(clen, sizeof(clen), "%d", len);
2767 add_header(req, "Content-Type", "text/plain");
2768 add_header(req, "Content-Length", clen);
2769 add_line(req, text);
2773 static int add_digit(struct sip_request *req, char digit)
2778 snprintf(tmp, sizeof(tmp), "Signal=%c\r\nDuration=250\r\n", digit);
2780 snprintf(clen, sizeof(clen), "%d", len);
2781 add_header(req, "Content-Type", "application/dtmf-relay");
2782 add_header(req, "Content-Length", clen);
2787 static int add_sdp(struct sip_request *resp, struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2791 int alreadysent = 0;
2793 struct sockaddr_in sin;
2794 struct sockaddr_in vsin;
2795 struct sip_codec_pref *cur;
2806 struct sockaddr_in dest;
2807 struct sockaddr_in vdest = { 0, };
2808 /* XXX We break with the "recommendation" and send our IP, in order that our
2809 peer doesn't have to ast_gethostbyname() us XXX */
2812 ast_log(LOG_WARNING, "No way to add SDP without an RTP structure\n");
2815 if (!p->sessionid) {
2816 p->sessionid = getpid();
2817 p->sessionversion = p->sessionid;
2819 p->sessionversion++;
2820 ast_rtp_get_us(p->rtp, &sin);
2822 ast_rtp_get_us(p->vrtp, &vsin);
2824 if (p->redirip.sin_addr.s_addr) {
2825 dest.sin_port = p->redirip.sin_port;
2826 dest.sin_addr = p->redirip.sin_addr;
2828 ast_rtp_get_peer(rtp, &dest);
2830 dest.sin_addr = p->ourip;
2831 dest.sin_port = sin.sin_port;
2834 /* Determine video destination */
2836 if (p->vredirip.sin_addr.s_addr) {
2837 vdest.sin_port = p->vredirip.sin_port;
2838 vdest.sin_addr = p->vredirip.sin_addr;
2840 ast_rtp_get_peer(vrtp, &vdest);
2842 vdest.sin_addr = p->ourip;
2843 vdest.sin_port = vsin.sin_port;
2846 if (sip_debug_test_pvt(p))
2847 ast_verbose("We're at %s port %d\n", inet_ntoa(p->ourip), ntohs(sin.sin_port));
2848 if (sip_debug_test_pvt(p) && p->vrtp)
2849 ast_verbose("Video is at %s port %d\n", inet_ntoa(p->ourip), ntohs(vsin.sin_port));
2850 snprintf(v, sizeof(v), "v=0\r\n");
2851 snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, inet_ntoa(dest.sin_addr));
2852 snprintf(s, sizeof(s), "s=session\r\n");
2853 snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", inet_ntoa(dest.sin_addr));
2854 snprintf(t, sizeof(t), "t=0 0\r\n");
2855 snprintf(m, sizeof(m), "m=audio %d RTP/AVP", ntohs(dest.sin_port));
2856 snprintf(m2, sizeof(m2), "m=video %d RTP/AVP", ntohs(vdest.sin_port));
2857 if (p->jointcapability & p->prefcodec) {
2858 if (sip_debug_test_pvt(p))
2859 ast_verbose("Answering/Requesting with root capability %d\n", p->prefcodec);
2860 codec = ast_rtp_lookup_code(p->rtp, 1, p->prefcodec);
2862 snprintf(costr, sizeof(costr), " %d", codec);
2863 if (p->prefcodec <= AST_FORMAT_MAX_AUDIO) {
2864 strncat(m, costr, sizeof(m) - strlen(m));
2865 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, p->prefcodec));
2866 strncat(a, costr, sizeof(a));
2868 strncat(m2, costr, sizeof(m2) - strlen(m2));
2869 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, p->prefcodec));
2870 strncat(a2, costr, sizeof(a2));
2873 alreadysent |= p->prefcodec;
2875 /* Start by sending our preferred codecs */
2878 if (p->jointcapability & cur->codec) {
2879 if (sip_debug_test_pvt(p))
2880 ast_verbose("Answering/Requesting with preferred capability %d\n", cur->codec);
2881 codec = ast_rtp_lookup_code(p->rtp, 1, cur->codec);
2883 snprintf(costr, sizeof(costr), " %d", codec);
2884 if (cur->codec <= AST_FORMAT_MAX_AUDIO) {
2885 strncat(m, costr, sizeof(m) - strlen(m));
2886 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2887 strncat(a, costr, sizeof(a));
2889 strncat(m2, costr, sizeof(m2) - strlen(m2));
2890 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2891 strncat(a2, costr, sizeof(a2));
2895 alreadysent |= cur->codec;
2898 /* Now send any other common codecs, and non-codec formats: */
2899 for (x = 1; x <= (videosupport ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO); x <<= 1) {
2900 if ((p->jointcapability & x) && !(alreadysent & x)) {
2901 if (sip_debug_test_pvt(p))
2902 ast_verbose("Answering with capability %d\n", x);
2903 codec = ast_rtp_lookup_code(p->rtp, 1, x);
2905 snprintf(costr, sizeof(costr), " %d", codec);
2906 if (x <= AST_FORMAT_MAX_AUDIO) {
2907 strncat(m, costr, sizeof(m) - strlen(m));
2908 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2909 strncat(a, costr, sizeof(a) - strlen(a));
2911 strncat(m2, costr, sizeof(m2) - strlen(m2));
2912 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2913 strncat(a2, costr, sizeof(a2) - strlen(a2));
2918 for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
2919 if (p->noncodeccapability & x) {
2920 if (sip_debug_test_pvt(p))
2921 ast_verbose("Answering with non-codec capability %d\n", x);
2922 codec = ast_rtp_lookup_code(p->rtp, 0, x);
2924 snprintf(costr, sizeof(costr), " %d", codec);
2925 strncat(m, costr, sizeof(m) - strlen(m));
2926 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(0, x));
2927 strncat(a, costr, sizeof(a) - strlen(a));
2928 if (x == AST_RTP_DTMF) {
2929 /* Indicate we support DTMF... Not sure about 16, but MSN supports it so dang it, we will too... */
2930 snprintf(costr, sizeof costr, "a=fmtp:%d 0-16\r\n",
2932 strncat(a, costr, sizeof(a) - strlen(a));
2937 strncat(a, "a=silenceSupp:off - - - -\r\n", sizeof(a) - strlen(a));
2938 if (strlen(m) < sizeof(m) - 2)
2940 if (strlen(m2) < sizeof(m2) - 2)
2942 if ((sizeof(m) <= strlen(m) - 2) || (sizeof(m2) <= strlen(m2) - 2) || (sizeof(a) == strlen(a)) || (sizeof(a2) == strlen(a2)))
2943 ast_log(LOG_WARNING, "SIP SDP may be truncated due to undersized buffer!!\n");
2944 len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m) + strlen(a);
2945 if ((p->vrtp) && (p->jointcapability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
2946 len += strlen(m2) + strlen(a2);
2947 snprintf(costr, sizeof(costr), "%d", len);
2948 add_header(resp, "Content-Type", "application/sdp");
2949 add_header(resp, "Content-Length", costr);
2957 if ((p->vrtp) && (p->jointcapability & VIDEO_CODEC_MASK)) { /* only if video response is appropriate */
2964 static void copy_request(struct sip_request *dst,struct sip_request *src)
2968 offset = ((void *)dst) - ((void *)src);
2969 /* First copy stuff */
2970 memcpy(dst, src, sizeof(*dst));
2971 /* Now fix pointer arithmetic */
2972 for (x=0;x<src->headers;x++)
2973 dst->header[x] += offset;
2974 for (x=0;x<src->lines;x++)
2975 dst->line[x] += offset;
2978 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans)
2980 struct sip_request resp;
2982 if (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1) {
2983 ast_log(LOG_WARNING, "Unable to get seqno from '%s'\n", get_header(req, "CSeq"));
2986 respprep(&resp, p, msg, req);
2987 add_sdp(&resp, p, NULL, NULL);
2988 return send_response(p, &resp, retrans, seqno);
2991 static int determine_firstline_parts( struct sip_request *req ) {
2996 cmd= req->header[0];
2997 while(*cmd && (*cmd < 33)) {
3004 while(*e && (*e > 32)) {
3007 /* Get the command */
3013 while( *e && ( *e < 33 ) ) {
3020 if ( !strcasecmp(cmd, "SIP/2.0") ) {
3021 /* We have a response */
3023 len= strlen( req->rlPart2 );
3024 if( len < 2 ) { return -1; }
3026 while( *e && *e<33 ) {
3031 /* We have a request */
3034 if( !*e ) { return -1; }
3037 if( ( e= strrchr( req->rlPart2, 'S' ) ) == NULL ) {
3040 while( isspace( *(--e) ) ) {}
3050 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
3052 struct sip_request req;
3053 if (p->canreinvite == REINVITE_UPDATE)
3054 reqprep(&req, p, "UPDATE", 0, 1);
3056 reqprep(&req, p, "INVITE", 0, 1);
3058 add_header(&req, "Allow", ALLOWED_METHODS);
3059 add_sdp(&req, p, rtp, vrtp);
3060 /* Use this as the basis */
3061 copy_request(&p->initreq, &req);
3063 if (sip_debug_test_pvt(p))
3064 ast_verbose("%d headers, %d lines\n", p->initreq.headers, p->initreq.lines);
3065 determine_firstline_parts(&p->initreq);
3066 p->lastinvite = p->ocseq;
3068 return send_request(p, &req, 1, p->ocseq);
3071 static void extract_uri(struct sip_pvt *p, struct sip_request *req)
3073 char stripped[256]="";
3075 strncpy(stripped, get_header(req, "Contact"), sizeof(stripped) - 1);
3076 c = strchr(stripped, '<');
3087 if (c && !ast_strlen_zero(c))
3088 strncpy(p->uri, c, sizeof(p->uri) - 1);
3091 static void build_contact(struct sip_pvt *p)
3093 /* Construct Contact: header */
3094 if (ourport != 5060)
3095 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s:%d>", p->exten, inet_ntoa(p->ourip), ourport);
3097 snprintf(p->our_contact, sizeof(p->our_contact), "<sip:%s@%s>", p->exten, inet_ntoa(p->ourip));
3100 static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, char *vxml_url)
3107 char *l = callerid, *n=NULL;
3109 snprintf(p->lastmsg, sizeof(p->lastmsg), "Init: %s", cmd);
3111 if (p->owner && p->owner->callerid) {
3112 strcpy(cid, p->owner->callerid);
3113 ast_callerid_parse(cid, &n, &l);
3115 ast_shrink_phone_number(l);
3116 if (!l || !ast_isphonenumber(l))
3119 /* if user want's his callerid restricted */
3120 if (p->restrictcid) {
3121 l = CALLERID_UNKNOWN;
3124 if (!n || ast_strlen_zero(n))
3126 /* Allow user to be overridden */
3127 if (!ast_strlen_zero(p->fromuser))
3130 if ((ourport != 5060) && ast_strlen_zero(p->fromdomain))
3131 snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s:%d>;tag=as%08x", n, l, ast_strlen_zero(p->fromdomain) ? inet_ntoa(p->ourip) : p->fromdomain, ourport, p->tag);
3133 snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=as%08x", n, l, ast_strlen_zero(p->fromdomain) ? inet_ntoa(p->ourip) : p->fromdomain, p->tag);
3135 if (!ast_strlen_zero(p->username)) {
3136 if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
3137 snprintf(invite, sizeof(invite), "sip:%s@%s:%d",p->username, p->tohost, ntohs(p->sa.sin_port));
3139 snprintf(invite, sizeof(invite), "sip:%s@%s",p->username, p->tohost);
3141 } else if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
3142 snprintf(invite, sizeof(invite), "sip:%s:%d", p->tohost, ntohs(p->sa.sin_port));
3144 snprintf(invite, sizeof(invite), "sip:%s", p->tohost);
3146 strncpy(p->uri, invite, sizeof(p->uri) - 1);
3147 /* If there is a VXML URL append it to the SIP URL */
3150 snprintf(to, sizeof(to), "<%s>;%s", invite, vxml_url);
3154 snprintf(to, sizeof(to), "<%s>", invite );
3156 memset(req, 0, sizeof(struct sip_request));
3157 init_req(req, cmd, invite);
3158 snprintf(tmp, sizeof(tmp), "%d %s", ++p->ocseq, cmd);
3160 add_header(req, "Via", p->via);
3161 /* SLD: FIXME?: do Route: here too? I think not cos this is the first request.
3162 * OTOH, then we won't have anything in p->route anyway */
3163 add_header(req, "From", from);
3164 strncpy(p->exten, l, sizeof(p->exten) - 1);
3166 add_header(req, "To", to);
3167 add_header(req, "Contact", p->our_contact);
3168 add_header(req, "Call-ID", p->callid);
3169 add_header(req, "CSeq", tmp);
3170 add_header(req, "User-Agent", "Asterisk PBX");
3173 static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, char *authheader, char *vxml_url, char *distinctive_ring, int init)
3175 struct sip_request req;
3178 /* Bump branch even on initial requests */
3179 p->branch ^= rand();
3180 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
3181 initreqprep(&req, p, cmd, vxml_url);
3183 reqprep(&req, p, cmd, 0, 1);
3186 add_header(&req, authheader, auth);
3188 if (!strcasecmp(cmd, "REFER")) {
3189 if (!ast_strlen_zero(p->refer_to))
3190 add_header(&req, "Refer-To", p->refer_to);
3191 if (!ast_strlen_zero(p->referred_by))
3192 add_header(&req, "Referred-By", p->referred_by);
3195 if (distinctive_ring)
3197 add_header(&req, "Alert-info",distinctive_ring);
3199 add_header(&req, "Allow", ALLOWED_METHODS);
3201 add_sdp(&req, p, NULL, NULL);
3203 add_header(&req, "Content-Length", "0");
3204 add_blank_header(&req);
3207 if (!p->initreq.headers) {
3208 /* Use this as the basis */
3209 copy_request(&p->initreq, &req);
3211 if (sip_debug_test_pvt(p))
3212 ast_verbose("%d headers, %d lines\n", p->initreq.headers, p->initreq.lines);
3213 determine_firstline_parts(&p->initreq);
3215 p->lastinvite = p->ocseq;
3216 return send_request(p, &req, init ? 2 : 1, p->ocseq);
3219 static int transmit_state_notify(struct sip_pvt *p, int state, int full)
3222 char from[256], to[256];
3225 struct sip_request req;
3228 strncpy(from, get_header(&p->initreq, "From"), sizeof(from)-1);
3230 c = ditch_braces(from);
3231 if (strncmp(c, "sip:", 4)) {
3232 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
3235 if ((a = strchr(c, ';'))) {
3240 reqprep(&req, p, "NOTIFY", 0, 1);
3242 if (p->subscribed == 1) {
3243 strncpy(to, get_header(&p->initreq, "To"), sizeof(to)-1);
3245 c = ditch_braces(to);
3246 if (strncmp(c, "sip:", 4)) {
3247 ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
3250 if ((a = strchr(c, ';'))) {
3255 add_header(&req, "Content-Type", "application/xpidf+xml");
3257 if ((state==AST_EXTENSION_UNAVAILABLE) || (state==AST_EXTENSION_BUSY))
3259 else if (state==AST_EXTENSION_INUSE)
3265 sprintf(t, "<?xml version=\"1.0\"?>\n");
3266 t = tmp + strlen(tmp);
3267 sprintf(t, "<!DOCTYPE presence PUBLIC \"-//IETF//DTD RFCxxxx XPIDF 1.0//EN\" \"xpidf.dtd\">\n");
3268 t = tmp + strlen(tmp);
3269 sprintf(t, "<presence>\n");
3270 t = tmp + strlen(tmp);
3271 snprintf(t, 1000, "<presentity uri=\"%s;method=SUBSCRIBE\" />\n", mfrom);
3272 t = tmp + strlen(tmp);
3273 snprintf(t, 1000, "<atom id=\"%s\">\n", p->exten);
3274 t = tmp + strlen(tmp);
3275 snprintf(t, 1000, "<address uri=\"%s;user=ip\" priority=\"0,800000\">\n", mto);
3276 t = tmp + strlen(tmp);
3277 sprintf(t, "<status status=\"%s\" />\n", !state ? "open" : (state==1) ? "inuse" : "closed");
3278 t = tmp + strlen(tmp);
3279 sprintf(t, "<msnsubstatus substatus=\"%s\" />\n", !state ? "online" : (state==1) ? "onthephone" : "offline");
3280 t = tmp + strlen(tmp);
3281 sprintf(t, "</address>\n</atom>\n</presence>\n");
3283 add_header(&req, "Event", "dialog");
3284 add_header(&req, "Content-Type", "application/dialog-info+xml");
3287 sprintf(t, "<?xml version=\"1.0\"?>\n");
3288 t = tmp + strlen(tmp);
3289 snprintf(t, 1000, "<dialog-info xmlns=\"urn:ietf:params:xml:ns:dialog-info\" version=\"%d\" state=\"%s\" entity=\"%s\">\n", p->dialogver++, full ? "full":"partial", mfrom);
3290 t = tmp + strlen(tmp);
3291 snprintf(t, 1000, "<dialog id=\"%s\">\n", p->exten);
3292 t = tmp + strlen(tmp);
3293 sprintf(t, "<state>%s</state>\n", state ? "confirmed" : "terminated");
3294 t = tmp + strlen(tmp);
3295 sprintf(t, "</dialog>\n</dialog-info>\n");
3297 if (t > tmp + sizeof(tmp))
3298 ast_log(LOG_WARNING, "Buffer overflow detected!! (Please file a bug report)\n");
3300 snprintf(clen, sizeof(clen), "%d", strlen(tmp));
3301 add_header(&req, "Content-Length", clen);
3302 add_line(&req, tmp);
3304 return send_request(p, &req, 1, p->ocseq);
3307 static int transmit_notify(struct sip_pvt *p, int newmsgs, int oldmsgs)
3309 struct sip_request req;
3313 initreqprep(&req, p, "NOTIFY", NULL);
3314 add_header(&req, "Event", "message-summary");
3315 add_header(&req, "Content-Type", notifymime);
3317 snprintf(tmp, sizeof(tmp), "Messages-Waiting: %s\n", newmsgs ? "yes" : "no");
3318 snprintf(tmp2, sizeof(tmp2), "Voicemail: %d/%d\n", newmsgs, oldmsgs);
3319 snprintf(clen, sizeof(clen), "%d", strlen(tmp) + strlen(tmp2));
3320 add_header(&req, "Content-Length", clen);
3321 add_line(&req, tmp);
3322 add_line(&req, tmp2);
3324 if (!p->initreq.headers) {
3325 /* Use this as the basis */
3326 copy_request(&p->initreq, &req);
3328 if (sip_debug_test_pvt(p))
3329 ast_verbose("%d headers, %d lines\n", p->initreq.headers, p->initreq.lines);
3330 determine_firstline_parts(&p->initreq);
3333 return send_request(p, &req, 1, p->ocseq);
3336 static int transmit_register(struct sip_registry *r, char *cmd, char *auth, char *authheader);
3338 static int sip_reregister(void *data)
3340 /* if we are here, we know that we need to reregister. */
3341 struct sip_registry *r=(struct sip_registry *)data;
3342 ast_mutex_lock(®l.lock);
3344 __sip_do_register(r);
3345 ast_mutex_unlock(®l.lock);
3350 static int __sip_do_register(struct sip_registry *r)
3353 res=transmit_register(r, "REGISTER", NULL, NULL);
3357 static int sip_reg_timeout(void *data)
3359 /* if we are here, our registration timed out, so we'll just do it over */
3360 struct sip_registry *r=data;
3363 ast_mutex_lock(®l.lock);
3364 ast_log(LOG_NOTICE, "Registration for '%s@%s' timed out, trying again\n", r->username, inet_ntoa(r->addr.sin_addr));
3366 /* Unlink us, destroy old call. Locking is not relevent here because all this happens
3367 in the single SIP manager thread. */
3373 r->regstate=REG_STATE_UNREGISTERED;
3375 res=transmit_register(r, "REGISTER", NULL, NULL);
3376 ast_mutex_unlock(®l.lock);
3380 static int transmit_register(struct sip_registry *r, char *cmd, char *auth, char *authheader)
3382 struct sip_request req;
3389 struct ast_hostent ahp;
3392 /* exit if we are already in process with this registrar ?*/
3393 if ( r == NULL || ((auth==NULL) && (r->regstate==REG_STATE_REGSENT || r->regstate==REG_STATE_AUTHSENT))) {
3394 ast_log(LOG_NOTICE, "Strange, trying to register when registration already pending\n");
3400 ast_log(LOG_WARNING, "Already have a call??\n");
3405 if (!r->callid_valid) {
3406 build_callid(r->callid, sizeof(r->callid), __ourip);
3407 r->callid_valid = 1;
3409 p=sip_alloc( r->callid, &r->addr, 0);
3411 ast_log(LOG_WARNING, "Unable to allocate registration call\n");
3417 strncpy(p->peersecret, r->secret, sizeof(p->peersecret)-1);
3418 strncpy(p->peermd5secret, r->md5secret, sizeof(p->peermd5secret)-1);
3419 if (!ast_strlen_zero(r->authuser)) {
3420 strncpy(p->peername, r->authuser, sizeof(p->peername)-1);
3421 strncpy(p->authname, r->authuser, sizeof(p->authname)-1);
3423 strncpy(p->peername, r->username, sizeof(p->peername)-1);
3424 strncpy(p->authname, r->username, sizeof(p->authname)-1);
3426 strncpy(p->username, r->username, sizeof(p->username)-1);
3427 strncpy(p->exten, r->contact, sizeof(p->exten) - 1);
3430 check which address we should use in our contact header
3431 based on whether the remote host is on the external or
3432 internal network so we can register through nat
3434 if ((hp = ast_gethostbyname(r->hostname, &ahp))) {
3435 if (ast_sip_ouraddrfor((struct in_addr *)hp->h_addr, &p->ourip))
3436 memcpy(&p->ourip, &bindaddr.sin_addr, sizeof(p->ourip));
3441 /* set up a timeout */
3443 if (r->timeout > -1) {
3444 ast_log(LOG_WARNING, "Still have a timeout, %d\n", r->timeout);
3445 ast_sched_del(sched, r->timeout);
3447 r->timeout = ast_sched_add(sched, 20*1000, sip_reg_timeout, r);
3448 ast_log(LOG_DEBUG, "Scheduled a timeout # %d\n", r->timeout);
3451 if (strchr(r->username, '@')) {
3452 snprintf(from, sizeof(from), "<sip:%s>;tag=as%08x", r->username, p->tag);
3453 snprintf(to, sizeof(to), "<sip:%s>", r->username);
3455 snprintf(from, sizeof(from), "<sip:%s@%s>;tag=as%08x", r->username, r->hostname, p->tag);
3456 snprintf(to, sizeof(to), "<sip:%s@%s>", r->username, r->hostname);
3459 snprintf(addr, sizeof(addr), "sip:%s", r->hostname);
3460 strncpy(p->uri, addr, sizeof(p->uri) - 1);
3462 p->branch ^= rand();
3464 memset(&req, 0, sizeof(req));
3465 init_req(&req, cmd, addr);
3467 snprintf(tmp, sizeof(tmp), "%u %s", ++r->ocseq, cmd);
3468 p->ocseq = r->ocseq;
3470 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
3471 snprintf(via, sizeof(via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
3472 add_header(&req, "Via", via);
3473 add_header(&req, "From", from);
3474 add_header(&req, "To", to);
3475 add_header(&req, "Call-ID", p->callid);
3476 add_header(&req, "CSeq", tmp);
3477 add_header(&req, "User-Agent", "Asterisk PBX");
3479 add_header(&req, authheader, auth);
3481 snprintf(tmp, sizeof(tmp), "%d", default_expiry);
3482 add_header(&req, "Expires", tmp);
3483 add_header(&req, "Contact", p->our_contact);
3484 add_header(&req, "Event", "registration");
3485 add_header(&req, "Content-Length", "0");
3486 add_blank_header(&req);
3487 copy_request(&p->initreq, &req);
3489 if (sip_debug_test_pvt(p))
3490 ast_verbose("%d headers, %d lines\n", p->initreq.headers, p->initreq.lines);
3491 determine_firstline_parts(&p->initreq);
3492 r->regstate=auth?REG_STATE_AUTHSENT:REG_STATE_REGSENT;
3493 return send_request(p, &req, 2, p->ocseq);
3496 static int transmit_message_with_text(struct sip_pvt *p, char *text)
3498 struct sip_request req;
3499 reqprep(&req, p, "MESSAGE", 0, 1);
3500 add_text(&req, text);
3501 return send_request(p, &req, 1, p->ocseq);
3504 static int transmit_refer(struct sip_pvt *p, char *dest)
3506 struct sip_request req;
3511 of = get_header(&p->initreq, "To");
3513 of = get_header(&p->initreq, "From");
3514 strncpy(from, of, sizeof(from) - 1);
3515 of = ditch_braces(from);
3516 strncpy(p->from,of,sizeof(p->from) - 1);
3517 if (strncmp(of, "sip:", 4)) {
3518 ast_log(LOG_NOTICE, "From address missing 'sip:', using it anyway\n");
3521 /* Get just the username part */
3522 if ((c = strchr(of, '@'))) {