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 recordhistory = 0;
179 static int globaldtmfmode = SIP_DTMF_RFC2833;
180 static char globalmusicclass[MAX_LANGUAGE] = ""; /* Global music on hold class */
181 static char global_realm[AST_MAX_EXTENSION] = "asterisk"; /* Default realm */
184 static int expiry = 900;
186 static struct sched_context *sched;
187 static struct io_context *io;
188 /* The private structures of the sip channels are linked for
189 selecting outgoing channels */
191 #define SIP_MAX_HEADERS 64
192 #define SIP_MAX_LINES 64
196 #define DEC_OUT_USE 2
197 #define INC_OUT_USE 3
199 static struct sip_codec_pref {
201 struct sip_codec_pref *next;
205 char *rlPart1; /* SIP Method Name or "SIP/2.0" protocol version */
206 char *rlPart2; /* The Request URI or Response Status */
208 int headers; /* SIP Headers */
209 char *header[SIP_MAX_HEADERS];
210 int lines; /* SDP Content */
211 char *line[SIP_MAX_LINES];
212 char data[SIP_MAX_PACKET];
218 struct sip_route *next;
224 struct sip_history *next;
227 static struct sip_pvt {
228 ast_mutex_t lock; /* Channel private lock */
229 char callid[80]; /* Global CallID */
230 char randdata[80]; /* Random data */
231 unsigned int ocseq; /* Current outgoing seqno */
232 unsigned int icseq; /* Current incoming seqno */
233 unsigned int callgroup; /* Call group */
234 unsigned int pickupgroup; /* Pickup group */
235 int lastinvite; /* Last Cseq of invite */
236 int alreadygone; /* Whether or not we've already been destroyed by or peer */
237 int needdestroy; /* if we need to be destroyed */
238 int capability; /* Special capability (codec) */
239 int jointcapability; /* Supported capability at both ends (codecs ) */
240 int prefcodec; /* Preferred codec (outbound only) */
241 int noncodeccapability;
242 int outgoing; /* Outgoing or incoming call? */
243 int authtries; /* Times we've tried to authenticate */
244 int insecure; /* Don't check source port/ip */
245 int expiry; /* How long we take to expire */
246 int branch; /* One random number */
247 int canreinvite; /* Do we support reinvite */
248 int ringing; /* Have sent 180 ringing */
249 int progress; /* Have sent 183 message progress */
250 int tag; /* Another random number */
251 int nat; /* Whether to try to support NAT */
252 int sessionid; /* SDP Session ID */
253 int sessionversion; /* SDP Session Version */
254 struct sockaddr_in sa; /* Our peer */
255 struct sockaddr_in redirip; /* Where our RTP should be going if not to us */
256 struct sockaddr_in vredirip; /* Where our Video RTP should be going if not to us */
257 struct sockaddr_in recv; /* Received as */
258 struct in_addr ourip; /* Our IP */
259 struct ast_channel *owner; /* Who owns us */
260 char exten[AST_MAX_EXTENSION]; /* Extension where to start */
261 char refer_to[AST_MAX_EXTENSION]; /* Place to store REFER-TO extension */
262 char referred_by[AST_MAX_EXTENSION]; /* Place to store REFERRED-BY extension */
263 char refer_contact[AST_MAX_EXTENSION]; /* Place to store Contact info from a REFER extension */
264 struct sip_pvt *refer_call; /* Call we are referring */
265 struct sip_route *route; /* Head of linked list of routing steps (fm Record-Route) */
266 int route_persistant; /* Is this the "real" route? */
267 char remote_party_id[256];
268 char from[256]; /* The From: header */
269 char useragent[256]; /* User agent in SIP request */
270 char context[AST_MAX_EXTENSION]; /* Context for this call */
271 char fromdomain[AST_MAX_EXTENSION]; /* Domain to show in the from field */
272 char fromuser[AST_MAX_EXTENSION]; /* Domain to show in the user field */
273 char tohost[AST_MAX_EXTENSION]; /* Host we should put in the "to" field */
274 char language[MAX_LANGUAGE]; /* Default language for this call */
275 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
276 char rdnis[256]; /* Referring DNIS */
277 char theirtag[256]; /* Their tag */
280 char authname[256]; /* Who we use for authentication */
281 char uri[256]; /* Original requested URI */
282 char peersecret[256];
283 char peermd5secret[256];
284 char callerid[256]; /* Caller*ID */
285 int restrictcid; /* hide presentation from remote user */
287 char accountcode[20]; /* Account code */
288 char our_contact[256]; /* Our contact header */
289 char realm[256]; /* Authorization realm */
290 char nonce[256]; /* Authorization nonce */
291 char opaque[256]; /* Opaque nonsense */
292 char qop[80]; /* Quality of Protection, since SIP wasn't complicated enough yet. */
293 char domain[256]; /* Authorization nonce */
294 char lastmsg[256]; /* Last Message sent/received */
295 int amaflags; /* AMA Flags */
296 int pendinginvite; /* Any pending invite */
297 int pendingbye; /* Need to send bye after we ack? */
298 int gotrefer; /* Got a refer? */
299 struct sip_request initreq; /* Initial request */
301 int maxtime; /* Max time for first response */
302 int initid; /* Auto-congest ID if appropriate */
303 int autokillid; /* Auto-kill ID */
312 struct sip_peer *peerpoke; /* If this calls is to poke a peer, which one */
313 struct sip_registry *registry; /* If this is a REGISTER call, to which registry */
314 struct ast_rtp *rtp; /* RTP Session */
315 struct ast_rtp *vrtp; /* Video RTP session */
316 struct sip_pkt *packets; /* Packets scheduled for re-transmission */
317 struct sip_history *history; /* History of this SIP dialog */
318 struct sip_pvt *next; /* Next call in chain */
321 #define FLAG_RESPONSE (1 << 0)
322 #define FLAG_FATAL (1 << 1)
325 struct sip_pkt *next; /* Next packet */
326 int retrans; /* Retransmission number */
327 int seqno; /* Sequence number */
328 int flags; /* non-zero if this is a response packet (e.g. 200 OK) */
329 struct sip_pvt *owner; /* Owner call */
330 int retransid; /* Retransmission ID */
331 int packetlen; /* Length of packet */
336 /* Users who can access various contexts */
342 char accountcode[20];
343 char language[MAX_LANGUAGE];
344 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
345 char useragent[256]; /* User agent in SIP request */
346 unsigned int callgroup;
347 unsigned int pickupgroup;
361 struct sip_user *next;
368 char context[80]; /* JK02: peers need context too to allow parking etc */
373 char mailbox[AST_MAX_EXTENSION];
374 char language[MAX_LANGUAGE];
375 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
376 char useragent[256]; /* User agent in SIP request */
386 unsigned int callgroup;
387 unsigned int pickupgroup;
389 struct sockaddr_in addr;
393 struct sip_pvt *call; /* Call pointer */
394 int pokeexpire; /* When to expire poke */
395 int lastms; /* How long last response took (in ms), or -1 for no response */
396 int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
397 struct timeval ps; /* Ping send time */
399 struct sockaddr_in defaddr;
405 struct sip_peer *next;
408 static ast_mutex_t sip_reload_lock = AST_MUTEX_INITIALIZER;
409 static int sip_reloading = 0;
411 #define REG_STATE_UNREGISTERED 0
412 #define REG_STATE_REGSENT 1
413 #define REG_STATE_AUTHSENT 2
414 #define REG_STATE_REGISTERED 3
415 #define REG_STATE_REJECTED 4
416 #define REG_STATE_TIMEOUT 5
417 #define REG_STATE_NOAUTH 6
419 struct sip_registry {
420 struct sockaddr_in addr; /* Who we connect to for registration purposes */
421 char username[80]; /* Who we are registering as */
422 char authuser[80]; /* Who we *authenticate* as */
424 char secret[80]; /* Password or key name in []'s */
426 char contact[80]; /* Contact extension */
428 int expire; /* Sched ID of expiration */
429 int timeout; /* sched id of sip_reg_timeout */
430 int refresh; /* How often to refresh */
431 struct sip_pvt *call; /* create a sip_pvt structure for each outbound "registration call" in progress */
433 int callid_valid; /* 0 means we haven't chosen callid for this registry yet. */
434 char callid[80]; /* Global CallID for this registry */
435 unsigned int ocseq; /* Sequence number we got to for REGISTERs for this registry */
436 struct sockaddr_in us; /* Who the server thinks we are */
437 struct sip_registry *next;
440 static struct ast_user_list {
441 struct sip_user *users;
443 } userl = { NULL, AST_MUTEX_INITIALIZER };
445 static struct ast_peer_list {
446 struct sip_peer *peers;
448 } peerl = { NULL, AST_MUTEX_INITIALIZER };
450 static struct ast_register_list {
451 struct sip_registry *registrations;
454 } regl = { NULL, AST_MUTEX_INITIALIZER };
457 #define REINVITE_INVITE 1
458 #define REINVITE_UPDATE 2
460 static int __sip_do_register(struct sip_registry *r);
462 static int sipsock = -1;
463 static int globalnat = 0;
464 static int globalcanreinvite = REINVITE_INVITE;
467 static struct sockaddr_in bindaddr;
468 static struct sockaddr_in externip;
469 static struct ast_ha *localaddr;
471 static struct ast_frame *sip_read(struct ast_channel *ast);
472 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req);
473 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
474 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *rand, int reliable);
475 static int transmit_request(struct sip_pvt *p, char *msg, int inc, int reliable, int newbranch);
476 static int transmit_request_with_auth(struct sip_pvt *p, char *msg, int inc, int reliable, int newbranch);
477 static int transmit_invite(struct sip_pvt *p, char *msg, int sendsdp, char *auth, char *authheader, char *vxml_url,char *distinctive_ring, int init);
478 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp);
479 static int transmit_info_with_digit(struct sip_pvt *p, char digit);
480 static int transmit_message_with_text(struct sip_pvt *p, char *text);
481 static int transmit_refer(struct sip_pvt *p, char *dest);
482 static struct sip_peer *temp_peer(char *name);
483 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req, char *header, char *respheader, char *msg, int init);
484 /* static char *getsipuri(char *header); */
485 static void free_old_route(struct sip_route *route);
486 static int build_reply_digest(struct sip_pvt *p, char *orig_header, char *digest, int digest_len);
487 static int update_user_counter(struct sip_pvt *fup, int event);
488 static void prune_peers(void);
489 static int sip_do_reload(void);
490 static int sip_debug_test_addr(struct sockaddr_in *addr);
491 static int sip_debug_test_pvt(struct sip_pvt *p);
493 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
497 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->recv, sizeof(struct sockaddr_in));
499 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->sa, sizeof(struct sockaddr_in));
501 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));
506 static void sip_destroy(struct sip_pvt *p);
508 static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
511 * Using the localaddr structure built up with localnet statements
512 * apply it to their address to see if we need to substitute our
513 * externip or can get away with our internal bindaddr
515 struct sockaddr_in theirs;
516 theirs.sin_addr = *them;
517 if (localaddr && externip.sin_addr.s_addr &&
518 ast_apply_ha(localaddr, &theirs)) {
520 memcpy(us, &externip.sin_addr, sizeof(struct in_addr));
521 strcpy(t, inet_ntoa(*(struct in_addr *)&them->s_addr));
522 ast_log(LOG_DEBUG, "Target address %s is not local, substituting externip\n", t);
524 else if (bindaddr.sin_addr.s_addr)
525 memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr));
527 return ast_ouraddrfor(them, us);
531 static int append_history(struct sip_pvt *p, char *event, char *data)
533 struct sip_history *hist, *prev;
537 hist = malloc(sizeof(struct sip_history));
539 memset(hist, 0, sizeof(struct sip_history));
540 snprintf(hist->event, sizeof(hist->event), "%-15s %s", event, data);
544 if ((*c == '\r') || (*c == '\n')) {
550 /* Enqueue into history */
563 static int retrans_pkt(void *data)
565 struct sip_pkt *pkt=data;
567 ast_mutex_lock(&pkt->owner->lock);
568 if (pkt->retrans < MAX_RETRANS) {
570 if (sip_debug_test_pvt(pkt->owner)) {
572 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));
574 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));
576 append_history(pkt->owner, "ReTx", pkt->data);
577 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
580 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");
581 append_history(pkt->owner, "MaxRetries", pkt->flags & FLAG_FATAL ? "(Critical)" : "(Non-critical)");
583 if (pkt->flags & FLAG_FATAL) {
584 while(pkt->owner->owner && ast_mutex_trylock(&pkt->owner->owner->lock)) {
585 ast_mutex_unlock(&pkt->owner->lock);
587 ast_mutex_lock(&pkt->owner->lock);
589 if (pkt->owner->owner) {
590 /* XXX Potential deadlocK?? XXX */
591 ast_queue_hangup(pkt->owner->owner);
592 ast_mutex_unlock(&pkt->owner->owner->lock);
594 /* If no owner, destroy now */
595 pkt->owner->needdestroy = 1;
598 /* Okay, it's not fatal, just continue. XXX If we were nice, we'd free it now, rather than wait for the
599 end of the call XXX */
603 ast_mutex_unlock(&pkt->owner->lock);
607 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len, int fatal)
610 pkt = malloc(sizeof(struct sip_pkt) + len);
613 memset(pkt, 0, sizeof(struct sip_pkt));
614 memcpy(pkt->data, data, len);
615 pkt->packetlen = len;
616 pkt->next = p->packets;
621 pkt->flags |= FLAG_FATAL;
622 /* Schedule retransmission */
623 pkt->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, pkt);
624 pkt->next = p->packets;
626 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
627 if (!strncasecmp(pkt->data, "INVITE", 6)) {
628 /* Note this is a pending invite */
629 p->pendinginvite = seqno;
634 static int __sip_autodestruct(void *data)
636 struct sip_pvt *p = data;
638 ast_log(LOG_DEBUG, "Auto destroying call '%s'\n", p->callid);
639 append_history(p, "AutoDestroy", "");
641 ast_log(LOG_WARNING, "Autodestruct on call '%s' with owner in place\n", p->callid);
642 ast_queue_hangup(p->owner);
649 static int sip_scheddestroy(struct sip_pvt *p, int ms)
652 if (sip_debug_test_pvt(p))
653 ast_verbose("Scheduling destruction of call '%s' in %d ms\n", p->callid, ms);
655 snprintf(tmp, sizeof(tmp), "%d ms", ms);
656 append_history(p, "SchedDestroy", tmp);
658 if (p->autokillid > -1)
659 ast_sched_del(sched, p->autokillid);
660 p->autokillid = ast_sched_add(sched, ms, __sip_autodestruct, p);
664 static int sip_cancel_destroy(struct sip_pvt *p)
666 if (p->autokillid > -1)
667 ast_sched_del(sched, p->autokillid);
668 append_history(p, "CancelDestroy", "");
673 static int __sip_ack(struct sip_pvt *p, int seqno, int resp)
675 struct sip_pkt *cur, *prev = NULL;
680 if ((cur->seqno == seqno) && ((cur->flags & FLAG_RESPONSE) == resp)) {
681 if (!resp && (seqno == p->pendinginvite)) {
682 ast_log(LOG_DEBUG, "Acked pending invite %d\n", p->pendinginvite);
683 p->pendinginvite = 0;
686 /* this is our baby */
688 prev->next = cur->next;
690 p->packets = cur->next;
691 if (cur->retransid > -1)
692 ast_sched_del(sched, cur->retransid);
700 ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
704 static int __sip_semi_ack(struct sip_pvt *p, int seqno, int resp)
710 if ((cur->seqno == seqno) && ((cur->flags & FLAG_RESPONSE) == resp)) {
711 /* this is our baby */
712 if (cur->retransid > -1)
713 ast_sched_del(sched, cur->retransid);
720 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");
724 static int send_response(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
727 if (sip_debug_test_pvt(p)) {
729 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));
731 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));
734 append_history(p, "TxRespRel", req->data);
735 res = __sip_reliable_xmit(p, seqno, 1, req->data, req->len, (reliable > 1));
737 append_history(p, "TxResp", req->data);
738 res = __sip_xmit(p, req->data, req->len);
745 static int send_request(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
748 if (sip_debug_test_pvt(p)) {
750 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));
752 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));
755 append_history(p, "TxReqRel", req->data);
756 res = __sip_reliable_xmit(p, seqno, 0, req->data, req->len, (reliable > 1));
758 append_history(p, "TxReq", req->data);
759 res = __sip_xmit(p, req->data, req->len);
764 static char *ditch_braces(char *tmp)
768 if ((n = strchr(tmp, '<')) ) {
770 while(*c && *c != '>') c++;
772 ast_log(LOG_WARNING, "No closing brace in '%s'\n", tmp);
781 static int sip_sendtext(struct ast_channel *ast, char *text)
783 struct sip_pvt *p = ast->pvt->pvt;
784 if (sip_debug_test_pvt(p))
785 ast_verbose("Sending text %s on %s\n", text, ast->name);
788 if (!text || ast_strlen_zero(text))
790 if (sip_debug_test_pvt(p))
791 ast_verbose("Really sending text %s on %s\n", text, ast->name);
792 transmit_message_with_text(p, text);
798 static void mysql_update_peer(char *peer, struct sockaddr_in *sin, char *username, int expiry)
800 if (mysql && (strlen(peer) < 128)) {
805 name = alloca(strlen(peer) * 2 + 1);
806 uname = alloca(strlen(username) * 2 + 1);
808 mysql_real_escape_string(mysql, name, peer, strlen(peer));
809 mysql_real_escape_string(mysql, uname, username, strlen(username));
810 snprintf(query, sizeof(query), "UPDATE sipfriends SET ipaddr=\"%s\", port=\"%d\", regseconds=\"%ld\", username=\"%s\" WHERE name=\"%s\"",
811 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), nowtime + expiry, uname, name);
812 ast_mutex_lock(&mysqllock);
813 if (mysql_real_query(mysql, query, strlen(query)))
814 ast_log(LOG_WARNING, "Unable to update database\n");
816 ast_mutex_unlock(&mysqllock);
820 static struct sip_peer *mysql_peer(char *peer, struct sockaddr_in *sin)
825 p = malloc(sizeof(struct sip_peer));
826 memset(p, 0, sizeof(struct sip_peer));
827 if (mysql && (!peer || (strlen(peer) < 128))) {
832 time_t regseconds, nowtime;
837 name = alloca(strlen(peer) * 2 + 1);
838 mysql_real_escape_string(mysql, name, peer, strlen(peer));
841 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));
843 snprintf(query, sizeof(query), "SELECT name, secret, context, username, ipaddr, port, regseconds FROM sipfriends WHERE name=\"%s\"", name);
844 ast_mutex_lock(&mysqllock);
845 mysql_query(mysql, query);
846 if ((result = mysql_store_result(mysql))) {
847 if ((rowval = mysql_fetch_row(result))) {
848 numfields = mysql_num_fields(result);
849 fields = mysql_fetch_fields(result);
851 for (x=0;x<numfields;x++) {
853 if (!strcasecmp(fields[x].name, "secret")) {
854 strncpy(p->secret, rowval[x], sizeof(p->secret));
855 } else if (!strcasecmp(fields[x].name, "name")) {
856 strncpy(p->name, rowval[x], sizeof(p->name) - 1);
857 } else if (!strcasecmp(fields[x].name, "context")) {
858 strncpy(p->context, rowval[x], sizeof(p->context) - 1);
859 } else if (!strcasecmp(fields[x].name, "username")) {
860 strncpy(p->username, rowval[x], sizeof(p->username) - 1);
861 } else if (!strcasecmp(fields[x].name, "ipaddr")) {
862 inet_aton(rowval[x], &p->addr.sin_addr);
863 } else if (!strcasecmp(fields[x].name, "port")) {
864 if (sscanf(rowval[x], "%i", &port) != 1)
866 p->addr.sin_port = htons(port);
867 } else if (!strcasecmp(fields[x].name, "regseconds")) {
868 if (sscanf(rowval[x], "%li", ®seconds) != 1)
874 if (nowtime > regseconds)
875 memset(&p->addr, 0, sizeof(p->addr));
877 mysql_free_result(result);
880 ast_mutex_unlock(&mysqllock);
887 p->capability = capability;
889 p->dtmfmode = globaldtmfmode;
897 #endif /* MYSQL_FRIENDS */
899 static void update_peer(struct sip_peer *p, int expiry)
903 mysql_update_peer(p->name, &p->addr, p->username, expiry);
908 static struct sip_peer *find_peer(char *peer, struct sockaddr_in *sin)
910 struct sip_peer *p = NULL;
914 /* Find by peer name */
916 if (!strcasecmp(p->name, peer)) {
925 if (!inaddrcmp(&p->addr, sin) ||
927 (p->addr.sin_addr.s_addr == sin->sin_addr.s_addr))) {
936 p = mysql_peer(peer, sin);
943 static struct sip_user *find_user(char *name)
945 struct sip_user *u = NULL;
949 if (!strcasecmp(u->name, name)) {
958 static int sip_debug_test_addr(struct sockaddr_in *addr) {
959 /* See if we pass debug IP filter */
960 if (sipdebug == 0) return 0;
961 if (debugaddr.sin_addr.s_addr) {
962 if (((ntohs(debugaddr.sin_port) != 0) &&
963 (debugaddr.sin_port != addr->sin_port)) ||
964 (debugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
970 static int sip_debug_test_pvt(struct sip_pvt *p) {
971 return (sipdebug && sip_debug_test_addr((p->nat ? &p->recv : &p->sa)));
974 static int create_addr(struct sip_pvt *r, char *peer)
977 struct ast_hostent ahp;
982 char host[256], *hostn;
984 r->sa.sin_family = AF_INET;
985 ast_mutex_lock(&peerl.lock);
986 p = find_peer(peer, NULL);
990 r->capability = p->capability;
993 ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", r->nat);
994 ast_rtp_setnat(r->rtp, r->nat);
997 ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", r->nat);
998 ast_rtp_setnat(r->vrtp, r->nat);
1000 strncpy(r->peername, p->username, sizeof(r->peername)-1);
1001 strncpy(r->authname, p->username, sizeof(r->authname)-1);
1002 strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1);
1003 strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1);
1004 strncpy(r->username, p->username, sizeof(r->username)-1);
1005 strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1);
1006 if (ast_strlen_zero(r->tohost)) {
1007 if (p->addr.sin_addr.s_addr)
1008 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->addr.sin_addr));
1010 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->defaddr.sin_addr));
1012 if (!ast_strlen_zero(p->fromdomain))
1013 strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1);
1014 if (!ast_strlen_zero(p->fromuser))
1015 strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1);
1016 r->insecure = p->insecure;
1017 r->canreinvite = p->canreinvite;
1018 r->maxtime = p->maxms;
1019 r->callgroup = p->callgroup;
1020 r->pickupgroup = p->pickupgroup;
1022 r->dtmfmode = p->dtmfmode;
1023 if (r->dtmfmode & SIP_DTMF_RFC2833)
1024 r->noncodeccapability |= AST_RTP_DTMF;
1026 r->noncodeccapability &= ~AST_RTP_DTMF;
1028 strncpy(r->context, p->context,sizeof(r->context)-1);
1029 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
1030 (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) {
1031 if (p->addr.sin_addr.s_addr) {
1032 r->sa.sin_addr = p->addr.sin_addr;
1033 r->sa.sin_port = p->addr.sin_port;
1035 r->sa.sin_addr = p->defaddr.sin_addr;
1036 r->sa.sin_port = p->defaddr.sin_port;
1038 memcpy(&r->recv, &r->sa, sizeof(r->recv));
1049 ast_mutex_unlock(&peerl.lock);
1051 if ((port=strchr(peer, ':'))) {
1057 portno = atoi(port);
1059 portno = DEFAULT_SIP_PORT;
1064 snprintf(service, sizeof(service), "_sip._udp.%s", peer);
1065 ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service);
1071 hp = ast_gethostbyname(hostn, &ahp);
1073 strncpy(r->tohost, peer, sizeof(r->tohost) - 1);
1074 memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr));
1075 r->sa.sin_port = htons(portno);
1076 memcpy(&r->recv, &r->sa, sizeof(r->recv));
1079 ast_log(LOG_WARNING, "No such host: %s\n", peer);
1095 static int auto_congest(void *nothing)
1097 struct sip_pvt *p = nothing;
1098 ast_mutex_lock(&p->lock);
1101 if (!ast_mutex_trylock(&p->owner->lock)) {
1102 ast_log(LOG_NOTICE, "Auto-congesting %s\n", p->owner->name);
1103 ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
1104 ast_mutex_unlock(&p->owner->lock);
1107 ast_mutex_unlock(&p->lock);
1111 static void sip_prefs_free(void)
1113 struct sip_codec_pref *cur, *next;
1123 static void sip_pref_remove(int format)
1125 struct sip_codec_pref *cur, *prev=NULL;
1128 if (cur->codec == format) {
1130 prev->next = cur->next;
1141 static int sip_pref_append(int format)
1143 struct sip_codec_pref *cur, *tmp;
1144 sip_pref_remove(format);
1145 tmp = (struct sip_codec_pref *)malloc(sizeof(struct sip_codec_pref));
1148 memset(tmp, 0, sizeof(struct sip_codec_pref));
1149 tmp->codec = format;
1160 static int sip_codec_choose(int formats)
1162 struct sip_codec_pref *cur;
1163 formats &= ((AST_FORMAT_MAX_AUDIO << 1) - 1);
1166 if (formats & cur->codec)
1170 return ast_best_codec(formats);
1173 static int sip_call(struct ast_channel *ast, char *dest, int timeout)
1177 char *vxml_url = NULL;
1178 char *distinctive_ring = NULL;
1179 struct varshead *headp;
1180 struct ast_var_t *current;
1183 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
1184 ast_log(LOG_WARNING, "sip_call called on %s, neither down nor reserved\n", ast->name);
1187 /* Check whether there is vxml_url, distinctive ring variables */
1189 headp=&ast->varshead;
1190 AST_LIST_TRAVERSE(headp,current,entries) {
1191 /* Check whether there is a VXML_URL variable */
1192 if (strcasecmp(ast_var_name(current),"VXML_URL")==0)
1194 vxml_url = ast_var_value(current);
1197 /* Check whether there is a ALERT_INFO variable */
1198 if (strcasecmp(ast_var_name(current),"ALERT_INFO")==0)
1200 distinctive_ring = ast_var_value(current);
1207 ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
1208 res = update_user_counter(p,INC_OUT_USE);
1210 p->restrictcid = ast->restrictcid;
1211 p->jointcapability = p->capability;
1212 transmit_invite(p, "INVITE", 1, NULL, NULL, vxml_url,distinctive_ring, 1);
1214 /* Initialize auto-congest time */
1215 p->initid = ast_sched_add(sched, p->maxtime * 4, auto_congest, p);
1221 static void __sip_destroy(struct sip_pvt *p, int lockowner)
1223 struct sip_pvt *cur, *prev = NULL;
1225 struct sip_history *hist;
1226 if (sip_debug_test_pvt(p))
1227 ast_verbose("Destroying call '%s'\n", p->callid);
1228 if (p->stateid > -1)
1229 ast_extension_state_del(p->stateid, NULL);
1231 ast_sched_del(sched, p->initid);
1232 if (p->autokillid > -1)
1233 ast_sched_del(sched, p->autokillid);
1236 ast_rtp_destroy(p->rtp);
1239 ast_rtp_destroy(p->vrtp);
1242 free_old_route(p->route);
1246 /* Carefully unlink from registry */
1247 struct sip_registry *reg;
1248 ast_mutex_lock(®l.lock);
1249 reg = regl.registrations;
1251 if ((reg == p->registry) && (p->registry->call == p))
1252 p->registry->call=NULL;
1255 ast_mutex_unlock(®l.lock);
1257 /* Unlink us from the owner if we have one */
1260 ast_mutex_lock(&p->owner->lock);
1261 ast_log(LOG_DEBUG, "Detaching from %s\n", p->owner->name);
1262 p->owner->pvt->pvt = NULL;
1264 ast_mutex_unlock(&p->owner->lock);
1269 p->history = p->history->next;
1276 prev->next = cur->next;
1285 ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
1288 ast_sched_del(sched, p->initid);
1289 while((cp = p->packets)) {
1290 p->packets = p->packets->next;
1291 if (cp->retransid > -1)
1292 ast_sched_del(sched, cp->retransid);
1299 static int update_user_counter(struct sip_pvt *fup, int event)
1301 char name[256] = "";
1303 strncpy(name, fup->username, sizeof(name) - 1);
1304 ast_mutex_lock(&userl.lock);
1305 u = find_user(name);
1307 ast_log(LOG_DEBUG, "%s is not a local user\n", name);
1308 ast_mutex_unlock(&userl.lock);
1312 /* incoming and outgoing affects the inUse counter */
1315 if ( u->inUse > 0 ) {
1323 if (u->incominglimit > 0 ) {
1324 if (u->inUse >= u->incominglimit) {
1325 ast_log(LOG_ERROR, "Call from user '%s' rejected due to usage limit of %d\n", u->name, u->incominglimit);
1326 /* inc inUse as well */
1327 if ( event == INC_OUT_USE ) {
1330 ast_mutex_unlock(&userl.lock);
1335 ast_log(LOG_DEBUG, "Call from user '%s' is %d out of %d\n", u->name, u->inUse, u->incominglimit);
1337 /* we don't use these anymore
1339 if ( u->outUse > 0 ) {
1346 if ( u->outgoinglimit > 0 ) {
1347 if ( u->outUse >= u->outgoinglimit ) {
1348 ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
1349 ast_mutex_unlock(&userl.lock);
1357 ast_log(LOG_ERROR, "update_user_counter(%s,%d) called with no event!\n",u->name,event);
1359 ast_mutex_unlock(&userl.lock);
1363 static void sip_destroy(struct sip_pvt *p)
1365 ast_mutex_lock(&iflock);
1366 __sip_destroy(p, 1);
1367 ast_mutex_unlock(&iflock);
1370 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req, int fatal);
1372 static int hangup_sip2cause(int cause)
1377 return AST_CAUSE_BUSY;
1379 return AST_CAUSE_NORMAL;
1385 static char *hangup_cause2sip(int cause)
1389 case AST_CAUSE_BUSY:
1398 static int sip_hangup(struct ast_channel *ast)
1400 struct sip_pvt *p = ast->pvt->pvt;
1402 int needdestroy = 0;
1404 ast_log(LOG_DEBUG, "sip_hangup(%s)\n", ast->name);
1405 if (!ast->pvt->pvt) {
1406 ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
1409 ast_mutex_lock(&p->lock);
1410 if ( p->outgoing ) {
1411 ast_log(LOG_DEBUG, "update_user_counter(%s) - decrement outUse counter\n", p->username);
1412 update_user_counter(p, DEC_OUT_USE);
1414 ast_log(LOG_DEBUG, "update_user_counter(%s) - decrement inUse counter\n", p->username);
1415 update_user_counter(p, DEC_IN_USE);
1417 /* Determine how to disconnect */
1418 if (p->owner != ast) {
1419 ast_log(LOG_WARNING, "Huh? We aren't the owner?\n");
1420 ast_mutex_unlock(&p->lock);
1423 if (!ast || (ast->_state != AST_STATE_UP))
1428 ast_dsp_free(p->vad);
1431 ast->pvt->pvt = NULL;
1433 ast_mutex_lock(&usecnt_lock);
1435 ast_mutex_unlock(&usecnt_lock);
1436 ast_update_use_count();
1439 /* Start the process if it's not already started */
1440 if (!p->alreadygone && !ast_strlen_zero(p->initreq.data)) {
1443 transmit_request_with_auth(p, "CANCEL", p->ocseq, 1, 0);
1444 /* Actually don't destroy us yet, wait for the 487 on our original
1445 INVITE, but do set an autodestruct just in case. */
1447 sip_scheddestroy(p, 15000);
1448 if ( p->initid != -1 ) {
1449 /* channel still up - reverse dec of inUse counter
1450 only if the channel is not auto-congested */
1451 if ( p->outgoing ) {
1452 update_user_counter(p, INC_OUT_USE);
1455 update_user_counter(p, INC_IN_USE);
1460 if (ast->hangupcause && ((res = hangup_cause2sip(ast->hangupcause)))) {
1461 transmit_response_reliable(p, res, &p->initreq, 1);
1463 transmit_response_reliable(p, "403 Forbidden", &p->initreq, 1);
1466 if (!p->pendinginvite) {
1468 transmit_request_with_auth(p, "BYE", 0, 1, 1);
1470 /* Note we will need a BYE when this all settles out
1471 but we can't send one while we have "INVITE" outstanding. */
1476 p->needdestroy = needdestroy;
1477 ast_mutex_unlock(&p->lock);
1481 static int sip_answer(struct ast_channel *ast)
1485 struct sip_pvt *p = ast->pvt->pvt;
1488 if (ast->_state != AST_STATE_UP) {
1492 codec=pbx_builtin_getvar_helper(p->owner,"SIP_CODEC");
1494 fmt=ast_getformatbyname(codec);
1496 ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
1497 p->jointcapability=fmt;
1498 } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n",codec);
1501 ast_setstate(ast, AST_STATE_UP);
1503 ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
1504 res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
1509 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
1511 struct sip_pvt *p = ast->pvt->pvt;
1513 if (frame->frametype == AST_FRAME_VOICE) {
1514 if (!(frame->subclass & ast->nativeformats)) {
1515 ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
1516 frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
1520 ast_mutex_lock(&p->lock);
1522 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1523 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1526 res = ast_rtp_write(p->rtp, frame);
1528 ast_mutex_unlock(&p->lock);
1530 } else if (frame->frametype == AST_FRAME_VIDEO) {
1532 ast_mutex_lock(&p->lock);
1534 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1535 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1538 res = ast_rtp_write(p->vrtp, frame);
1540 ast_mutex_unlock(&p->lock);
1542 } else if (frame->frametype == AST_FRAME_IMAGE) {
1545 ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", frame->frametype);
1552 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
1554 struct sip_pvt *p = newchan->pvt->pvt;
1555 ast_mutex_lock(&p->lock);
1556 if (p->owner != oldchan) {
1557 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
1558 ast_mutex_unlock(&p->lock);
1562 ast_mutex_unlock(&p->lock);
1566 static int sip_senddigit(struct ast_channel *ast, char digit)
1568 struct sip_pvt *p = ast->pvt->pvt;
1569 if (p && (p->dtmfmode & SIP_DTMF_INFO)) {
1570 transmit_info_with_digit(p, digit);
1572 if (p && p->rtp && (p->dtmfmode & SIP_DTMF_RFC2833)) {
1573 ast_rtp_senddigit(p->rtp, digit);
1575 /* If in-band DTMF is desired, send that */
1576 if (p->dtmfmode & SIP_DTMF_INBAND)
1581 static int sip_transfer(struct ast_channel *ast, char *dest)
1583 struct sip_pvt *p = ast->pvt->pvt;
1585 res = transmit_refer(p, dest);
1589 static int sip_indicate(struct ast_channel *ast, int condition)
1591 struct sip_pvt *p = ast->pvt->pvt;
1593 case AST_CONTROL_RINGING:
1594 if (ast->_state == AST_STATE_RING) {
1596 transmit_response(p, "180 Ringing", &p->initreq);
1600 /* Oops, we've sent progress tones. Let Asterisk do it instead */
1604 case AST_CONTROL_BUSY:
1605 if (ast->_state != AST_STATE_UP) {
1606 transmit_response(p, "486 Busy Here", &p->initreq);
1608 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1612 case AST_CONTROL_CONGESTION:
1613 if (ast->_state != AST_STATE_UP) {
1614 transmit_response(p, "503 Service Unavailable", &p->initreq);
1616 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1620 case AST_CONTROL_PROGRESS:
1621 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1622 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1630 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
1638 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
1640 struct ast_channel *tmp;
1642 tmp = ast_channel_alloc(1);
1644 /* Select our native format based on codec preference until we receive
1645 something from another device to the contrary. */
1646 if (i->jointcapability)
1647 tmp->nativeformats = sip_codec_choose(i->jointcapability);
1648 else if (i->capability)
1649 tmp->nativeformats = sip_codec_choose(i->capability);
1651 tmp->nativeformats = sip_codec_choose(capability);
1652 fmt = ast_best_codec(tmp->nativeformats);
1654 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
1656 if (strchr(i->fromdomain,':'))
1658 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(i));
1662 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(i));
1665 if (i->dtmfmode & SIP_DTMF_INBAND) {
1666 i->vad = ast_dsp_new();
1667 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
1669 ast_dsp_digitmode(i->vad, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF);
1671 tmp->fds[0] = ast_rtp_fd(i->rtp);
1672 tmp->fds[1] = ast_rtcp_fd(i->rtp);
1674 tmp->fds[2] = ast_rtp_fd(i->vrtp);
1675 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
1677 if (state == AST_STATE_RING)
1679 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
1680 tmp->writeformat = fmt;
1681 tmp->pvt->rawwriteformat = fmt;
1682 tmp->readformat = fmt;
1683 tmp->pvt->rawreadformat = fmt;
1685 tmp->pvt->send_text = sip_sendtext;
1686 tmp->pvt->call = sip_call;
1687 tmp->pvt->hangup = sip_hangup;
1688 tmp->pvt->answer = sip_answer;
1689 tmp->pvt->read = sip_read;
1690 tmp->pvt->write = sip_write;
1691 tmp->pvt->write_video = sip_write;
1692 tmp->pvt->indicate = sip_indicate;
1693 tmp->pvt->transfer = sip_transfer;
1694 tmp->pvt->fixup = sip_fixup;
1695 tmp->pvt->send_digit = sip_senddigit;
1697 tmp->pvt->bridge = ast_rtp_bridge;
1699 tmp->callgroup = i->callgroup;
1700 tmp->pickupgroup = i->pickupgroup;
1701 tmp->restrictcid = i->restrictcid;
1702 if (!ast_strlen_zero(i->accountcode))
1703 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
1705 tmp->amaflags = i->amaflags;
1706 if (!ast_strlen_zero(i->language))
1707 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
1708 if (!ast_strlen_zero(i->musicclass))
1709 strncpy(tmp->musicclass, i->musicclass, sizeof(tmp->musicclass)-1);
1711 ast_mutex_lock(&usecnt_lock);
1713 ast_mutex_unlock(&usecnt_lock);
1714 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
1715 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
1716 if (!ast_strlen_zero(i->callerid))
1717 tmp->callerid = strdup(i->callerid);
1718 if (!ast_strlen_zero(i->rdnis))
1719 tmp->rdnis = strdup(i->rdnis);
1720 if (!ast_strlen_zero(i->exten) && strcmp(i->exten, "s"))
1721 tmp->dnid = strdup(i->exten);
1723 if (!ast_strlen_zero(i->domain)) {
1724 pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
1726 if (!ast_strlen_zero(i->useragent)) {
1727 pbx_builtin_setvar_helper(tmp, "SIPUSERAGENT", i->useragent);
1729 if (!ast_strlen_zero(i->callid)) {
1730 pbx_builtin_setvar_helper(tmp, "SIPCALLID", i->callid);
1732 ast_setstate(tmp, state);
1733 if (state != AST_STATE_DOWN) {
1734 if (ast_pbx_start(tmp)) {
1735 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
1741 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
1745 static struct cfalias {
1749 { "Content-Type", "c" },
1750 { "Content-Encoding", "e" },
1754 { "Content-Length", "l" },
1760 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
1761 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
1762 char* r = line + nameLen + 1;
1763 while (*r && (*r < 33)) ++r;
1770 static char *get_sdp(struct sip_request *req, char *name) {
1772 int len = strlen(name);
1775 for (x=0; x<req->lines; x++) {
1776 r = get_sdp_by_line(req->line[x], name, len);
1777 if (r[0] != '\0') return r;
1782 static void sdpLineNum_iterator_init(int* iterator) {
1786 static char* get_sdp_iterate(int* iterator,
1787 struct sip_request *req, char *name) {
1788 int len = strlen(name);
1790 while (*iterator < req->lines) {
1791 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
1792 if (r[0] != '\0') return r;
1797 static char *__get_header(struct sip_request *req, char *name, int *start)
1800 int len = strlen(name);
1802 for (x=*start;x<req->headers;x++) {
1803 if (!strncasecmp(req->header[x], name, len) &&
1804 (req->header[x][len] == ':')) {
1805 r = req->header[x] + len + 1;
1806 while(*r && (*r < 33))
1813 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
1814 if (!strcasecmp(aliases[x].fullname, name))
1815 return __get_header(req, aliases[x].shortname, start);
1817 /* Don't return NULL, so get_header is always a valid pointer */
1821 static char *get_header(struct sip_request *req, char *name)
1824 return __get_header(req, name, &start);
1827 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
1829 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
1830 struct ast_frame *f;
1831 static struct ast_frame null_frame = { AST_FRAME_NULL, };
1834 f = ast_rtp_read(p->rtp);
1837 f = ast_rtcp_read(p->rtp);
1840 f = ast_rtp_read(p->vrtp);
1843 f = ast_rtcp_read(p->vrtp);
1848 /* Don't send RFC2833 if we're not supposed to */
1849 if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & SIP_DTMF_RFC2833))
1852 /* We already hold the channel lock */
1853 if (f->frametype == AST_FRAME_VOICE) {
1854 if (f->subclass != p->owner->nativeformats) {
1855 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
1856 p->owner->nativeformats = f->subclass;
1857 ast_set_read_format(p->owner, p->owner->readformat);
1858 ast_set_write_format(p->owner, p->owner->writeformat);
1860 if ((p->dtmfmode & SIP_DTMF_INBAND) && p->vad) {
1861 f = ast_dsp_process(p->owner,p->vad,f);
1862 if (f && (f->frametype == AST_FRAME_DTMF))
1863 ast_log(LOG_DEBUG, "Detected DTMF '%c'\n", f->subclass);
1870 static struct ast_frame *sip_read(struct ast_channel *ast)
1872 struct ast_frame *fr;
1873 struct sip_pvt *p = ast->pvt->pvt;
1874 ast_mutex_lock(&p->lock);
1875 fr = sip_rtp_read(ast, p);
1876 ast_mutex_unlock(&p->lock);
1880 static void build_callid(char *callid, int len, struct in_addr ourip)
1887 res = snprintf(callid, len, "%08x", val);
1891 /* It's not important that we really use our right IP here... */
1892 snprintf(callid, len, "@%s", inet_ntoa(ourip));
1895 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobalnat)
1899 p = malloc(sizeof(struct sip_pvt));
1902 /* Keep track of stuff */
1903 memset(p, 0, sizeof(struct sip_pvt));
1907 p->rtp = ast_rtp_new(sched, io, 1, 0);
1909 p->vrtp = ast_rtp_new(sched, io, 1, 0);
1913 /* Start with 101 instead of 1 */
1916 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
1920 ast_rtp_settos(p->rtp, tos);
1922 ast_rtp_settos(p->vrtp, tos);
1923 if (useglobalnat && sin) {
1924 /* Setup NAT structure according to global settings if we have an address */
1926 memcpy(&p->recv, sin, sizeof(p->recv));
1927 ast_rtp_setnat(p->rtp, p->nat);
1929 ast_rtp_setnat(p->vrtp, p->nat);
1931 ast_mutex_init(&p->lock);
1934 memcpy(&p->sa, sin, sizeof(p->sa));
1935 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
1936 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1938 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1940 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
1941 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
1943 build_callid(p->callid, sizeof(p->callid), p->ourip);
1945 strncpy(p->callid, callid, sizeof(p->callid) - 1);
1946 /* Assume reinvite OK and via INVITE */
1947 p->canreinvite = globalcanreinvite;
1948 /* Assign default music on hold class */
1949 strncpy(p->musicclass, globalmusicclass, sizeof(p->musicclass));
1950 p->dtmfmode = globaldtmfmode;
1951 p->capability = capability;
1952 if (p->dtmfmode & SIP_DTMF_RFC2833)
1953 p->noncodeccapability |= AST_RTP_DTMF;
1954 strncpy(p->context, context, sizeof(p->context) - 1);
1955 strncpy(p->fromdomain, fromdomain, sizeof(p->fromdomain) - 1);
1957 ast_mutex_lock(&iflock);
1960 ast_mutex_unlock(&iflock);
1962 ast_log(LOG_DEBUG, "Allocating new SIP call for %s\n", callid);
1966 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin)
1974 callid = get_header(req, "Call-ID");
1976 if (pedanticsipchecking) {
1977 /* In principle Call-ID's uniquely identify a call, however some vendors
1978 (i.e. Pingtel) send multiple calls with the same Call-ID and different
1979 tags in order to simplify billing. The RFC does state that we have to
1980 compare tags in addition to the call-id, but this generate substantially
1981 more overhead which is totally unnecessary for the vast majority of sane
1982 SIP implementations, and thus Asterisk does not enable this behavior
1983 by default. Short version: You'll need this option to support conferencing
1985 strncpy(tmp, req->header[0], sizeof(tmp) - 1);
1987 c = strchr(tmp, ' ');
1990 if (!strcasecmp(cmd, "SIP/2.0")) {
1996 strncpy(tmp, get_header(req, "From"), sizeof(tmp) - 1);
1998 strncpy(tmp, get_header(req, "To"), sizeof(tmp) - 1);
1999 tag = strstr(tmp, "tag=");
2002 c = strchr(tag, ';');
2009 if (ast_strlen_zero(callid)) {
2010 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", inet_ntoa(sin->sin_addr));
2013 ast_mutex_lock(&iflock);
2016 if (!strcmp(p->callid, callid) &&
2017 (!pedanticsipchecking || !tag || ast_strlen_zero(p->theirtag) || !strcmp(p->theirtag, tag))) {
2018 /* Found the call */
2019 ast_mutex_lock(&p->lock);
2020 ast_mutex_unlock(&iflock);
2025 ast_mutex_unlock(&iflock);
2026 p = sip_alloc(callid, sin, 1);
2028 ast_mutex_lock(&p->lock);
2032 static int sip_register(char *value, int lineno)
2034 struct sip_registry *reg;
2035 char copy[256] = "";
2036 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
2042 struct ast_hostent ahp;
2045 strncpy(copy, value, sizeof(copy)-1);
2048 hostname = strrchr(stringp, '@');
2053 if (!username || ast_strlen_zero(username) || !hostname || ast_strlen_zero(hostname)) {
2054 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d", lineno);
2058 username = strsep(&stringp, ":");
2060 secret = strsep(&stringp, ":");
2062 authuser = strsep(&stringp, ":");
2065 hostname = strsep(&stringp, "/");
2067 contact = strsep(&stringp, "/");
2068 if (!contact || ast_strlen_zero(contact))
2071 hostname = strsep(&stringp, ":");
2072 porta = strsep(&stringp, ":");
2074 if (porta && !atoi(porta)) {
2075 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
2078 hp = ast_gethostbyname(hostname, &ahp);
2080 ast_log(LOG_WARNING, "Host '%s' not found at line %d\n", hostname, lineno);
2083 reg = malloc(sizeof(struct sip_registry));
2085 memset(reg, 0, sizeof(struct sip_registry));
2086 strncpy(reg->contact, contact, sizeof(reg->contact) - 1);
2088 strncpy(reg->username, username, sizeof(reg->username)-1);
2090 strncpy(reg->hostname, hostname, sizeof(reg->hostname)-1);
2092 strncpy(reg->authuser, authuser, sizeof(reg->authuser)-1);
2094 strncpy(reg->secret, secret, sizeof(reg->secret)-1);
2097 reg->refresh = default_expiry;
2098 reg->addr.sin_family = AF_INET;
2099 memcpy(®->addr.sin_addr, hp->h_addr, sizeof(®->addr.sin_addr));
2100 reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT);
2101 reg->callid_valid = 0;
2103 ast_mutex_lock(®l.lock);
2104 reg->next = regl.registrations;
2105 regl.registrations = reg;
2106 ast_mutex_unlock(®l.lock);
2108 ast_log(LOG_ERROR, "Out of memory\n");
2114 static int lws2sws(char *msgbuf, int len)
2120 /* Eliminate all CRs */
2121 if (msgbuf[h] == '\r') {
2125 /* Check for end-of-line */
2126 if (msgbuf[h] == '\n') {
2127 /* Check for end-of-message */
2130 /* Check for a continuation line */
2131 if (msgbuf[h + 1] == ' ') {
2132 /* Merge continuation line */
2136 /* Propagate LF and start new line */
2137 msgbuf[t++] = msgbuf[h++];
2142 if (msgbuf[h] == ' ' || msgbuf[h] == '\t') {
2147 msgbuf[t++] = msgbuf[h++];
2151 msgbuf[t++] = msgbuf[h++];
2159 static void parse(struct sip_request *req)
2161 /* Divide fields by NULL's */
2166 /* First header starts immediately */
2170 /* We've got a new header */
2174 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
2176 if (ast_strlen_zero(req->header[f])) {
2177 /* Line by itself means we're now in content */
2181 if (f >= SIP_MAX_HEADERS - 1) {
2182 ast_log(LOG_WARNING, "Too many SIP headers...\n");
2185 req->header[f] = c + 1;
2186 } else if (*c == '\r') {
2187 /* Ignore but eliminate \r's */
2192 /* Check for last header */
2193 if (!ast_strlen_zero(req->header[f]))
2196 /* Now we process any mime content */
2201 /* We've got a new line */
2204 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
2206 if (f >= SIP_MAX_LINES - 1) {
2207 ast_log(LOG_WARNING, "Too many SDP lines...\n");
2210 req->line[f] = c + 1;
2211 } else if (*c == '\r') {
2212 /* Ignore and eliminate \r's */
2217 /* Check for last line */
2218 if (!ast_strlen_zero(req->line[f]))
2222 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
2225 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
2234 int peercapability, peernoncodeccapability;
2235 int vpeercapability=0, vpeernoncodeccapability=0;
2236 struct sockaddr_in sin;
2239 struct ast_hostent ahp;
2245 /* Get codec and RTP info from SDP */
2246 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
2247 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
2250 m = get_sdp(req, "m");
2251 c = get_sdp(req, "c");
2252 if (ast_strlen_zero(m) || ast_strlen_zero(c)) {
2253 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
2256 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2257 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
2260 /* XXX This could block for a long time, and block the main thread! XXX */
2261 hp = ast_gethostbyname(host, &ahp);
2263 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
2266 sdpLineNum_iterator_init(&iterator);
2267 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
2268 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) {
2270 /* Scan through the RTP payload types specified in a "m=" line: */
2271 ast_rtp_pt_clear(p->rtp);
2273 while(!ast_strlen_zero(codecs)) {
2274 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2275 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2278 if (sip_debug_test_pvt(p))
2279 ast_verbose("Found RTP audio format %d\n", codec);
2280 ast_rtp_set_m_type(p->rtp, codec);
2282 /* Skip over any whitespace */
2283 while(*codecs && (*codecs < 33)) codecs++;
2287 ast_rtp_pt_clear(p->vrtp); /* Must be cleared in case no m=video line exists */
2289 if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
2291 /* Scan through the RTP payload types specified in a "m=" line: */
2293 while(!ast_strlen_zero(codecs)) {
2294 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2295 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2298 if (sip_debug_test_pvt(p))
2299 ast_verbose("Found video format %s\n", ast_getformatname(codec));
2300 ast_rtp_set_m_type(p->vrtp, codec);
2302 /* Skip over any whitespace */
2303 while(*codecs && (*codecs < 33)) codecs++;
2307 sin.sin_family = AF_INET;
2308 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
2309 /* Setup audio port number */
2310 sin.sin_port = htons(portno);
2311 if (p->rtp && sin.sin_port)
2312 ast_rtp_set_peer(p->rtp, &sin);
2313 /* Setup video port number */
2314 sin.sin_port = htons(vportno);
2315 if (p->vrtp && sin.sin_port)
2316 ast_rtp_set_peer(p->vrtp, &sin);
2318 printf("Peer RTP is at port %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
2320 /* Next, scan through each "a=rtpmap:" line, noting each
2321 * specified RTP payload type (with corresponding MIME subtype):
2323 sdpLineNum_iterator_init(&iterator);
2324 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
2325 char* mimeSubtype = ast_strdupa(a); /* ensures we have enough space */
2326 if (!strcasecmp(a, "sendonly")) {
2330 if (!strcasecmp(a, "sendrecv")) {
2333 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
2334 if (sip_debug_test_pvt(p))
2335 ast_verbose("Found description format %s\n", mimeSubtype);
2336 /* Note: should really look at the 'freq' and '#chans' params too */
2337 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
2339 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
2342 /* Now gather all of the codecs that were asked for: */
2343 ast_rtp_get_current_formats(p->rtp,
2344 &peercapability, &peernoncodeccapability);
2346 ast_rtp_get_current_formats(p->vrtp,
2347 &vpeercapability, &vpeernoncodeccapability);
2348 p->jointcapability = p->capability & (peercapability | vpeercapability);
2349 p->noncodeccapability = noncodeccapability & (peernoncodeccapability | vpeernoncodeccapability);
2351 if (sip_debug_test_pvt(p)) {
2352 ast_verbose("Capabilities: us - %d, them - %d/%d, combined - %d\n",
2353 p->capability, peercapability, vpeercapability, p->jointcapability);
2354 ast_verbose("Non-codec capabilities: us - %d, them - %d, combined - %d\n",
2355 noncodeccapability, peernoncodeccapability,
2356 p->noncodeccapability);
2358 if (!p->jointcapability) {
2359 ast_log(LOG_WARNING, "No compatible codecs!\n");
2363 if (!(p->owner->nativeformats & p->jointcapability)) {
2364 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);
2365 p->owner->nativeformats = sip_codec_choose(p->jointcapability);
2366 ast_set_read_format(p->owner, p->owner->readformat);
2367 ast_set_write_format(p->owner, p->owner->writeformat);
2369 if (p->owner->bridge) {
2370 /* Turn on/off music on hold if we are holding/unholding */
2371 if (sin.sin_addr.s_addr && !sendonly) {
2372 ast_moh_stop(p->owner->bridge);
2374 ast_moh_start(p->owner->bridge, NULL);
2382 static int add_header(struct sip_request *req, char *var, char *value)
2384 if (req->len >= sizeof(req->data) - 4) {
2385 ast_log(LOG_WARNING, "Out of space, can't add anymore (%s:%s)\n", var, value);
2389 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2392 req->header[req->headers] = req->data + req->len;
2393 snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", var, value);
2394 req->len += strlen(req->header[req->headers]);
2395 if (req->headers < SIP_MAX_HEADERS)
2398 ast_log(LOG_WARNING, "Out of header space\n");
2404 static int add_blank_header(struct sip_request *req)
2406 if (req->len >= sizeof(req->data) - 4) {
2407 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2411 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2414 req->header[req->headers] = req->data + req->len;
2415 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "\r\n");
2416 req->len += strlen(req->header[req->headers]);
2417 if (req->headers < SIP_MAX_HEADERS)
2420 ast_log(LOG_WARNING, "Out of header space\n");
2426 static int add_line(struct sip_request *req, char *line)
2428 if (req->len >= sizeof(req->data) - 4) {
2429 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2433 /* Add extra empty return */
2434 snprintf(req->data + req->len, sizeof(req->data) - req->len, "\r\n");
2435 req->len += strlen(req->data + req->len);
2437 req->line[req->lines] = req->data + req->len;
2438 snprintf(req->line[req->lines], sizeof(req->data) - req->len, "%s", line);
2439 req->len += strlen(req->line[req->lines]);
2440 if (req->lines < SIP_MAX_LINES)
2443 ast_log(LOG_WARNING, "Out of line space\n");
2449 static int copy_header(struct sip_request *req, struct sip_request *orig, char *field)
2452 tmp = get_header(orig, field);
2453 if (!ast_strlen_zero(tmp)) {
2454 /* Add what we're responding to */
2455 return add_header(req, field, tmp);
2457 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2461 static int copy_all_header(struct sip_request *req, struct sip_request *orig, char *field)
2467 tmp = __get_header(orig, field, &start);
2468 if (!ast_strlen_zero(tmp)) {
2469 /* Add what we're responding to */
2470 add_header(req, field, tmp);
2475 return copied ? 0 : -1;
2478 static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct sip_request *orig, char *field)
2485 tmp = __get_header(orig, field, &start);
2486 if (!ast_strlen_zero(tmp)) {
2487 if (!copied && p->nat) {
2488 #ifdef THE_SIP_AUTHORS_CAN_SUCK_MY_GONADS
2489 /* SLD: FIXME: Nice try, but the received= should not have a port */
2490 /* SLD: FIXME: See RFC2543 BNF in Section 6.40.5 */
2491 /* MAS: Yup, RFC says you can't do it. No way to indicate PAT...
2493 if (ntohs(p->recv.sin_port) != DEFAULT_SIP_PORT)
2494 snprintf(new, sizeof(new), "%s;received=%s:%d", tmp, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
2497 snprintf(new, sizeof(new), "%s;received=%s", tmp, inet_ntoa(p->recv.sin_addr));
2498 add_header(req, field, new);
2500 /* Add what we're responding to */
2501 add_header(req, field, tmp);
2508 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2514 /* Add Route: header into request per learned route */
2515 static void add_route(struct sip_request *req, struct sip_route *route)
2518 int n, rem = 255; /* sizeof(r)-1: Room for terminating 0 */
2524 n = strlen(route->hop);
2525 if ((n+3)>rem) break;
2531 strcpy(p, route->hop); p += n;
2534 route = route->next;
2537 add_header(req, "Route", r);
2540 static void set_destination(struct sip_pvt *p, char *uri)
2542 char *h, *maddr, hostname[256];
2545 struct ast_hostent ahp;
2547 /* Parse uri to h (host) and port - uri is already just the part inside the <> */
2548 /* general form we are expecting is sip[s]:username[:password]@host[:port][;...] */
2550 if (sip_debug_test_pvt(p))
2551 ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
2553 /* Find and parse hostname */
2554 h = strchr(uri, '@');
2559 if (strncmp(h, "sip:", 4) == 0)
2561 else if (strncmp(h, "sips:", 5) == 0)
2564 hn = strcspn(h, ":;>");
2566 strncpy(hostname, h, hn); hostname[hn] = '\0';
2569 /* Is "port" present? if not default to 5060 */
2573 port = strtol(h, &h, 10);
2578 /* Got the hostname:port - but maybe there's a "maddr=" to override address? */
2579 maddr = strstr(h, "maddr=");
2582 hn = strspn(maddr, "0123456789.");
2584 strncpy(hostname, maddr, hn); hostname[hn] = '\0';
2587 hp = ast_gethostbyname(hostname, &ahp);
2589 ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
2592 p->sa.sin_family = AF_INET;
2593 memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr));
2594 p->sa.sin_port = htons(port);
2595 if (sip_debug_test_pvt(p))
2596 ast_verbose("set_destination: set destination to %s, port %d\n", inet_ntoa(p->sa.sin_addr), port);
2599 static int init_resp(struct sip_request *req, char *resp, struct sip_request *orig)
2601 /* Initialize a response */
2602 if (req->headers || req->len) {
2603 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2606 req->header[req->headers] = req->data + req->len;
2607 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "SIP/2.0 %s\r\n", resp);
2608 req->len += strlen(req->header[req->headers]);
2609 if (req->headers < SIP_MAX_HEADERS)
2612 ast_log(LOG_WARNING, "Out of header space\n");
2616 static int init_req(struct sip_request *req, char *resp, char *recip)
2618 /* Initialize a response */
2619 if (req->headers || req->len) {
2620 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2623 req->header[req->headers] = req->data + req->len;
2624 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "%s %s SIP/2.0\r\n", resp, recip);
2625 req->len += strlen(req->header[req->headers]);
2626 if (req->headers < SIP_MAX_HEADERS)
2629 ast_log(LOG_WARNING, "Out of header space\n");
2633 static int respprep(struct sip_request *resp, struct sip_pvt *p, char *msg, struct sip_request *req)
2635 char newto[256] = "", *ot;
2636 memset(resp, 0, sizeof(*resp));
2637 init_resp(resp, msg, req);
2638 copy_via_headers(p, resp, req, "Via");
2639 if (msg[0] == '2') copy_all_header(resp, req, "Record-Route");
2640 copy_header(resp, req, "From");
2641 ot = get_header(req, "To");
2642 if (!strstr(ot, "tag=")) {
2643 /* Add the proper tag if we don't have it already. If they have specified
2644 their tag, use it. Otherwise, use our own tag */
2645 if (!ast_strlen_zero(p->theirtag) && p->outgoing)
2646 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2647 else if (p->tag && !p->outgoing)
2648 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2650 strncpy(newto, ot, sizeof(newto) - 1);
2653 add_header(resp, "To", ot);
2654 copy_header(resp, req, "Call-ID");
2655 copy_header(resp, req, "CSeq");
2656 add_header(resp, "User-Agent", "Asterisk PBX");
2657 add_header(resp, "Allow", ALLOWED_METHODS);
2659 /* For registration responses, we also need expiry and
2663 snprintf(contact, sizeof(contact), "%s;expires=%d", p->our_contact, p->expiry);
2664 snprintf(tmp, sizeof(tmp), "%d", p->expiry);
2665 add_header(resp, "Expires", tmp);
2666 add_header(resp, "Contact", contact);
2668 add_header(resp, "Contact", p->our_contact);
2673 static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int seqno, int newbranch)
2675 struct sip_request *orig = &p->initreq;
2676 char stripped[80] ="";
2682 memset(req, 0, sizeof(struct sip_request));
2684 snprintf(p->lastmsg, sizeof(p->lastmsg), "Tx: %s", msg);
2692 p->branch ^= rand();
2693 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
2696 if (!ast_strlen_zero(p->uri)) {
2700 strncpy(stripped, get_header(orig, "To"), sizeof(stripped) - 1);
2702 strncpy(stripped, get_header(orig, "From"), sizeof(stripped) - 1);
2704 c = strchr(stripped, '<');
2716 init_req(req, msg, c);
2718 snprintf(tmp, sizeof(tmp), "%d %s", seqno, msg);
2720 add_header(req, "Via", p->via);
2722 set_destination(p, p->route->hop);
2723 add_route(req, p->route->next);
2726 ot = get_header(orig, "To");
2727 of = get_header(orig, "From");
2729 /* Add tag *unless* this is a CANCEL, in which case we need to send it exactly
2730 as our original request, including tag (or presumably lack thereof) */
2731 if (!strstr(ot, "tag=") && strcasecmp(msg, "CANCEL")) {
2732 /* Add the proper tag if we don't have it already. If they have specified
2733 their tag, use it. Otherwise, use our own tag */
2734 if (p->outgoing && !ast_strlen_zero(p->theirtag))
2735 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2736 else if (!p->outgoing)
2737 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2739 snprintf(newto, sizeof(newto), "%s", ot);
2744 add_header(req, "From", of);
2745 add_header(req, "To", ot);
2747 add_header(req, "From", ot);
2748 add_header(req, "To", of);
2750 add_header(req, "Contact", p->our_contact);
2751 copy_header(req, orig, "Call-ID");
2752 add_header(req, "CSeq", tmp);
2754 add_header(req, "User-Agent", "Asterisk PBX");
2758 static int __transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2760 struct sip_request resp;
2762 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2763 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2766 respprep(&resp, p, msg, req);
2767 add_header(&resp, "Content-Length", "0");
2768 add_blank_header(&resp);
2769 return send_response(p, &resp, reliable, seqno);
2772 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req)
2774 return __transmit_response(p, msg, req, 0);
2776 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req, int fatal)
2778 return __transmit_response(p, msg, req, fatal ? 2 : 1);
2781 static void append_date(struct sip_request *req)
2788 strftime(tmpdat, sizeof(tmpdat), "%a, %d %b %Y %T GMT", &tm);
2789 add_header(req, "Date", tmpdat);
2792 static int transmit_response_with_date(struct sip_pvt *p, char *msg, struct sip_request *req)
2794 struct sip_request resp;
2795 respprep(&resp, p, msg, req);
2797 add_header(&resp, "Content-Length", "0");
2798 add_blank_header(&resp);
2799 return send_response(p, &resp, 0, 0);
2802 static int transmit_response_with_allow(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2804 struct sip_request resp;
2805 respprep(&resp, p, msg, req);
2806 add_header(&resp, "Accept", "application/sdp");
2807 add_header(&resp, "Content-Length", "0");
2808 add_blank_header(&resp);
2809 return send_response(p, &resp, reliable, 0);
2812 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *randdata, int reliable)
2814 struct sip_request resp;
2817 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2818 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2821 snprintf(tmp, sizeof(tmp), "Digest realm=\"%s\", nonce=\"%s\"", global_realm, randdata);
2822 respprep(&resp, p, msg, req);
2823 add_header(&resp, "Proxy-Authenticate", tmp);
2824 add_header(&resp, "Content-Length", "0");
2825 add_blank_header(&resp);
2826 return send_response(p, &resp, reliable, seqno);
2829 static int add_text(struct sip_request *req, char *text)
2831 /* XXX Convert \n's to \r\n's XXX */
2832 int len = strlen(text);
2834 snprintf(clen, sizeof(clen), "%d", len);
2835 add_header(req, "Content-Type", "text/plain");
2836 add_header(req, "Content-Length", clen);
2837 add_line(req, text);
2841 static int add_digit(struct sip_request *req, char digit)
2846 snprintf(tmp, sizeof(tmp), "Signal=%c\r\nDuration=250\r\n", digit);
2848 snprintf(clen, sizeof(clen), "%d", len);
2849 add_header(req, "Content-Type", "application/dtmf-relay");
2850 add_header(req, "Content-Length", clen);
2855 static int add_sdp(struct sip_request *resp, struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2859 int alreadysent = 0;
2861 struct sockaddr_in sin;
2862 struct sockaddr_in vsin;
2863 struct sip_codec_pref *cur;
2874 struct sockaddr_in dest;
2875 struct sockaddr_in vdest = { 0, };
2876 /* XXX We break with the "recommendation" and send our IP, in order that our
2877 peer doesn't have to ast_gethostbyname() us XXX */
2880 ast_log(LOG_WARNING, "No way to add SDP without an RTP structure\n");
2883 if (!p->sessionid) {
2884 p->sessionid = getpid();
2885 p->sessionversion = p->sessionid;
2887 p->sessionversion++;
2888 ast_rtp_get_us(p->rtp, &sin);
2890 ast_rtp_get_us(p->vrtp, &vsin);
2892 if (p->redirip.sin_addr.s_addr) {
2893 dest.sin_port = p->redirip.sin_port;
2894 dest.sin_addr = p->redirip.sin_addr;
2896 ast_rtp_get_peer(rtp, &dest);
2898 dest.sin_addr = p->ourip;
2899 dest.sin_port = sin.sin_port;
2902 /* Determine video destination */
2904 if (p->vredirip.sin_addr.s_addr) {
2905 vdest.sin_port = p->vredirip.sin_port;
2906 vdest.sin_addr = p->vredirip.sin_addr;
2908 ast_rtp_get_peer(vrtp, &vdest);
2910 vdest.sin_addr = p->ourip;
2911 vdest.sin_port = vsin.sin_port;
2914 if (sip_debug_test_pvt(p))
2915 ast_verbose("We're at %s port %d\n", inet_ntoa(p->ourip), ntohs(sin.sin_port));
2916 if (sip_debug_test_pvt(p) && p->vrtp)
2917 ast_verbose("Video is at %s port %d\n", inet_ntoa(p->ourip), ntohs(vsin.sin_port));
2918 snprintf(v, sizeof(v), "v=0\r\n");
2919 snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, inet_ntoa(dest.sin_addr));
2920 snprintf(s, sizeof(s), "s=session\r\n");
2921 snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", inet_ntoa(dest.sin_addr));
2922 snprintf(t, sizeof(t), "t=0 0\r\n");
2923 snprintf(m, sizeof(m), "m=audio %d RTP/AVP", ntohs(dest.sin_port));
2924 snprintf(m2, sizeof(m2), "m=video %d RTP/AVP", ntohs(vdest.sin_port));
2925 if (p->jointcapability & p->prefcodec) {
2926 if (sip_debug_test_pvt(p))
2927 ast_verbose("Answering/Requesting with root capability %d\n", p->prefcodec);
2928 codec = ast_rtp_lookup_code(p->rtp, 1, p->prefcodec);
2930 snprintf(costr, sizeof(costr), " %d", codec);
2931 if (p->prefcodec <= AST_FORMAT_MAX_AUDIO) {
2932 strncat(m, costr, sizeof(m) - strlen(m));
2933 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, p->prefcodec));
2934 strncat(a, costr, sizeof(a));
2936 strncat(m2, costr, sizeof(m2) - strlen(m2));
2937 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, p->prefcodec));
2938 strncat(a2, costr, sizeof(a2));
2941 alreadysent |= p->prefcodec;
2943 /* Start by sending our preferred codecs */
2946 if (p->jointcapability & cur->codec) {
2947 if (sip_debug_test_pvt(p))
2948 ast_verbose("Answering/Requesting with preferred capability %d\n", cur->codec);
2949 codec = ast_rtp_lookup_code(p->rtp, 1, cur->codec);
2951 snprintf(costr, sizeof(costr), " %d", codec);
2952 if (cur->codec <= AST_FORMAT_MAX_AUDIO) {
2953 strncat(m, costr, sizeof(m) - strlen(m));
2954 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2955 strncat(a, costr, sizeof(a));
2957 strncat(m2, costr, sizeof(m2) - strlen(m2));
2958 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2959 strncat(a2, costr, sizeof(a2));
2963 alreadysent |= cur->codec;
2966 /* Now send any other common codecs, and non-codec formats: */
2967 for (x = 1; x <= (videosupport ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO); x <<= 1) {
2968 if ((p->jointcapability & x) && !(alreadysent & x)) {
2969 if (sip_debug_test_pvt(p))
2970 ast_verbose("Answering with capability %d\n", x);
2971 codec = ast_rtp_lookup_code(p->rtp, 1, x);
2973 snprintf(costr, sizeof(costr), " %d", codec);
2974 if (x <= AST_FORMAT_MAX_AUDIO) {
2975 strncat(m, costr, sizeof(m) - strlen(m));
2976 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2977 strncat(a, costr, sizeof(a) - strlen(a));
2979 strncat(m2, costr, sizeof(m2) - strlen(m2));
2980 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2981 strncat(a2, costr, sizeof(a2) - strlen(a2));
2986 for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
2987 if (p->noncodeccapability & x) {
2988 if (sip_debug_test_pvt(p))
2989 ast_verbose("Answering with non-codec capability %d\n", x);
2990 codec = ast_rtp_lookup_code(p->rtp, 0, x);
2992 snprintf(costr, sizeof(costr), " %d", codec);
2993 strncat(m, costr, sizeof(m) - strlen(m));
2994 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(0, x));
2995 strncat(a, costr, sizeof(a) - strlen(a));
2996 if (x == AST_RTP_DTMF) {
2997 /* Indicate we support DTMF... Not sure about 16, but MSN supports it so dang it, we will too... */
2998 snprintf(costr, sizeof costr, "a=fmtp:%d 0-16\r\n",
3000 strncat(a, costr, sizeof(a) - strlen(a));
3005 strncat(a, "a=silenceSupp:off - - - -\r\n", sizeof(a) - strlen(a));
3006 if (strlen(m) < sizeof(m) - 2)
3008 if (strlen(m2) < sizeof(m2) - 2)
3010 if ((sizeof(m) <= strlen(m) - 2) || (sizeof(m2) <= strlen(m2) - 2) || (sizeof(a) == strlen(a)) || (sizeof(a2) == strlen(a2)))
3011 ast_log(LOG_WARNING, "SIP SDP may be truncated due to undersized buffer!!\n");
3012 len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m) + strlen(a);
3013 if ((p->vrtp) && (p->jointcapability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
3014 len += strlen(m2) + strlen(a2);
3015 snprintf(costr, sizeof(costr), "%d", len);
3016 add_header(resp, "Content-Type", "application/sdp");
3017 add_header(resp, "Content-Length", costr);
3025 if ((p->vrtp) && (p->jointcapability & VIDEO_CODEC_MASK)) { /* only if video response is appropriate */
3032 static void copy_request(struct sip_request *dst,struct sip_request *src)
3036 offset = ((void *)dst) - ((void *)src);
3037 /* First copy stuff */
3038 memcpy(dst, src, sizeof(*dst));
3039 /* Now fix pointer arithmetic */
3040 for (x=0;x<src->headers;x++)
3041 dst->header[x] += offset;