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 */
343 char accountcode[20];
344 char language[MAX_LANGUAGE];
345 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
346 char useragent[256]; /* User agent in SIP request */
347 unsigned int callgroup;
348 unsigned int pickupgroup;
362 struct sip_user *next;
369 char context[80]; /* JK02: peers need context too to allow parking etc */
375 char mailbox[AST_MAX_EXTENSION];
376 char language[MAX_LANGUAGE];
377 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
378 char useragent[256]; /* User agent in SIP request */
388 unsigned int callgroup;
389 unsigned int pickupgroup;
391 struct sockaddr_in addr;
395 struct sip_pvt *call; /* Call pointer */
396 int pokeexpire; /* When to expire poke */
397 int lastms; /* How long last response took (in ms), or -1 for no response */
398 int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
399 struct timeval ps; /* Ping send time */
401 struct sockaddr_in defaddr;
407 struct sip_peer *next;
410 static ast_mutex_t sip_reload_lock = AST_MUTEX_INITIALIZER;
411 static int sip_reloading = 0;
413 #define REG_STATE_UNREGISTERED 0
414 #define REG_STATE_REGSENT 1
415 #define REG_STATE_AUTHSENT 2
416 #define REG_STATE_REGISTERED 3
417 #define REG_STATE_REJECTED 4
418 #define REG_STATE_TIMEOUT 5
419 #define REG_STATE_NOAUTH 6
421 struct sip_registry {
422 struct sockaddr_in addr; /* Who we connect to for registration purposes */
423 char username[80]; /* Who we are registering as */
424 char authuser[80]; /* Who we *authenticate* as */
426 char secret[80]; /* Password or key name in []'s */
428 char contact[80]; /* Contact extension */
430 int expire; /* Sched ID of expiration */
431 int timeout; /* sched id of sip_reg_timeout */
432 int refresh; /* How often to refresh */
433 struct sip_pvt *call; /* create a sip_pvt structure for each outbound "registration call" in progress */
435 int callid_valid; /* 0 means we haven't chosen callid for this registry yet. */
436 char callid[80]; /* Global CallID for this registry */
437 unsigned int ocseq; /* Sequence number we got to for REGISTERs for this registry */
438 struct sockaddr_in us; /* Who the server thinks we are */
439 struct sip_registry *next;
442 static struct ast_user_list {
443 struct sip_user *users;
445 } userl = { NULL, AST_MUTEX_INITIALIZER };
447 static struct ast_peer_list {
448 struct sip_peer *peers;
450 } peerl = { NULL, AST_MUTEX_INITIALIZER };
452 static struct ast_register_list {
453 struct sip_registry *registrations;
456 } regl = { NULL, AST_MUTEX_INITIALIZER };
459 #define REINVITE_INVITE 1
460 #define REINVITE_UPDATE 2
462 static int __sip_do_register(struct sip_registry *r);
464 static int sipsock = -1;
465 static int globalnat = 0;
466 static int globalcanreinvite = REINVITE_INVITE;
469 static struct sockaddr_in bindaddr;
470 static struct sockaddr_in externip;
471 static struct ast_ha *localaddr;
473 static struct ast_frame *sip_read(struct ast_channel *ast);
474 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req);
475 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
476 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *rand, int reliable);
477 static int transmit_request(struct sip_pvt *p, char *msg, int inc, int reliable, int newbranch);
478 static int transmit_request_with_auth(struct sip_pvt *p, char *msg, int inc, int reliable, int newbranch);
479 static int transmit_invite(struct sip_pvt *p, char *msg, int sendsdp, char *auth, char *authheader, char *vxml_url,char *distinctive_ring, int init);
480 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp);
481 static int transmit_info_with_digit(struct sip_pvt *p, char digit);
482 static int transmit_message_with_text(struct sip_pvt *p, char *text);
483 static int transmit_refer(struct sip_pvt *p, char *dest);
484 static struct sip_peer *temp_peer(char *name);
485 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req, char *header, char *respheader, char *msg, int init);
486 /* static char *getsipuri(char *header); */
487 static void free_old_route(struct sip_route *route);
488 static int build_reply_digest(struct sip_pvt *p, char *orig_header, char *digest, int digest_len);
489 static int update_user_counter(struct sip_pvt *fup, int event);
490 static void prune_peers(void);
491 static int sip_do_reload(void);
492 static int sip_debug_test_addr(struct sockaddr_in *addr);
493 static int sip_debug_test_pvt(struct sip_pvt *p);
495 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
499 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->recv, sizeof(struct sockaddr_in));
501 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->sa, sizeof(struct sockaddr_in));
503 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));
508 static void sip_destroy(struct sip_pvt *p);
510 static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
513 * Using the localaddr structure built up with localnet statements
514 * apply it to their address to see if we need to substitute our
515 * externip or can get away with our internal bindaddr
517 struct sockaddr_in theirs;
518 theirs.sin_addr = *them;
519 if (localaddr && externip.sin_addr.s_addr &&
520 ast_apply_ha(localaddr, &theirs)) {
522 memcpy(us, &externip.sin_addr, sizeof(struct in_addr));
523 strcpy(t, inet_ntoa(*(struct in_addr *)&them->s_addr));
524 ast_log(LOG_DEBUG, "Target address %s is not local, substituting externip\n", t);
526 else if (bindaddr.sin_addr.s_addr)
527 memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr));
529 return ast_ouraddrfor(them, us);
533 static int append_history(struct sip_pvt *p, char *event, char *data)
535 struct sip_history *hist, *prev;
539 hist = malloc(sizeof(struct sip_history));
541 memset(hist, 0, sizeof(struct sip_history));
542 snprintf(hist->event, sizeof(hist->event), "%-15s %s", event, data);
546 if ((*c == '\r') || (*c == '\n')) {
552 /* Enqueue into history */
565 static int retrans_pkt(void *data)
567 struct sip_pkt *pkt=data;
569 ast_mutex_lock(&pkt->owner->lock);
570 if (pkt->retrans < MAX_RETRANS) {
572 if (sip_debug_test_pvt(pkt->owner)) {
574 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));
576 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));
578 append_history(pkt->owner, "ReTx", pkt->data);
579 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
582 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");
583 append_history(pkt->owner, "MaxRetries", pkt->flags & FLAG_FATAL ? "(Critical)" : "(Non-critical)");
585 if (pkt->flags & FLAG_FATAL) {
586 while(pkt->owner->owner && ast_mutex_trylock(&pkt->owner->owner->lock)) {
587 ast_mutex_unlock(&pkt->owner->lock);
589 ast_mutex_lock(&pkt->owner->lock);
591 if (pkt->owner->owner) {
592 /* XXX Potential deadlocK?? XXX */
593 ast_queue_hangup(pkt->owner->owner);
594 ast_mutex_unlock(&pkt->owner->owner->lock);
596 /* If no owner, destroy now */
597 pkt->owner->needdestroy = 1;
600 /* Okay, it's not fatal, just continue. XXX If we were nice, we'd free it now, rather than wait for the
601 end of the call XXX */
605 ast_mutex_unlock(&pkt->owner->lock);
609 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len, int fatal)
612 pkt = malloc(sizeof(struct sip_pkt) + len);
615 memset(pkt, 0, sizeof(struct sip_pkt));
616 memcpy(pkt->data, data, len);
617 pkt->packetlen = len;
618 pkt->next = p->packets;
623 pkt->flags |= FLAG_FATAL;
624 /* Schedule retransmission */
625 pkt->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, pkt);
626 pkt->next = p->packets;
628 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
629 if (!strncasecmp(pkt->data, "INVITE", 6)) {
630 /* Note this is a pending invite */
631 p->pendinginvite = seqno;
636 static int __sip_autodestruct(void *data)
638 struct sip_pvt *p = data;
640 ast_log(LOG_DEBUG, "Auto destroying call '%s'\n", p->callid);
641 append_history(p, "AutoDestroy", "");
643 ast_log(LOG_WARNING, "Autodestruct on call '%s' with owner in place\n", p->callid);
644 ast_queue_hangup(p->owner);
651 static int sip_scheddestroy(struct sip_pvt *p, int ms)
654 if (sip_debug_test_pvt(p))
655 ast_verbose("Scheduling destruction of call '%s' in %d ms\n", p->callid, ms);
657 snprintf(tmp, sizeof(tmp), "%d ms", ms);
658 append_history(p, "SchedDestroy", tmp);
660 if (p->autokillid > -1)
661 ast_sched_del(sched, p->autokillid);
662 p->autokillid = ast_sched_add(sched, ms, __sip_autodestruct, p);
666 static int sip_cancel_destroy(struct sip_pvt *p)
668 if (p->autokillid > -1)
669 ast_sched_del(sched, p->autokillid);
670 append_history(p, "CancelDestroy", "");
675 static int __sip_ack(struct sip_pvt *p, int seqno, int resp)
677 struct sip_pkt *cur, *prev = NULL;
682 if ((cur->seqno == seqno) && ((cur->flags & FLAG_RESPONSE) == resp)) {
683 if (!resp && (seqno == p->pendinginvite)) {
684 ast_log(LOG_DEBUG, "Acked pending invite %d\n", p->pendinginvite);
685 p->pendinginvite = 0;
688 /* this is our baby */
690 prev->next = cur->next;
692 p->packets = cur->next;
693 if (cur->retransid > -1)
694 ast_sched_del(sched, cur->retransid);
702 ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
706 static int __sip_semi_ack(struct sip_pvt *p, int seqno, int resp)
712 if ((cur->seqno == seqno) && ((cur->flags & FLAG_RESPONSE) == resp)) {
713 /* this is our baby */
714 if (cur->retransid > -1)
715 ast_sched_del(sched, cur->retransid);
722 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");
726 static int send_response(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
729 if (sip_debug_test_pvt(p)) {
731 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));
733 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));
736 append_history(p, "TxRespRel", req->data);
737 res = __sip_reliable_xmit(p, seqno, 1, req->data, req->len, (reliable > 1));
739 append_history(p, "TxResp", req->data);
740 res = __sip_xmit(p, req->data, req->len);
747 static int send_request(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
750 if (sip_debug_test_pvt(p)) {
752 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));
754 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));
757 append_history(p, "TxReqRel", req->data);
758 res = __sip_reliable_xmit(p, seqno, 0, req->data, req->len, (reliable > 1));
760 append_history(p, "TxReq", req->data);
761 res = __sip_xmit(p, req->data, req->len);
766 static char *ditch_braces(char *tmp)
770 if ((n = strchr(tmp, '<')) ) {
772 while(*c && *c != '>') c++;
774 ast_log(LOG_WARNING, "No closing brace in '%s'\n", tmp);
783 static int sip_sendtext(struct ast_channel *ast, char *text)
785 struct sip_pvt *p = ast->pvt->pvt;
786 if (sip_debug_test_pvt(p))
787 ast_verbose("Sending text %s on %s\n", text, ast->name);
790 if (!text || ast_strlen_zero(text))
792 if (sip_debug_test_pvt(p))
793 ast_verbose("Really sending text %s on %s\n", text, ast->name);
794 transmit_message_with_text(p, text);
800 static void mysql_update_peer(char *peer, struct sockaddr_in *sin, char *username, int expiry)
802 if (mysql && (strlen(peer) < 128)) {
807 name = alloca(strlen(peer) * 2 + 1);
808 uname = alloca(strlen(username) * 2 + 1);
810 mysql_real_escape_string(mysql, name, peer, strlen(peer));
811 mysql_real_escape_string(mysql, uname, username, strlen(username));
812 snprintf(query, sizeof(query), "UPDATE sipfriends SET ipaddr=\"%s\", port=\"%d\", regseconds=\"%ld\", username=\"%s\" WHERE name=\"%s\"",
813 inet_ntoa(sin->sin_addr), ntohs(sin->sin_port), nowtime + expiry, uname, name);
814 ast_mutex_lock(&mysqllock);
815 if (mysql_real_query(mysql, query, strlen(query)))
816 ast_log(LOG_WARNING, "Unable to update database\n");
818 ast_mutex_unlock(&mysqllock);
822 static struct sip_peer *mysql_peer(char *peer, struct sockaddr_in *sin)
827 p = malloc(sizeof(struct sip_peer));
828 memset(p, 0, sizeof(struct sip_peer));
829 if (mysql && (!peer || (strlen(peer) < 128))) {
834 time_t regseconds, nowtime;
839 name = alloca(strlen(peer) * 2 + 1);
840 mysql_real_escape_string(mysql, name, peer, strlen(peer));
843 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));
845 snprintf(query, sizeof(query), "SELECT name, secret, context, username, ipaddr, port, regseconds FROM sipfriends WHERE name=\"%s\"", name);
846 ast_mutex_lock(&mysqllock);
847 mysql_query(mysql, query);
848 if ((result = mysql_store_result(mysql))) {
849 if ((rowval = mysql_fetch_row(result))) {
850 numfields = mysql_num_fields(result);
851 fields = mysql_fetch_fields(result);
853 for (x=0;x<numfields;x++) {
855 if (!strcasecmp(fields[x].name, "secret")) {
856 strncpy(p->secret, rowval[x], sizeof(p->secret));
857 } else if (!strcasecmp(fields[x].name, "name")) {
858 strncpy(p->name, rowval[x], sizeof(p->name) - 1);
859 } else if (!strcasecmp(fields[x].name, "context")) {
860 strncpy(p->context, rowval[x], sizeof(p->context) - 1);
861 } else if (!strcasecmp(fields[x].name, "username")) {
862 strncpy(p->username, rowval[x], sizeof(p->username) - 1);
863 } else if (!strcasecmp(fields[x].name, "ipaddr")) {
864 inet_aton(rowval[x], &p->addr.sin_addr);
865 } else if (!strcasecmp(fields[x].name, "port")) {
866 if (sscanf(rowval[x], "%i", &port) != 1)
868 p->addr.sin_port = htons(port);
869 } else if (!strcasecmp(fields[x].name, "regseconds")) {
870 if (sscanf(rowval[x], "%li", ®seconds) != 1)
876 if (nowtime > regseconds)
877 memset(&p->addr, 0, sizeof(p->addr));
879 mysql_free_result(result);
882 ast_mutex_unlock(&mysqllock);
889 p->capability = capability;
891 p->dtmfmode = globaldtmfmode;
899 #endif /* MYSQL_FRIENDS */
901 static void update_peer(struct sip_peer *p, int expiry)
905 mysql_update_peer(p->name, &p->addr, p->username, expiry);
910 static struct sip_peer *find_peer(char *peer, struct sockaddr_in *sin)
912 struct sip_peer *p = NULL;
916 /* Find by peer name */
918 if (!strcasecmp(p->name, peer)) {
927 if (!inaddrcmp(&p->addr, sin) ||
929 (p->addr.sin_addr.s_addr == sin->sin_addr.s_addr))) {
938 p = mysql_peer(peer, sin);
945 static struct sip_user *find_user(char *name)
947 struct sip_user *u = NULL;
951 if (!strcasecmp(u->name, name)) {
960 static int sip_debug_test_addr(struct sockaddr_in *addr) {
961 /* See if we pass debug IP filter */
962 if (sipdebug == 0) return 0;
963 if (debugaddr.sin_addr.s_addr) {
964 if (((ntohs(debugaddr.sin_port) != 0) &&
965 (debugaddr.sin_port != addr->sin_port)) ||
966 (debugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
972 static int sip_debug_test_pvt(struct sip_pvt *p) {
973 return (sipdebug && sip_debug_test_addr((p->nat ? &p->recv : &p->sa)));
976 static int create_addr(struct sip_pvt *r, char *peer)
979 struct ast_hostent ahp;
984 char host[256], *hostn;
986 r->sa.sin_family = AF_INET;
987 ast_mutex_lock(&peerl.lock);
988 p = find_peer(peer, NULL);
992 r->capability = p->capability;
995 ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", r->nat);
996 ast_rtp_setnat(r->rtp, r->nat);
999 ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", r->nat);
1000 ast_rtp_setnat(r->vrtp, r->nat);
1002 strncpy(r->peername, p->username, sizeof(r->peername)-1);
1003 strncpy(r->authname, p->username, sizeof(r->authname)-1);
1004 strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1);
1005 strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1);
1006 strncpy(r->username, p->username, sizeof(r->username)-1);
1007 strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1);
1008 if (ast_strlen_zero(r->tohost)) {
1009 if (p->addr.sin_addr.s_addr)
1010 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->addr.sin_addr));
1012 snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->defaddr.sin_addr));
1014 if (!ast_strlen_zero(p->fromdomain))
1015 strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1);
1016 if (!ast_strlen_zero(p->fromuser))
1017 strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1);
1018 r->insecure = p->insecure;
1019 r->canreinvite = p->canreinvite;
1020 r->maxtime = p->maxms;
1021 r->callgroup = p->callgroup;
1022 r->pickupgroup = p->pickupgroup;
1024 r->dtmfmode = p->dtmfmode;
1025 if (r->dtmfmode & SIP_DTMF_RFC2833)
1026 r->noncodeccapability |= AST_RTP_DTMF;
1028 r->noncodeccapability &= ~AST_RTP_DTMF;
1030 strncpy(r->context, p->context,sizeof(r->context)-1);
1031 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
1032 (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) {
1033 if (p->addr.sin_addr.s_addr) {
1034 r->sa.sin_addr = p->addr.sin_addr;
1035 r->sa.sin_port = p->addr.sin_port;
1037 r->sa.sin_addr = p->defaddr.sin_addr;
1038 r->sa.sin_port = p->defaddr.sin_port;
1040 memcpy(&r->recv, &r->sa, sizeof(r->recv));
1051 ast_mutex_unlock(&peerl.lock);
1053 if ((port=strchr(peer, ':'))) {
1059 portno = atoi(port);
1061 portno = DEFAULT_SIP_PORT;
1066 snprintf(service, sizeof(service), "_sip._udp.%s", peer);
1067 ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service);
1073 hp = ast_gethostbyname(hostn, &ahp);
1075 strncpy(r->tohost, peer, sizeof(r->tohost) - 1);
1076 memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr));
1077 r->sa.sin_port = htons(portno);
1078 memcpy(&r->recv, &r->sa, sizeof(r->recv));
1081 ast_log(LOG_WARNING, "No such host: %s\n", peer);
1097 static int auto_congest(void *nothing)
1099 struct sip_pvt *p = nothing;
1100 ast_mutex_lock(&p->lock);
1103 if (!ast_mutex_trylock(&p->owner->lock)) {
1104 ast_log(LOG_NOTICE, "Auto-congesting %s\n", p->owner->name);
1105 ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
1106 ast_mutex_unlock(&p->owner->lock);
1109 ast_mutex_unlock(&p->lock);
1113 static void sip_prefs_free(void)
1115 struct sip_codec_pref *cur, *next;
1125 static void sip_pref_remove(int format)
1127 struct sip_codec_pref *cur, *prev=NULL;
1130 if (cur->codec == format) {
1132 prev->next = cur->next;
1143 static int sip_pref_append(int format)
1145 struct sip_codec_pref *cur, *tmp;
1146 sip_pref_remove(format);
1147 tmp = (struct sip_codec_pref *)malloc(sizeof(struct sip_codec_pref));
1150 memset(tmp, 0, sizeof(struct sip_codec_pref));
1151 tmp->codec = format;
1162 static int sip_codec_choose(int formats)
1164 struct sip_codec_pref *cur;
1165 formats &= ((AST_FORMAT_MAX_AUDIO << 1) - 1);
1168 if (formats & cur->codec)
1172 return ast_best_codec(formats);
1175 static int sip_call(struct ast_channel *ast, char *dest, int timeout)
1179 char *vxml_url = NULL;
1180 char *distinctive_ring = NULL;
1181 struct varshead *headp;
1182 struct ast_var_t *current;
1185 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
1186 ast_log(LOG_WARNING, "sip_call called on %s, neither down nor reserved\n", ast->name);
1189 /* Check whether there is vxml_url, distinctive ring variables */
1191 headp=&ast->varshead;
1192 AST_LIST_TRAVERSE(headp,current,entries) {
1193 /* Check whether there is a VXML_URL variable */
1194 if (strcasecmp(ast_var_name(current),"VXML_URL")==0)
1196 vxml_url = ast_var_value(current);
1199 /* Check whether there is a ALERT_INFO variable */
1200 if (strcasecmp(ast_var_name(current),"ALERT_INFO")==0)
1202 distinctive_ring = ast_var_value(current);
1209 ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
1210 res = update_user_counter(p,INC_OUT_USE);
1212 p->restrictcid = ast->restrictcid;
1213 p->jointcapability = p->capability;
1214 transmit_invite(p, "INVITE", 1, NULL, NULL, vxml_url,distinctive_ring, 1);
1216 /* Initialize auto-congest time */
1217 p->initid = ast_sched_add(sched, p->maxtime * 4, auto_congest, p);
1223 static void __sip_destroy(struct sip_pvt *p, int lockowner)
1225 struct sip_pvt *cur, *prev = NULL;
1227 struct sip_history *hist;
1228 if (sip_debug_test_pvt(p))
1229 ast_verbose("Destroying call '%s'\n", p->callid);
1230 if (p->stateid > -1)
1231 ast_extension_state_del(p->stateid, NULL);
1233 ast_sched_del(sched, p->initid);
1234 if (p->autokillid > -1)
1235 ast_sched_del(sched, p->autokillid);
1238 ast_rtp_destroy(p->rtp);
1241 ast_rtp_destroy(p->vrtp);
1244 free_old_route(p->route);
1248 /* Carefully unlink from registry */
1249 struct sip_registry *reg;
1250 ast_mutex_lock(®l.lock);
1251 reg = regl.registrations;
1253 if ((reg == p->registry) && (p->registry->call == p))
1254 p->registry->call=NULL;
1257 ast_mutex_unlock(®l.lock);
1259 /* Unlink us from the owner if we have one */
1262 ast_mutex_lock(&p->owner->lock);
1263 ast_log(LOG_DEBUG, "Detaching from %s\n", p->owner->name);
1264 p->owner->pvt->pvt = NULL;
1266 ast_mutex_unlock(&p->owner->lock);
1271 p->history = p->history->next;
1278 prev->next = cur->next;
1287 ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
1290 ast_sched_del(sched, p->initid);
1291 while((cp = p->packets)) {
1292 p->packets = p->packets->next;
1293 if (cp->retransid > -1)
1294 ast_sched_del(sched, cp->retransid);
1301 static int update_user_counter(struct sip_pvt *fup, int event)
1303 char name[256] = "";
1305 strncpy(name, fup->username, sizeof(name) - 1);
1306 ast_mutex_lock(&userl.lock);
1307 u = find_user(name);
1309 ast_log(LOG_DEBUG, "%s is not a local user\n", name);
1310 ast_mutex_unlock(&userl.lock);
1314 /* incoming and outgoing affects the inUse counter */
1317 if ( u->inUse > 0 ) {
1325 if (u->incominglimit > 0 ) {
1326 if (u->inUse >= u->incominglimit) {
1327 ast_log(LOG_ERROR, "Call from user '%s' rejected due to usage limit of %d\n", u->name, u->incominglimit);
1328 /* inc inUse as well */
1329 if ( event == INC_OUT_USE ) {
1332 ast_mutex_unlock(&userl.lock);
1337 ast_log(LOG_DEBUG, "Call from user '%s' is %d out of %d\n", u->name, u->inUse, u->incominglimit);
1339 /* we don't use these anymore
1341 if ( u->outUse > 0 ) {
1348 if ( u->outgoinglimit > 0 ) {
1349 if ( u->outUse >= u->outgoinglimit ) {
1350 ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
1351 ast_mutex_unlock(&userl.lock);
1359 ast_log(LOG_ERROR, "update_user_counter(%s,%d) called with no event!\n",u->name,event);
1361 ast_mutex_unlock(&userl.lock);
1365 static void sip_destroy(struct sip_pvt *p)
1367 ast_mutex_lock(&iflock);
1368 __sip_destroy(p, 1);
1369 ast_mutex_unlock(&iflock);
1372 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req, int fatal);
1374 static int hangup_sip2cause(int cause)
1379 return AST_CAUSE_BUSY;
1381 return AST_CAUSE_NORMAL;
1387 static char *hangup_cause2sip(int cause)
1391 case AST_CAUSE_BUSY:
1400 static int sip_hangup(struct ast_channel *ast)
1402 struct sip_pvt *p = ast->pvt->pvt;
1404 int needdestroy = 0;
1406 ast_log(LOG_DEBUG, "sip_hangup(%s)\n", ast->name);
1407 if (!ast->pvt->pvt) {
1408 ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
1411 ast_mutex_lock(&p->lock);
1412 if ( p->outgoing ) {
1413 ast_log(LOG_DEBUG, "update_user_counter(%s) - decrement outUse counter\n", p->username);
1414 update_user_counter(p, DEC_OUT_USE);
1416 ast_log(LOG_DEBUG, "update_user_counter(%s) - decrement inUse counter\n", p->username);
1417 update_user_counter(p, DEC_IN_USE);
1419 /* Determine how to disconnect */
1420 if (p->owner != ast) {
1421 ast_log(LOG_WARNING, "Huh? We aren't the owner?\n");
1422 ast_mutex_unlock(&p->lock);
1425 if (!ast || (ast->_state != AST_STATE_UP))
1430 ast_dsp_free(p->vad);
1433 ast->pvt->pvt = NULL;
1435 ast_mutex_lock(&usecnt_lock);
1437 ast_mutex_unlock(&usecnt_lock);
1438 ast_update_use_count();
1441 /* Start the process if it's not already started */
1442 if (!p->alreadygone && !ast_strlen_zero(p->initreq.data)) {
1445 transmit_request_with_auth(p, "CANCEL", p->ocseq, 1, 0);
1446 /* Actually don't destroy us yet, wait for the 487 on our original
1447 INVITE, but do set an autodestruct just in case. */
1449 sip_scheddestroy(p, 15000);
1450 if ( p->initid != -1 ) {
1451 /* channel still up - reverse dec of inUse counter
1452 only if the channel is not auto-congested */
1453 if ( p->outgoing ) {
1454 update_user_counter(p, INC_OUT_USE);
1457 update_user_counter(p, INC_IN_USE);
1462 if (ast->hangupcause && ((res = hangup_cause2sip(ast->hangupcause)))) {
1463 transmit_response_reliable(p, res, &p->initreq, 1);
1465 transmit_response_reliable(p, "403 Forbidden", &p->initreq, 1);
1468 if (!p->pendinginvite) {
1470 transmit_request_with_auth(p, "BYE", 0, 1, 1);
1472 /* Note we will need a BYE when this all settles out
1473 but we can't send one while we have "INVITE" outstanding. */
1478 p->needdestroy = needdestroy;
1479 ast_mutex_unlock(&p->lock);
1483 static int sip_answer(struct ast_channel *ast)
1487 struct sip_pvt *p = ast->pvt->pvt;
1490 if (ast->_state != AST_STATE_UP) {
1494 codec=pbx_builtin_getvar_helper(p->owner,"SIP_CODEC");
1496 fmt=ast_getformatbyname(codec);
1498 ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
1499 p->jointcapability=fmt;
1500 } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n",codec);
1503 ast_setstate(ast, AST_STATE_UP);
1505 ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
1506 res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
1511 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
1513 struct sip_pvt *p = ast->pvt->pvt;
1515 if (frame->frametype == AST_FRAME_VOICE) {
1516 if (!(frame->subclass & ast->nativeformats)) {
1517 ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
1518 frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
1522 ast_mutex_lock(&p->lock);
1524 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1525 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1528 res = ast_rtp_write(p->rtp, frame);
1530 ast_mutex_unlock(&p->lock);
1532 } else if (frame->frametype == AST_FRAME_VIDEO) {
1534 ast_mutex_lock(&p->lock);
1536 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1537 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1540 res = ast_rtp_write(p->vrtp, frame);
1542 ast_mutex_unlock(&p->lock);
1544 } else if (frame->frametype == AST_FRAME_IMAGE) {
1547 ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", frame->frametype);
1554 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
1556 struct sip_pvt *p = newchan->pvt->pvt;
1557 ast_mutex_lock(&p->lock);
1558 if (p->owner != oldchan) {
1559 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
1560 ast_mutex_unlock(&p->lock);
1564 ast_mutex_unlock(&p->lock);
1568 static int sip_senddigit(struct ast_channel *ast, char digit)
1570 struct sip_pvt *p = ast->pvt->pvt;
1571 if (p && (p->dtmfmode & SIP_DTMF_INFO)) {
1572 transmit_info_with_digit(p, digit);
1574 if (p && p->rtp && (p->dtmfmode & SIP_DTMF_RFC2833)) {
1575 ast_rtp_senddigit(p->rtp, digit);
1577 /* If in-band DTMF is desired, send that */
1578 if (p->dtmfmode & SIP_DTMF_INBAND)
1583 static int sip_transfer(struct ast_channel *ast, char *dest)
1585 struct sip_pvt *p = ast->pvt->pvt;
1587 res = transmit_refer(p, dest);
1591 static int sip_indicate(struct ast_channel *ast, int condition)
1593 struct sip_pvt *p = ast->pvt->pvt;
1595 case AST_CONTROL_RINGING:
1596 if (ast->_state == AST_STATE_RING) {
1598 transmit_response(p, "180 Ringing", &p->initreq);
1602 /* Oops, we've sent progress tones. Let Asterisk do it instead */
1606 case AST_CONTROL_BUSY:
1607 if (ast->_state != AST_STATE_UP) {
1608 transmit_response(p, "486 Busy Here", &p->initreq);
1610 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1614 case AST_CONTROL_CONGESTION:
1615 if (ast->_state != AST_STATE_UP) {
1616 transmit_response(p, "503 Service Unavailable", &p->initreq);
1618 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
1622 case AST_CONTROL_PROGRESS:
1623 if ((ast->_state != AST_STATE_UP) && !p->progress && !p->outgoing) {
1624 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
1632 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
1640 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
1642 struct ast_channel *tmp;
1644 tmp = ast_channel_alloc(1);
1646 /* Select our native format based on codec preference until we receive
1647 something from another device to the contrary. */
1648 if (i->jointcapability)
1649 tmp->nativeformats = sip_codec_choose(i->jointcapability);
1650 else if (i->capability)
1651 tmp->nativeformats = sip_codec_choose(i->capability);
1653 tmp->nativeformats = sip_codec_choose(capability);
1654 fmt = ast_best_codec(tmp->nativeformats);
1656 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
1658 if (strchr(i->fromdomain,':'))
1660 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(i));
1664 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(i));
1667 if (i->dtmfmode & SIP_DTMF_INBAND) {
1668 i->vad = ast_dsp_new();
1669 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
1671 ast_dsp_digitmode(i->vad, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF);
1673 tmp->fds[0] = ast_rtp_fd(i->rtp);
1674 tmp->fds[1] = ast_rtcp_fd(i->rtp);
1676 tmp->fds[2] = ast_rtp_fd(i->vrtp);
1677 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
1679 if (state == AST_STATE_RING)
1681 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
1682 tmp->writeformat = fmt;
1683 tmp->pvt->rawwriteformat = fmt;
1684 tmp->readformat = fmt;
1685 tmp->pvt->rawreadformat = fmt;
1687 tmp->pvt->send_text = sip_sendtext;
1688 tmp->pvt->call = sip_call;
1689 tmp->pvt->hangup = sip_hangup;
1690 tmp->pvt->answer = sip_answer;
1691 tmp->pvt->read = sip_read;
1692 tmp->pvt->write = sip_write;
1693 tmp->pvt->write_video = sip_write;
1694 tmp->pvt->indicate = sip_indicate;
1695 tmp->pvt->transfer = sip_transfer;
1696 tmp->pvt->fixup = sip_fixup;
1697 tmp->pvt->send_digit = sip_senddigit;
1699 tmp->pvt->bridge = ast_rtp_bridge;
1701 tmp->callgroup = i->callgroup;
1702 tmp->pickupgroup = i->pickupgroup;
1703 tmp->restrictcid = i->restrictcid;
1704 if (!ast_strlen_zero(i->accountcode))
1705 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
1707 tmp->amaflags = i->amaflags;
1708 if (!ast_strlen_zero(i->language))
1709 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
1710 if (!ast_strlen_zero(i->musicclass))
1711 strncpy(tmp->musicclass, i->musicclass, sizeof(tmp->musicclass)-1);
1713 ast_mutex_lock(&usecnt_lock);
1715 ast_mutex_unlock(&usecnt_lock);
1716 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
1717 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
1718 if (!ast_strlen_zero(i->callerid))
1719 tmp->callerid = strdup(i->callerid);
1720 if (!ast_strlen_zero(i->rdnis))
1721 tmp->rdnis = strdup(i->rdnis);
1722 if (!ast_strlen_zero(i->exten) && strcmp(i->exten, "s"))
1723 tmp->dnid = strdup(i->exten);
1725 if (!ast_strlen_zero(i->domain)) {
1726 pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
1728 if (!ast_strlen_zero(i->useragent)) {
1729 pbx_builtin_setvar_helper(tmp, "SIPUSERAGENT", i->useragent);
1731 if (!ast_strlen_zero(i->callid)) {
1732 pbx_builtin_setvar_helper(tmp, "SIPCALLID", i->callid);
1734 ast_setstate(tmp, state);
1735 if (state != AST_STATE_DOWN) {
1736 if (ast_pbx_start(tmp)) {
1737 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
1743 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
1747 static struct cfalias {
1751 { "Content-Type", "c" },
1752 { "Content-Encoding", "e" },
1756 { "Content-Length", "l" },
1762 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
1763 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
1764 char* r = line + nameLen + 1;
1765 while (*r && (*r < 33)) ++r;
1772 static char *get_sdp(struct sip_request *req, char *name) {
1774 int len = strlen(name);
1777 for (x=0; x<req->lines; x++) {
1778 r = get_sdp_by_line(req->line[x], name, len);
1779 if (r[0] != '\0') return r;
1784 static void sdpLineNum_iterator_init(int* iterator) {
1788 static char* get_sdp_iterate(int* iterator,
1789 struct sip_request *req, char *name) {
1790 int len = strlen(name);
1792 while (*iterator < req->lines) {
1793 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
1794 if (r[0] != '\0') return r;
1799 static char *__get_header(struct sip_request *req, char *name, int *start)
1802 int len = strlen(name);
1804 for (x=*start;x<req->headers;x++) {
1805 if (!strncasecmp(req->header[x], name, len) &&
1806 (req->header[x][len] == ':')) {
1807 r = req->header[x] + len + 1;
1808 while(*r && (*r < 33))
1815 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
1816 if (!strcasecmp(aliases[x].fullname, name))
1817 return __get_header(req, aliases[x].shortname, start);
1819 /* Don't return NULL, so get_header is always a valid pointer */
1823 static char *get_header(struct sip_request *req, char *name)
1826 return __get_header(req, name, &start);
1829 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
1831 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
1832 struct ast_frame *f;
1833 static struct ast_frame null_frame = { AST_FRAME_NULL, };
1836 f = ast_rtp_read(p->rtp);
1839 f = ast_rtcp_read(p->rtp);
1842 f = ast_rtp_read(p->vrtp);
1845 f = ast_rtcp_read(p->vrtp);
1850 /* Don't send RFC2833 if we're not supposed to */
1851 if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & SIP_DTMF_RFC2833))
1854 /* We already hold the channel lock */
1855 if (f->frametype == AST_FRAME_VOICE) {
1856 if (f->subclass != p->owner->nativeformats) {
1857 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
1858 p->owner->nativeformats = f->subclass;
1859 ast_set_read_format(p->owner, p->owner->readformat);
1860 ast_set_write_format(p->owner, p->owner->writeformat);
1862 if ((p->dtmfmode & SIP_DTMF_INBAND) && p->vad) {
1863 f = ast_dsp_process(p->owner,p->vad,f);
1864 if (f && (f->frametype == AST_FRAME_DTMF))
1865 ast_log(LOG_DEBUG, "Detected DTMF '%c'\n", f->subclass);
1872 static struct ast_frame *sip_read(struct ast_channel *ast)
1874 struct ast_frame *fr;
1875 struct sip_pvt *p = ast->pvt->pvt;
1876 ast_mutex_lock(&p->lock);
1877 fr = sip_rtp_read(ast, p);
1878 ast_mutex_unlock(&p->lock);
1882 static void build_callid(char *callid, int len, struct in_addr ourip)
1889 res = snprintf(callid, len, "%08x", val);
1893 /* It's not important that we really use our right IP here... */
1894 snprintf(callid, len, "@%s", inet_ntoa(ourip));
1897 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobalnat)
1901 p = malloc(sizeof(struct sip_pvt));
1904 /* Keep track of stuff */
1905 memset(p, 0, sizeof(struct sip_pvt));
1909 p->rtp = ast_rtp_new(sched, io, 1, 0);
1911 p->vrtp = ast_rtp_new(sched, io, 1, 0);
1915 /* Start with 101 instead of 1 */
1918 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
1922 ast_rtp_settos(p->rtp, tos);
1924 ast_rtp_settos(p->vrtp, tos);
1925 if (useglobalnat && sin) {
1926 /* Setup NAT structure according to global settings if we have an address */
1928 memcpy(&p->recv, sin, sizeof(p->recv));
1929 ast_rtp_setnat(p->rtp, p->nat);
1931 ast_rtp_setnat(p->vrtp, p->nat);
1933 ast_mutex_init(&p->lock);
1936 memcpy(&p->sa, sin, sizeof(p->sa));
1937 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
1938 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1940 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
1942 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
1943 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
1945 build_callid(p->callid, sizeof(p->callid), p->ourip);
1947 strncpy(p->callid, callid, sizeof(p->callid) - 1);
1948 /* Assume reinvite OK and via INVITE */
1949 p->canreinvite = globalcanreinvite;
1950 /* Assign default music on hold class */
1951 strncpy(p->musicclass, globalmusicclass, sizeof(p->musicclass));
1952 p->dtmfmode = globaldtmfmode;
1953 p->capability = capability;
1954 if (p->dtmfmode & SIP_DTMF_RFC2833)
1955 p->noncodeccapability |= AST_RTP_DTMF;
1956 strncpy(p->context, context, sizeof(p->context) - 1);
1957 strncpy(p->fromdomain, fromdomain, sizeof(p->fromdomain) - 1);
1959 ast_mutex_lock(&iflock);
1962 ast_mutex_unlock(&iflock);
1964 ast_log(LOG_DEBUG, "Allocating new SIP call for %s\n", callid);
1968 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin)
1976 callid = get_header(req, "Call-ID");
1978 if (pedanticsipchecking) {
1979 /* In principle Call-ID's uniquely identify a call, however some vendors
1980 (i.e. Pingtel) send multiple calls with the same Call-ID and different
1981 tags in order to simplify billing. The RFC does state that we have to
1982 compare tags in addition to the call-id, but this generate substantially
1983 more overhead which is totally unnecessary for the vast majority of sane
1984 SIP implementations, and thus Asterisk does not enable this behavior
1985 by default. Short version: You'll need this option to support conferencing
1987 strncpy(tmp, req->header[0], sizeof(tmp) - 1);
1989 c = strchr(tmp, ' ');
1992 if (!strcasecmp(cmd, "SIP/2.0")) {
1998 strncpy(tmp, get_header(req, "From"), sizeof(tmp) - 1);
2000 strncpy(tmp, get_header(req, "To"), sizeof(tmp) - 1);
2001 tag = strstr(tmp, "tag=");
2004 c = strchr(tag, ';');
2011 if (ast_strlen_zero(callid)) {
2012 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", inet_ntoa(sin->sin_addr));
2015 ast_mutex_lock(&iflock);
2018 if (!strcmp(p->callid, callid) &&
2019 (!pedanticsipchecking || !tag || ast_strlen_zero(p->theirtag) || !strcmp(p->theirtag, tag))) {
2020 /* Found the call */
2021 ast_mutex_lock(&p->lock);
2022 ast_mutex_unlock(&iflock);
2027 ast_mutex_unlock(&iflock);
2028 p = sip_alloc(callid, sin, 1);
2030 ast_mutex_lock(&p->lock);
2034 static int sip_register(char *value, int lineno)
2036 struct sip_registry *reg;
2037 char copy[256] = "";
2038 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
2044 struct ast_hostent ahp;
2047 strncpy(copy, value, sizeof(copy)-1);
2050 hostname = strrchr(stringp, '@');
2055 if (!username || ast_strlen_zero(username) || !hostname || ast_strlen_zero(hostname)) {
2056 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d", lineno);
2060 username = strsep(&stringp, ":");
2062 secret = strsep(&stringp, ":");
2064 authuser = strsep(&stringp, ":");
2067 hostname = strsep(&stringp, "/");
2069 contact = strsep(&stringp, "/");
2070 if (!contact || ast_strlen_zero(contact))
2073 hostname = strsep(&stringp, ":");
2074 porta = strsep(&stringp, ":");
2076 if (porta && !atoi(porta)) {
2077 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
2080 hp = ast_gethostbyname(hostname, &ahp);
2082 ast_log(LOG_WARNING, "Host '%s' not found at line %d\n", hostname, lineno);
2085 reg = malloc(sizeof(struct sip_registry));
2087 memset(reg, 0, sizeof(struct sip_registry));
2088 strncpy(reg->contact, contact, sizeof(reg->contact) - 1);
2090 strncpy(reg->username, username, sizeof(reg->username)-1);
2092 strncpy(reg->hostname, hostname, sizeof(reg->hostname)-1);
2094 strncpy(reg->authuser, authuser, sizeof(reg->authuser)-1);
2096 strncpy(reg->secret, secret, sizeof(reg->secret)-1);
2099 reg->refresh = default_expiry;
2100 reg->addr.sin_family = AF_INET;
2101 memcpy(®->addr.sin_addr, hp->h_addr, sizeof(®->addr.sin_addr));
2102 reg->addr.sin_port = porta ? htons(atoi(porta)) : htons(DEFAULT_SIP_PORT);
2103 reg->callid_valid = 0;
2105 ast_mutex_lock(®l.lock);
2106 reg->next = regl.registrations;
2107 regl.registrations = reg;
2108 ast_mutex_unlock(®l.lock);
2110 ast_log(LOG_ERROR, "Out of memory\n");
2116 static int lws2sws(char *msgbuf, int len)
2122 /* Eliminate all CRs */
2123 if (msgbuf[h] == '\r') {
2127 /* Check for end-of-line */
2128 if (msgbuf[h] == '\n') {
2129 /* Check for end-of-message */
2132 /* Check for a continuation line */
2133 if (msgbuf[h + 1] == ' ') {
2134 /* Merge continuation line */
2138 /* Propagate LF and start new line */
2139 msgbuf[t++] = msgbuf[h++];
2144 if (msgbuf[h] == ' ' || msgbuf[h] == '\t') {
2149 msgbuf[t++] = msgbuf[h++];
2153 msgbuf[t++] = msgbuf[h++];
2161 static void parse(struct sip_request *req)
2163 /* Divide fields by NULL's */
2168 /* First header starts immediately */
2172 /* We've got a new header */
2176 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
2178 if (ast_strlen_zero(req->header[f])) {
2179 /* Line by itself means we're now in content */
2183 if (f >= SIP_MAX_HEADERS - 1) {
2184 ast_log(LOG_WARNING, "Too many SIP headers...\n");
2187 req->header[f] = c + 1;
2188 } else if (*c == '\r') {
2189 /* Ignore but eliminate \r's */
2194 /* Check for last header */
2195 if (!ast_strlen_zero(req->header[f]))
2198 /* Now we process any mime content */
2203 /* We've got a new line */
2206 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
2208 if (f >= SIP_MAX_LINES - 1) {
2209 ast_log(LOG_WARNING, "Too many SDP lines...\n");
2212 req->line[f] = c + 1;
2213 } else if (*c == '\r') {
2214 /* Ignore and eliminate \r's */
2219 /* Check for last line */
2220 if (!ast_strlen_zero(req->line[f]))
2224 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
2227 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
2236 int peercapability, peernoncodeccapability;
2237 int vpeercapability=0, vpeernoncodeccapability=0;
2238 struct sockaddr_in sin;
2241 struct ast_hostent ahp;
2247 /* Get codec and RTP info from SDP */
2248 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
2249 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
2252 m = get_sdp(req, "m");
2253 c = get_sdp(req, "c");
2254 if (ast_strlen_zero(m) || ast_strlen_zero(c)) {
2255 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
2258 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2259 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
2262 /* XXX This could block for a long time, and block the main thread! XXX */
2263 hp = ast_gethostbyname(host, &ahp);
2265 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
2268 sdpLineNum_iterator_init(&iterator);
2269 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
2270 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) {
2272 /* Scan through the RTP payload types specified in a "m=" line: */
2273 ast_rtp_pt_clear(p->rtp);
2275 while(!ast_strlen_zero(codecs)) {
2276 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2277 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2280 if (sip_debug_test_pvt(p))
2281 ast_verbose("Found RTP audio format %d\n", codec);
2282 ast_rtp_set_m_type(p->rtp, codec);
2284 /* Skip over any whitespace */
2285 while(*codecs && (*codecs < 33)) codecs++;
2289 ast_rtp_pt_clear(p->vrtp); /* Must be cleared in case no m=video line exists */
2291 if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
2293 /* Scan through the RTP payload types specified in a "m=" line: */
2295 while(!ast_strlen_zero(codecs)) {
2296 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2297 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2300 if (sip_debug_test_pvt(p))
2301 ast_verbose("Found video format %s\n", ast_getformatname(codec));
2302 ast_rtp_set_m_type(p->vrtp, codec);
2304 /* Skip over any whitespace */
2305 while(*codecs && (*codecs < 33)) codecs++;
2309 sin.sin_family = AF_INET;
2310 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
2311 /* Setup audio port number */
2312 sin.sin_port = htons(portno);
2313 if (p->rtp && sin.sin_port)
2314 ast_rtp_set_peer(p->rtp, &sin);
2315 /* Setup video port number */
2316 sin.sin_port = htons(vportno);
2317 if (p->vrtp && sin.sin_port)
2318 ast_rtp_set_peer(p->vrtp, &sin);
2320 printf("Peer RTP is at port %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
2322 /* Next, scan through each "a=rtpmap:" line, noting each
2323 * specified RTP payload type (with corresponding MIME subtype):
2325 sdpLineNum_iterator_init(&iterator);
2326 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
2327 char* mimeSubtype = ast_strdupa(a); /* ensures we have enough space */
2328 if (!strcasecmp(a, "sendonly")) {
2332 if (!strcasecmp(a, "sendrecv")) {
2335 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
2336 if (sip_debug_test_pvt(p))
2337 ast_verbose("Found description format %s\n", mimeSubtype);
2338 /* Note: should really look at the 'freq' and '#chans' params too */
2339 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
2341 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
2344 /* Now gather all of the codecs that were asked for: */
2345 ast_rtp_get_current_formats(p->rtp,
2346 &peercapability, &peernoncodeccapability);
2348 ast_rtp_get_current_formats(p->vrtp,
2349 &vpeercapability, &vpeernoncodeccapability);
2350 p->jointcapability = p->capability & (peercapability | vpeercapability);
2351 p->noncodeccapability = noncodeccapability & (peernoncodeccapability | vpeernoncodeccapability);
2353 if (sip_debug_test_pvt(p)) {
2354 ast_verbose("Capabilities: us - %d, them - %d/%d, combined - %d\n",
2355 p->capability, peercapability, vpeercapability, p->jointcapability);
2356 ast_verbose("Non-codec capabilities: us - %d, them - %d, combined - %d\n",
2357 noncodeccapability, peernoncodeccapability,
2358 p->noncodeccapability);
2360 if (!p->jointcapability) {
2361 ast_log(LOG_WARNING, "No compatible codecs!\n");
2365 if (!(p->owner->nativeformats & p->jointcapability)) {
2366 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);
2367 p->owner->nativeformats = sip_codec_choose(p->jointcapability);
2368 ast_set_read_format(p->owner, p->owner->readformat);
2369 ast_set_write_format(p->owner, p->owner->writeformat);
2371 if (p->owner->bridge) {
2372 /* Turn on/off music on hold if we are holding/unholding */
2373 if (sin.sin_addr.s_addr && !sendonly) {
2374 ast_moh_stop(p->owner->bridge);
2376 ast_moh_start(p->owner->bridge, NULL);
2384 static int add_header(struct sip_request *req, char *var, char *value)
2386 if (req->len >= sizeof(req->data) - 4) {
2387 ast_log(LOG_WARNING, "Out of space, can't add anymore (%s:%s)\n", var, value);
2391 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2394 req->header[req->headers] = req->data + req->len;
2395 snprintf(req->header[req->headers], sizeof(req->data) - req->len - 4, "%s: %s\r\n", var, value);
2396 req->len += strlen(req->header[req->headers]);
2397 if (req->headers < SIP_MAX_HEADERS)
2400 ast_log(LOG_WARNING, "Out of header space\n");
2406 static int add_blank_header(struct sip_request *req)
2408 if (req->len >= sizeof(req->data) - 4) {
2409 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2413 ast_log(LOG_WARNING, "Can't add more headers when lines have been added\n");
2416 req->header[req->headers] = req->data + req->len;
2417 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "\r\n");
2418 req->len += strlen(req->header[req->headers]);
2419 if (req->headers < SIP_MAX_HEADERS)
2422 ast_log(LOG_WARNING, "Out of header space\n");
2428 static int add_line(struct sip_request *req, char *line)
2430 if (req->len >= sizeof(req->data) - 4) {
2431 ast_log(LOG_WARNING, "Out of space, can't add anymore\n");
2435 /* Add extra empty return */
2436 snprintf(req->data + req->len, sizeof(req->data) - req->len, "\r\n");
2437 req->len += strlen(req->data + req->len);
2439 req->line[req->lines] = req->data + req->len;
2440 snprintf(req->line[req->lines], sizeof(req->data) - req->len, "%s", line);
2441 req->len += strlen(req->line[req->lines]);
2442 if (req->lines < SIP_MAX_LINES)
2445 ast_log(LOG_WARNING, "Out of line space\n");
2451 static int copy_header(struct sip_request *req, struct sip_request *orig, char *field)
2454 tmp = get_header(orig, field);
2455 if (!ast_strlen_zero(tmp)) {
2456 /* Add what we're responding to */
2457 return add_header(req, field, tmp);
2459 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2463 static int copy_all_header(struct sip_request *req, struct sip_request *orig, char *field)
2469 tmp = __get_header(orig, field, &start);
2470 if (!ast_strlen_zero(tmp)) {
2471 /* Add what we're responding to */
2472 add_header(req, field, tmp);
2477 return copied ? 0 : -1;
2480 static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, struct sip_request *orig, char *field)
2487 tmp = __get_header(orig, field, &start);
2488 if (!ast_strlen_zero(tmp)) {
2489 if (!copied && p->nat) {
2490 #ifdef THE_SIP_AUTHORS_CAN_SUCK_MY_GONADS
2491 /* SLD: FIXME: Nice try, but the received= should not have a port */
2492 /* SLD: FIXME: See RFC2543 BNF in Section 6.40.5 */
2493 /* MAS: Yup, RFC says you can't do it. No way to indicate PAT...
2495 if (ntohs(p->recv.sin_port) != DEFAULT_SIP_PORT)
2496 snprintf(new, sizeof(new), "%s;received=%s:%d", tmp, inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port));
2499 snprintf(new, sizeof(new), "%s;received=%s", tmp, inet_ntoa(p->recv.sin_addr));
2500 add_header(req, field, new);
2502 /* Add what we're responding to */
2503 add_header(req, field, tmp);
2510 ast_log(LOG_NOTICE, "No field '%s' present to copy\n", field);
2516 /* Add Route: header into request per learned route */
2517 static void add_route(struct sip_request *req, struct sip_route *route)
2520 int n, rem = 255; /* sizeof(r)-1: Room for terminating 0 */
2526 n = strlen(route->hop);
2527 if ((n+3)>rem) break;
2533 strcpy(p, route->hop); p += n;
2536 route = route->next;
2539 add_header(req, "Route", r);
2542 static void set_destination(struct sip_pvt *p, char *uri)
2544 char *h, *maddr, hostname[256];
2547 struct ast_hostent ahp;
2549 /* Parse uri to h (host) and port - uri is already just the part inside the <> */
2550 /* general form we are expecting is sip[s]:username[:password]@host[:port][;...] */
2552 if (sip_debug_test_pvt(p))
2553 ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
2555 /* Find and parse hostname */
2556 h = strchr(uri, '@');
2561 if (strncmp(h, "sip:", 4) == 0)
2563 else if (strncmp(h, "sips:", 5) == 0)
2566 hn = strcspn(h, ":;>");
2568 strncpy(hostname, h, hn); hostname[hn] = '\0';
2571 /* Is "port" present? if not default to 5060 */
2575 port = strtol(h, &h, 10);
2580 /* Got the hostname:port - but maybe there's a "maddr=" to override address? */
2581 maddr = strstr(h, "maddr=");
2584 hn = strspn(maddr, "0123456789.");
2586 strncpy(hostname, maddr, hn); hostname[hn] = '\0';
2589 hp = ast_gethostbyname(hostname, &ahp);
2591 ast_log(LOG_WARNING, "Can't find address for host '%s'\n", hostname);
2594 p->sa.sin_family = AF_INET;
2595 memcpy(&p->sa.sin_addr, hp->h_addr, sizeof(p->sa.sin_addr));
2596 p->sa.sin_port = htons(port);
2597 if (sip_debug_test_pvt(p))
2598 ast_verbose("set_destination: set destination to %s, port %d\n", inet_ntoa(p->sa.sin_addr), port);
2601 static int init_resp(struct sip_request *req, char *resp, struct sip_request *orig)
2603 /* Initialize a response */
2604 if (req->headers || req->len) {
2605 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2608 req->header[req->headers] = req->data + req->len;
2609 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "SIP/2.0 %s\r\n", resp);
2610 req->len += strlen(req->header[req->headers]);
2611 if (req->headers < SIP_MAX_HEADERS)
2614 ast_log(LOG_WARNING, "Out of header space\n");
2618 static int init_req(struct sip_request *req, char *resp, char *recip)
2620 /* Initialize a response */
2621 if (req->headers || req->len) {
2622 ast_log(LOG_WARNING, "Request already initialized?!?\n");
2625 req->header[req->headers] = req->data + req->len;
2626 snprintf(req->header[req->headers], sizeof(req->data) - req->len, "%s %s SIP/2.0\r\n", resp, recip);
2627 req->len += strlen(req->header[req->headers]);
2628 if (req->headers < SIP_MAX_HEADERS)
2631 ast_log(LOG_WARNING, "Out of header space\n");
2635 static int respprep(struct sip_request *resp, struct sip_pvt *p, char *msg, struct sip_request *req)
2637 char newto[256] = "", *ot;
2638 memset(resp, 0, sizeof(*resp));
2639 init_resp(resp, msg, req);
2640 copy_via_headers(p, resp, req, "Via");
2641 if (msg[0] == '2') copy_all_header(resp, req, "Record-Route");
2642 copy_header(resp, req, "From");
2643 ot = get_header(req, "To");
2644 if (!strstr(ot, "tag=")) {
2645 /* Add the proper tag if we don't have it already. If they have specified
2646 their tag, use it. Otherwise, use our own tag */
2647 if (!ast_strlen_zero(p->theirtag) && p->outgoing)
2648 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2649 else if (p->tag && !p->outgoing)
2650 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2652 strncpy(newto, ot, sizeof(newto) - 1);
2655 add_header(resp, "To", ot);
2656 copy_header(resp, req, "Call-ID");
2657 copy_header(resp, req, "CSeq");
2658 add_header(resp, "User-Agent", "Asterisk PBX");
2659 add_header(resp, "Allow", ALLOWED_METHODS);
2661 /* For registration responses, we also need expiry and
2665 snprintf(contact, sizeof(contact), "%s;expires=%d", p->our_contact, p->expiry);
2666 snprintf(tmp, sizeof(tmp), "%d", p->expiry);
2667 add_header(resp, "Expires", tmp);
2668 add_header(resp, "Contact", contact);
2670 add_header(resp, "Contact", p->our_contact);
2675 static int reqprep(struct sip_request *req, struct sip_pvt *p, char *msg, int seqno, int newbranch)
2677 struct sip_request *orig = &p->initreq;
2678 char stripped[80] ="";
2684 memset(req, 0, sizeof(struct sip_request));
2686 snprintf(p->lastmsg, sizeof(p->lastmsg), "Tx: %s", msg);
2694 p->branch ^= rand();
2695 snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch);
2698 if (!ast_strlen_zero(p->uri)) {
2702 strncpy(stripped, get_header(orig, "To"), sizeof(stripped) - 1);
2704 strncpy(stripped, get_header(orig, "From"), sizeof(stripped) - 1);
2706 c = strchr(stripped, '<');
2718 init_req(req, msg, c);
2720 snprintf(tmp, sizeof(tmp), "%d %s", seqno, msg);
2722 add_header(req, "Via", p->via);
2724 set_destination(p, p->route->hop);
2725 add_route(req, p->route->next);
2728 ot = get_header(orig, "To");
2729 of = get_header(orig, "From");
2731 /* Add tag *unless* this is a CANCEL, in which case we need to send it exactly
2732 as our original request, including tag (or presumably lack thereof) */
2733 if (!strstr(ot, "tag=") && strcasecmp(msg, "CANCEL")) {
2734 /* Add the proper tag if we don't have it already. If they have specified
2735 their tag, use it. Otherwise, use our own tag */
2736 if (p->outgoing && !ast_strlen_zero(p->theirtag))
2737 snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
2738 else if (!p->outgoing)
2739 snprintf(newto, sizeof(newto), "%s;tag=as%08x", ot, p->tag);
2741 snprintf(newto, sizeof(newto), "%s", ot);
2746 add_header(req, "From", of);
2747 add_header(req, "To", ot);
2749 add_header(req, "From", ot);
2750 add_header(req, "To", of);
2752 add_header(req, "Contact", p->our_contact);
2753 copy_header(req, orig, "Call-ID");
2754 add_header(req, "CSeq", tmp);
2756 add_header(req, "User-Agent", "Asterisk PBX");
2760 static int __transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2762 struct sip_request resp;
2764 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2765 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2768 respprep(&resp, p, msg, req);
2769 add_header(&resp, "Content-Length", "0");
2770 add_blank_header(&resp);
2771 return send_response(p, &resp, reliable, seqno);
2774 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req)
2776 return __transmit_response(p, msg, req, 0);
2778 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req, int fatal)
2780 return __transmit_response(p, msg, req, fatal ? 2 : 1);
2783 static void append_date(struct sip_request *req)
2790 strftime(tmpdat, sizeof(tmpdat), "%a, %d %b %Y %T GMT", &tm);
2791 add_header(req, "Date", tmpdat);
2794 static int transmit_response_with_date(struct sip_pvt *p, char *msg, struct sip_request *req)
2796 struct sip_request resp;
2797 respprep(&resp, p, msg, req);
2799 add_header(&resp, "Content-Length", "0");
2800 add_blank_header(&resp);
2801 return send_response(p, &resp, 0, 0);
2804 static int transmit_response_with_allow(struct sip_pvt *p, char *msg, struct sip_request *req, int reliable)
2806 struct sip_request resp;
2807 respprep(&resp, p, msg, req);
2808 add_header(&resp, "Accept", "application/sdp");
2809 add_header(&resp, "Content-Length", "0");
2810 add_blank_header(&resp);
2811 return send_response(p, &resp, reliable, 0);
2814 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *randdata, int reliable)
2816 struct sip_request resp;
2819 if (reliable && (sscanf(get_header(req, "CSeq"), "%i ", &seqno) != 1)) {
2820 ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
2823 snprintf(tmp, sizeof(tmp), "Digest realm=\"%s\", nonce=\"%s\"", global_realm, randdata);
2824 respprep(&resp, p, msg, req);
2825 add_header(&resp, "Proxy-Authenticate", tmp);
2826 add_header(&resp, "Content-Length", "0");
2827 add_blank_header(&resp);
2828 return send_response(p, &resp, reliable, seqno);
2831 static int add_text(struct sip_request *req, char *text)
2833 /* XXX Convert \n's to \r\n's XXX */
2834 int len = strlen(text);
2836 snprintf(clen, sizeof(clen), "%d", len);
2837 add_header(req, "Content-Type", "text/plain");
2838 add_header(req, "Content-Length", clen);
2839 add_line(req, text);
2843 static int add_digit(struct sip_request *req, char digit)
2848 snprintf(tmp, sizeof(tmp), "Signal=%c\r\nDuration=250\r\n", digit);
2850 snprintf(clen, sizeof(clen), "%d", len);
2851 add_header(req, "Content-Type", "application/dtmf-relay");
2852 add_header(req, "Content-Length", clen);
2857 static int add_sdp(struct sip_request *resp, struct sip_pvt *p, struct ast_rtp *rtp, struct ast_rtp *vrtp)
2861 int alreadysent = 0;
2863 struct sockaddr_in sin;
2864 struct sockaddr_in vsin;
2865 struct sip_codec_pref *cur;
2876 struct sockaddr_in dest;
2877 struct sockaddr_in vdest = { 0, };
2878 /* XXX We break with the "recommendation" and send our IP, in order that our
2879 peer doesn't have to ast_gethostbyname() us XXX */
2882 ast_log(LOG_WARNING, "No way to add SDP without an RTP structure\n");
2885 if (!p->sessionid) {
2886 p->sessionid = getpid();
2887 p->sessionversion = p->sessionid;
2889 p->sessionversion++;
2890 ast_rtp_get_us(p->rtp, &sin);
2892 ast_rtp_get_us(p->vrtp, &vsin);
2894 if (p->redirip.sin_addr.s_addr) {
2895 dest.sin_port = p->redirip.sin_port;
2896 dest.sin_addr = p->redirip.sin_addr;
2898 ast_rtp_get_peer(rtp, &dest);
2900 dest.sin_addr = p->ourip;
2901 dest.sin_port = sin.sin_port;
2904 /* Determine video destination */
2906 if (p->vredirip.sin_addr.s_addr) {
2907 vdest.sin_port = p->vredirip.sin_port;
2908 vdest.sin_addr = p->vredirip.sin_addr;
2910 ast_rtp_get_peer(vrtp, &vdest);
2912 vdest.sin_addr = p->ourip;
2913 vdest.sin_port = vsin.sin_port;
2916 if (sip_debug_test_pvt(p))
2917 ast_verbose("We're at %s port %d\n", inet_ntoa(p->ourip), ntohs(sin.sin_port));
2918 if (sip_debug_test_pvt(p) && p->vrtp)
2919 ast_verbose("Video is at %s port %d\n", inet_ntoa(p->ourip), ntohs(vsin.sin_port));
2920 snprintf(v, sizeof(v), "v=0\r\n");
2921 snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, inet_ntoa(dest.sin_addr));
2922 snprintf(s, sizeof(s), "s=session\r\n");
2923 snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", inet_ntoa(dest.sin_addr));
2924 snprintf(t, sizeof(t), "t=0 0\r\n");
2925 snprintf(m, sizeof(m), "m=audio %d RTP/AVP", ntohs(dest.sin_port));
2926 snprintf(m2, sizeof(m2), "m=video %d RTP/AVP", ntohs(vdest.sin_port));
2927 if (p->jointcapability & p->prefcodec) {
2928 if (sip_debug_test_pvt(p))
2929 ast_verbose("Answering/Requesting with root capability %d\n", p->prefcodec);
2930 codec = ast_rtp_lookup_code(p->rtp, 1, p->prefcodec);
2932 snprintf(costr, sizeof(costr), " %d", codec);
2933 if (p->prefcodec <= AST_FORMAT_MAX_AUDIO) {
2934 strncat(m, costr, sizeof(m) - strlen(m));
2935 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, p->prefcodec));
2936 strncat(a, costr, sizeof(a));
2938 strncat(m2, costr, sizeof(m2) - strlen(m2));
2939 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, p->prefcodec));
2940 strncat(a2, costr, sizeof(a2));
2943 alreadysent |= p->prefcodec;
2945 /* Start by sending our preferred codecs */
2948 if (p->jointcapability & cur->codec) {
2949 if (sip_debug_test_pvt(p))
2950 ast_verbose("Answering/Requesting with preferred capability %d\n", cur->codec);
2951 codec = ast_rtp_lookup_code(p->rtp, 1, cur->codec);
2953 snprintf(costr, sizeof(costr), " %d", codec);
2954 if (cur->codec <= AST_FORMAT_MAX_AUDIO) {
2955 strncat(m, costr, sizeof(m) - strlen(m));
2956 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2957 strncat(a, costr, sizeof(a));
2959 strncat(m2, costr, sizeof(m2) - strlen(m2));
2960 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, cur->codec));
2961 strncat(a2, costr, sizeof(a2));
2965 alreadysent |= cur->codec;
2968 /* Now send any other common codecs, and non-codec formats: */
2969 for (x = 1; x <= (videosupport ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO); x <<= 1) {
2970 if ((p->jointcapability & x) && !(alreadysent & x)) {
2971 if (sip_debug_test_pvt(p))
2972 ast_verbose("Answering with capability %d\n", x);
2973 codec = ast_rtp_lookup_code(p->rtp, 1, x);
2975 snprintf(costr, sizeof(costr), " %d", codec);
2976 if (x <= AST_FORMAT_MAX_AUDIO) {
2977 strncat(m, costr, sizeof(m) - strlen(m));
2978 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2979 strncat(a, costr, sizeof(a) - strlen(a));
2981 strncat(m2, costr, sizeof(m2) - strlen(m2));
2982 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/90000\r\n", codec, ast_rtp_lookup_mime_subtype(1, x));
2983 strncat(a2, costr, sizeof(a2) - strlen(a2));
2988 for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
2989 if (p->noncodeccapability & x) {
2990 if (sip_debug_test_pvt(p))
2991 ast_verbose("Answering with non-codec capability %d\n", x);
2992 codec = ast_rtp_lookup_code(p->rtp, 0, x);
2994 snprintf(costr, sizeof(costr), " %d", codec);
2995 strncat(m, costr, sizeof(m) - strlen(m));
2996 snprintf(costr, sizeof(costr), "a=rtpmap:%d %s/8000\r\n", codec, ast_rtp_lookup_mime_subtype(0, x));
2997 strncat(a, costr, sizeof(a) - strlen(a));
2998 if (x == AST_RTP_DTMF) {
2999 /* Indicate we support DTMF... Not sure about 16, but MSN supports it so dang it, we will too... */
3000 snprintf(costr, sizeof costr, "a=fmtp:%d 0-16\r\n",
3002 strncat(a, costr, sizeof(a) - strlen(a));
3007 strncat(a, "a=silenceSupp:off - - - -\r\n", sizeof(a) - strlen(a));
3008 if (strlen(m) < sizeof(m) - 2)
3010 if (strlen(m2) < sizeof(m2) - 2)
3012 if ((sizeof(m) <= strlen(m) - 2) || (sizeof(m2) <= strlen(m2) - 2) || (sizeof(a) == strlen(a)) || (sizeof(a2) == strlen(a2)))
3013 ast_log(LOG_WARNING, "SIP SDP may be truncated due to undersized buffer!!\n");
3014 len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m) + strlen(a);
3015 if ((p->vrtp) && (p->jointcapability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
3016 len += strlen(m2) + strlen(a2);
3017 snprintf(costr, sizeof(costr), "%d", len);
3018 add_header(resp, "Content-Type", "application/sdp");
3019 add_header(resp, "Content-Length", costr);
3027 if ((p->vrtp) && (p->jointcapability & VIDEO_CODEC_MASK)) { /* only if video response is appropriate */
3034 static void copy_request(struct sip_request *dst,struct sip_request *src)
3038 offset = ((void *)dst) - ((void *)src);
3039 /* First copy stuff */
3040 memcpy(dst, src, sizeof(*dst));
3041 /* Now fix pointer arithmetic */