2 * Asterisk -- A telephony toolkit for Linux.
4 * Implementation of Session Initiation Protocol
6 * Copyright (C) 2004 - 2005, Digium, Inc.
8 * Mark Spencer <markster@digium.com>
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/config.h>
21 #include <asterisk/logger.h>
22 #include <asterisk/module.h>
23 #include <asterisk/pbx.h>
24 #include <asterisk/options.h>
25 #include <asterisk/lock.h>
26 #include <asterisk/sched.h>
27 #include <asterisk/io.h>
28 #include <asterisk/rtp.h>
29 #include <asterisk/acl.h>
30 #include <asterisk/manager.h>
31 #include <asterisk/callerid.h>
32 #include <asterisk/cli.h>
33 #include <asterisk/app.h>
34 #include <asterisk/musiconhold.h>
35 #include <asterisk/dsp.h>
36 #include <asterisk/features.h>
37 #include <asterisk/acl.h>
38 #include <asterisk/srv.h>
39 #include <asterisk/astdb.h>
40 #include <asterisk/causes.h>
41 #include <asterisk/utils.h>
42 #include <asterisk/file.h>
43 #include <asterisk/astobj.h>
45 #include <asterisk/astosp.h>
47 #include <sys/socket.h>
48 #include <sys/ioctl.h>
55 #include <arpa/inet.h>
57 #include <sys/signal.h>
58 #include <netinet/in_systm.h>
59 #include <netinet/ip.h>
62 #ifndef DEFAULT_USERAGENT
63 #define DEFAULT_USERAGENT "Asterisk PBX"
66 #define VIDEO_CODEC_MASK 0x1fc0000 /* Video codecs from H.261 thru AST_FORMAT_MAX_VIDEO */
68 #define IPTOS_MINCOST 0x02
71 /* #define VOCAL_DATA_HACK */
74 #define DEFAULT_DEFAULT_EXPIRY 120
75 #define DEFAULT_MAX_EXPIRY 3600
76 #define DEFAULT_REGISTRATION_TIMEOUT 20
78 /* guard limit must be larger than guard secs */
79 /* guard min must be < 1000, and should be >= 250 */
80 #define EXPIRY_GUARD_SECS 15 /* How long before expiry do we reregister */
81 #define EXPIRY_GUARD_LIMIT 30 /* Below here, we use EXPIRY_GUARD_PCT instead of
83 #define EXPIRY_GUARD_MIN 500 /* This is the minimum guard time applied. If
84 GUARD_PCT turns out to be lower than this, it
85 will use this time instead.
86 This is in milliseconds. */
87 #define EXPIRY_GUARD_PCT 0.20 /* Percentage of expires timeout to use when
88 below EXPIRY_GUARD_LIMIT */
90 static int max_expiry = DEFAULT_MAX_EXPIRY;
91 static int default_expiry = DEFAULT_DEFAULT_EXPIRY;
94 #define MAX(a,b) ((a) > (b) ? (a) : (b))
97 #define CALLERID_UNKNOWN "Unknown"
101 #define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
102 #define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
103 #define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
105 #define DEFAULT_RETRANS 1000 /* How frequently to retransmit */
106 #define MAX_RETRANS 5 /* Try only 5 times for retransmissions */
109 #define DEBUG_READ 0 /* Recieved data */
110 #define DEBUG_SEND 1 /* Transmit data */
112 static const char desc[] = "Session Initiation Protocol (SIP)";
113 static const char channeltype[] = "SIP";
114 static const char config[] = "sip.conf";
115 static const char notify_config[] = "sip_notify.conf";
117 #define SIP_REGISTER 1
118 #define SIP_OPTIONS 2
125 #define SIP_SUBSCRIBE 9
126 #define SIP_MESSAGE 10
127 #define SIP_UPDATE 11
129 #define SIP_CANCEL 13
130 #define SIP_PUBLISH 14
131 #define SIP_RESPONSE 100
133 const struct cfsip_methods {
138 { SIP_REGISTER, "REGISTER" },
139 { SIP_OPTIONS, "OPTIONS" },
140 { SIP_NOTIFY, "NOTIFY" },
141 { SIP_INVITE, "INVITE" },
143 { SIP_PRACK, "PRACK" },
145 { SIP_REFER, "REFER" },
146 { SIP_SUBSCRIBE,"SUBSCRIBE" },
147 { SIP_MESSAGE, "MESSAGE" },
148 { SIP_UPDATE, "UPDATE" },
149 { SIP_INFO, "INFO" },
150 { SIP_CANCEL, "CANCEL" },
151 { SIP_PUBLISH, "PUBLISH" }
155 #define DEFAULT_SIP_PORT 5060 /* From RFC 2543 */
156 #define SIP_MAX_PACKET 4096 /* Also from RFC 2543, should sub headers tho */
158 #define ALLOWED_METHODS "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER"
160 static char default_useragent[AST_MAX_EXTENSION] = DEFAULT_USERAGENT;
162 #define DEFAULT_CONTEXT "default"
163 static char default_context[AST_MAX_EXTENSION] = DEFAULT_CONTEXT;
165 static char default_language[MAX_LANGUAGE] = "";
167 #define DEFAULT_CALLERID "asterisk"
168 static char default_callerid[AST_MAX_EXTENSION] = DEFAULT_CALLERID;
170 static char default_fromdomain[AST_MAX_EXTENSION] = "";
172 #define DEFAULT_NOTIFYMIME "application/simple-message-summary"
173 static char default_notifymime[AST_MAX_EXTENSION] = DEFAULT_NOTIFYMIME;
176 static int default_qualify = 0; /* Default Qualify= setting */
178 static struct ast_flags global_flags = {0}; /* global SIP_ flags */
179 static struct ast_flags global_flags_page2 = {0}; /* more global SIP_ flags */
181 static int srvlookup = 0; /* SRV Lookup on or off. Default is off, RFC behavior is on */
183 static int pedanticsipchecking = 0; /* Extra checking ? Default off */
185 static int autocreatepeer = 0; /* Auto creation of peers at registration? Default off. */
187 static int relaxdtmf = 0;
189 static int global_rtptimeout = 0;
191 static int global_rtpholdtimeout = 0;
193 static int global_rtpkeepalive = 0;
195 static int global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT;
197 /* Object counters */
198 static int suserobjs = 0;
199 static int ruserobjs = 0;
200 static int speerobjs = 0;
201 static int rpeerobjs = 0;
202 static int apeerobjs = 0;
203 static int regobjs = 0;
205 static int global_allowguest = 1; /* allow unauthenticated users/peers to connect? */
207 #define DEFAULT_MWITIME 10
208 static int global_mwitime = DEFAULT_MWITIME; /* Time between MWI checks for peers */
210 static int usecnt =0;
211 AST_MUTEX_DEFINE_STATIC(usecnt_lock);
214 /* Protect the interface list (of sip_pvt's) */
215 AST_MUTEX_DEFINE_STATIC(iflock);
217 /* Protect the monitoring thread, so only one process can kill or start it, and not
218 when it's doing something critical. */
219 AST_MUTEX_DEFINE_STATIC(netlock);
221 AST_MUTEX_DEFINE_STATIC(monlock);
223 /* This is the thread for the monitor which checks for input on the channels
224 which are not currently in use. */
225 static pthread_t monitor_thread = AST_PTHREADT_NULL;
227 static int restart_monitor(void);
229 /* Codecs that we support by default: */
230 static int global_capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263;
231 static int noncodeccapability = AST_RTP_DTMF;
233 static struct in_addr __ourip;
234 static struct sockaddr_in outboundproxyip;
237 static int sipdebug = 0;
238 static struct sockaddr_in debugaddr;
242 static int videosupport = 0;
244 static int compactheaders = 0; /* send compact sip headers */
246 static int recordhistory = 0; /* Record SIP history. Off by default */
248 static char global_musicclass[MAX_LANGUAGE] = ""; /* Global music on hold class */
249 #define DEFAULT_REALM "asterisk"
250 static char global_realm[AST_MAX_EXTENSION] = DEFAULT_REALM; /* Default realm */
251 static char regcontext[AST_MAX_EXTENSION] = ""; /* Context for auto-extensions */
254 #define DEFAULT_EXPIRY 900
255 static int expiry = DEFAULT_EXPIRY;
257 static struct sched_context *sched;
258 static struct io_context *io;
259 /* The private structures of the sip channels are linked for
260 selecting outgoing channels */
262 #define SIP_MAX_HEADERS 64
263 #define SIP_MAX_LINES 64
267 #define DEC_OUT_USE 2
268 #define INC_OUT_USE 3
270 static struct ast_codec_pref prefs;
273 /* sip_request: The data grabbed from the UDP socket */
275 char *rlPart1; /* SIP Method Name or "SIP/2.0" protocol version */
276 char *rlPart2; /* The Request URI or Response Status */
277 int len; /* Length */
278 int headers; /* # of SIP Headers */
279 int method; /* Method of this request */
280 char *header[SIP_MAX_HEADERS];
281 int lines; /* SDP Content */
282 char *line[SIP_MAX_LINES];
283 char data[SIP_MAX_PACKET];
289 struct sip_route *next;
293 /* sip_history: Structure for saving transactions within a SIP dialog */
296 struct sip_history *next;
299 /* sip_auth: Creadentials for authentication to other SIP services */
301 char realm[AST_MAX_EXTENSION]; /* Realm in which these credentials are valid */
302 char username[256]; /* Username */
303 char secret[256]; /* Secret */
304 char md5secret[256]; /* MD5Secret */
305 struct sip_auth *next; /* Next auth structure in list */
308 #define SIP_ALREADYGONE (1 << 0) /* Whether or not we've already been destroyed by our peer */
309 #define SIP_NEEDDESTROY (1 << 1) /* if we need to be destroyed */
310 #define SIP_NOVIDEO (1 << 2) /* Didn't get video in invite, don't offer */
311 #define SIP_RINGING (1 << 3) /* Have sent 180 ringing */
312 #define SIP_PROGRESS_SENT (1 << 4) /* Have sent 183 message progress */
313 #define SIP_NEEDREINVITE (1 << 5) /* Do we need to send another reinvite? */
314 #define SIP_PENDINGBYE (1 << 6) /* Need to send bye after we ack? */
315 #define SIP_GOTREFER (1 << 7) /* Got a refer? */
316 #define SIP_PROMISCREDIR (1 << 8) /* Promiscuous redirection */
317 #define SIP_TRUSTRPID (1 << 9) /* Trust RPID headers? */
318 #define SIP_USEREQPHONE (1 << 10) /* Add user=phone to numeric URI. Default off */
319 #define SIP_REALTIME (1 << 11) /* Flag for realtime users */
320 #define SIP_USECLIENTCODE (1 << 12) /* Trust X-ClientCode info message */
321 #define SIP_OUTGOING (1 << 13) /* Is this an outgoing call? */
322 #define SIP_SELFDESTRUCT (1 << 14)
323 #define SIP_DYNAMIC (1 << 15) /* Is this a dynamic peer? */
324 /* --- Choices for DTMF support in SIP channel */
325 #define SIP_DTMF (3 << 16) /* three settings, uses two bits */
326 #define SIP_DTMF_RFC2833 (0 << 16) /* RTP DTMF */
327 #define SIP_DTMF_INBAND (1 << 16) /* Inband audio, only for ULAW/ALAW */
328 #define SIP_DTMF_INFO (2 << 16) /* SIP Info messages */
330 #define SIP_NAT (3 << 18) /* four settings, uses two bits */
331 #define SIP_NAT_NEVER (0 << 18) /* No nat support */
332 #define SIP_NAT_RFC3581 (1 << 18)
333 #define SIP_NAT_ROUTE (2 << 18)
334 #define SIP_NAT_ALWAYS (3 << 18)
335 /* re-INVITE related settings */
336 #define SIP_REINVITE (3 << 20) /* two bits used */
337 #define SIP_CAN_REINVITE (1 << 20) /* allow peers to be reinvited to send media directly p2p */
338 #define SIP_REINVITE_UPDATE (2 << 20) /* use UPDATE (RFC3311) when reinviting this peer */
339 /* "insecure" settings */
340 #define SIP_INSECURE (3 << 22) /* three settings, uses two bits */
341 #define SIP_SECURE (0 << 22)
342 #define SIP_INSECURE_NORMAL (1 << 22)
343 #define SIP_INSECURE_VERY (2 << 22)
344 /* Sending PROGRESS in-band settings */
345 #define SIP_PROG_INBAND (3 << 24) /* three settings, uses two bits */
346 #define SIP_PROG_INBAND_NEVER (0 << 24)
347 #define SIP_PROG_INBAND_NO (1 << 24)
348 #define SIP_PROG_INBAND_YES (2 << 24)
349 /* Open Settlement Protocol authentication */
350 #define SIP_OSPAUTH (3 << 26) /* three settings, uses two bits */
351 #define SIP_OSPAUTH_NO (0 << 26)
352 #define SIP_OSPAUTH_YES (1 << 26)
353 #define SIP_OSPAUTH_EXCLUSIVE (2 << 26)
355 #define SIP_CALL_ONHOLD (1 << 28)
356 #define SIP_CALL_LIMIT (1 << 29)
358 /* a new page of flags for peer */
359 #define SIP_PAGE2_RTCACHEFRIENDS (1 << 0)
360 #define SIP_PAGE2_RTNOUPDATE (1 << 1)
361 #define SIP_PAGE2_RTAUTOCLEAR (1 << 2)
363 static int global_rtautoclear = 120;
365 /* sip_pvt: PVT structures are used for each SIP conversation, ie. a call */
366 static struct sip_pvt {
367 ast_mutex_t lock; /* Channel private lock */
368 int method; /* SIP method of this packet */
369 char callid[80]; /* Global CallID */
370 char randdata[80]; /* Random data */
371 struct ast_codec_pref prefs; /* codec prefs */
372 unsigned int ocseq; /* Current outgoing seqno */
373 unsigned int icseq; /* Current incoming seqno */
374 ast_group_t callgroup; /* Call group */
375 ast_group_t pickupgroup; /* Pickup group */
376 int lastinvite; /* Last Cseq of invite */
377 unsigned int flags; /* SIP_ flags */
378 int capability; /* Special capability (codec) */
379 int jointcapability; /* Supported capability at both ends (codecs ) */
380 int peercapability; /* Supported peer capability */
381 int prefcodec; /* Preferred codec (outbound only) */
382 int noncodeccapability;
383 int callingpres; /* Calling presentation */
384 int authtries; /* Times we've tried to authenticate */
385 int expiry; /* How long we take to expire */
386 int branch; /* One random number */
387 int tag; /* Another random number */
388 int sessionid; /* SDP Session ID */
389 int sessionversion; /* SDP Session Version */
390 struct sockaddr_in sa; /* Our peer */
391 struct sockaddr_in redirip; /* Where our RTP should be going if not to us */
392 struct sockaddr_in vredirip; /* Where our Video RTP should be going if not to us */
393 int redircodecs; /* Redirect codecs */
394 struct sockaddr_in recv; /* Received as */
395 struct in_addr ourip; /* Our IP */
396 struct ast_channel *owner; /* Who owns us */
397 char exten[AST_MAX_EXTENSION]; /* Extension where to start */
398 char refer_to[AST_MAX_EXTENSION]; /* Place to store REFER-TO extension */
399 char referred_by[AST_MAX_EXTENSION]; /* Place to store REFERRED-BY extension */
400 char refer_contact[AST_MAX_EXTENSION]; /* Place to store Contact info from a REFER extension */
401 struct sip_pvt *refer_call; /* Call we are referring */
402 struct sip_route *route; /* Head of linked list of routing steps (fm Record-Route) */
403 int route_persistant; /* Is this the "real" route? */
404 char from[256]; /* The From: header */
405 char useragent[256]; /* User agent in SIP request */
406 char context[AST_MAX_EXTENSION]; /* Context for this call */
407 char fromdomain[AST_MAX_EXTENSION]; /* Domain to show in the from field */
408 char fromuser[AST_MAX_EXTENSION]; /* User to show in the user field */
409 char fromname[AST_MAX_EXTENSION]; /* Name to show in the user field */
410 char tohost[AST_MAX_EXTENSION]; /* Host we should put in the "to" field */
411 char language[MAX_LANGUAGE]; /* Default language for this call */
412 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
413 char rdnis[256]; /* Referring DNIS */
414 char theirtag[256]; /* Their tag */
415 char username[256]; /* [user] name */
416 char peername[256]; /* [peer] name, not set if [user] */
417 char authname[256]; /* Who we use for authentication */
418 char uri[256]; /* Original requested URI */
419 char okcontacturi[256]; /* URI from the 200 OK on INVITE */
420 char peersecret[256]; /* Password */
421 char peermd5secret[256];
422 struct sip_auth *peerauth; /* Realm authentication */
423 char cid_num[256]; /* Caller*ID */
424 char cid_name[256]; /* Caller*ID */
425 char via[256]; /* Via: header */
426 char fullcontact[128]; /* The Contact: that the UA registers with us */
427 char accountcode[20]; /* Account code */
428 char our_contact[256]; /* Our contact header */
429 char realm[256]; /* Authorization realm */
430 char nonce[256]; /* Authorization nonce */
431 char opaque[256]; /* Opaque nonsense */
432 char qop[80]; /* Quality of Protection, since SIP wasn't complicated enough yet. */
433 char domain[256]; /* Authorization domain */
434 char lastmsg[256]; /* Last Message sent/received */
435 int amaflags; /* AMA Flags */
436 int pendinginvite; /* Any pending invite */
438 int osphandle; /* OSP Handle for call */
439 time_t ospstart; /* OSP Start time */
441 struct sip_request initreq; /* Initial request */
443 int maxtime; /* Max time for first response */
444 int maxforwards; /* keep the max-forwards info */
445 int initid; /* Auto-congest ID if appropriate */
446 int autokillid; /* Auto-kill ID */
447 time_t lastrtprx; /* Last RTP received */
448 time_t lastrtptx; /* Last RTP sent */
449 int rtptimeout; /* RTP timeout time */
450 int rtpholdtimeout; /* RTP timeout when on hold */
451 int rtpkeepalive; /* Send RTP packets for keepalive */
453 int subscribed; /* Is this call a subscription? */
457 struct ast_dsp *vad; /* Voice Activation Detection dsp */
459 struct sip_peer *peerpoke; /* If this calls is to poke a peer, which one */
460 struct sip_registry *registry; /* If this is a REGISTER call, to which registry */
461 struct ast_rtp *rtp; /* RTP Session */
462 struct ast_rtp *vrtp; /* Video RTP session */
463 struct sip_pkt *packets; /* Packets scheduled for re-transmission */
464 struct sip_history *history; /* History of this SIP dialog */
465 struct ast_variable *chanvars; /* Channel variables to set for call */
466 struct sip_pvt *next; /* Next call in chain */
469 #define FLAG_RESPONSE (1 << 0)
470 #define FLAG_FATAL (1 << 1)
472 /* sip packet - read in sipsock_read, transmitted in send_request */
474 struct sip_pkt *next; /* Next packet */
475 int retrans; /* Retransmission number */
476 int seqno; /* Sequence number */
477 unsigned int flags; /* non-zero if this is a response packet (e.g. 200 OK) */
478 struct sip_pvt *owner; /* Owner call */
479 int retransid; /* Retransmission ID */
480 int packetlen; /* Length of packet */
484 /* Structure for SIP user data. User's place calls to us */
486 /* Users who can access various contexts */
487 ASTOBJ_COMPONENTS(struct sip_user);
488 char secret[80]; /* Password */
489 char md5secret[80]; /* Password in md5 */
490 char context[80]; /* Default context for incoming calls */
491 char cid_num[80]; /* Caller ID num */
492 char cid_name[80]; /* Caller ID name */
493 char accountcode[20]; /* Account code */
494 char language[MAX_LANGUAGE]; /* Default language for this user */
495 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
496 char useragent[256]; /* User agent in SIP request */
497 struct ast_codec_pref prefs; /* codec prefs */
498 ast_group_t callgroup; /* Call group */
499 ast_group_t pickupgroup; /* Pickup Group */
500 unsigned int flags; /* SIP_ flags */
501 int amaflags; /* AMA flags for billing */
502 int callingpres; /* Calling id presentation */
503 int capability; /* Codec capability */
504 int inUse; /* Number of calls in use */
505 int incominglimit; /* Limit of incoming calls */
506 int outUse; /* disabled */
507 int outgoinglimit; /* disabled */
508 struct ast_ha *ha; /* ACL setting */
509 struct ast_variable *chanvars; /* Variables to set for channel created by user */
512 /* Structure for SIP peer data, we place calls to peers if registred or fixed IP address (host) */
514 ASTOBJ_COMPONENTS(struct sip_peer); /* name, refcount, objflags, object pointers */
515 /* peer->name is the unique name of this object */
516 char secret[80]; /* Password */
517 char md5secret[80]; /* Password in MD5 */
518 struct sip_auth *auth; /* Realm authentication list */
519 char context[80]; /* Default context for incoming calls */
520 char username[80]; /* Temporary username until registration */
521 char accountcode[20]; /* Account code */
522 int amaflags; /* AMA Flags (for billing) */
523 char tohost[80]; /* If not dynamic, IP address */
524 char regexten[AST_MAX_EXTENSION]; /* Extension to register (if regcontext is used) */
525 char fromuser[80]; /* From: user when calling this peer */
526 char fromdomain[80]; /* From: domain when calling this peer */
527 char fullcontact[128]; /* Contact registred with us (not in sip.conf) */
528 char cid_num[80]; /* Caller ID num */
529 char cid_name[80]; /* Caller ID name */
530 int callingpres; /* Calling id presentation */
531 int inUse; /* Number of calls in use */
532 int incominglimit; /* Limit of incoming calls */
533 int outUse; /* disabled */
534 int outgoinglimit; /* disabled */
535 char mailbox[AST_MAX_EXTENSION]; /* Mailbox setting for MWI checks */
536 char language[MAX_LANGUAGE]; /* Default language for prompts */
537 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
538 char useragent[256]; /* User agent in SIP request (saved from registration) */
539 struct ast_codec_pref prefs; /* codec prefs */
541 time_t lastmsgcheck; /* Last time we checked for MWI */
542 unsigned int flags; /* SIP_ flags */
543 struct ast_flags flags_page2; /* SIP_PAGE2 flags */
544 int expire; /* When to expire this peer registration */
545 int expiry; /* Duration of registration */
546 int capability; /* Codec capability */
547 int rtptimeout; /* RTP timeout */
548 int rtpholdtimeout; /* RTP Hold Timeout */
549 int rtpkeepalive; /* Send RTP packets for keepalive */
550 ast_group_t callgroup; /* Call group */
551 ast_group_t pickupgroup; /* Pickup group */
552 struct sockaddr_in addr; /* IP address of peer */
556 struct sip_pvt *call; /* Call pointer */
557 int pokeexpire; /* When to expire poke (qualify= checking) */
558 int lastms; /* How long last response took (in ms), or -1 for no response */
559 int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
560 struct timeval ps; /* Ping send time */
562 struct sockaddr_in defaddr; /* Default IP address, used until registration */
563 struct ast_ha *ha; /* Access control list */
564 struct ast_variable *chanvars; /* Variables to set for channel created by user */
568 AST_MUTEX_DEFINE_STATIC(sip_reload_lock);
569 static int sip_reloading = 0;
571 /* States for outbound registrations (with register= lines in sip.conf */
572 #define REG_STATE_UNREGISTERED 0
573 #define REG_STATE_REGSENT 1
574 #define REG_STATE_AUTHSENT 2
575 #define REG_STATE_REGISTERED 3
576 #define REG_STATE_REJECTED 4
577 #define REG_STATE_TIMEOUT 5
578 #define REG_STATE_NOAUTH 6
581 /* sip_registry: Registrations with other SIP proxies */
582 struct sip_registry {
583 ASTOBJ_COMPONENTS_FULL(struct sip_registry,1,1);
584 int portno; /* Optional port override */
585 char username[80]; /* Who we are registering as */
586 char authuser[80]; /* Who we *authenticate* as */
587 char hostname[80]; /* Domain or host we register to */
588 char secret[80]; /* Password or key name in []'s */
590 char contact[80]; /* Contact extension */
592 int expire; /* Sched ID of expiration */
593 int timeout; /* sched id of sip_reg_timeout */
594 int refresh; /* How often to refresh */
595 struct sip_pvt *call; /* create a sip_pvt structure for each outbound "registration call" in progress */
596 int regstate; /* Registration state (see above) */
597 int callid_valid; /* 0 means we haven't chosen callid for this registry yet. */
598 char callid[80]; /* Global CallID for this registry */
599 unsigned int ocseq; /* Sequence number we got to for REGISTERs for this registry */
600 struct sockaddr_in us; /* Who the server thinks we are */
603 char realm[256]; /* Authorization realm */
604 char nonce[256]; /* Authorization nonce */
605 char domain[256]; /* Authorization domain */
606 char opaque[256]; /* Opaque nonsense */
607 char qop[80]; /* Quality of Protection. */
609 char lastmsg[256]; /* Last Message sent/received */
612 /*--- The user list: Users and friends ---*/
613 static struct ast_user_list {
614 ASTOBJ_CONTAINER_COMPONENTS(struct sip_user);
617 /*--- The peer list: Peers and Friends ---*/
618 static struct ast_peer_list {
619 ASTOBJ_CONTAINER_COMPONENTS(struct sip_peer);
622 /*--- The register list: Other SIP proxys we register with and call ---*/
623 static struct ast_register_list {
624 ASTOBJ_CONTAINER_COMPONENTS(struct sip_registry);
629 static int __sip_do_register(struct sip_registry *r);
631 static int sipsock = -1;
634 static struct sockaddr_in bindaddr;
635 static struct sockaddr_in externip;
636 static char externhost[256] = "";
637 static time_t externexpire = 0;
638 static int externrefresh = 10;
639 static struct ast_ha *localaddr;
641 /* The list of manual NOTIFY types we know how to send */
642 struct ast_config *notify_types;
644 static struct sip_auth *authl; /* Authentication list */
647 static struct ast_frame *sip_read(struct ast_channel *ast);
648 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req);
649 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
650 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *rand, int reliable, char *header);
651 static int transmit_request(struct sip_pvt *p, int sipmethod, int inc, int reliable, int newbranch);
652 static int transmit_request_with_auth(struct sip_pvt *p, int sipmethod, int inc, int reliable, int newbranch);
653 static int transmit_invite(struct sip_pvt *p, int sipmethod, int sendsdp, char *auth, char *authheader, char *vxml_url, char *distinctive_ring, char *osptoken, int addsipheaders, int init);
654 static int transmit_reinvite_with_sdp(struct sip_pvt *p);
655 static int transmit_info_with_digit(struct sip_pvt *p, char digit);
656 static int transmit_message_with_text(struct sip_pvt *p, char *text);
657 static int transmit_refer(struct sip_pvt *p, char *dest);
658 static int sip_sipredirect(struct sip_pvt *p, char *dest);
659 static struct sip_peer *temp_peer(char *name);
660 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req, char *header, char *respheader, int sipmethod, int init);
661 static void free_old_route(struct sip_route *route);
662 static int build_reply_digest(struct sip_pvt *p, int method, char *digest, int digest_len);
663 static int update_user_counter(struct sip_pvt *fup, int event);
664 static void prune_peers(void);
665 static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int realtime);
666 static struct sip_user *build_user(const char *name, struct ast_variable *v, int realtime);
667 static int sip_do_reload(void);
668 static int expire_register(void *data);
669 static int callevents = 0;
671 static struct ast_channel *sip_request(const char *type, int format, void *data, int *cause);
672 static int sip_devicestate(void *data);
673 static int sip_sendtext(struct ast_channel *ast, char *text);
674 static int sip_call(struct ast_channel *ast, char *dest, int timeout);
675 static int sip_hangup(struct ast_channel *ast);
676 static int sip_answer(struct ast_channel *ast);
677 static struct ast_frame *sip_read(struct ast_channel *ast);
678 static int sip_write(struct ast_channel *ast, struct ast_frame *frame);
679 static int sip_indicate(struct ast_channel *ast, int condition);
680 static int sip_transfer(struct ast_channel *ast, char *dest);
681 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
682 static int sip_senddigit(struct ast_channel *ast, char digit);
683 static int sip_sendtext(struct ast_channel *ast, char *text);
684 static int clear_realm_authentication(struct sip_auth *authlist); /* Clear realm authentication list (at reload) */
685 static struct sip_auth *add_realm_authentication(struct sip_auth *authlist, char *configuration, int lineno); /* Add realm authentication in list */
686 static struct sip_auth *find_realm_authentication(struct sip_auth *authlist, char *realm); /* Find authentication for a specific realm */
688 /* Definition of this channel for channel registration */
689 static const struct ast_channel_tech sip_tech = {
691 .description = "Session Initiation Protocol (SIP)",
692 .capabilities = ((AST_FORMAT_MAX_AUDIO << 1) - 1),
693 .properties = AST_CHAN_TP_WANTSJITTER,
694 .requester = sip_request,
695 .devicestate = sip_devicestate,
697 .hangup = sip_hangup,
698 .answer = sip_answer,
701 .write_video = sip_write,
702 .indicate = sip_indicate,
703 .transfer = sip_transfer,
705 .send_digit = sip_senddigit,
706 .bridge = ast_rtp_bridge,
707 .send_text = sip_sendtext,
710 /*--- find_sip_method: Find SIP method from header */
711 int find_sip_method(char *msg)
714 /* Strictly speaking, SIP methods are case SENSITIVE, but we don't check */
715 for (i=1;(i < (sizeof(sip_methods) / sizeof(sip_methods[0]))) && !res; i++) {
716 if (!strcasecmp(sip_methods[i].text, msg))
717 res = sip_methods[i].id;
722 /*--- sip_debug_test_addr: See if we pass debug IP filter */
723 static inline int sip_debug_test_addr(struct sockaddr_in *addr)
727 if (debugaddr.sin_addr.s_addr) {
728 if (((ntohs(debugaddr.sin_port) != 0)
729 && (debugaddr.sin_port != addr->sin_port))
730 || (debugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
736 /*--- sip_debug_test_pvt: Test PVT for debugging output */
737 static inline int sip_debug_test_pvt(struct sip_pvt *p)
741 return sip_debug_test_addr(((ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE) ? &p->recv : &p->sa));
745 /*--- __sip_xmit: Transmit SIP message ---*/
746 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
749 char iabuf[INET_ADDRSTRLEN];
750 if (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)
751 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->recv, sizeof(struct sockaddr_in));
753 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->sa, sizeof(struct sockaddr_in));
755 ast_log(LOG_WARNING, "sip_xmit of %p (len %d) to %s returned %d: %s\n", data, len, ast_inet_ntoa(iabuf, sizeof(iabuf), p->sa.sin_addr), res, strerror(errno));
760 static void sip_destroy(struct sip_pvt *p);
762 /*--- build_via: Build a Via header for a request ---*/
763 static void build_via(struct sip_pvt *p, char *buf, int len)
765 char iabuf[INET_ADDRSTRLEN];
767 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
768 if (ast_test_flag(p, SIP_NAT) != SIP_NAT_NEVER)
769 snprintf(buf, len, "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x;rport", ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ourport, p->branch);
770 else /* Work around buggy UNIDEN UIP200 firmware */
771 snprintf(buf, len, "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ourport, p->branch);
774 /*--- ast_sip_ouraddrfor: NAT fix - decide which IP address to use for ASterisk server? ---*/
775 /* Only used for outbound registrations */
776 static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
779 * Using the localaddr structure built up with localnet statements
780 * apply it to their address to see if we need to substitute our
781 * externip or can get away with our internal bindaddr
783 struct sockaddr_in theirs;
784 theirs.sin_addr = *them;
785 if (localaddr && externip.sin_addr.s_addr &&
786 ast_apply_ha(localaddr, &theirs)) {
787 char iabuf[INET_ADDRSTRLEN];
788 if (externexpire && (time(NULL) >= externexpire)) {
789 struct ast_hostent ahp;
792 externexpire += externrefresh;
793 if ((hp = ast_gethostbyname(externhost, &ahp))) {
794 memcpy(&externip.sin_addr, hp->h_addr, sizeof(externip.sin_addr));
796 ast_log(LOG_NOTICE, "Warning: Re-lookup of '%s' failed!\n", externhost);
798 memcpy(us, &externip.sin_addr, sizeof(struct in_addr));
799 ast_inet_ntoa(iabuf, sizeof(iabuf), *(struct in_addr *)&them->s_addr);
800 ast_log(LOG_DEBUG, "Target address %s is not local, substituting externip\n", iabuf);
802 else if (bindaddr.sin_addr.s_addr)
803 memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr));
805 return ast_ouraddrfor(them, us);
809 /*--- append_history: Append to SIP dialog history */
810 static int append_history(struct sip_pvt *p, char *event, char *data)
812 struct sip_history *hist, *prev;
816 hist = malloc(sizeof(struct sip_history));
818 memset(hist, 0, sizeof(struct sip_history));
819 snprintf(hist->event, sizeof(hist->event), "%-15s %s", event, data);
823 if ((*c == '\r') || (*c == '\n')) {
829 /* Enqueue into history */
842 /*--- retrans_pkt: Retransmit SIP message if no answer ---*/
843 static int retrans_pkt(void *data)
845 struct sip_pkt *pkt=data, *prev, *cur;
847 char iabuf[INET_ADDRSTRLEN];
848 ast_mutex_lock(&pkt->owner->lock);
849 if (pkt->retrans < MAX_RETRANS) {
851 if (sip_debug_test_pvt(pkt->owner)) {
852 if (ast_test_flag(pkt->owner, SIP_NAT) & SIP_NAT_ROUTE)
853 ast_verbose("Retransmitting #%d (NAT) to %s:%d:\n%s\n---\n", pkt->retrans, ast_inet_ntoa(iabuf, sizeof(iabuf), pkt->owner->recv.sin_addr), ntohs(pkt->owner->recv.sin_port), pkt->data);
855 ast_verbose("Retransmitting #%d (no NAT) to %s:%d:\n%s\n---\n", pkt->retrans, ast_inet_ntoa(iabuf, sizeof(iabuf), pkt->owner->sa.sin_addr), ntohs(pkt->owner->sa.sin_port), pkt->data);
857 append_history(pkt->owner, "ReTx", pkt->data);
858 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
861 ast_log(LOG_WARNING, "Maximum retries exceeded on call %s for seqno %d (%s %s)\n", pkt->owner->callid, pkt->seqno, (ast_test_flag(pkt, FLAG_FATAL)) ? "Critical" : "Non-critical", (ast_test_flag(pkt, FLAG_RESPONSE)) ? "Response" : "Request");
862 append_history(pkt->owner, "MaxRetries", (ast_test_flag(pkt, FLAG_FATAL)) ? "(Critical)" : "(Non-critical)");
864 if (ast_test_flag(pkt, FLAG_FATAL)) {
865 while(pkt->owner->owner && ast_mutex_trylock(&pkt->owner->owner->lock)) {
866 ast_mutex_unlock(&pkt->owner->lock);
868 ast_mutex_lock(&pkt->owner->lock);
870 if (pkt->owner->owner) {
871 ast_set_flag(pkt->owner, SIP_ALREADYGONE);
872 ast_queue_hangup(pkt->owner->owner);
873 ast_mutex_unlock(&pkt->owner->owner->lock);
875 /* If no owner, destroy now */
876 ast_set_flag(pkt->owner, SIP_NEEDDESTROY);
879 /* In any case, go ahead and remove the packet */
881 cur = pkt->owner->packets;
890 prev->next = cur->next;
892 pkt->owner->packets = cur->next;
893 ast_mutex_unlock(&pkt->owner->lock);
897 ast_log(LOG_WARNING, "Weird, couldn't find packet owner!\n");
900 ast_mutex_unlock(&pkt->owner->lock);
904 /*--- __sip_reliable_xmit: transmit packet with retransmits ---*/
905 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len, int fatal)
908 pkt = malloc(sizeof(struct sip_pkt) + len + 1);
911 memset(pkt, 0, sizeof(struct sip_pkt));
912 memcpy(pkt->data, data, len);
913 pkt->packetlen = len;
914 pkt->next = p->packets;
918 pkt->data[len] = '\0';
920 ast_set_flag(pkt, FLAG_FATAL);
921 /* Schedule retransmission */
922 pkt->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, pkt);
923 pkt->next = p->packets;
925 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
926 if (!strncasecmp(pkt->data, "INVITE", 6)) {
927 /* Note this is a pending invite */
928 p->pendinginvite = seqno;
933 /*--- __sip_autodestruct: Kill a call (called by scheduler) ---*/
934 static int __sip_autodestruct(void *data)
936 struct sip_pvt *p = data;
938 ast_log(LOG_DEBUG, "Auto destroying call '%s'\n", p->callid);
939 append_history(p, "AutoDestroy", "");
941 ast_log(LOG_WARNING, "Autodestruct on call '%s' with owner in place\n", p->callid);
942 ast_queue_hangup(p->owner);
949 /*--- sip_scheddestroy: Schedule destruction of SIP call ---*/
950 static int sip_scheddestroy(struct sip_pvt *p, int ms)
953 if (sip_debug_test_pvt(p))
954 ast_verbose("Scheduling destruction of call '%s' in %d ms\n", p->callid, ms);
956 snprintf(tmp, sizeof(tmp), "%d ms", ms);
957 append_history(p, "SchedDestroy", tmp);
959 if (p->autokillid > -1)
960 ast_sched_del(sched, p->autokillid);
961 p->autokillid = ast_sched_add(sched, ms, __sip_autodestruct, p);
965 /*--- sip_cancel_destroy: Cancel destruction of SIP call ---*/
966 static int sip_cancel_destroy(struct sip_pvt *p)
968 if (p->autokillid > -1)
969 ast_sched_del(sched, p->autokillid);
970 append_history(p, "CancelDestroy", "");
975 /*--- __sip_ack: Acknowledges receipt of a packet and stops retransmission ---*/
976 static int __sip_ack(struct sip_pvt *p, int seqno, int resp, int sipmethod)
978 struct sip_pkt *cur, *prev = NULL;
981 /* Just in case... */
985 msg = sip_methods[sipmethod].text;
990 if ((cur->seqno == seqno) && ((ast_test_flag(cur, FLAG_RESPONSE)) == resp) &&
991 ((ast_test_flag(cur, FLAG_RESPONSE)) ||
992 (!strncasecmp(msg, cur->data, strlen(msg)) && (cur->data[strlen(msg)] < 33)))) {
993 if (!resp && (seqno == p->pendinginvite)) {
994 ast_log(LOG_DEBUG, "Acked pending invite %d\n", p->pendinginvite);
995 p->pendinginvite = 0;
998 /* this is our baby */
1000 prev->next = cur->next;
1002 p->packets = cur->next;
1003 if (cur->retransid > -1)
1004 ast_sched_del(sched, cur->retransid);
1012 ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
1016 /* Pretend to ack all packets */
1017 static int __sip_pretend_ack(struct sip_pvt *p)
1021 __sip_ack(p, p->packets->seqno, (ast_test_flag(p->packets, FLAG_RESPONSE)), find_sip_method(p->packets->data));
1026 /*--- __sip_semi_ack: Acks receipt of packet, keep it around (used for provisional responses) ---*/
1027 static int __sip_semi_ack(struct sip_pvt *p, int seqno, int resp, int sipmethod)
1029 struct sip_pkt *cur;
1031 char *msg = sip_methods[sipmethod].text;
1035 if ((cur->seqno == seqno) && ((ast_test_flag(cur, FLAG_RESPONSE)) == resp) &&
1036 ((ast_test_flag(cur, FLAG_RESPONSE)) ||
1037 (!strncasecmp(msg, cur->data, strlen(msg)) && (cur->data[strlen(msg)] < 33)))) {
1038 /* this is our baby */
1039 if (cur->retransid > -1)
1040 ast_sched_del(sched, cur->retransid);
1041 cur->retransid = -1;
1047 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");
1051 static void parse(struct sip_request *req);
1052 static char *get_header(struct sip_request *req, char *name);
1053 static void copy_request(struct sip_request *dst,struct sip_request *src);
1055 static void parse_copy(struct sip_request *dst, struct sip_request *src)
1057 memset(dst, 0, sizeof(*dst));
1058 memcpy(dst->data, src->data, sizeof(dst->data));
1059 dst->len = src->len;
1062 /*--- send_response: Transmit response on SIP request---*/
1063 static int send_response(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
1066 char iabuf[INET_ADDRSTRLEN];
1067 struct sip_request tmp;
1069 if (sip_debug_test_pvt(p)) {
1070 if (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)
1071 ast_verbose("%sTransmitting (NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(iabuf, sizeof(iabuf), p->recv.sin_addr), ntohs(p->recv.sin_port), req->data);
1073 ast_verbose("%sTransmitting (no NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(iabuf, sizeof(iabuf), p->sa.sin_addr), ntohs(p->sa.sin_port), req->data);
1076 if (recordhistory) {
1077 parse_copy(&tmp, req);
1078 snprintf(tmpmsg, sizeof(tmpmsg), "%s / %s", tmp.data, get_header(&tmp, "CSeq"));
1079 append_history(p, "TxRespRel", tmpmsg);
1081 res = __sip_reliable_xmit(p, seqno, 1, req->data, req->len, (reliable > 1));
1083 if (recordhistory) {
1084 parse_copy(&tmp, req);
1085 snprintf(tmpmsg, sizeof(tmpmsg), "%s / %s", tmp.data, get_header(&tmp, "CSeq"));
1086 append_history(p, "TxResp", tmpmsg);
1088 res = __sip_xmit(p, req->data, req->len);
1095 /*--- send_request: Send SIP Request to the other part of the dialogue ---*/
1096 static int send_request(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
1099 char iabuf[INET_ADDRSTRLEN];
1100 struct sip_request tmp;
1102 if (sip_debug_test_pvt(p)) {
1103 if (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)
1104 ast_verbose("%sTransmitting (NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(iabuf, sizeof(iabuf), p->recv.sin_addr), ntohs(p->recv.sin_port), req->data);
1106 ast_verbose("%sTransmitting (no NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(iabuf, sizeof(iabuf), p->sa.sin_addr), ntohs(p->sa.sin_port), req->data);
1109 if (recordhistory) {
1110 parse_copy(&tmp, req);
1111 snprintf(tmpmsg, sizeof(tmpmsg), "%s / %s", tmp.data, get_header(&tmp, "CSeq"));
1112 append_history(p, "TxReqRel", tmpmsg);
1114 res = __sip_reliable_xmit(p, seqno, 0, req->data, req->len, (reliable > 1));
1116 if (recordhistory) {
1117 parse_copy(&tmp, req);
1118 snprintf(tmpmsg, sizeof(tmpmsg), "%s / %s", tmp.data, get_header(&tmp, "CSeq"));
1119 append_history(p, "TxReq", tmpmsg);
1121 res = __sip_xmit(p, req->data, req->len);
1126 /*--- url_decode: Decode SIP URL ---*/
1127 static void url_decode(char *s)
1134 if (strlen(s) > 2) {
1135 if (sscanf(s + 1, "%2x", &tmp) == 1) {
1137 s += 2; /* Will be incremented once more when we break out */
1141 /* Fall through if something wasn't right with the formatting */
1151 /*--- ditch_braces: Pick out text in braces from character string ---*/
1152 static char *ditch_braces(char *tmp)
1157 if ((q = strchr(tmp, '"')) ) {
1159 if ((q = strchr(c, '"')) )
1162 ast_log(LOG_WARNING, "No closing quote in '%s'\n", tmp);
1166 if ((n = strchr(c, '<')) ) {
1168 while(*c && *c != '>') c++;
1170 ast_log(LOG_WARNING, "No closing brace in '%s'\n", tmp);
1179 /*--- sip_sendtext: Send SIP MESSAGE text within a call ---*/
1180 /* Called from PBX core text message functions */
1181 static int sip_sendtext(struct ast_channel *ast, char *text)
1183 struct sip_pvt *p = ast->tech_pvt;
1184 int debug=sip_debug_test_pvt(p);
1187 ast_verbose("Sending text %s on %s\n", text, ast->name);
1190 if (!text || ast_strlen_zero(text))
1193 ast_verbose("Really sending text %s on %s\n", text, ast->name);
1194 transmit_message_with_text(p, text);
1198 /*--- realtime_update_peer: Update peer object in realtime storage ---*/
1199 static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, const char *username, int expirey)
1202 char ipaddr[20] = "";
1203 char regseconds[20] = "0";
1205 if (expirey) { /* Registration */
1209 snprintf(regseconds, sizeof(regseconds), "%ld", nowtime); /* Expiration time */
1210 ast_inet_ntoa(ipaddr, sizeof(ipaddr), sin->sin_addr);
1211 snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
1213 ast_update_realtime("sippeers", "name", peername, "ipaddr", ipaddr, "port", port, "regseconds", regseconds, "username", username, NULL);
1216 /*--- register_peer_exten: Automatically add peer extension to dial plan ---*/
1217 static void register_peer_exten(struct sip_peer *peer, int onoff)
1219 unsigned char multi[256]="";
1220 char *stringp, *ext;
1221 if (!ast_strlen_zero(regcontext)) {
1222 strncpy(multi, ast_strlen_zero(peer->regexten) ? peer->name : peer->regexten, sizeof(multi) - 1);
1224 while((ext = strsep(&stringp, "&"))) {
1226 ast_add_extension(regcontext, 1, ext, 1, NULL, NULL, "Noop", strdup(peer->name), free, channeltype);
1228 ast_context_remove_extension(regcontext, ext, 1, NULL);
1233 /*--- sip_destroy_peer: Destroy peer object from memory */
1234 static void sip_destroy_peer(struct sip_peer *peer)
1236 /* Delete it, it needs to disappear */
1238 sip_destroy(peer->call);
1239 if(peer->chanvars) {
1240 ast_variables_destroy(peer->chanvars);
1241 peer->chanvars = NULL;
1243 if (peer->expire > -1)
1244 ast_sched_del(sched, peer->expire);
1245 if (peer->pokeexpire > -1)
1246 ast_sched_del(sched, peer->pokeexpire);
1247 register_peer_exten(peer, 0);
1248 ast_free_ha(peer->ha);
1249 if (ast_test_flag(peer, SIP_SELFDESTRUCT))
1251 else if (ast_test_flag(peer, SIP_REALTIME))
1255 clear_realm_authentication(peer->auth);
1256 peer->auth = (struct sip_auth *) NULL;
1260 /*--- update_peer: Update peer data in database (if used) ---*/
1261 static void update_peer(struct sip_peer *p, int expiry)
1263 if (!ast_test_flag((&global_flags_page2), SIP_PAGE2_RTNOUPDATE) &&
1264 (ast_test_flag(p, SIP_REALTIME) ||
1265 ast_test_flag(&(p->flags_page2), SIP_PAGE2_RTCACHEFRIENDS))) {
1266 if (p->expire == -1)
1267 expiry = 0; /* Unregister realtime peer */
1268 realtime_update_peer(p->name, &p->addr, p->username, expiry);
1273 /*--- realtime_peer: Get peer from realtime storage ---*/
1274 /* Checks the "sippeers" realtime family from extconfig.conf */
1275 static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *sin)
1277 struct sip_peer *peer=NULL;
1278 struct ast_variable *var;
1279 struct ast_variable *tmp;
1280 char *newpeername = (char *) peername;
1281 char iabuf[80] = "";
1283 /* First check on peer name */
1285 var = ast_load_realtime("sippeers", "name", peername, NULL);
1286 else if (sin) { /* Then check on IP address */
1287 ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr);
1288 var = ast_load_realtime("sippeers", "ipaddr", iabuf, NULL);
1296 /* If this is type=user, then skip this object. */
1298 if (!strcasecmp(tmp->name, "type") &&
1299 !strcasecmp(tmp->value, "user")) {
1300 ast_variables_destroy(var);
1302 } else if(!newpeername && !strcasecmp(tmp->name, "name")) {
1303 newpeername = tmp->value;
1309 peer = build_peer(newpeername, var, ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS) ? 0 : 1);
1312 if(ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) {
1313 ast_copy_flags((&peer->flags_page2),(&global_flags_page2), SIP_PAGE2_RTAUTOCLEAR|SIP_PAGE2_RTCACHEFRIENDS);
1314 if(ast_test_flag((&global_flags_page2), SIP_PAGE2_RTAUTOCLEAR)) {
1315 if (peer->expire > -1) {
1316 ast_sched_del(sched, peer->expire);
1318 peer->expire = ast_sched_add(sched, (global_rtautoclear) * 1000, expire_register, (void *)peer);
1320 ASTOBJ_CONTAINER_LINK(&peerl,peer);
1322 ast_set_flag(peer, SIP_REALTIME);
1326 ast_log(LOG_WARNING, "Cannot Determine peer name ip=%s\n", iabuf);
1329 ast_variables_destroy(var);
1333 /*--- sip_addrcmp: Support routine for find_peer ---*/
1334 static int sip_addrcmp(char *name, struct sockaddr_in *sin)
1336 /* We know name is the first field, so we can cast */
1337 struct sip_peer *p = (struct sip_peer *)name;
1338 return !(!inaddrcmp(&p->addr, sin) ||
1339 (ast_test_flag(p, SIP_INSECURE) &&
1340 (p->addr.sin_addr.s_addr == sin->sin_addr.s_addr)));
1343 /*--- find_peer: Locate peer by name or ip address */
1344 static struct sip_peer *find_peer(const char *peer, struct sockaddr_in *sin, int realtime)
1346 struct sip_peer *p = NULL;
1349 p = ASTOBJ_CONTAINER_FIND(&peerl,peer);
1351 p = ASTOBJ_CONTAINER_FIND_FULL(&peerl,sin,name,sip_addr_hashfunc,1,sip_addrcmp);
1353 if (!p && realtime) {
1354 p = realtime_peer(peer, sin);
1360 /*--- sip_destroy_user: Remove user object from in-memory storage ---*/
1361 static void sip_destroy_user(struct sip_user *user)
1363 ast_free_ha(user->ha);
1364 if(user->chanvars) {
1365 ast_variables_destroy(user->chanvars);
1366 user->chanvars = NULL;
1368 if (ast_test_flag(user, SIP_REALTIME))
1375 /*--- realtime_user: Load user from realtime storage ---*/
1376 /* Loads user from "sipusers" category in realtime (extconfig.conf) */
1377 /* Users are matched on From: user name (the domain in skipped) */
1378 static struct sip_user *realtime_user(const char *username)
1380 struct ast_variable *var;
1381 struct ast_variable *tmp;
1382 struct sip_user *user = NULL;
1384 var = ast_load_realtime("sipusers", "name", username, NULL);
1391 if (!strcasecmp(tmp->name, "type") &&
1392 !strcasecmp(tmp->value, "peer")) {
1393 ast_variables_destroy(var);
1401 user = build_user(username, var, !ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS));
1404 /* Add some finishing touches, addresses, etc */
1405 if(ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) {
1408 ASTOBJ_CONTAINER_LINK(&userl,user);
1410 /* Move counter from s to r... */
1413 ast_set_flag(user, SIP_REALTIME);
1416 ast_variables_destroy(var);
1420 /*--- find_user: Locate user by name ---*/
1421 /* Locates user by name (From: sip uri user name part) first
1422 from in-memory list (static configuration) then from
1423 realtime storage (defined in extconfig.conf) */
1424 static struct sip_user *find_user(const char *name, int realtime)
1426 struct sip_user *u = NULL;
1427 u = ASTOBJ_CONTAINER_FIND(&userl,name);
1428 if (!u && realtime) {
1429 u = realtime_user(name);
1434 /*--- create_addr: create address structure from peer definition ---*/
1435 /* Or, if peer not found, find it in the global DNS */
1436 /* returns TRUE on failure, FALSE on success */
1437 static int create_addr(struct sip_pvt *r, char *opeer)
1440 struct ast_hostent ahp;
1446 char host[256], *hostn;
1449 strncpy(peer, opeer, sizeof(peer) - 1);
1450 port = strchr(peer, ':');
1455 r->sa.sin_family = AF_INET;
1456 p = find_peer(peer, NULL, 1);
1460 ast_copy_flags(r, p, SIP_PROMISCREDIR | SIP_USEREQPHONE | SIP_DTMF | SIP_NAT | SIP_REINVITE | SIP_INSECURE);
1461 r->capability = p->capability;
1463 ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
1464 ast_rtp_setnat(r->rtp, (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
1467 ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
1468 ast_rtp_setnat(r->vrtp, (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
1470 strncpy(r->peername, p->username, sizeof(r->peername)-1);
1471 strncpy(r->authname, p->username, sizeof(r->authname)-1);
1472 strncpy(r->username, p->username, sizeof(r->username)-1);
1473 strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1);
1474 strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1);
1475 strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1);
1476 strncpy(r->fullcontact, p->fullcontact, sizeof(r->fullcontact)-1);
1477 if (!r->initreq.headers && !ast_strlen_zero(p->fromdomain)) {
1478 if ((callhost = strchr(r->callid, '@'))) {
1479 strncpy(callhost + 1, p->fromdomain, sizeof(r->callid) - (callhost - r->callid) - 2);
1482 if (ast_strlen_zero(r->tohost)) {
1483 if (p->addr.sin_addr.s_addr)
1484 ast_inet_ntoa(r->tohost, sizeof(r->tohost), p->addr.sin_addr);
1486 ast_inet_ntoa(r->tohost, sizeof(r->tohost), p->defaddr.sin_addr);
1488 if (!ast_strlen_zero(p->fromdomain))
1489 strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1);
1490 if (!ast_strlen_zero(p->fromuser))
1491 strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1);
1492 r->maxtime = p->maxms;
1493 r->callgroup = p->callgroup;
1494 r->pickupgroup = p->pickupgroup;
1495 if (ast_test_flag(r, SIP_DTMF) == SIP_DTMF_RFC2833)
1496 r->noncodeccapability |= AST_RTP_DTMF;
1498 r->noncodeccapability &= ~AST_RTP_DTMF;
1499 strncpy(r->context, p->context,sizeof(r->context)-1);
1500 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
1501 (!p->maxms || ((p->lastms >= 0) && (p->lastms <= p->maxms)))) {
1502 if (p->addr.sin_addr.s_addr) {
1503 r->sa.sin_addr = p->addr.sin_addr;
1504 r->sa.sin_port = p->addr.sin_port;
1506 r->sa.sin_addr = p->defaddr.sin_addr;
1507 r->sa.sin_port = p->defaddr.sin_port;
1509 memcpy(&r->recv, &r->sa, sizeof(r->recv));
1511 ASTOBJ_UNREF(p,sip_destroy_peer);
1517 portno = atoi(port);
1519 portno = DEFAULT_SIP_PORT;
1524 snprintf(service, sizeof(service), "_sip._udp.%s", peer);
1525 ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service);
1531 hp = ast_gethostbyname(hostn, &ahp);
1533 strncpy(r->tohost, peer, sizeof(r->tohost) - 1);
1534 memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr));
1535 r->sa.sin_port = htons(portno);
1536 memcpy(&r->recv, &r->sa, sizeof(r->recv));
1539 ast_log(LOG_WARNING, "No such host: %s\n", peer);
1545 ASTOBJ_UNREF(p,sip_destroy_peer);
1550 /*--- auto_congest: Scheduled congestion on a call ---*/
1551 static int auto_congest(void *nothing)
1553 struct sip_pvt *p = nothing;
1554 ast_mutex_lock(&p->lock);
1557 if (!ast_mutex_trylock(&p->owner->lock)) {
1558 ast_log(LOG_NOTICE, "Auto-congesting %s\n", p->owner->name);
1559 ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
1560 ast_mutex_unlock(&p->owner->lock);
1563 ast_mutex_unlock(&p->lock);
1570 /*--- sip_call: Initiate SIP call from PBX ---*/
1571 /* used from the dial() application */
1572 static int sip_call(struct ast_channel *ast, char *dest, int timeout)
1576 char *vxml_url = NULL;
1577 char *distinctive_ring = NULL;
1578 char *osptoken = NULL;
1580 char *osphandle = NULL;
1582 struct varshead *headp;
1583 struct ast_var_t *current;
1584 int addsipheaders = 0;
1587 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
1588 ast_log(LOG_WARNING, "sip_call called on %s, neither down nor reserved\n", ast->name);
1591 /* Check whether there is vxml_url, distinctive ring variables */
1593 headp=&ast->varshead;
1594 AST_LIST_TRAVERSE(headp,current,entries) {
1595 /* Check whether there is a VXML_URL variable */
1596 if (!vxml_url && !strcasecmp(ast_var_name(current),"VXML_URL")) {
1597 vxml_url = ast_var_value(current);
1598 } else if (!distinctive_ring && !strcasecmp(ast_var_name(current),"ALERT_INFO")) {
1599 /* Check whether there is a ALERT_INFO variable */
1600 distinctive_ring = ast_var_value(current);
1601 } else if (!addsipheaders && !strncasecmp(ast_var_name(current),"SIPADDHEADER",strlen("SIPADDHEADER"))) {
1602 /* Check whether there is a variable with a name starting with SIPADDHEADER */
1608 else if (!osptoken && !strcasecmp(ast_var_name(current), "OSPTOKEN")) {
1609 osptoken = ast_var_value(current);
1610 } else if (!osphandle && !strcasecmp(ast_var_name(current), "OSPHANDLE")) {
1611 osphandle = ast_var_value(current);
1617 ast_set_flag(p, SIP_OUTGOING);
1619 if (!osptoken || !osphandle || (sscanf(osphandle, "%i", &p->osphandle) != 1)) {
1620 /* Force Disable OSP support */
1621 ast_log(LOG_DEBUG, "Disabling OSP support for this call. osptoken = %s, osphandle = %s\n", osptoken, osphandle);
1627 ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
1628 res = update_user_counter(p,INC_OUT_USE);
1630 p->callingpres = ast->cid.cid_pres;
1631 p->jointcapability = p->capability;
1632 transmit_invite(p, SIP_INVITE, 1, NULL, NULL, vxml_url,distinctive_ring, osptoken, addsipheaders, 1);
1634 /* Initialize auto-congest time */
1635 p->initid = ast_sched_add(sched, p->maxtime * 4, auto_congest, p);
1641 /*--- sip_registry_destroy: Destroy registry object ---*/
1642 /* Objects created with the register= statement in static configuration */
1643 static void sip_registry_destroy(struct sip_registry *reg)
1647 /* Clear registry before destroying to ensure
1648 we don't get reentered trying to grab the registry lock */
1649 reg->call->registry = NULL;
1650 sip_destroy(reg->call);
1652 if (reg->expire > -1)
1653 ast_sched_del(sched, reg->expire);
1654 if (reg->timeout > -1)
1655 ast_sched_del(sched, reg->timeout);
1661 /*--- __sip_destroy: Execute destrucion of call structure, release memory---*/
1662 static void __sip_destroy(struct sip_pvt *p, int lockowner)
1664 struct sip_pvt *cur, *prev = NULL;
1666 struct sip_history *hist;
1668 if (sip_debug_test_pvt(p))
1669 ast_verbose("Destroying call '%s'\n", p->callid);
1670 if (p->stateid > -1)
1671 ast_extension_state_del(p->stateid, NULL);
1673 ast_sched_del(sched, p->initid);
1674 if (p->autokillid > -1)
1675 ast_sched_del(sched, p->autokillid);
1678 ast_rtp_destroy(p->rtp);
1681 ast_rtp_destroy(p->vrtp);
1684 free_old_route(p->route);
1688 if (p->registry->call == p)
1689 p->registry->call = NULL;
1690 ASTOBJ_UNREF(p->registry,sip_registry_destroy);
1692 /* Unlink us from the owner if we have one */
1695 ast_mutex_lock(&p->owner->lock);
1696 ast_log(LOG_DEBUG, "Detaching from %s\n", p->owner->name);
1697 p->owner->tech_pvt = NULL;
1699 ast_mutex_unlock(&p->owner->lock);
1704 p->history = p->history->next;
1711 prev->next = cur->next;
1720 ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
1723 ast_sched_del(sched, p->initid);
1724 while((cp = p->packets)) {
1725 p->packets = p->packets->next;
1726 if (cp->retransid > -1)
1727 ast_sched_del(sched, cp->retransid);
1730 ast_mutex_destroy(&p->lock);
1732 ast_variables_destroy(p->chanvars);
1739 /*--- update_user_counter: Handle incominglimit and outgoinglimit for SIP users ---*/
1740 /* Note: This is going to be replaced by app_groupcount */
1741 /* Thought: For realtime, we should propably update storage with inuse counter... */
1742 static int update_user_counter(struct sip_pvt *fup, int event)
1744 char name[256] = "";
1747 int *inuse, *incominglimit;
1749 /* Test if we need to check call limits, in order to avoid
1750 realtime lookups if we do not need it */
1751 if (!ast_test_flag(fup, SIP_CALL_LIMIT))
1754 strncpy(name, fup->username, sizeof(name) - 1);
1756 /* Check the list of users */
1757 u = find_user(name, 1);
1760 incominglimit = &u->incominglimit;
1763 /* Try to find peer */
1764 p = find_peer(fup->peername, NULL, 1);
1767 incominglimit = &p->incominglimit;
1768 strncpy(name, fup->peername, sizeof(name) -1);
1770 ast_log(LOG_DEBUG, "%s is not a local user\n", name);
1775 /* incoming and outgoing affects the inUse counter */
1786 if (*incominglimit > 0 ) {
1787 if (*inuse >= *incominglimit) {
1788 ast_log(LOG_ERROR, "Call from %s '%s' rejected due to usage limit of %d\n", u?"user":"peer", name, *incominglimit);
1789 /* inc inUse as well */
1790 if ( event == INC_OUT_USE ) {
1794 ASTOBJ_UNREF(u,sip_destroy_user);
1796 ASTOBJ_UNREF(p,sip_destroy_peer);
1801 ast_log(LOG_DEBUG, "Call from %s '%s' is %d out of %d\n", u?"user":"peer", name, *inuse, *incominglimit);
1803 #ifdef DISABLED_CODE
1804 /* we don't use these anymore */
1806 if ( u->outUse > 0 ) {
1813 if ( u->outgoinglimit > 0 ) {
1814 if ( u->outUse >= u->outgoinglimit ) {
1815 ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
1816 ast_mutex_unlock(&userl.lock);
1827 ast_log(LOG_ERROR, "update_user_counter(%s,%d) called with no event!\n",name,event);
1830 ASTOBJ_UNREF(u,sip_destroy_user);
1832 ASTOBJ_UNREF(p,sip_destroy_peer);
1836 /*--- sip_destroy: Destroy SIP call structure ---*/
1837 static void sip_destroy(struct sip_pvt *p)
1839 ast_mutex_lock(&iflock);
1840 __sip_destroy(p, 1);
1841 ast_mutex_unlock(&iflock);
1845 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req, int fatal);
1847 /*--- hangup_sip2cause: Convert SIP hangup causes to Asterisk hangup causes ---*/
1848 static int hangup_sip2cause(int cause)
1850 /* Possible values from causes.h
1851 AST_CAUSE_NOTDEFINED AST_CAUSE_NORMAL AST_CAUSE_BUSY
1852 AST_CAUSE_FAILURE AST_CAUSE_CONGESTION AST_CAUSE_UNALLOCATED
1856 case 404: /* Not found */
1857 return AST_CAUSE_UNALLOCATED;
1858 case 483: /* Too many hops */
1859 return AST_CAUSE_FAILURE;
1861 return AST_CAUSE_BUSY;
1863 return AST_CAUSE_NORMAL;
1869 /*--- hangup_cause2sip: Convert Asterisk hangup causes to SIP codes ---*/
1870 static char *hangup_cause2sip(int cause)
1874 case AST_CAUSE_FAILURE:
1875 return "500 Server internal failure";
1876 case AST_CAUSE_CONGESTION:
1877 return "503 Service Unavailable";
1878 case AST_CAUSE_BUSY:
1887 /*--- sip_hangup: Hangup SIP call ---*/
1888 /* Part of PBX interface */
1889 static int sip_hangup(struct ast_channel *ast)
1891 struct sip_pvt *p = ast->tech_pvt;
1893 struct ast_flags locflags = {0};
1895 ast_log(LOG_DEBUG, "sip_hangup(%s)\n", ast->name);
1897 ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
1900 ast_mutex_lock(&p->lock);
1902 if ((p->osphandle > -1) && (ast->_state == AST_STATE_UP)) {
1903 ast_osp_terminate(p->osphandle, AST_CAUSE_NORMAL, p->ospstart, time(NULL) - p->ospstart);
1906 if (ast_test_flag(p, SIP_OUTGOING)) {
1907 ast_log(LOG_DEBUG, "update_user_counter(%s) - decrement outUse counter\n", p->username);
1908 update_user_counter(p, DEC_OUT_USE);
1910 ast_log(LOG_DEBUG, "update_user_counter(%s) - decrement inUse counter\n", p->username);
1911 update_user_counter(p, DEC_IN_USE);
1913 /* Determine how to disconnect */
1914 if (p->owner != ast) {
1915 ast_log(LOG_WARNING, "Huh? We aren't the owner?\n");
1916 ast_mutex_unlock(&p->lock);
1919 if (ast->_state != AST_STATE_UP)
1924 ast_dsp_free(p->vad);
1927 ast->tech_pvt = NULL;
1929 ast_mutex_lock(&usecnt_lock);
1931 ast_mutex_unlock(&usecnt_lock);
1932 ast_update_use_count();
1934 ast_set_flag(&locflags, SIP_NEEDDESTROY);
1935 /* Start the process if it's not already started */
1936 if (!ast_test_flag(p, SIP_ALREADYGONE) && !ast_strlen_zero(p->initreq.data)) {
1938 if (ast_test_flag(p, SIP_OUTGOING)) {
1939 transmit_request_with_auth(p, SIP_CANCEL, p->ocseq, 1, 0);
1940 /* Actually don't destroy us yet, wait for the 487 on our original
1941 INVITE, but do set an autodestruct just in case we never get it. */
1942 ast_clear_flag(&locflags, SIP_NEEDDESTROY);
1943 sip_scheddestroy(p, 15000);
1944 if ( p->initid != -1 ) {
1945 /* channel still up - reverse dec of inUse counter
1946 only if the channel is not auto-congested */
1947 if (ast_test_flag(p, SIP_OUTGOING)) {
1948 update_user_counter(p, INC_OUT_USE);
1951 update_user_counter(p, INC_IN_USE);
1956 if (ast->hangupcause && ((res = hangup_cause2sip(ast->hangupcause)))) {
1957 transmit_response_reliable(p, res, &p->initreq, 1);
1959 transmit_response_reliable(p, "403 Forbidden", &p->initreq, 1);
1962 if (!p->pendinginvite) {
1964 transmit_request_with_auth(p, SIP_BYE, 0, 1, 1);
1966 /* Note we will need a BYE when this all settles out
1967 but we can't send one while we have "INVITE" outstanding. */
1968 ast_set_flag(p, SIP_PENDINGBYE);
1969 ast_clear_flag(p, SIP_NEEDREINVITE);
1973 ast_copy_flags(p, (&locflags), SIP_NEEDDESTROY);
1974 ast_mutex_unlock(&p->lock);
1978 /*--- sip_answer: Answer SIP call , send 200 OK on Invite ---*/
1979 /* Part of PBX interface */
1980 static int sip_answer(struct ast_channel *ast)
1984 struct sip_pvt *p = ast->tech_pvt;
1986 ast_mutex_lock(&p->lock);
1987 if (ast->_state != AST_STATE_UP) {
1992 codec=pbx_builtin_getvar_helper(p->owner,"SIP_CODEC");
1994 fmt=ast_getformatbyname(codec);
1996 ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
1997 if (p->jointcapability & fmt) {
1998 p->jointcapability &= fmt;
1999 p->capability &= fmt;
2001 ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because it is not shared by both ends.\n");
2002 } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n",codec);
2005 ast_setstate(ast, AST_STATE_UP);
2007 ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
2008 res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
2010 ast_mutex_unlock(&p->lock);
2014 /*--- sip_write: Send response, support audio media ---*/
2015 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
2017 struct sip_pvt *p = ast->tech_pvt;
2019 if (frame->frametype == AST_FRAME_VOICE) {
2020 if (!(frame->subclass & ast->nativeformats)) {
2021 ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
2022 frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
2026 ast_mutex_lock(&p->lock);
2028 if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
2029 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
2030 ast_set_flag(p, SIP_PROGRESS_SENT);
2032 time(&p->lastrtptx);
2033 res = ast_rtp_write(p->rtp, frame);
2035 ast_mutex_unlock(&p->lock);
2037 } else if (frame->frametype == AST_FRAME_VIDEO) {
2039 ast_mutex_lock(&p->lock);
2041 if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
2042 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
2043 ast_set_flag(p, SIP_PROGRESS_SENT);
2045 time(&p->lastrtptx);
2046 res = ast_rtp_write(p->vrtp, frame);
2048 ast_mutex_unlock(&p->lock);
2050 } else if (frame->frametype == AST_FRAME_IMAGE) {
2053 ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", frame->frametype);
2060 /*--- sip_fixup: Fix up a channel: If a channel is consumed, this is called.
2061 Basically update any ->owner links ----*/
2062 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
2064 struct sip_pvt *p = newchan->tech_pvt;
2065 ast_mutex_lock(&p->lock);
2066 if (p->owner != oldchan) {
2067 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
2068 ast_mutex_unlock(&p->lock);
2072 ast_mutex_unlock(&p->lock);
2076 /*--- sip_senddigit: Send DTMF character on SIP channel */
2077 /* within one call, we're able to transmit in many methods simultaneously */
2078 static int sip_senddigit(struct ast_channel *ast, char digit)
2080 struct sip_pvt *p = ast->tech_pvt;
2082 ast_mutex_lock(&p->lock);
2083 switch (ast_test_flag(p, SIP_DTMF)) {
2085 transmit_info_with_digit(p, digit);
2087 case SIP_DTMF_RFC2833:
2089 ast_rtp_senddigit(p->rtp, digit);
2091 case SIP_DTMF_INBAND:
2095 ast_mutex_unlock(&p->lock);
2100 /*--- sip_transfer: Transfer SIP call */
2101 static int sip_transfer(struct ast_channel *ast, char *dest)
2103 struct sip_pvt *p = ast->tech_pvt;
2106 ast_mutex_lock(&p->lock);
2107 if (ast->_state == AST_STATE_RING)
2108 res = sip_sipredirect(p, dest);
2110 res = transmit_refer(p, dest);
2111 ast_mutex_unlock(&p->lock);
2115 /*--- sip_indicate: Play indication to user */
2116 /* With SIP a lot of indications is sent as messages, letting the device play
2117 the indication - busy signal, congestion etc */
2118 static int sip_indicate(struct ast_channel *ast, int condition)
2120 struct sip_pvt *p = ast->tech_pvt;
2123 ast_mutex_lock(&p->lock);
2125 case AST_CONTROL_RINGING:
2126 if (ast->_state == AST_STATE_RING) {
2127 if (!ast_test_flag(p, SIP_PROGRESS_SENT) ||
2128 (ast_test_flag(p, SIP_PROG_INBAND) == SIP_PROG_INBAND_NEVER)) {
2129 /* Send 180 ringing if out-of-band seems reasonable */
2130 transmit_response(p, "180 Ringing", &p->initreq);
2131 ast_set_flag(p, SIP_RINGING);
2132 if (ast_test_flag(p, SIP_PROG_INBAND) != SIP_PROG_INBAND_YES)
2135 /* Well, if it's not reasonable, just send in-band */
2140 case AST_CONTROL_BUSY:
2141 if (ast->_state != AST_STATE_UP) {
2142 transmit_response(p, "486 Busy Here", &p->initreq);
2143 ast_set_flag(p, SIP_ALREADYGONE);
2144 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
2149 case AST_CONTROL_CONGESTION:
2150 if (ast->_state != AST_STATE_UP) {
2151 transmit_response(p, "503 Service Unavailable", &p->initreq);
2152 ast_set_flag(p, SIP_ALREADYGONE);
2153 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
2158 case AST_CONTROL_PROGRESS:
2159 case AST_CONTROL_PROCEEDING:
2160 if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
2161 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
2162 ast_set_flag(p, SIP_PROGRESS_SENT);
2171 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
2175 ast_mutex_unlock(&p->lock);
2181 /*--- sip_new: Initiate a call in the SIP channel */
2182 /* called from sip_request_call (calls from the pbx ) */
2183 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
2185 struct ast_channel *tmp;
2186 struct ast_variable *v = NULL;
2189 ast_mutex_unlock(&i->lock);
2190 /* Don't hold a sip pvt lock while we allocate a channel */
2191 tmp = ast_channel_alloc(1);
2192 ast_mutex_lock(&i->lock);
2194 tmp->tech = &sip_tech;
2195 /* Select our native format based on codec preference until we receive
2196 something from another device to the contrary. */
2197 ast_mutex_lock(&i->lock);
2198 if (i->jointcapability)
2199 tmp->nativeformats = ast_codec_choose(&i->prefs, i->jointcapability, 1);
2200 else if (i->capability)
2201 tmp->nativeformats = ast_codec_choose(&i->prefs, i->capability, 1);
2203 tmp->nativeformats = ast_codec_choose(&i->prefs, global_capability, 1);
2204 ast_mutex_unlock(&i->lock);
2205 fmt = ast_best_codec(tmp->nativeformats);
2208 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
2209 else if (strchr(i->fromdomain,':'))
2210 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(long)(i));
2212 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(long)(i));
2214 tmp->type = channeltype;
2215 if (ast_test_flag(i, SIP_DTMF) == SIP_DTMF_INBAND) {
2216 i->vad = ast_dsp_new();
2217 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
2219 ast_dsp_digitmode(i->vad, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF);
2221 tmp->fds[0] = ast_rtp_fd(i->rtp);
2222 tmp->fds[1] = ast_rtcp_fd(i->rtp);
2224 tmp->fds[2] = ast_rtp_fd(i->vrtp);
2225 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
2227 if (state == AST_STATE_RING)
2229 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
2230 tmp->writeformat = fmt;
2231 tmp->rawwriteformat = fmt;
2232 tmp->readformat = fmt;
2233 tmp->rawreadformat = fmt;
2236 tmp->callgroup = i->callgroup;
2237 tmp->pickupgroup = i->pickupgroup;
2238 tmp->cid.cid_pres = i->callingpres;
2239 if (!ast_strlen_zero(i->accountcode))
2240 strncpy(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode)-1);
2242 tmp->amaflags = i->amaflags;
2243 if (!ast_strlen_zero(i->language))
2244 strncpy(tmp->language, i->language, sizeof(tmp->language)-1);
2245 if (!ast_strlen_zero(i->musicclass))
2246 strncpy(tmp->musicclass, i->musicclass, sizeof(tmp->musicclass)-1);
2248 ast_mutex_lock(&usecnt_lock);
2250 ast_mutex_unlock(&usecnt_lock);
2251 strncpy(tmp->context, i->context, sizeof(tmp->context)-1);
2252 strncpy(tmp->exten, i->exten, sizeof(tmp->exten)-1);
2253 if (!ast_strlen_zero(i->cid_num))
2254 tmp->cid.cid_num = strdup(i->cid_num);
2255 if (!ast_strlen_zero(i->cid_name))
2256 tmp->cid.cid_name = strdup(i->cid_name);
2257 if (!ast_strlen_zero(i->rdnis))
2258 tmp->cid.cid_rdnis = strdup(i->rdnis);
2259 if (!ast_strlen_zero(i->exten) && strcmp(i->exten, "s"))
2260 tmp->cid.cid_dnid = strdup(i->exten);
2262 if (!ast_strlen_zero(i->uri)) {
2263 pbx_builtin_setvar_helper(tmp, "SIPURI", i->uri);
2265 if (!ast_strlen_zero(i->domain)) {
2266 pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
2268 if (!ast_strlen_zero(i->useragent)) {
2269 pbx_builtin_setvar_helper(tmp, "SIPUSERAGENT", i->useragent);
2271 if (!ast_strlen_zero(i->callid)) {
2272 pbx_builtin_setvar_helper(tmp, "SIPCALLID", i->callid);
2274 ast_setstate(tmp, state);
2275 if (state != AST_STATE_DOWN) {
2276 if (ast_pbx_start(tmp)) {
2277 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
2282 /* Set channel variables for this call from configuration */
2283 for (v = i->chanvars ; v ; v = v->next)
2284 pbx_builtin_setvar_helper(tmp,v->name,v->value);
2287 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
2291 /* Structure for conversion between compressed SIP and "normal" SIP */
2292 static struct cfalias {
2296 { "Content-Type", "c" },
2297 { "Content-Encoding", "e" },
2301 { "Content-Length", "l" },
2304 { "Supported", "k" },
2305 { "Refer-To", "r" },
2306 { "Allow-Events", "u" },
2311 /*--- get_sdp_by_line: Reads one line of SIP message body */
2312 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
2313 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
2314 char* r = line + nameLen + 1;
2315 while (*r && (*r < 33)) ++r;
2322 /*--- get_sdp: Gets all kind of SIP message bodies, including SDP,
2323 but the name wrongly applies _only_ sdp */
2324 static char *get_sdp(struct sip_request *req, char *name) {
2326 int len = strlen(name);
2329 for (x=0; x<req->lines; x++) {
2330 r = get_sdp_by_line(req->line[x], name, len);
2331 if (r[0] != '\0') return r;
2337 static void sdpLineNum_iterator_init(int* iterator) {
2341 static char* get_sdp_iterate(int* iterator,
2342 struct sip_request *req, char *name) {
2343 int len = strlen(name);
2345 while (*iterator < req->lines) {
2346 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
2347 if (r[0] != '\0') return r;
2352 static char *__get_header(struct sip_request *req, char *name, int *start)
2355 int len = strlen(name);
2357 if (pedanticsipchecking) {
2358 /* Technically you can place arbitrary whitespace both before and after the ':' in
2359 a header, although RFC3261 clearly says you shouldn't before, and place just
2360 one afterwards. If you shouldn't do it, what absolute idiot decided it was
2361 a good idea to say you can do it, and if you can do it, why in the hell would
2362 you say you shouldn't. */
2363 for (x=*start;x<req->headers;x++) {
2364 if (!strncasecmp(req->header[x], name, len)) {
2365 r = req->header[x] + len;
2366 while(*r && (*r < 33))
2370 while(*r && (*r < 33))
2378 /* We probably shouldn't even bother counting whitespace afterwards but
2379 I guess for backwards compatibility we will */
2380 for (x=*start;x<req->headers;x++) {
2381 if (!strncasecmp(req->header[x], name, len) &&
2382 (req->header[x][len] == ':')) {
2383 r = req->header[x] + len + 1;
2384 while(*r && (*r < 33))
2392 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
2393 if (!strcasecmp(aliases[x].fullname, name))
2394 return __get_header(req, aliases[x].shortname, start);
2396 /* Don't return NULL, so get_header is always a valid pointer */
2400 /*--- get_header: Get header from SIP request ---*/
2401 static char *get_header(struct sip_request *req, char *name)
2404 return __get_header(req, name, &start);
2407 /*--- sip_rtp_read: Read RTP from network ---*/
2408 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
2410 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
2411 struct ast_frame *f;
2412 static struct ast_frame null_frame = { AST_FRAME_NULL, };
2415 f = ast_rtp_read(p->rtp); /* RTP Audio */
2418 f = ast_rtcp_read(p->rtp); /* RTCP Control Channel */
2421 f = ast_rtp_read(p->vrtp); /* RTP Video */
2424 f = ast_rtcp_read(p->vrtp); /* RTCP Control Channel for video */
2429 /* Don't send RFC2833 if we're not supposed to */
2430 if (f && (f->frametype == AST_FRAME_DTMF) && (ast_test_flag(p, SIP_DTMF) != SIP_DTMF_RFC2833))
2433 /* We already hold the channel lock */
2434 if (f->frametype == AST_FRAME_VOICE) {
2435 if (f->subclass != p->owner->nativeformats) {
2436 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
2437 p->owner->nativeformats = f->subclass;
2438 ast_set_read_format(p->owner, p->owner->readformat);
2439 ast_set_write_format(p->owner, p->owner->writeformat);
2441 if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_INBAND) && p->vad) {
2442 f = ast_dsp_process(p->owner, p->vad, f);
2443 if (f && (f->frametype == AST_FRAME_DTMF))
2444 ast_log(LOG_DEBUG, "* Detected inband DTMF '%c'\n", f->subclass);
2451 /*--- sip_read: Read SIP RTP from channel */
2452 static struct ast_frame *sip_read(struct ast_channel *ast)
2454 struct ast_frame *fr;
2455 struct sip_pvt *p = ast->tech_pvt;
2456 ast_mutex_lock(&p->lock);
2457 fr = sip_rtp_read(ast, p);
2458 time(&p->lastrtprx);
2459 ast_mutex_unlock(&p->lock);
2463 /*--- build_callid: Build SIP CALLID header ---*/
2464 static void build_callid(char *callid, int len, struct in_addr ourip, char *fromdomain)
2469 char iabuf[INET_ADDRSTRLEN];
2472 res = snprintf(callid, len, "%08x", val);
2476 if (!ast_strlen_zero(fromdomain))
2477 snprintf(callid, len, "@%s", fromdomain);
2479 /* It's not important that we really use our right IP here... */
2480 snprintf(callid, len, "@%s", ast_inet_ntoa(iabuf, sizeof(iabuf), ourip));
2483 /*--- sip_alloc: Allocate SIP_PVT structure and set defaults ---*/
2484 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobal_nat)
2488 p = malloc(sizeof(struct sip_pvt));
2491 /* Keep track of stuff */
2492 memset(p, 0, sizeof(struct sip_pvt));
2493 ast_mutex_init(&p->lock);
2503 memcpy(&p->sa, sin, sizeof(p->sa));
2504 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
2505 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
2507 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
2509 p->rtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
2511 p->vrtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
2515 /* Start with 101 instead of 1 */
2518 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
2519 ast_mutex_destroy(&p->lock);
2521 ast_variables_destroy(p->chanvars);
2527 ast_rtp_settos(p->rtp, tos);
2529 ast_rtp_settos(p->vrtp, tos);
2530 if (useglobal_nat && sin) {
2531 /* Setup NAT structure according to global settings if we have an address */
2532 ast_copy_flags(p, &global_flags, SIP_NAT);
2533 memcpy(&p->recv, sin, sizeof(p->recv));
2534 ast_rtp_setnat(p->rtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
2536 ast_rtp_setnat(p->vrtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
2539 strncpy(p->fromdomain, default_fromdomain, sizeof(p->fromdomain) - 1);
2540 build_via(p, p->via, sizeof(p->via));
2542 build_callid(p->callid, sizeof(p->callid), p->ourip, p->fromdomain);
2544 strncpy(p->callid, callid, sizeof(p->callid) - 1);
2545 ast_copy_flags(p, (&global_flags), SIP_PROMISCREDIR | SIP_TRUSTRPID | SIP_DTMF | SIP_REINVITE | SIP_PROG_INBAND | SIP_OSPAUTH);
2546 /* Assign default music on hold class */
2547 strncpy(p->musicclass, global_musicclass, sizeof(p->musicclass) - 1);
2548 p->rtptimeout = global_rtptimeout;
2549 p->rtpholdtimeout = global_rtpholdtimeout;
2550 p->rtpkeepalive = global_rtpkeepalive;
2551 p->capability = global_capability;
2552 if (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_RFC2833)
2553 p->noncodeccapability |= AST_RTP_DTMF;
2554 strncpy(p->context, default_context, sizeof(p->context) - 1);
2556 ast_mutex_lock(&iflock);
2559 ast_mutex_unlock(&iflock);
2561 ast_log(LOG_DEBUG, "Allocating new SIP call for %s\n", callid);
2565 /*--- find_call: Connect incoming SIP message to current call or create new call structure */
2566 /* Called by handle_request ,sipsock_read */
2567 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin)
2572 char iabuf[INET_ADDRSTRLEN];
2576 callid = get_header(req, "Call-ID");
2578 if (pedanticsipchecking) {
2579 /* In principle Call-ID's uniquely identify a call, however some vendors
2580 (i.e. Pingtel) send multiple calls with the same Call-ID and different
2581 tags in order to simplify billing. The RFC does state that we have to
2582 compare tags in addition to the call-id, but this generate substantially
2583 more overhead which is totally unnecessary for the vast majority of sane
2584 SIP implementations, and thus Asterisk does not enable this behavior
2585 by default. Short version: You'll need this option to support conferencing
2587 strncpy(tmp, req->header[0], sizeof(tmp) - 1);
2589 c = strchr(tmp, ' ');
2592 if (!strcasecmp(cmd, "SIP/2.0"))
2593 strncpy(tmp, get_header(req, "To"), sizeof(tmp) - 1);
2595 strncpy(tmp, get_header(req, "From"), sizeof(tmp) - 1);
2596 tag = ast_strcasestr(tmp, "tag=");
2599 c = strchr(tag, ';');
2606 if (ast_strlen_zero(callid)) {
2607 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr));
2610 ast_mutex_lock(&iflock);
2613 if (!strcmp(p->callid, callid) &&
2614 (!pedanticsipchecking || !tag || ast_strlen_zero(p->theirtag) || !strcmp(p->theirtag, tag))) {
2615 /* Found the call */
2616 ast_mutex_lock(&p->lock);
2617 ast_mutex_unlock(&iflock);
2622 ast_mutex_unlock(&iflock);
2623 p = sip_alloc(callid, sin, 1);
2625 ast_mutex_lock(&p->lock);
2629 /*--- sip_register: Parse register=> line in sip.conf and add to registry */
2630 static int sip_register(char *value, int lineno)
2632 struct sip_registry *reg;
2633 char copy[256] = "";
2634 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
2641 strncpy(copy, value, sizeof(copy)-1);
2644 hostname = strrchr(stringp, '@');
2649 if (!username || ast_strlen_zero(username) || !hostname || ast_strlen_zero(hostname)) {
2650 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d", lineno);
2654 username = strsep(&stringp, ":");
2656 secret = strsep(&stringp, ":");
2658 authuser = strsep(&stringp, ":");
2661 hostname = strsep(&stringp, "/");
2663 contact = strsep(&stringp, "/");
2664 if (!contact || ast_strlen_zero(contact))
2667 hostname = strsep(&stringp, ":");
2668 porta = strsep(&stringp, ":");
2670 if (porta && !atoi(porta)) {
2671 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
2674 reg = malloc(sizeof(struct sip_registry));
2676 memset(reg, 0, sizeof(struct sip_registry));
2679 strncpy(reg->contact, contact, sizeof(reg->contact) - 1);
2681 strncpy(reg->username, username, sizeof(reg->username)-1);
2683 strncpy(reg->hostname, hostname, sizeof(reg->hostname)-1);
2685 strncpy(reg->authuser, authuser, sizeof(reg->authuser)-1);
2687 strncpy(reg->secret, secret, sizeof(reg->secret)-1);
2690 reg->refresh = default_expiry;
2691 reg->portno = porta ? atoi(porta) : 0;
2692 reg->callid_valid = 0;
2694 ASTOBJ_CONTAINER_LINK(®l, reg);
2695 ASTOBJ_UNREF(reg,sip_registry_destroy);
2697 ast_log(LOG_ERROR, "Out of memory\n");
2703 /*--- lws2sws: Parse multiline SIP headers into one header */
2704 /* This is enabled if pedanticsipchecking is enabled */
2705 static int lws2sws(char *msgbuf, int len)
2711 /* Eliminate all CRs */
2712 if (msgbuf[h] == '\r') {
2716 /* Check for end-of-line */
2717 if (msgbuf[h] == '\n') {
2718 /* Check for end-of-message */
2721 /* Check for a continuation line */
2722 if (msgbuf[h + 1] == ' ' || msgbuf[h + 1] == '\t') {
2723 /* Merge continuation line */
2727 /* Propagate LF and start new line */
2728 msgbuf[t++] = msgbuf[h++];
2732 if (msgbuf[h] == ' ' || msgbuf[h] == '\t') {
2737 msgbuf[t++] = msgbuf[h++];
2741 msgbuf[t++] = msgbuf[h++];
2749 /*--- parse: Parse a SIP message ----*/
2750 static void parse(struct sip_request *req)
2752 /* Divide fields by NULL's */
2757 /* First header starts immediately */
2761 /* We've got a new header */
2765 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
2767 if (ast_strlen_zero(req->header[f])) {
2768 /* Line by itself means we're now in content */
2772 if (f >= SIP_MAX_HEADERS - 1) {
2773 ast_log(LOG_WARNING, "Too many SIP headers...\n");
2776 req->header[f] = c + 1;
2777 } else if (*c == '\r') {
2778 /* Ignore but eliminate \r's */
2783 /* Check for last header */
2784 if (!ast_strlen_zero(req->header[f]))
2787 /* Now we process any mime content */
2792 /* We've got a new line */
2795 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
2797 if (f >= SIP_MAX_LINES - 1) {
2798 ast_log(LOG_WARNING, "Too many SDP lines...\n");
2801 req->line[f] = c + 1;
2802 } else if (*c == '\r') {
2803 /* Ignore and eliminate \r's */
2808 /* Check for last line */
2809 if (!ast_strlen_zero(req->line[f]))
2813 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
2816 /*--- process_sdp: Process SIP SDP ---*/
2817 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
2823 char iabuf[INET_ADDRSTRLEN];
2827 int peercapability, peernoncodeccapability;
2828 int vpeercapability=0, vpeernoncodeccapability=0;
2829 struct sockaddr_in sin;
2832 struct ast_hostent ahp;
2834 int destiterator = 0;
2838 int debug=sip_debug_test_pvt(p);
2840 /* Update our last rtprx when we receive an SDP, too */
2841 time(&p->lastrtprx);
2842 time(&p->lastrtptx);
2844 /* Get codec and RTP info from SDP */
2845 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
2846 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
2849 m = get_sdp(req, "m");
2850 sdpLineNum_iterator_init(&destiterator);
2851 c = get_sdp_iterate(&destiterator, req, "c");
2852 if (ast_strlen_zero(m) || ast_strlen_zero(c)) {
2853 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
2856 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2857 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
2860 /* XXX This could block for a long time, and block the main thread! XXX */
2861 hp = ast_gethostbyname(host, &ahp);
2863 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
2866 sdpLineNum_iterator_init(&iterator);
2867 ast_set_flag(p, SIP_NOVIDEO);
2868 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
2870 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1) ||
2871 (sscanf(m, "audio %d/%d RTP/AVP %n", &x, &y, &len) == 2)) {
2874 /* Scan through the RTP payload types specified in a "m=" line: */
2875 ast_rtp_pt_clear(p->rtp);
2877 while(!ast_strlen_zero(codecs)) {
2878 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2879 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2883 ast_verbose("Found RTP audio format %d\n", codec);
2884 ast_rtp_set_m_type(p->rtp, codec);
2886 /* Skip over any whitespace */
2887 while(*codecs && (*codecs < 33)) codecs++;
2891 ast_rtp_pt_clear(p->vrtp); /* Must be cleared in case no m=video line exists */
2893 if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
2895 ast_clear_flag(p, SIP_NOVIDEO);
2897 /* Scan through the RTP payload types specified in a "m=" line: */
2899 while(!ast_strlen_zero(codecs)) {
2900 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2901 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2905 ast_verbose("Found video format %s\n", ast_getformatname(codec));
2906 ast_rtp_set_m_type(p->vrtp, codec);
2908 /* Skip over any whitespace */
2909 while(*codecs && (*codecs < 33)) codecs++;
2913 ast_log(LOG_WARNING, "Unknown SDP media type in offer: %s\n", m);
2915 if (portno == -1 && vportno == -1) {
2916 /* No acceptable offer found in SDP */
2919 /* Check for Media-description-level-address for audio */
2920 if (pedanticsipchecking) {
2921 c = get_sdp_iterate(&destiterator, req, "c");
2922 if (!ast_strlen_zero(c)) {
2923 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2924 ast_log(LOG_WARNING, "Invalid secondary host in c= line, '%s'\n", c);
2926 /* XXX This could block for a long time, and block the main thread! XXX */
2927 hp = ast_gethostbyname(host, &ahp);
2929 ast_log(LOG_WARNING, "Unable to lookup host in secondary c= line, '%s'\n", c);
2934 /* RTP addresses and ports for audio and video */
2935 sin.sin_family = AF_INET;
2936 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
2938 /* Setup audio port number */
2939 sin.sin_port = htons(portno);
2940 if (p->rtp && sin.sin_port) {
2941 ast_rtp_set_peer(p->rtp, &sin);
2943 ast_verbose("Peer audio RTP is at port %s:%d\n", ast_inet_ntoa(iabuf,sizeof(iabuf), sin.sin_addr), ntohs(sin.sin_port));
2944 ast_log(LOG_DEBUG,"Peer audio RTP is at port %s:%d\n",ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr), ntohs(sin.sin_port));
2947 /* Check for Media-description-level-address for video */
2948 if (pedanticsipchecking) {
2949 c = get_sdp_iterate(&destiterator, req, "c");
2950 if (!ast_strlen_zero(c)) {
2951 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2952 ast_log(LOG_WARNING, "Invalid secondary host in c= line, '%s'\n", c);
2954 /* XXX This could block for a long time, and block the main thread! XXX */
2955 hp = ast_gethostbyname(host, &ahp);
2957 ast_log(LOG_WARNING, "Unable to lookup host in secondary c= line, '%s'\n", c);
2962 /* Setup video port number */
2963 sin.sin_port = htons(vportno);
2964 if (p->vrtp && sin.sin_port) {
2965 ast_rtp_set_peer(p->vrtp, &sin);
2967 ast_verbose("Peer video RTP is at port %s:%d\n", ast_inet_ntoa(iabuf,sizeof(iabuf), sin.sin_addr), ntohs(sin.sin_port));
2968 ast_log(LOG_DEBUG,"Peer video RTP is at port %s:%d\n",ast_inet_ntoa(iabuf, sizeof(iabuf), sin.sin_addr), ntohs(sin.sin_port));
2972 /* Next, scan through each "a=rtpmap:" line, noting each
2973 * specified RTP payload type (with corresponding MIME subtype):
2975 sdpLineNum_iterator_init(&iterator);
2976 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
2977 char* mimeSubtype = ast_strdupa(a); /* ensures we have enough space */
2978 if (!strcasecmp(a, "sendonly")) {
2982 if (!strcasecmp(a, "sendrecv")) {
2985 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
2987 ast_verbose("Found description format %s\n", mimeSubtype);
2988 /* Note: should really look at the 'freq' and '#chans' params too */
2989 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
2991 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
2994 /* Now gather all of the codecs that were asked for: */
2995 ast_rtp_get_current_formats(p->rtp,
2996 &peercapability, &peernoncodeccapability);
2998 ast_rtp_get_current_formats(p->vrtp,
2999 &vpeercapability, &vpeernoncodeccapability);
3000 p->jointcapability = p->capability & (peercapability | vpeercapability);
3001 p->peercapability = (peercapability | vpeercapability);
3002 p->noncodeccapability = noncodeccapability & peernoncodeccapability;
3005 /* shame on whoever coded this.... */
3006 const unsigned slen=512;
3007 char s1[slen], s2[slen], s3[slen], s4[slen];
3009 ast_verbose("Capabilities: us - %s, peer - audio=%s/video=%s, combined - %s\n",
3010 ast_getformatname_multiple(s1, slen, p->capability),
3011 ast_getformatname_multiple(s2, slen, peercapability),
3012 ast_getformatname_multiple(s3, slen, vpeercapability),
3013 ast_getformatname_multiple(s4, slen, p->jointcapability));
3015 ast_verbose("Non-codec capabilities: us - %s, peer - %s, combined - %s\n",
3016 ast_getformatname_multiple(s1, slen, noncodeccapability),
3017 ast_getformatname_multiple(s2, slen, peernoncodeccapability),
3018 ast_getformatname_multiple(s3, slen, p->noncodeccapability));
3020 if (!p->jointcapability) {
3021 ast_log(LOG_NOTICE, "No