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"
44 #include "asterisk/dnsmgr.h"
46 #include "asterisk/astosp.h"
48 #include <sys/socket.h>
49 #include <sys/ioctl.h>
56 #include <arpa/inet.h>
58 #include <sys/signal.h>
59 #include <netinet/in_systm.h>
60 #include <netinet/ip.h>
63 #ifndef DEFAULT_USERAGENT
64 #define DEFAULT_USERAGENT "Asterisk PBX"
67 #define VIDEO_CODEC_MASK 0x1fc0000 /* Video codecs from H.261 thru AST_FORMAT_MAX_VIDEO */
69 #define IPTOS_MINCOST 0x02
72 /* #define VOCAL_DATA_HACK */
75 #define DEFAULT_DEFAULT_EXPIRY 120
76 #define DEFAULT_MAX_EXPIRY 3600
77 #define DEFAULT_REGISTRATION_TIMEOUT 20
79 /* guard limit must be larger than guard secs */
80 /* guard min must be < 1000, and should be >= 250 */
81 #define EXPIRY_GUARD_SECS 15 /* How long before expiry do we reregister */
82 #define EXPIRY_GUARD_LIMIT 30 /* Below here, we use EXPIRY_GUARD_PCT instead of
84 #define EXPIRY_GUARD_MIN 500 /* This is the minimum guard time applied. If
85 GUARD_PCT turns out to be lower than this, it
86 will use this time instead.
87 This is in milliseconds. */
88 #define EXPIRY_GUARD_PCT 0.20 /* Percentage of expires timeout to use when
89 below EXPIRY_GUARD_LIMIT */
91 static int max_expiry = DEFAULT_MAX_EXPIRY;
92 static int default_expiry = DEFAULT_DEFAULT_EXPIRY;
95 #define MAX(a,b) ((a) > (b) ? (a) : (b))
98 #define CALLERID_UNKNOWN "Unknown"
102 #define DEFAULT_MAXMS 2000 /* Must be faster than 2 seconds by default */
103 #define DEFAULT_FREQ_OK 60 * 1000 /* How often to check for the host to be up */
104 #define DEFAULT_FREQ_NOTOK 10 * 1000 /* How often to check, if the host is down... */
106 #define DEFAULT_RETRANS 1000 /* How frequently to retransmit */
107 #define MAX_RETRANS 5 /* Try only 5 times for retransmissions */
110 #define DEBUG_READ 0 /* Recieved data */
111 #define DEBUG_SEND 1 /* Transmit data */
113 static const char desc[] = "Session Initiation Protocol (SIP)";
114 static const char channeltype[] = "SIP";
115 static const char config[] = "sip.conf";
116 static const char notify_config[] = "sip_notify.conf";
118 #define SIP_REGISTER 1
119 #define SIP_OPTIONS 2
126 #define SIP_SUBSCRIBE 9
127 #define SIP_MESSAGE 10
128 #define SIP_UPDATE 11
130 #define SIP_CANCEL 13
131 #define SIP_PUBLISH 14
132 #define SIP_RESPONSE 100
136 const struct cfsip_methods {
138 int need_rtp; /* when this is the 'primary' use for a pvt structure, does it need RTP? */
141 { 0, RTP, "-UNKNOWN-" },
142 { SIP_REGISTER, NO_RTP, "REGISTER" },
143 { SIP_OPTIONS, NO_RTP, "OPTIONS" },
144 { SIP_NOTIFY, NO_RTP, "NOTIFY" },
145 { SIP_INVITE, RTP, "INVITE" },
146 { SIP_ACK, NO_RTP, "ACK" },
147 { SIP_PRACK, NO_RTP, "PRACK" },
148 { SIP_BYE, NO_RTP, "BYE" },
149 { SIP_REFER, NO_RTP, "REFER" },
150 { SIP_SUBSCRIBE, NO_RTP, "SUBSCRIBE" },
151 { SIP_MESSAGE, NO_RTP, "MESSAGE" },
152 { SIP_UPDATE, NO_RTP, "UPDATE" },
153 { SIP_INFO, NO_RTP, "INFO" },
154 { SIP_CANCEL, NO_RTP, "CANCEL" },
155 { SIP_PUBLISH, NO_RTP, "PUBLISH" }
159 #define DEFAULT_SIP_PORT 5060 /* From RFC 2543 */
160 #define SIP_MAX_PACKET 4096 /* Also from RFC 2543, should sub headers tho */
162 #define ALLOWED_METHODS "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER"
164 static char default_useragent[AST_MAX_EXTENSION] = DEFAULT_USERAGENT;
166 #define DEFAULT_CONTEXT "default"
167 static char default_context[AST_MAX_EXTENSION] = DEFAULT_CONTEXT;
169 static char default_language[MAX_LANGUAGE] = "";
171 #define DEFAULT_CALLERID "asterisk"
172 static char default_callerid[AST_MAX_EXTENSION] = DEFAULT_CALLERID;
174 static char default_fromdomain[AST_MAX_EXTENSION] = "";
176 #define DEFAULT_NOTIFYMIME "application/simple-message-summary"
177 static char default_notifymime[AST_MAX_EXTENSION] = DEFAULT_NOTIFYMIME;
180 static int default_qualify = 0; /* Default Qualify= setting */
182 static struct ast_flags global_flags = {0}; /* global SIP_ flags */
183 static struct ast_flags global_flags_page2 = {0}; /* more global SIP_ flags */
185 static int srvlookup = 0; /* SRV Lookup on or off. Default is off, RFC behavior is on */
187 static int pedanticsipchecking = 0; /* Extra checking ? Default off */
189 static int autocreatepeer = 0; /* Auto creation of peers at registration? Default off. */
191 static int relaxdtmf = 0;
193 static int global_rtptimeout = 0;
195 static int global_rtpholdtimeout = 0;
197 static int global_rtpkeepalive = 0;
199 static int global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT;
201 /* Object counters */
202 static int suserobjs = 0;
203 static int ruserobjs = 0;
204 static int speerobjs = 0;
205 static int rpeerobjs = 0;
206 static int apeerobjs = 0;
207 static int regobjs = 0;
209 static int global_allowguest = 1; /* allow unauthenticated users/peers to connect? */
211 #define DEFAULT_MWITIME 10
212 static int global_mwitime = DEFAULT_MWITIME; /* Time between MWI checks for peers */
214 static int usecnt =0;
215 AST_MUTEX_DEFINE_STATIC(usecnt_lock);
218 /* Protect the interface list (of sip_pvt's) */
219 AST_MUTEX_DEFINE_STATIC(iflock);
221 /* Protect the monitoring thread, so only one process can kill or start it, and not
222 when it's doing something critical. */
223 AST_MUTEX_DEFINE_STATIC(netlock);
225 AST_MUTEX_DEFINE_STATIC(monlock);
227 /* This is the thread for the monitor which checks for input on the channels
228 which are not currently in use. */
229 static pthread_t monitor_thread = AST_PTHREADT_NULL;
231 static int restart_monitor(void);
233 /* Codecs that we support by default: */
234 static int global_capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263;
235 static int noncodeccapability = AST_RTP_DTMF;
237 static struct in_addr __ourip;
238 static struct sockaddr_in outboundproxyip;
241 static int sipdebug = 0;
242 static struct sockaddr_in debugaddr;
246 static int videosupport = 0;
248 static int compactheaders = 0; /* send compact sip headers */
250 static int recordhistory = 0; /* Record SIP history. Off by default */
252 static char global_musicclass[MAX_LANGUAGE] = ""; /* Global music on hold class */
253 #define DEFAULT_REALM "asterisk"
254 static char global_realm[AST_MAX_EXTENSION] = DEFAULT_REALM; /* Default realm */
255 static char regcontext[AST_MAX_EXTENSION] = ""; /* Context for auto-extensions */
258 #define DEFAULT_EXPIRY 900
259 static int expiry = DEFAULT_EXPIRY;
261 static struct sched_context *sched;
262 static struct io_context *io;
263 /* The private structures of the sip channels are linked for
264 selecting outgoing channels */
266 #define SIP_MAX_HEADERS 64
267 #define SIP_MAX_LINES 64
271 #define DEC_OUT_USE 2
272 #define INC_OUT_USE 3
274 static struct ast_codec_pref prefs;
277 /* sip_request: The data grabbed from the UDP socket */
279 char *rlPart1; /* SIP Method Name or "SIP/2.0" protocol version */
280 char *rlPart2; /* The Request URI or Response Status */
281 int len; /* Length */
282 int headers; /* # of SIP Headers */
283 int method; /* Method of this request */
284 char *header[SIP_MAX_HEADERS];
285 int lines; /* SDP Content */
286 char *line[SIP_MAX_LINES];
287 char data[SIP_MAX_PACKET];
293 struct sip_route *next;
297 /* sip_history: Structure for saving transactions within a SIP dialog */
300 struct sip_history *next;
303 /* sip_auth: Creadentials for authentication to other SIP services */
305 char realm[AST_MAX_EXTENSION]; /* Realm in which these credentials are valid */
306 char username[256]; /* Username */
307 char secret[256]; /* Secret */
308 char md5secret[256]; /* MD5Secret */
309 struct sip_auth *next; /* Next auth structure in list */
312 #define SIP_ALREADYGONE (1 << 0) /* Whether or not we've already been destroyed by our peer */
313 #define SIP_NEEDDESTROY (1 << 1) /* if we need to be destroyed */
314 #define SIP_NOVIDEO (1 << 2) /* Didn't get video in invite, don't offer */
315 #define SIP_RINGING (1 << 3) /* Have sent 180 ringing */
316 #define SIP_PROGRESS_SENT (1 << 4) /* Have sent 183 message progress */
317 #define SIP_NEEDREINVITE (1 << 5) /* Do we need to send another reinvite? */
318 #define SIP_PENDINGBYE (1 << 6) /* Need to send bye after we ack? */
319 #define SIP_GOTREFER (1 << 7) /* Got a refer? */
320 #define SIP_PROMISCREDIR (1 << 8) /* Promiscuous redirection */
321 #define SIP_TRUSTRPID (1 << 9) /* Trust RPID headers? */
322 #define SIP_USEREQPHONE (1 << 10) /* Add user=phone to numeric URI. Default off */
323 #define SIP_REALTIME (1 << 11) /* Flag for realtime users */
324 #define SIP_USECLIENTCODE (1 << 12) /* Trust X-ClientCode info message */
325 #define SIP_OUTGOING (1 << 13) /* Is this an outgoing call? */
326 #define SIP_SELFDESTRUCT (1 << 14)
327 #define SIP_DYNAMIC (1 << 15) /* Is this a dynamic peer? */
328 /* --- Choices for DTMF support in SIP channel */
329 #define SIP_DTMF (3 << 16) /* three settings, uses two bits */
330 #define SIP_DTMF_RFC2833 (0 << 16) /* RTP DTMF */
331 #define SIP_DTMF_INBAND (1 << 16) /* Inband audio, only for ULAW/ALAW */
332 #define SIP_DTMF_INFO (2 << 16) /* SIP Info messages */
334 #define SIP_NAT (3 << 18) /* four settings, uses two bits */
335 #define SIP_NAT_NEVER (0 << 18) /* No nat support */
336 #define SIP_NAT_RFC3581 (1 << 18)
337 #define SIP_NAT_ROUTE (2 << 18)
338 #define SIP_NAT_ALWAYS (3 << 18)
339 /* re-INVITE related settings */
340 #define SIP_REINVITE (3 << 20) /* two bits used */
341 #define SIP_CAN_REINVITE (1 << 20) /* allow peers to be reinvited to send media directly p2p */
342 #define SIP_REINVITE_UPDATE (2 << 20) /* use UPDATE (RFC3311) when reinviting this peer */
343 /* "insecure" settings */
344 #define SIP_INSECURE_PORT (1 << 22) /* don't require matching port for incoming requests */
345 #define SIP_INSECURE_INVITE (1 << 23) /* don't require authentication for incoming INVITEs */
346 /* Sending PROGRESS in-band settings */
347 #define SIP_PROG_INBAND (3 << 24) /* three settings, uses two bits */
348 #define SIP_PROG_INBAND_NEVER (0 << 24)
349 #define SIP_PROG_INBAND_NO (1 << 24)
350 #define SIP_PROG_INBAND_YES (2 << 24)
351 /* Open Settlement Protocol authentication */
352 #define SIP_OSPAUTH (3 << 26) /* three settings, uses two bits */
353 #define SIP_OSPAUTH_NO (0 << 26)
354 #define SIP_OSPAUTH_YES (1 << 26)
355 #define SIP_OSPAUTH_EXCLUSIVE (2 << 26)
357 #define SIP_CALL_ONHOLD (1 << 28)
358 #define SIP_CALL_LIMIT (1 << 29)
360 /* a new page of flags for peer */
361 #define SIP_PAGE2_RTCACHEFRIENDS (1 << 0)
362 #define SIP_PAGE2_RTNOUPDATE (1 << 1)
363 #define SIP_PAGE2_RTAUTOCLEAR (1 << 2)
365 static int global_rtautoclear = 120;
367 /* sip_pvt: PVT structures are used for each SIP conversation, ie. a call */
368 static struct sip_pvt {
369 ast_mutex_t lock; /* Channel private lock */
370 int method; /* SIP method of this packet */
371 char callid[80]; /* Global CallID */
372 char randdata[80]; /* Random data */
373 struct ast_codec_pref prefs; /* codec prefs */
374 unsigned int ocseq; /* Current outgoing seqno */
375 unsigned int icseq; /* Current incoming seqno */
376 ast_group_t callgroup; /* Call group */
377 ast_group_t pickupgroup; /* Pickup group */
378 int lastinvite; /* Last Cseq of invite */
379 unsigned int flags; /* SIP_ flags */
380 int capability; /* Special capability (codec) */
381 int jointcapability; /* Supported capability at both ends (codecs ) */
382 int peercapability; /* Supported peer capability */
383 int prefcodec; /* Preferred codec (outbound only) */
384 int noncodeccapability;
385 int callingpres; /* Calling presentation */
386 int authtries; /* Times we've tried to authenticate */
387 int expiry; /* How long we take to expire */
388 int branch; /* One random number */
389 int tag; /* Another random number */
390 int sessionid; /* SDP Session ID */
391 int sessionversion; /* SDP Session Version */
392 struct sockaddr_in sa; /* Our peer */
393 struct sockaddr_in redirip; /* Where our RTP should be going if not to us */
394 struct sockaddr_in vredirip; /* Where our Video RTP should be going if not to us */
395 int redircodecs; /* Redirect codecs */
396 struct sockaddr_in recv; /* Received as */
397 struct in_addr ourip; /* Our IP */
398 struct ast_channel *owner; /* Who owns us */
399 char exten[AST_MAX_EXTENSION]; /* Extension where to start */
400 char refer_to[AST_MAX_EXTENSION]; /* Place to store REFER-TO extension */
401 char referred_by[AST_MAX_EXTENSION]; /* Place to store REFERRED-BY extension */
402 char refer_contact[AST_MAX_EXTENSION]; /* Place to store Contact info from a REFER extension */
403 struct sip_pvt *refer_call; /* Call we are referring */
404 struct sip_route *route; /* Head of linked list of routing steps (fm Record-Route) */
405 int route_persistant; /* Is this the "real" route? */
406 char from[256]; /* The From: header */
407 char useragent[256]; /* User agent in SIP request */
408 char context[AST_MAX_EXTENSION]; /* Context for this call */
409 char fromdomain[AST_MAX_EXTENSION]; /* Domain to show in the from field */
410 char fromuser[AST_MAX_EXTENSION]; /* User to show in the user field */
411 char fromname[AST_MAX_EXTENSION]; /* Name to show in the user field */
412 char tohost[AST_MAX_EXTENSION]; /* Host we should put in the "to" field */
413 char language[MAX_LANGUAGE]; /* Default language for this call */
414 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
415 char rdnis[256]; /* Referring DNIS */
416 char theirtag[256]; /* Their tag */
417 char username[256]; /* [user] name */
418 char peername[256]; /* [peer] name, not set if [user] */
419 char authname[256]; /* Who we use for authentication */
420 char uri[256]; /* Original requested URI */
421 char okcontacturi[256]; /* URI from the 200 OK on INVITE */
422 char peersecret[256]; /* Password */
423 char peermd5secret[256];
424 struct sip_auth *peerauth; /* Realm authentication */
425 char cid_num[256]; /* Caller*ID */
426 char cid_name[256]; /* Caller*ID */
427 char via[256]; /* Via: header */
428 char fullcontact[128]; /* The Contact: that the UA registers with us */
429 char accountcode[20]; /* Account code */
430 char our_contact[256]; /* Our contact header */
431 char realm[256]; /* Authorization realm */
432 char nonce[256]; /* Authorization nonce */
433 char opaque[256]; /* Opaque nonsense */
434 char qop[80]; /* Quality of Protection, since SIP wasn't complicated enough yet. */
435 char domain[256]; /* Authorization domain */
436 char lastmsg[256]; /* Last Message sent/received */
437 int amaflags; /* AMA Flags */
438 int pendinginvite; /* Any pending invite */
440 int osphandle; /* OSP Handle for call */
441 time_t ospstart; /* OSP Start time */
443 struct sip_request initreq; /* Initial request */
445 int maxtime; /* Max time for first response */
446 int maxforwards; /* keep the max-forwards info */
447 int initid; /* Auto-congest ID if appropriate */
448 int autokillid; /* Auto-kill ID */
449 time_t lastrtprx; /* Last RTP received */
450 time_t lastrtptx; /* Last RTP sent */
451 int rtptimeout; /* RTP timeout time */
452 int rtpholdtimeout; /* RTP timeout when on hold */
453 int rtpkeepalive; /* Send RTP packets for keepalive */
455 int subscribed; /* Is this call a subscription? */
459 struct ast_dsp *vad; /* Voice Activation Detection dsp */
461 struct sip_peer *peerpoke; /* If this calls is to poke a peer, which one */
462 struct sip_registry *registry; /* If this is a REGISTER call, to which registry */
463 struct ast_rtp *rtp; /* RTP Session */
464 struct ast_rtp *vrtp; /* Video RTP session */
465 struct sip_pkt *packets; /* Packets scheduled for re-transmission */
466 struct sip_history *history; /* History of this SIP dialog */
467 struct ast_variable *chanvars; /* Channel variables to set for call */
468 struct sip_pvt *next; /* Next call in chain */
471 #define FLAG_RESPONSE (1 << 0)
472 #define FLAG_FATAL (1 << 1)
474 /* sip packet - read in sipsock_read, transmitted in send_request */
476 struct sip_pkt *next; /* Next packet */
477 int retrans; /* Retransmission number */
478 int seqno; /* Sequence number */
479 unsigned int flags; /* non-zero if this is a response packet (e.g. 200 OK) */
480 struct sip_pvt *owner; /* Owner call */
481 int retransid; /* Retransmission ID */
482 int packetlen; /* Length of packet */
486 /* Structure for SIP user data. User's place calls to us */
488 /* Users who can access various contexts */
489 ASTOBJ_COMPONENTS(struct sip_user);
490 char secret[80]; /* Password */
491 char md5secret[80]; /* Password in md5 */
492 char context[80]; /* Default context for incoming calls */
493 char cid_num[80]; /* Caller ID num */
494 char cid_name[80]; /* Caller ID name */
495 char accountcode[20]; /* Account code */
496 char language[MAX_LANGUAGE]; /* Default language for this user */
497 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
498 char useragent[256]; /* User agent in SIP request */
499 struct ast_codec_pref prefs; /* codec prefs */
500 ast_group_t callgroup; /* Call group */
501 ast_group_t pickupgroup; /* Pickup Group */
502 unsigned int flags; /* SIP_ flags */
503 struct ast_flags flags_page2; /* SIP_PAGE2 flags */
504 int amaflags; /* AMA flags for billing */
505 int callingpres; /* Calling id presentation */
506 int capability; /* Codec capability */
507 int inUse; /* Number of calls in use */
508 int incominglimit; /* Limit of incoming calls */
509 int outUse; /* disabled */
510 int outgoinglimit; /* disabled */
511 struct ast_ha *ha; /* ACL setting */
512 struct ast_variable *chanvars; /* Variables to set for channel created by user */
515 /* Structure for SIP peer data, we place calls to peers if registred or fixed IP address (host) */
517 ASTOBJ_COMPONENTS(struct sip_peer); /* name, refcount, objflags, object pointers */
518 /* peer->name is the unique name of this object */
519 char secret[80]; /* Password */
520 char md5secret[80]; /* Password in MD5 */
521 struct sip_auth *auth; /* Realm authentication list */
522 char context[80]; /* Default context for incoming calls */
523 char username[80]; /* Temporary username until registration */
524 char accountcode[20]; /* Account code */
525 int amaflags; /* AMA Flags (for billing) */
526 char tohost[80]; /* If not dynamic, IP address */
527 char regexten[AST_MAX_EXTENSION]; /* Extension to register (if regcontext is used) */
528 char fromuser[80]; /* From: user when calling this peer */
529 char fromdomain[80]; /* From: domain when calling this peer */
530 char fullcontact[128]; /* Contact registred with us (not in sip.conf) */
531 char cid_num[80]; /* Caller ID num */
532 char cid_name[80]; /* Caller ID name */
533 int callingpres; /* Calling id presentation */
534 int inUse; /* Number of calls in use */
535 int incominglimit; /* Limit of incoming calls */
536 int outUse; /* disabled */
537 int outgoinglimit; /* disabled */
538 char mailbox[AST_MAX_EXTENSION]; /* Mailbox setting for MWI checks */
539 char language[MAX_LANGUAGE]; /* Default language for prompts */
540 char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
541 char useragent[256]; /* User agent in SIP request (saved from registration) */
542 struct ast_codec_pref prefs; /* codec prefs */
544 time_t lastmsgcheck; /* Last time we checked for MWI */
545 unsigned int flags; /* SIP_ flags */
546 struct ast_flags flags_page2; /* SIP_PAGE2 flags */
547 int expire; /* When to expire this peer registration */
548 int expiry; /* Duration of registration */
549 int capability; /* Codec capability */
550 int rtptimeout; /* RTP timeout */
551 int rtpholdtimeout; /* RTP Hold Timeout */
552 int rtpkeepalive; /* Send RTP packets for keepalive */
553 ast_group_t callgroup; /* Call group */
554 ast_group_t pickupgroup; /* Pickup group */
555 struct ast_dnsmgr_entry *dnsmgr;/* DNS refresh manager for peer */
556 struct sockaddr_in addr; /* IP address of peer */
560 struct sip_pvt *call; /* Call pointer */
561 int pokeexpire; /* When to expire poke (qualify= checking) */
562 int lastms; /* How long last response took (in ms), or -1 for no response */
563 int maxms; /* Max ms we will accept for the host to be up, 0 to not monitor */
564 struct timeval ps; /* Ping send time */
566 struct sockaddr_in defaddr; /* Default IP address, used until registration */
567 struct ast_ha *ha; /* Access control list */
568 struct ast_variable *chanvars; /* Variables to set for channel created by user */
572 AST_MUTEX_DEFINE_STATIC(sip_reload_lock);
573 static int sip_reloading = 0;
575 /* States for outbound registrations (with register= lines in sip.conf */
576 #define REG_STATE_UNREGISTERED 0
577 #define REG_STATE_REGSENT 1
578 #define REG_STATE_AUTHSENT 2
579 #define REG_STATE_REGISTERED 3
580 #define REG_STATE_REJECTED 4
581 #define REG_STATE_TIMEOUT 5
582 #define REG_STATE_NOAUTH 6
585 /* sip_registry: Registrations with other SIP proxies */
586 struct sip_registry {
587 ASTOBJ_COMPONENTS_FULL(struct sip_registry,1,1);
588 int portno; /* Optional port override */
589 char username[80]; /* Who we are registering as */
590 char authuser[80]; /* Who we *authenticate* as */
591 char hostname[80]; /* Domain or host we register to */
592 char secret[80]; /* Password or key name in []'s */
594 char contact[80]; /* Contact extension */
596 int expire; /* Sched ID of expiration */
597 int timeout; /* sched id of sip_reg_timeout */
598 int refresh; /* How often to refresh */
599 struct sip_pvt *call; /* create a sip_pvt structure for each outbound "registration call" in progress */
600 int regstate; /* Registration state (see above) */
601 int callid_valid; /* 0 means we haven't chosen callid for this registry yet. */
602 char callid[80]; /* Global CallID for this registry */
603 unsigned int ocseq; /* Sequence number we got to for REGISTERs for this registry */
604 struct sockaddr_in us; /* Who the server thinks we are */
607 char realm[256]; /* Authorization realm */
608 char nonce[256]; /* Authorization nonce */
609 char domain[256]; /* Authorization domain */
610 char opaque[256]; /* Opaque nonsense */
611 char qop[80]; /* Quality of Protection. */
613 char lastmsg[256]; /* Last Message sent/received */
616 /*--- The user list: Users and friends ---*/
617 static struct ast_user_list {
618 ASTOBJ_CONTAINER_COMPONENTS(struct sip_user);
621 /*--- The peer list: Peers and Friends ---*/
622 static struct ast_peer_list {
623 ASTOBJ_CONTAINER_COMPONENTS(struct sip_peer);
626 /*--- The register list: Other SIP proxys we register with and call ---*/
627 static struct ast_register_list {
628 ASTOBJ_CONTAINER_COMPONENTS(struct sip_registry);
633 static int __sip_do_register(struct sip_registry *r);
635 static int sipsock = -1;
638 static struct sockaddr_in bindaddr;
639 static struct sockaddr_in externip;
640 static char externhost[256] = "";
641 static time_t externexpire = 0;
642 static int externrefresh = 10;
643 static struct ast_ha *localaddr;
645 /* The list of manual NOTIFY types we know how to send */
646 struct ast_config *notify_types;
648 static struct sip_auth *authl; /* Authentication list */
651 static struct ast_frame *sip_read(struct ast_channel *ast);
652 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req);
653 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
654 static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *rand, int reliable, char *header);
655 static int transmit_request(struct sip_pvt *p, int sipmethod, int inc, int reliable, int newbranch);
656 static int transmit_request_with_auth(struct sip_pvt *p, int sipmethod, int inc, int reliable, int newbranch);
657 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);
658 static int transmit_reinvite_with_sdp(struct sip_pvt *p);
659 static int transmit_info_with_digit(struct sip_pvt *p, char digit);
660 static int transmit_message_with_text(struct sip_pvt *p, const char *text);
661 static int transmit_refer(struct sip_pvt *p, const char *dest);
662 static int sip_sipredirect(struct sip_pvt *p, const char *dest);
663 static struct sip_peer *temp_peer(const char *name);
664 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req, char *header, char *respheader, int sipmethod, int init);
665 static void free_old_route(struct sip_route *route);
666 static int build_reply_digest(struct sip_pvt *p, int method, char *digest, int digest_len);
667 static int update_user_counter(struct sip_pvt *fup, int event);
668 static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int realtime);
669 static struct sip_user *build_user(const char *name, struct ast_variable *v, int realtime);
670 static int sip_do_reload(void);
671 static int expire_register(void *data);
672 static int callevents = 0;
674 static struct ast_channel *sip_request(const char *type, int format, void *data, int *cause);
675 static int sip_devicestate(void *data);
676 static int sip_sendtext(struct ast_channel *ast, const char *text);
677 static int sip_call(struct ast_channel *ast, char *dest, int timeout);
678 static int sip_hangup(struct ast_channel *ast);
679 static int sip_answer(struct ast_channel *ast);
680 static struct ast_frame *sip_read(struct ast_channel *ast);
681 static int sip_write(struct ast_channel *ast, struct ast_frame *frame);
682 static int sip_indicate(struct ast_channel *ast, int condition);
683 static int sip_transfer(struct ast_channel *ast, const char *dest);
684 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
685 static int sip_senddigit(struct ast_channel *ast, char digit);
686 static int clear_realm_authentication(struct sip_auth *authlist); /* Clear realm authentication list (at reload) */
687 static struct sip_auth *add_realm_authentication(struct sip_auth *authlist, char *configuration, int lineno); /* Add realm authentication in list */
688 static struct sip_auth *find_realm_authentication(struct sip_auth *authlist, char *realm); /* Find authentication for a specific realm */
690 /* Definition of this channel for channel registration */
691 static const struct ast_channel_tech sip_tech = {
693 .description = "Session Initiation Protocol (SIP)",
694 .capabilities = ((AST_FORMAT_MAX_AUDIO << 1) - 1),
695 .properties = AST_CHAN_TP_WANTSJITTER,
696 .requester = sip_request,
697 .devicestate = sip_devicestate,
699 .hangup = sip_hangup,
700 .answer = sip_answer,
703 .write_video = sip_write,
704 .indicate = sip_indicate,
705 .transfer = sip_transfer,
707 .send_digit = sip_senddigit,
708 .bridge = ast_rtp_bridge,
709 .send_text = sip_sendtext,
712 /*--- find_sip_method: Find SIP method from header */
713 int find_sip_method(char *msg)
716 /* Strictly speaking, SIP methods are case SENSITIVE, but we don't check */
717 for (i=1;(i < (sizeof(sip_methods) / sizeof(sip_methods[0]))) && !res; i++) {
718 if (!strcasecmp(sip_methods[i].text, msg))
719 res = sip_methods[i].id;
724 /*--- sip_debug_test_addr: See if we pass debug IP filter */
725 static inline int sip_debug_test_addr(struct sockaddr_in *addr)
729 if (debugaddr.sin_addr.s_addr) {
730 if (((ntohs(debugaddr.sin_port) != 0)
731 && (debugaddr.sin_port != addr->sin_port))
732 || (debugaddr.sin_addr.s_addr != addr->sin_addr.s_addr))
738 /*--- sip_debug_test_pvt: Test PVT for debugging output */
739 static inline int sip_debug_test_pvt(struct sip_pvt *p)
743 return sip_debug_test_addr(((ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE) ? &p->recv : &p->sa));
747 /*--- __sip_xmit: Transmit SIP message ---*/
748 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
751 char iabuf[INET_ADDRSTRLEN];
752 if (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)
753 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->recv, sizeof(struct sockaddr_in));
755 res=sendto(sipsock, data, len, 0, (struct sockaddr *)&p->sa, sizeof(struct sockaddr_in));
757 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));
762 static void sip_destroy(struct sip_pvt *p);
764 /*--- build_via: Build a Via header for a request ---*/
765 static void build_via(struct sip_pvt *p, char *buf, int len)
767 char iabuf[INET_ADDRSTRLEN];
769 /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */
770 if (ast_test_flag(p, SIP_NAT) != SIP_NAT_NEVER)
771 snprintf(buf, len, "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x;rport", ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ourport, p->branch);
772 else /* Work around buggy UNIDEN UIP200 firmware */
773 snprintf(buf, len, "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ourport, p->branch);
776 /*--- ast_sip_ouraddrfor: NAT fix - decide which IP address to use for ASterisk server? ---*/
777 /* Only used for outbound registrations */
778 static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
781 * Using the localaddr structure built up with localnet statements
782 * apply it to their address to see if we need to substitute our
783 * externip or can get away with our internal bindaddr
785 struct sockaddr_in theirs;
786 theirs.sin_addr = *them;
787 if (localaddr && externip.sin_addr.s_addr &&
788 ast_apply_ha(localaddr, &theirs)) {
789 char iabuf[INET_ADDRSTRLEN];
790 if (externexpire && (time(NULL) >= externexpire)) {
791 struct ast_hostent ahp;
794 externexpire += externrefresh;
795 if ((hp = ast_gethostbyname(externhost, &ahp))) {
796 memcpy(&externip.sin_addr, hp->h_addr, sizeof(externip.sin_addr));
798 ast_log(LOG_NOTICE, "Warning: Re-lookup of '%s' failed!\n", externhost);
800 memcpy(us, &externip.sin_addr, sizeof(struct in_addr));
801 ast_inet_ntoa(iabuf, sizeof(iabuf), *(struct in_addr *)&them->s_addr);
802 ast_log(LOG_DEBUG, "Target address %s is not local, substituting externip\n", iabuf);
804 else if (bindaddr.sin_addr.s_addr)
805 memcpy(us, &bindaddr.sin_addr, sizeof(struct in_addr));
807 return ast_ouraddrfor(them, us);
811 /*--- append_history: Append to SIP dialog history */
812 static int append_history(struct sip_pvt *p, char *event, char *data)
814 struct sip_history *hist, *prev;
818 hist = malloc(sizeof(struct sip_history));
820 memset(hist, 0, sizeof(struct sip_history));
821 snprintf(hist->event, sizeof(hist->event), "%-15s %s", event, data);
825 if ((*c == '\r') || (*c == '\n')) {
831 /* Enqueue into history */
844 /*--- retrans_pkt: Retransmit SIP message if no answer ---*/
845 static int retrans_pkt(void *data)
847 struct sip_pkt *pkt=data, *prev, *cur;
849 char iabuf[INET_ADDRSTRLEN];
850 ast_mutex_lock(&pkt->owner->lock);
851 if (pkt->retrans < MAX_RETRANS) {
853 if (sip_debug_test_pvt(pkt->owner)) {
854 if (ast_test_flag(pkt->owner, SIP_NAT) & SIP_NAT_ROUTE)
855 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);
857 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);
859 append_history(pkt->owner, "ReTx", pkt->data);
860 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
863 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");
864 append_history(pkt->owner, "MaxRetries", (ast_test_flag(pkt, FLAG_FATAL)) ? "(Critical)" : "(Non-critical)");
866 if (ast_test_flag(pkt, FLAG_FATAL)) {
867 while(pkt->owner->owner && ast_mutex_trylock(&pkt->owner->owner->lock)) {
868 ast_mutex_unlock(&pkt->owner->lock);
870 ast_mutex_lock(&pkt->owner->lock);
872 if (pkt->owner->owner) {
873 ast_set_flag(pkt->owner, SIP_ALREADYGONE);
874 ast_queue_hangup(pkt->owner->owner);
875 ast_mutex_unlock(&pkt->owner->owner->lock);
877 /* If no owner, destroy now */
878 ast_set_flag(pkt->owner, SIP_NEEDDESTROY);
881 /* In any case, go ahead and remove the packet */
883 cur = pkt->owner->packets;
892 prev->next = cur->next;
894 pkt->owner->packets = cur->next;
895 ast_mutex_unlock(&pkt->owner->lock);
899 ast_log(LOG_WARNING, "Weird, couldn't find packet owner!\n");
902 ast_mutex_unlock(&pkt->owner->lock);
906 /*--- __sip_reliable_xmit: transmit packet with retransmits ---*/
907 static int __sip_reliable_xmit(struct sip_pvt *p, int seqno, int resp, char *data, int len, int fatal)
910 pkt = malloc(sizeof(struct sip_pkt) + len + 1);
913 memset(pkt, 0, sizeof(struct sip_pkt));
914 memcpy(pkt->data, data, len);
915 pkt->packetlen = len;
916 pkt->next = p->packets;
920 pkt->data[len] = '\0';
922 ast_set_flag(pkt, FLAG_FATAL);
923 /* Schedule retransmission */
924 pkt->retransid = ast_sched_add(sched, DEFAULT_RETRANS, retrans_pkt, pkt);
925 pkt->next = p->packets;
927 __sip_xmit(pkt->owner, pkt->data, pkt->packetlen);
928 if (!strncasecmp(pkt->data, "INVITE", 6)) {
929 /* Note this is a pending invite */
930 p->pendinginvite = seqno;
935 /*--- __sip_autodestruct: Kill a call (called by scheduler) ---*/
936 static int __sip_autodestruct(void *data)
938 struct sip_pvt *p = data;
940 ast_log(LOG_DEBUG, "Auto destroying call '%s'\n", p->callid);
941 append_history(p, "AutoDestroy", "");
943 ast_log(LOG_WARNING, "Autodestruct on call '%s' with owner in place\n", p->callid);
944 ast_queue_hangup(p->owner);
951 /*--- sip_scheddestroy: Schedule destruction of SIP call ---*/
952 static int sip_scheddestroy(struct sip_pvt *p, int ms)
955 if (sip_debug_test_pvt(p))
956 ast_verbose("Scheduling destruction of call '%s' in %d ms\n", p->callid, ms);
958 snprintf(tmp, sizeof(tmp), "%d ms", ms);
959 append_history(p, "SchedDestroy", tmp);
961 if (p->autokillid > -1)
962 ast_sched_del(sched, p->autokillid);
963 p->autokillid = ast_sched_add(sched, ms, __sip_autodestruct, p);
967 /*--- sip_cancel_destroy: Cancel destruction of SIP call ---*/
968 static int sip_cancel_destroy(struct sip_pvt *p)
970 if (p->autokillid > -1)
971 ast_sched_del(sched, p->autokillid);
972 append_history(p, "CancelDestroy", "");
977 /*--- __sip_ack: Acknowledges receipt of a packet and stops retransmission ---*/
978 static int __sip_ack(struct sip_pvt *p, int seqno, int resp, int sipmethod)
980 struct sip_pkt *cur, *prev = NULL;
983 /* Just in case... */
987 msg = sip_methods[sipmethod].text;
992 if ((cur->seqno == seqno) && ((ast_test_flag(cur, FLAG_RESPONSE)) == resp) &&
993 ((ast_test_flag(cur, FLAG_RESPONSE)) ||
994 (!strncasecmp(msg, cur->data, strlen(msg)) && (cur->data[strlen(msg)] < 33)))) {
995 if (!resp && (seqno == p->pendinginvite)) {
996 ast_log(LOG_DEBUG, "Acked pending invite %d\n", p->pendinginvite);
997 p->pendinginvite = 0;
1000 /* this is our baby */
1002 prev->next = cur->next;
1004 p->packets = cur->next;
1005 if (cur->retransid > -1)
1006 ast_sched_del(sched, cur->retransid);
1014 ast_log(LOG_DEBUG, "Stopping retransmission on '%s' of %s %d: %s\n", p->callid, resp ? "Response" : "Request", seqno, res ? "Not Found" : "Found");
1018 /* Pretend to ack all packets */
1019 static int __sip_pretend_ack(struct sip_pvt *p)
1021 char method[128]="";
1022 struct sip_pkt *cur=NULL;
1025 if (cur == p->packets) {
1026 ast_log(LOG_WARNING, "Have a packet that doesn't want to give up!\n");
1030 ast_copy_string(method, p->packets->data, sizeof(method));
1032 while(*c && (*c < 33)) c++;
1034 __sip_ack(p, p->packets->seqno, (ast_test_flag(p->packets, FLAG_RESPONSE)), find_sip_method(method));
1039 /*--- __sip_semi_ack: Acks receipt of packet, keep it around (used for provisional responses) ---*/
1040 static int __sip_semi_ack(struct sip_pvt *p, int seqno, int resp, int sipmethod)
1042 struct sip_pkt *cur;
1044 char *msg = sip_methods[sipmethod].text;
1048 if ((cur->seqno == seqno) && ((ast_test_flag(cur, FLAG_RESPONSE)) == resp) &&
1049 ((ast_test_flag(cur, FLAG_RESPONSE)) ||
1050 (!strncasecmp(msg, cur->data, strlen(msg)) && (cur->data[strlen(msg)] < 33)))) {
1051 /* this is our baby */
1052 if (cur->retransid > -1)
1053 ast_sched_del(sched, cur->retransid);
1054 cur->retransid = -1;
1060 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");
1064 static void parse(struct sip_request *req);
1065 static char *get_header(struct sip_request *req, char *name);
1066 static void copy_request(struct sip_request *dst,struct sip_request *src);
1068 static void parse_copy(struct sip_request *dst, struct sip_request *src)
1070 memset(dst, 0, sizeof(*dst));
1071 memcpy(dst->data, src->data, sizeof(dst->data));
1072 dst->len = src->len;
1075 /*--- send_response: Transmit response on SIP request---*/
1076 static int send_response(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
1079 char iabuf[INET_ADDRSTRLEN];
1080 struct sip_request tmp;
1082 if (sip_debug_test_pvt(p)) {
1083 if (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)
1084 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);
1086 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);
1089 if (recordhistory) {
1090 parse_copy(&tmp, req);
1091 snprintf(tmpmsg, sizeof(tmpmsg), "%s / %s", tmp.data, get_header(&tmp, "CSeq"));
1092 append_history(p, "TxRespRel", tmpmsg);
1094 res = __sip_reliable_xmit(p, seqno, 1, req->data, req->len, (reliable > 1));
1096 if (recordhistory) {
1097 parse_copy(&tmp, req);
1098 snprintf(tmpmsg, sizeof(tmpmsg), "%s / %s", tmp.data, get_header(&tmp, "CSeq"));
1099 append_history(p, "TxResp", tmpmsg);
1101 res = __sip_xmit(p, req->data, req->len);
1108 /*--- send_request: Send SIP Request to the other part of the dialogue ---*/
1109 static int send_request(struct sip_pvt *p, struct sip_request *req, int reliable, int seqno)
1112 char iabuf[INET_ADDRSTRLEN];
1113 struct sip_request tmp;
1115 if (sip_debug_test_pvt(p)) {
1116 if (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)
1117 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);
1119 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);
1122 if (recordhistory) {
1123 parse_copy(&tmp, req);
1124 snprintf(tmpmsg, sizeof(tmpmsg), "%s / %s", tmp.data, get_header(&tmp, "CSeq"));
1125 append_history(p, "TxReqRel", tmpmsg);
1127 res = __sip_reliable_xmit(p, seqno, 0, req->data, req->len, (reliable > 1));
1129 if (recordhistory) {
1130 parse_copy(&tmp, req);
1131 snprintf(tmpmsg, sizeof(tmpmsg), "%s / %s", tmp.data, get_header(&tmp, "CSeq"));
1132 append_history(p, "TxReq", tmpmsg);
1134 res = __sip_xmit(p, req->data, req->len);
1139 /*--- url_decode: Decode SIP URL ---*/
1140 static void url_decode(char *s)
1147 if (strlen(s) > 2) {
1148 if (sscanf(s + 1, "%2x", &tmp) == 1) {
1150 s += 2; /* Will be incremented once more when we break out */
1154 /* Fall through if something wasn't right with the formatting */
1164 /*--- ditch_braces: Pick out text in braces from character string ---*/
1165 static char *ditch_braces(char *tmp)
1170 if ((q = strchr(tmp, '"')) ) {
1172 if ((q = strchr(c, '"')) )
1175 ast_log(LOG_WARNING, "No closing quote in '%s'\n", tmp);
1179 if ((n = strchr(c, '<')) ) {
1181 while(*c && *c != '>') c++;
1183 ast_log(LOG_WARNING, "No closing brace in '%s'\n", tmp);
1192 /*--- sip_sendtext: Send SIP MESSAGE text within a call ---*/
1193 /* Called from PBX core text message functions */
1194 static int sip_sendtext(struct ast_channel *ast, const char *text)
1196 struct sip_pvt *p = ast->tech_pvt;
1197 int debug=sip_debug_test_pvt(p);
1200 ast_verbose("Sending text %s on %s\n", text, ast->name);
1203 if (!text || ast_strlen_zero(text))
1206 ast_verbose("Really sending text %s on %s\n", text, ast->name);
1207 transmit_message_with_text(p, text);
1211 /*--- realtime_update_peer: Update peer object in realtime storage ---*/
1212 static void realtime_update_peer(const char *peername, struct sockaddr_in *sin, const char *username, int expirey)
1215 char ipaddr[20] = "";
1216 char regseconds[20] = "0";
1218 if (expirey) { /* Registration */
1222 snprintf(regseconds, sizeof(regseconds), "%ld", nowtime); /* Expiration time */
1223 ast_inet_ntoa(ipaddr, sizeof(ipaddr), sin->sin_addr);
1224 snprintf(port, sizeof(port), "%d", ntohs(sin->sin_port));
1226 ast_update_realtime("sippeers", "name", peername, "ipaddr", ipaddr, "port", port, "regseconds", regseconds, "username", username, NULL);
1229 /*--- register_peer_exten: Automatically add peer extension to dial plan ---*/
1230 static void register_peer_exten(struct sip_peer *peer, int onoff)
1232 unsigned char multi[256]="";
1233 char *stringp, *ext;
1234 if (!ast_strlen_zero(regcontext)) {
1235 ast_copy_string(multi, ast_strlen_zero(peer->regexten) ? peer->name : peer->regexten, sizeof(multi));
1237 while((ext = strsep(&stringp, "&"))) {
1239 ast_add_extension(regcontext, 1, ext, 1, NULL, NULL, "Noop", strdup(peer->name), free, channeltype);
1241 ast_context_remove_extension(regcontext, ext, 1, NULL);
1246 /*--- sip_destroy_peer: Destroy peer object from memory */
1247 static void sip_destroy_peer(struct sip_peer *peer)
1249 /* Delete it, it needs to disappear */
1251 sip_destroy(peer->call);
1252 if(peer->chanvars) {
1253 ast_variables_destroy(peer->chanvars);
1254 peer->chanvars = NULL;
1256 if (peer->expire > -1)
1257 ast_sched_del(sched, peer->expire);
1258 if (peer->pokeexpire > -1)
1259 ast_sched_del(sched, peer->pokeexpire);
1260 register_peer_exten(peer, 0);
1261 ast_free_ha(peer->ha);
1262 if (ast_test_flag(peer, SIP_SELFDESTRUCT))
1264 else if (ast_test_flag(peer, SIP_REALTIME))
1268 clear_realm_authentication(peer->auth);
1269 peer->auth = (struct sip_auth *) NULL;
1271 ast_dnsmgr_release(peer->dnsmgr);
1275 /*--- update_peer: Update peer data in database (if used) ---*/
1276 static void update_peer(struct sip_peer *p, int expiry)
1278 if (!ast_test_flag((&global_flags_page2), SIP_PAGE2_RTNOUPDATE) &&
1279 (ast_test_flag(p, SIP_REALTIME) ||
1280 ast_test_flag(&(p->flags_page2), SIP_PAGE2_RTCACHEFRIENDS))) {
1281 if (p->expire == -1)
1282 expiry = 0; /* Unregister realtime peer */
1283 realtime_update_peer(p->name, &p->addr, p->username, expiry);
1288 /*--- realtime_peer: Get peer from realtime storage ---*/
1289 /* Checks the "sippeers" realtime family from extconfig.conf */
1290 static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *sin)
1292 struct sip_peer *peer=NULL;
1293 struct ast_variable *var;
1294 struct ast_variable *tmp;
1295 char *newpeername = (char *) peername;
1296 char iabuf[80] = "";
1298 /* First check on peer name */
1300 var = ast_load_realtime("sippeers", "name", peername, NULL);
1301 else if (sin) { /* Then check on IP address */
1302 ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr);
1303 var = ast_load_realtime("sippeers", "ipaddr", iabuf, NULL);
1311 /* If this is type=user, then skip this object. */
1313 if (!strcasecmp(tmp->name, "type") &&
1314 !strcasecmp(tmp->value, "user")) {
1315 ast_variables_destroy(var);
1317 } else if(!newpeername && !strcasecmp(tmp->name, "name")) {
1318 newpeername = tmp->value;
1324 peer = build_peer(newpeername, var, !ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS));
1327 if(ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) {
1328 ast_copy_flags((&peer->flags_page2),(&global_flags_page2), SIP_PAGE2_RTAUTOCLEAR|SIP_PAGE2_RTCACHEFRIENDS);
1329 if(ast_test_flag((&global_flags_page2), SIP_PAGE2_RTAUTOCLEAR)) {
1330 if (peer->expire > -1) {
1331 ast_sched_del(sched, peer->expire);
1333 peer->expire = ast_sched_add(sched, (global_rtautoclear) * 1000, expire_register, (void *)peer);
1335 ASTOBJ_CONTAINER_LINK(&peerl,peer);
1337 ast_set_flag(peer, SIP_REALTIME);
1341 ast_log(LOG_WARNING, "Cannot Determine peer name ip=%s\n", iabuf);
1344 ast_variables_destroy(var);
1348 /*--- sip_addrcmp: Support routine for find_peer ---*/
1349 static int sip_addrcmp(char *name, struct sockaddr_in *sin)
1351 /* We know name is the first field, so we can cast */
1352 struct sip_peer *p = (struct sip_peer *)name;
1353 return !(!inaddrcmp(&p->addr, sin) ||
1354 (ast_test_flag(p, SIP_INSECURE_PORT) &&
1355 (p->addr.sin_addr.s_addr == sin->sin_addr.s_addr)));
1358 /*--- find_peer: Locate peer by name or ip address */
1359 static struct sip_peer *find_peer(const char *peer, struct sockaddr_in *sin, int realtime)
1361 struct sip_peer *p = NULL;
1364 p = ASTOBJ_CONTAINER_FIND(&peerl,peer);
1366 p = ASTOBJ_CONTAINER_FIND_FULL(&peerl,sin,name,sip_addr_hashfunc,1,sip_addrcmp);
1368 if (!p && realtime) {
1369 p = realtime_peer(peer, sin);
1375 /*--- sip_destroy_user: Remove user object from in-memory storage ---*/
1376 static void sip_destroy_user(struct sip_user *user)
1378 ast_free_ha(user->ha);
1379 if(user->chanvars) {
1380 ast_variables_destroy(user->chanvars);
1381 user->chanvars = NULL;
1383 if (ast_test_flag(user, SIP_REALTIME))
1390 /*--- realtime_user: Load user from realtime storage ---*/
1391 /* Loads user from "sipusers" category in realtime (extconfig.conf) */
1392 /* Users are matched on From: user name (the domain in skipped) */
1393 static struct sip_user *realtime_user(const char *username)
1395 struct ast_variable *var;
1396 struct ast_variable *tmp;
1397 struct sip_user *user = NULL;
1399 var = ast_load_realtime("sipusers", "name", username, NULL);
1406 if (!strcasecmp(tmp->name, "type") &&
1407 !strcasecmp(tmp->value, "peer")) {
1408 ast_variables_destroy(var);
1416 user = build_user(username, var, !ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS));
1419 if(ast_test_flag((&global_flags_page2), SIP_PAGE2_RTCACHEFRIENDS)) {
1420 ast_set_flag((&user->flags_page2), SIP_PAGE2_RTCACHEFRIENDS);
1422 ASTOBJ_CONTAINER_LINK(&userl,user);
1424 /* Move counter from s to r... */
1427 ast_set_flag(user, SIP_REALTIME);
1430 ast_variables_destroy(var);
1434 /*--- find_user: Locate user by name ---*/
1435 /* Locates user by name (From: sip uri user name part) first
1436 from in-memory list (static configuration) then from
1437 realtime storage (defined in extconfig.conf) */
1438 static struct sip_user *find_user(const char *name, int realtime)
1440 struct sip_user *u = NULL;
1441 u = ASTOBJ_CONTAINER_FIND(&userl,name);
1442 if (!u && realtime) {
1443 u = realtime_user(name);
1448 /*--- create_addr: create address structure from peer definition ---*/
1449 /* Or, if peer not found, find it in the global DNS */
1450 /* returns TRUE on failure, FALSE on success */
1451 static int create_addr(struct sip_pvt *r, char *opeer)
1454 struct ast_hostent ahp;
1460 char host[256], *hostn;
1463 ast_copy_string(peer, opeer, sizeof(peer));
1464 port = strchr(peer, ':');
1469 r->sa.sin_family = AF_INET;
1470 p = find_peer(peer, NULL, 1);
1474 ast_copy_flags(r, p,
1475 SIP_PROMISCREDIR | SIP_USEREQPHONE | SIP_DTMF | SIP_NAT | SIP_REINVITE |
1476 SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
1477 r->capability = p->capability;
1479 ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
1480 ast_rtp_setnat(r->rtp, (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
1483 ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
1484 ast_rtp_setnat(r->vrtp, (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
1486 ast_copy_string(r->peername, p->username, sizeof(r->peername));
1487 ast_copy_string(r->authname, p->username, sizeof(r->authname));
1488 ast_copy_string(r->username, p->username, sizeof(r->username));
1489 ast_copy_string(r->peersecret, p->secret, sizeof(r->peersecret));
1490 ast_copy_string(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret));
1491 ast_copy_string(r->tohost, p->tohost, sizeof(r->tohost));
1492 ast_copy_string(r->fullcontact, p->fullcontact, sizeof(r->fullcontact));
1493 if (!r->initreq.headers && !ast_strlen_zero(p->fromdomain)) {
1494 if ((callhost = strchr(r->callid, '@'))) {
1495 ast_copy_string(callhost + 1, p->fromdomain, sizeof(r->callid) - (callhost - r->callid) - 1);
1498 if (ast_strlen_zero(r->tohost)) {
1499 if (p->addr.sin_addr.s_addr)
1500 ast_inet_ntoa(r->tohost, sizeof(r->tohost), p->addr.sin_addr);
1502 ast_inet_ntoa(r->tohost, sizeof(r->tohost), p->defaddr.sin_addr);
1504 if (!ast_strlen_zero(p->fromdomain))
1505 ast_copy_string(r->fromdomain, p->fromdomain, sizeof(r->fromdomain));
1506 if (!ast_strlen_zero(p->fromuser))
1507 ast_copy_string(r->fromuser, p->fromuser, sizeof(r->fromuser));
1508 r->maxtime = p->maxms;
1509 r->callgroup = p->callgroup;
1510 r->pickupgroup = p->pickupgroup;
1511 if (ast_test_flag(r, SIP_DTMF) == SIP_DTMF_RFC2833)
1512 r->noncodeccapability |= AST_RTP_DTMF;
1514 r->noncodeccapability &= ~AST_RTP_DTMF;
1515 ast_copy_string(r->context, p->context,sizeof(r->context));
1516 if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
1517 (!p->maxms || ((p->lastms >= 0) && (p->lastms <= p->maxms)))) {
1518 if (p->addr.sin_addr.s_addr) {
1519 r->sa.sin_addr = p->addr.sin_addr;
1520 r->sa.sin_port = p->addr.sin_port;
1522 r->sa.sin_addr = p->defaddr.sin_addr;
1523 r->sa.sin_port = p->defaddr.sin_port;
1525 memcpy(&r->recv, &r->sa, sizeof(r->recv));
1527 ASTOBJ_UNREF(p,sip_destroy_peer);
1533 portno = atoi(port);
1535 portno = DEFAULT_SIP_PORT;
1540 snprintf(service, sizeof(service), "_sip._udp.%s", peer);
1541 ret = ast_get_srv(NULL, host, sizeof(host), &tportno, service);
1547 hp = ast_gethostbyname(hostn, &ahp);
1549 ast_copy_string(r->tohost, peer, sizeof(r->tohost));
1550 memcpy(&r->sa.sin_addr, hp->h_addr, sizeof(r->sa.sin_addr));
1551 r->sa.sin_port = htons(portno);
1552 memcpy(&r->recv, &r->sa, sizeof(r->recv));
1555 ast_log(LOG_WARNING, "No such host: %s\n", peer);
1561 ASTOBJ_UNREF(p,sip_destroy_peer);
1566 /*--- auto_congest: Scheduled congestion on a call ---*/
1567 static int auto_congest(void *nothing)
1569 struct sip_pvt *p = nothing;
1570 ast_mutex_lock(&p->lock);
1573 if (!ast_mutex_trylock(&p->owner->lock)) {
1574 ast_log(LOG_NOTICE, "Auto-congesting %s\n", p->owner->name);
1575 ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
1576 ast_mutex_unlock(&p->owner->lock);
1579 ast_mutex_unlock(&p->lock);
1586 /*--- sip_call: Initiate SIP call from PBX ---*/
1587 /* used from the dial() application */
1588 static int sip_call(struct ast_channel *ast, char *dest, int timeout)
1592 char *vxml_url = NULL;
1593 char *distinctive_ring = NULL;
1594 char *osptoken = NULL;
1596 char *osphandle = NULL;
1598 struct varshead *headp;
1599 struct ast_var_t *current;
1600 int addsipheaders = 0;
1603 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
1604 ast_log(LOG_WARNING, "sip_call called on %s, neither down nor reserved\n", ast->name);
1607 /* Check whether there is vxml_url, distinctive ring variables */
1609 headp=&ast->varshead;
1610 AST_LIST_TRAVERSE(headp,current,entries) {
1611 /* Check whether there is a VXML_URL variable */
1612 if (!vxml_url && !strcasecmp(ast_var_name(current),"VXML_URL")) {
1613 vxml_url = ast_var_value(current);
1614 } else if (!distinctive_ring && !strcasecmp(ast_var_name(current),"ALERT_INFO")) {
1615 /* Check whether there is a ALERT_INFO variable */
1616 distinctive_ring = ast_var_value(current);
1617 } else if (!addsipheaders && !strncasecmp(ast_var_name(current),"SIPADDHEADER",strlen("SIPADDHEADER"))) {
1618 /* Check whether there is a variable with a name starting with SIPADDHEADER */
1624 else if (!osptoken && !strcasecmp(ast_var_name(current), "OSPTOKEN")) {
1625 osptoken = ast_var_value(current);
1626 } else if (!osphandle && !strcasecmp(ast_var_name(current), "OSPHANDLE")) {
1627 osphandle = ast_var_value(current);
1633 ast_set_flag(p, SIP_OUTGOING);
1635 if (!osptoken || !osphandle || (sscanf(osphandle, "%d", &p->osphandle) != 1)) {
1636 /* Force Disable OSP support */
1637 ast_log(LOG_DEBUG, "Disabling OSP support for this call. osptoken = %s, osphandle = %s\n", osptoken, osphandle);
1643 ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
1644 res = update_user_counter(p,INC_OUT_USE);
1646 p->callingpres = ast->cid.cid_pres;
1647 p->jointcapability = p->capability;
1648 transmit_invite(p, SIP_INVITE, 1, NULL, NULL, vxml_url,distinctive_ring, osptoken, addsipheaders, 1);
1650 /* Initialize auto-congest time */
1651 p->initid = ast_sched_add(sched, p->maxtime * 4, auto_congest, p);
1657 /*--- sip_registry_destroy: Destroy registry object ---*/
1658 /* Objects created with the register= statement in static configuration */
1659 static void sip_registry_destroy(struct sip_registry *reg)
1663 /* Clear registry before destroying to ensure
1664 we don't get reentered trying to grab the registry lock */
1665 reg->call->registry = NULL;
1666 sip_destroy(reg->call);
1668 if (reg->expire > -1)
1669 ast_sched_del(sched, reg->expire);
1670 if (reg->timeout > -1)
1671 ast_sched_del(sched, reg->timeout);
1677 /*--- __sip_destroy: Execute destrucion of call structure, release memory---*/
1678 static void __sip_destroy(struct sip_pvt *p, int lockowner)
1680 struct sip_pvt *cur, *prev = NULL;
1682 struct sip_history *hist;
1684 if (sip_debug_test_pvt(p))
1685 ast_verbose("Destroying call '%s'\n", p->callid);
1686 if (p->stateid > -1)
1687 ast_extension_state_del(p->stateid, NULL);
1689 ast_sched_del(sched, p->initid);
1690 if (p->autokillid > -1)
1691 ast_sched_del(sched, p->autokillid);
1694 ast_rtp_destroy(p->rtp);
1697 ast_rtp_destroy(p->vrtp);
1700 free_old_route(p->route);
1704 if (p->registry->call == p)
1705 p->registry->call = NULL;
1706 ASTOBJ_UNREF(p->registry,sip_registry_destroy);
1708 /* Unlink us from the owner if we have one */
1711 ast_mutex_lock(&p->owner->lock);
1712 ast_log(LOG_DEBUG, "Detaching from %s\n", p->owner->name);
1713 p->owner->tech_pvt = NULL;
1715 ast_mutex_unlock(&p->owner->lock);
1720 p->history = p->history->next;
1727 prev->next = cur->next;
1736 ast_log(LOG_WARNING, "%p is not in list?!?! \n", cur);
1739 ast_sched_del(sched, p->initid);
1740 while((cp = p->packets)) {
1741 p->packets = p->packets->next;
1742 if (cp->retransid > -1)
1743 ast_sched_del(sched, cp->retransid);
1746 ast_mutex_destroy(&p->lock);
1748 ast_variables_destroy(p->chanvars);
1755 /*--- update_user_counter: Handle incominglimit and outgoinglimit for SIP users ---*/
1756 /* Note: This is going to be replaced by app_groupcount */
1757 /* Thought: For realtime, we should propably update storage with inuse counter... */
1758 static int update_user_counter(struct sip_pvt *fup, int event)
1760 char name[256] = "";
1763 int *inuse, *incominglimit;
1765 /* Test if we need to check call limits, in order to avoid
1766 realtime lookups if we do not need it */
1767 if (!ast_test_flag(fup, SIP_CALL_LIMIT))
1770 ast_copy_string(name, fup->username, sizeof(name));
1772 /* Check the list of users */
1773 u = find_user(name, 1);
1776 incominglimit = &u->incominglimit;
1779 /* Try to find peer */
1780 p = find_peer(fup->peername, NULL, 1);
1783 incominglimit = &p->incominglimit;
1784 ast_copy_string(name, fup->peername, sizeof(name));
1786 ast_log(LOG_DEBUG, "%s is not a local user\n", name);
1791 /* incoming and outgoing affects the inUse counter */
1802 if (*incominglimit > 0 ) {
1803 if (*inuse >= *incominglimit) {
1804 ast_log(LOG_ERROR, "Call from %s '%s' rejected due to usage limit of %d\n", u?"user":"peer", name, *incominglimit);
1805 /* inc inUse as well */
1806 if ( event == INC_OUT_USE ) {
1810 ASTOBJ_UNREF(u,sip_destroy_user);
1812 ASTOBJ_UNREF(p,sip_destroy_peer);
1817 ast_log(LOG_DEBUG, "Call from %s '%s' is %d out of %d\n", u?"user":"peer", name, *inuse, *incominglimit);
1819 #ifdef DISABLED_CODE
1820 /* we don't use these anymore */
1822 if ( u->outUse > 0 ) {
1829 if ( u->outgoinglimit > 0 ) {
1830 if ( u->outUse >= u->outgoinglimit ) {
1831 ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
1832 ast_mutex_unlock(&userl.lock);
1843 ast_log(LOG_ERROR, "update_user_counter(%s,%d) called with no event!\n",name,event);
1846 ASTOBJ_UNREF(u,sip_destroy_user);
1848 ASTOBJ_UNREF(p,sip_destroy_peer);
1852 /*--- sip_destroy: Destroy SIP call structure ---*/
1853 static void sip_destroy(struct sip_pvt *p)
1855 ast_mutex_lock(&iflock);
1856 __sip_destroy(p, 1);
1857 ast_mutex_unlock(&iflock);
1861 static int transmit_response_reliable(struct sip_pvt *p, char *msg, struct sip_request *req, int fatal);
1863 /*--- hangup_sip2cause: Convert SIP hangup causes to Asterisk hangup causes ---*/
1864 static int hangup_sip2cause(int cause)
1866 /* Possible values from causes.h
1867 AST_CAUSE_NOTDEFINED AST_CAUSE_NORMAL AST_CAUSE_BUSY
1868 AST_CAUSE_FAILURE AST_CAUSE_CONGESTION AST_CAUSE_UNALLOCATED
1872 case 404: /* Not found */
1873 return AST_CAUSE_UNALLOCATED;
1874 case 483: /* Too many hops */
1875 return AST_CAUSE_FAILURE;
1877 return AST_CAUSE_BUSY;
1879 return AST_CAUSE_NORMAL;
1885 /*--- hangup_cause2sip: Convert Asterisk hangup causes to SIP codes ---*/
1886 static char *hangup_cause2sip(int cause)
1890 case AST_CAUSE_FAILURE:
1891 return "500 Server internal failure";
1892 case AST_CAUSE_CONGESTION:
1893 return "503 Service Unavailable";
1894 case AST_CAUSE_BUSY:
1903 /*--- sip_hangup: Hangup SIP call ---*/
1904 /* Part of PBX interface */
1905 static int sip_hangup(struct ast_channel *ast)
1907 struct sip_pvt *p = ast->tech_pvt;
1909 struct ast_flags locflags = {0};
1911 ast_log(LOG_DEBUG, "sip_hangup(%s)\n", ast->name);
1913 ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
1916 ast_mutex_lock(&p->lock);
1918 if ((p->osphandle > -1) && (ast->_state == AST_STATE_UP)) {
1919 ast_osp_terminate(p->osphandle, AST_CAUSE_NORMAL, p->ospstart, time(NULL) - p->ospstart);
1922 if (ast_test_flag(p, SIP_OUTGOING)) {
1923 ast_log(LOG_DEBUG, "update_user_counter(%s) - decrement outUse counter\n", p->username);
1924 update_user_counter(p, DEC_OUT_USE);
1926 ast_log(LOG_DEBUG, "update_user_counter(%s) - decrement inUse counter\n", p->username);
1927 update_user_counter(p, DEC_IN_USE);
1929 /* Determine how to disconnect */
1930 if (p->owner != ast) {
1931 ast_log(LOG_WARNING, "Huh? We aren't the owner?\n");
1932 ast_mutex_unlock(&p->lock);
1935 if (ast->_state != AST_STATE_UP)
1940 ast_dsp_free(p->vad);
1943 ast->tech_pvt = NULL;
1945 ast_mutex_lock(&usecnt_lock);
1947 ast_mutex_unlock(&usecnt_lock);
1948 ast_update_use_count();
1950 ast_set_flag(&locflags, SIP_NEEDDESTROY);
1951 /* Start the process if it's not already started */
1952 if (!ast_test_flag(p, SIP_ALREADYGONE) && !ast_strlen_zero(p->initreq.data)) {
1954 if (ast_test_flag(p, SIP_OUTGOING)) {
1955 transmit_request_with_auth(p, SIP_CANCEL, p->ocseq, 1, 0);
1956 /* Actually don't destroy us yet, wait for the 487 on our original
1957 INVITE, but do set an autodestruct just in case we never get it. */
1958 ast_clear_flag(&locflags, SIP_NEEDDESTROY);
1959 sip_scheddestroy(p, 15000);
1960 if ( p->initid != -1 ) {
1961 /* channel still up - reverse dec of inUse counter
1962 only if the channel is not auto-congested */
1963 if (ast_test_flag(p, SIP_OUTGOING)) {
1964 update_user_counter(p, INC_OUT_USE);
1967 update_user_counter(p, INC_IN_USE);
1972 if (ast->hangupcause && ((res = hangup_cause2sip(ast->hangupcause)))) {
1973 transmit_response_reliable(p, res, &p->initreq, 1);
1975 transmit_response_reliable(p, "403 Forbidden", &p->initreq, 1);
1978 if (!p->pendinginvite) {
1980 transmit_request_with_auth(p, SIP_BYE, 0, 1, 1);
1982 /* Note we will need a BYE when this all settles out
1983 but we can't send one while we have "INVITE" outstanding. */
1984 ast_set_flag(p, SIP_PENDINGBYE);
1985 ast_clear_flag(p, SIP_NEEDREINVITE);
1989 ast_copy_flags(p, (&locflags), SIP_NEEDDESTROY);
1990 ast_mutex_unlock(&p->lock);
1994 /*--- sip_answer: Answer SIP call , send 200 OK on Invite ---*/
1995 /* Part of PBX interface */
1996 static int sip_answer(struct ast_channel *ast)
2000 struct sip_pvt *p = ast->tech_pvt;
2002 ast_mutex_lock(&p->lock);
2003 if (ast->_state != AST_STATE_UP) {
2008 codec=pbx_builtin_getvar_helper(p->owner,"SIP_CODEC");
2010 fmt=ast_getformatbyname(codec);
2012 ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
2013 if (p->jointcapability & fmt) {
2014 p->jointcapability &= fmt;
2015 p->capability &= fmt;
2017 ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because it is not shared by both ends.\n");
2018 } else ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n",codec);
2021 ast_setstate(ast, AST_STATE_UP);
2023 ast_log(LOG_DEBUG, "sip_answer(%s)\n", ast->name);
2024 res = transmit_response_with_sdp(p, "200 OK", &p->initreq, 1);
2026 ast_mutex_unlock(&p->lock);
2030 /*--- sip_write: Send response, support audio media ---*/
2031 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
2033 struct sip_pvt *p = ast->tech_pvt;
2035 if (frame->frametype == AST_FRAME_VOICE) {
2036 if (!(frame->subclass & ast->nativeformats)) {
2037 ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
2038 frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
2042 ast_mutex_lock(&p->lock);
2044 if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
2045 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
2046 ast_set_flag(p, SIP_PROGRESS_SENT);
2048 time(&p->lastrtptx);
2049 res = ast_rtp_write(p->rtp, frame);
2051 ast_mutex_unlock(&p->lock);
2053 } else if (frame->frametype == AST_FRAME_VIDEO) {
2055 ast_mutex_lock(&p->lock);
2057 if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
2058 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
2059 ast_set_flag(p, SIP_PROGRESS_SENT);
2061 time(&p->lastrtptx);
2062 res = ast_rtp_write(p->vrtp, frame);
2064 ast_mutex_unlock(&p->lock);
2066 } else if (frame->frametype == AST_FRAME_IMAGE) {
2069 ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", frame->frametype);
2076 /*--- sip_fixup: Fix up a channel: If a channel is consumed, this is called.
2077 Basically update any ->owner links ----*/
2078 static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
2080 struct sip_pvt *p = newchan->tech_pvt;
2081 ast_mutex_lock(&p->lock);
2082 if (p->owner != oldchan) {
2083 ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
2084 ast_mutex_unlock(&p->lock);
2088 ast_mutex_unlock(&p->lock);
2092 /*--- sip_senddigit: Send DTMF character on SIP channel */
2093 /* within one call, we're able to transmit in many methods simultaneously */
2094 static int sip_senddigit(struct ast_channel *ast, char digit)
2096 struct sip_pvt *p = ast->tech_pvt;
2098 ast_mutex_lock(&p->lock);
2099 switch (ast_test_flag(p, SIP_DTMF)) {
2101 transmit_info_with_digit(p, digit);
2103 case SIP_DTMF_RFC2833:
2105 ast_rtp_senddigit(p->rtp, digit);
2107 case SIP_DTMF_INBAND:
2111 ast_mutex_unlock(&p->lock);
2116 /*--- sip_transfer: Transfer SIP call */
2117 static int sip_transfer(struct ast_channel *ast, const char *dest)
2119 struct sip_pvt *p = ast->tech_pvt;
2122 ast_mutex_lock(&p->lock);
2123 if (ast->_state == AST_STATE_RING)
2124 res = sip_sipredirect(p, dest);
2126 res = transmit_refer(p, dest);
2127 ast_mutex_unlock(&p->lock);
2131 /*--- sip_indicate: Play indication to user */
2132 /* With SIP a lot of indications is sent as messages, letting the device play
2133 the indication - busy signal, congestion etc */
2134 static int sip_indicate(struct ast_channel *ast, int condition)
2136 struct sip_pvt *p = ast->tech_pvt;
2139 ast_mutex_lock(&p->lock);
2141 case AST_CONTROL_RINGING:
2142 if (ast->_state == AST_STATE_RING) {
2143 if (!ast_test_flag(p, SIP_PROGRESS_SENT) ||
2144 (ast_test_flag(p, SIP_PROG_INBAND) == SIP_PROG_INBAND_NEVER)) {
2145 /* Send 180 ringing if out-of-band seems reasonable */
2146 transmit_response(p, "180 Ringing", &p->initreq);
2147 ast_set_flag(p, SIP_RINGING);
2148 if (ast_test_flag(p, SIP_PROG_INBAND) != SIP_PROG_INBAND_YES)
2151 /* Well, if it's not reasonable, just send in-band */
2156 case AST_CONTROL_BUSY:
2157 if (ast->_state != AST_STATE_UP) {
2158 transmit_response(p, "486 Busy Here", &p->initreq);
2159 ast_set_flag(p, SIP_ALREADYGONE);
2160 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
2165 case AST_CONTROL_CONGESTION:
2166 if (ast->_state != AST_STATE_UP) {
2167 transmit_response(p, "503 Service Unavailable", &p->initreq);
2168 ast_set_flag(p, SIP_ALREADYGONE);
2169 ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
2174 case AST_CONTROL_PROGRESS:
2175 case AST_CONTROL_PROCEEDING:
2176 if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
2177 transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
2178 ast_set_flag(p, SIP_PROGRESS_SENT);
2187 ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", condition);
2191 ast_mutex_unlock(&p->lock);
2197 /*--- sip_new: Initiate a call in the SIP channel */
2198 /* called from sip_request_call (calls from the pbx ) */
2199 static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
2201 struct ast_channel *tmp;
2202 struct ast_variable *v = NULL;
2205 ast_mutex_unlock(&i->lock);
2206 /* Don't hold a sip pvt lock while we allocate a channel */
2207 tmp = ast_channel_alloc(1);
2208 ast_mutex_lock(&i->lock);
2210 tmp->tech = &sip_tech;
2211 /* Select our native format based on codec preference until we receive
2212 something from another device to the contrary. */
2213 ast_mutex_lock(&i->lock);
2214 if (i->jointcapability)
2215 tmp->nativeformats = ast_codec_choose(&i->prefs, i->jointcapability, 1);
2216 else if (i->capability)
2217 tmp->nativeformats = ast_codec_choose(&i->prefs, i->capability, 1);
2219 tmp->nativeformats = ast_codec_choose(&i->prefs, global_capability, 1);
2220 ast_mutex_unlock(&i->lock);
2221 fmt = ast_best_codec(tmp->nativeformats);
2224 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%04x", title, rand() & 0xffff);
2225 else if (strchr(i->fromdomain,':'))
2226 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", strchr(i->fromdomain,':')+1, (int)(long)(i));
2228 snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", i->fromdomain, (int)(long)(i));
2230 tmp->type = channeltype;
2231 if (ast_test_flag(i, SIP_DTMF) == SIP_DTMF_INBAND) {
2232 i->vad = ast_dsp_new();
2233 ast_dsp_set_features(i->vad, DSP_FEATURE_DTMF_DETECT);
2235 ast_dsp_digitmode(i->vad, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF);
2237 tmp->fds[0] = ast_rtp_fd(i->rtp);
2238 tmp->fds[1] = ast_rtcp_fd(i->rtp);
2240 tmp->fds[2] = ast_rtp_fd(i->vrtp);
2241 tmp->fds[3] = ast_rtcp_fd(i->vrtp);
2243 if (state == AST_STATE_RING)
2245 tmp->adsicpe = AST_ADSI_UNAVAILABLE;
2246 tmp->writeformat = fmt;
2247 tmp->rawwriteformat = fmt;
2248 tmp->readformat = fmt;
2249 tmp->rawreadformat = fmt;
2252 tmp->callgroup = i->callgroup;
2253 tmp->pickupgroup = i->pickupgroup;
2254 tmp->cid.cid_pres = i->callingpres;
2255 if (!ast_strlen_zero(i->accountcode))
2256 ast_copy_string(tmp->accountcode, i->accountcode, sizeof(tmp->accountcode));
2258 tmp->amaflags = i->amaflags;
2259 if (!ast_strlen_zero(i->language))
2260 ast_copy_string(tmp->language, i->language, sizeof(tmp->language));
2261 if (!ast_strlen_zero(i->musicclass))
2262 ast_copy_string(tmp->musicclass, i->musicclass, sizeof(tmp->musicclass));
2264 ast_mutex_lock(&usecnt_lock);
2266 ast_mutex_unlock(&usecnt_lock);
2267 ast_copy_string(tmp->context, i->context, sizeof(tmp->context));
2268 ast_copy_string(tmp->exten, i->exten, sizeof(tmp->exten));
2269 if (!ast_strlen_zero(i->cid_num))
2270 tmp->cid.cid_num = strdup(i->cid_num);
2271 if (!ast_strlen_zero(i->cid_name))
2272 tmp->cid.cid_name = strdup(i->cid_name);
2273 if (!ast_strlen_zero(i->rdnis))
2274 tmp->cid.cid_rdnis = strdup(i->rdnis);
2275 if (!ast_strlen_zero(i->exten) && strcmp(i->exten, "s"))
2276 tmp->cid.cid_dnid = strdup(i->exten);
2278 if (!ast_strlen_zero(i->uri)) {
2279 pbx_builtin_setvar_helper(tmp, "SIPURI", i->uri);
2281 if (!ast_strlen_zero(i->domain)) {
2282 pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
2284 if (!ast_strlen_zero(i->useragent)) {
2285 pbx_builtin_setvar_helper(tmp, "SIPUSERAGENT", i->useragent);
2287 if (!ast_strlen_zero(i->callid)) {
2288 pbx_builtin_setvar_helper(tmp, "SIPCALLID", i->callid);
2290 ast_setstate(tmp, state);
2291 if (state != AST_STATE_DOWN) {
2292 if (ast_pbx_start(tmp)) {
2293 ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
2298 /* Set channel variables for this call from configuration */
2299 for (v = i->chanvars ; v ; v = v->next)
2300 pbx_builtin_setvar_helper(tmp,v->name,v->value);
2303 ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
2307 /* Structure for conversion between compressed SIP and "normal" SIP */
2308 static struct cfalias {
2312 { "Content-Type", "c" },
2313 { "Content-Encoding", "e" },
2317 { "Content-Length", "l" },
2320 { "Supported", "k" },
2321 { "Refer-To", "r" },
2322 { "Allow-Events", "u" },
2327 /*--- get_sdp_by_line: Reads one line of SIP message body */
2328 static char* get_sdp_by_line(char* line, char *name, int nameLen) {
2329 if (strncasecmp(line, name, nameLen) == 0 && line[nameLen] == '=') {
2330 char* r = line + nameLen + 1;
2331 while (*r && (*r < 33)) ++r;
2338 /*--- get_sdp: Gets all kind of SIP message bodies, including SDP,
2339 but the name wrongly applies _only_ sdp */
2340 static char *get_sdp(struct sip_request *req, char *name) {
2342 int len = strlen(name);
2345 for (x=0; x<req->lines; x++) {
2346 r = get_sdp_by_line(req->line[x], name, len);
2347 if (r[0] != '\0') return r;
2353 static void sdpLineNum_iterator_init(int* iterator) {
2357 static char* get_sdp_iterate(int* iterator,
2358 struct sip_request *req, char *name) {
2359 int len = strlen(name);
2361 while (*iterator < req->lines) {
2362 r = get_sdp_by_line(req->line[(*iterator)++], name, len);
2363 if (r[0] != '\0') return r;
2368 static char *__get_header(struct sip_request *req, char *name, int *start)
2371 int len = strlen(name);
2373 if (pedanticsipchecking) {
2374 /* Technically you can place arbitrary whitespace both before and after the ':' in
2375 a header, although RFC3261 clearly says you shouldn't before, and place just
2376 one afterwards. If you shouldn't do it, what absolute idiot decided it was
2377 a good idea to say you can do it, and if you can do it, why in the hell would
2378 you say you shouldn't. */
2379 for (x=*start;x<req->headers;x++) {
2380 if (!strncasecmp(req->header[x], name, len)) {
2381 r = req->header[x] + len;
2382 while(*r && (*r < 33))
2386 while(*r && (*r < 33))
2394 /* We probably shouldn't even bother counting whitespace afterwards but
2395 I guess for backwards compatibility we will */
2396 for (x=*start;x<req->headers;x++) {
2397 if (!strncasecmp(req->header[x], name, len) &&
2398 (req->header[x][len] == ':')) {
2399 r = req->header[x] + len + 1;
2400 while(*r && (*r < 33))
2408 for (x=0;x<sizeof(aliases) / sizeof(aliases[0]); x++)
2409 if (!strcasecmp(aliases[x].fullname, name))
2410 return __get_header(req, aliases[x].shortname, start);
2412 /* Don't return NULL, so get_header is always a valid pointer */
2416 /*--- get_header: Get header from SIP request ---*/
2417 static char *get_header(struct sip_request *req, char *name)
2420 return __get_header(req, name, &start);
2423 /*--- sip_rtp_read: Read RTP from network ---*/
2424 static struct ast_frame *sip_rtp_read(struct ast_channel *ast, struct sip_pvt *p)
2426 /* Retrieve audio/etc from channel. Assumes p->lock is already held. */
2427 struct ast_frame *f;
2428 static struct ast_frame null_frame = { AST_FRAME_NULL, };
2431 f = ast_rtp_read(p->rtp); /* RTP Audio */
2434 f = ast_rtcp_read(p->rtp); /* RTCP Control Channel */
2437 f = ast_rtp_read(p->vrtp); /* RTP Video */
2440 f = ast_rtcp_read(p->vrtp); /* RTCP Control Channel for video */
2445 /* Don't send RFC2833 if we're not supposed to */
2446 if (f && (f->frametype == AST_FRAME_DTMF) && (ast_test_flag(p, SIP_DTMF) != SIP_DTMF_RFC2833))
2449 /* We already hold the channel lock */
2450 if (f->frametype == AST_FRAME_VOICE) {
2451 if (f->subclass != p->owner->nativeformats) {
2452 ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
2453 p->owner->nativeformats = f->subclass;
2454 ast_set_read_format(p->owner, p->owner->readformat);
2455 ast_set_write_format(p->owner, p->owner->writeformat);
2457 if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_INBAND) && p->vad) {
2458 f = ast_dsp_process(p->owner, p->vad, f);
2459 if (f && (f->frametype == AST_FRAME_DTMF))
2460 ast_log(LOG_DEBUG, "* Detected inband DTMF '%c'\n", f->subclass);
2467 /*--- sip_read: Read SIP RTP from channel */
2468 static struct ast_frame *sip_read(struct ast_channel *ast)
2470 struct ast_frame *fr;
2471 struct sip_pvt *p = ast->tech_pvt;
2472 ast_mutex_lock(&p->lock);
2473 fr = sip_rtp_read(ast, p);
2474 time(&p->lastrtprx);
2475 ast_mutex_unlock(&p->lock);
2479 /*--- build_callid: Build SIP CALLID header ---*/
2480 static void build_callid(char *callid, int len, struct in_addr ourip, char *fromdomain)
2485 char iabuf[INET_ADDRSTRLEN];
2488 res = snprintf(callid, len, "%08x", val);
2492 if (!ast_strlen_zero(fromdomain))
2493 snprintf(callid, len, "@%s", fromdomain);
2495 /* It's not important that we really use our right IP here... */
2496 snprintf(callid, len, "@%s", ast_inet_ntoa(iabuf, sizeof(iabuf), ourip));
2499 /*--- sip_alloc: Allocate SIP_PVT structure and set defaults ---*/
2500 static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useglobal_nat, const int intended_method)
2504 p = malloc(sizeof(struct sip_pvt));
2507 /* Keep track of stuff */
2508 memset(p, 0, sizeof(struct sip_pvt));
2509 ast_mutex_init(&p->lock);
2519 memcpy(&p->sa, sin, sizeof(p->sa));
2520 if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip))
2521 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
2523 memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
2528 /* Start with 101 instead of 1 */
2531 if (sip_methods[intended_method].need_rtp) {
2532 p->rtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
2534 p->vrtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, bindaddr.sin_addr);
2536 ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
2537 ast_mutex_destroy(&p->lock);
2539 ast_variables_destroy(p->chanvars);
2545 ast_rtp_settos(p->rtp, tos);
2547 ast_rtp_settos(p->vrtp, tos);
2548 p->rtptimeout = global_rtptimeout;
2549 p->rtpholdtimeout = global_rtpholdtimeout;
2550 p->rtpkeepalive = global_rtpkeepalive;
2553 if (useglobal_nat && sin) {
2554 /* Setup NAT structure according to global settings if we have an address */
2555 ast_copy_flags(p, &global_flags, SIP_NAT);
2556 memcpy(&p->recv, sin, sizeof(p->recv));
2558 ast_rtp_setnat(p->rtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
2560 ast_rtp_setnat(p->vrtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
2563 ast_copy_string(p->fromdomain, default_fromdomain, sizeof(p->fromdomain));
2564 build_via(p, p->via, sizeof(p->via));
2566 build_callid(p->callid, sizeof(p->callid), p->ourip, p->fromdomain);
2568 ast_copy_string(p->callid, callid, sizeof(p->callid));
2569 ast_copy_flags(p, (&global_flags), SIP_PROMISCREDIR | SIP_TRUSTRPID | SIP_DTMF | SIP_REINVITE | SIP_PROG_INBAND | SIP_OSPAUTH);
2570 /* Assign default music on hold class */
2571 strcpy(p->musicclass, global_musicclass);
2572 p->capability = global_capability;
2573 if (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_RFC2833)
2574 p->noncodeccapability |= AST_RTP_DTMF;
2575 strcpy(p->context, default_context);
2576 /* Add to active dialog list */
2577 ast_mutex_lock(&iflock);
2580 ast_mutex_unlock(&iflock);
2582 ast_log(LOG_DEBUG, "Allocating new SIP dialog for %s - %s (%s)\n", callid ? callid : "(No Call-ID)", sip_methods[intended_method].text, p->rtp ? "With RTP" : "No RTP");
2586 /*--- find_call: Connect incoming SIP message to current dialog or create new dialog structure */
2587 /* Called by handle_request ,sipsock_read */
2588 static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *sin, const int intended_method)
2593 char iabuf[INET_ADDRSTRLEN];
2597 callid = get_header(req, "Call-ID");
2599 if (pedanticsipchecking) {
2600 /* In principle Call-ID's uniquely identify a call, however some vendors
2601 (i.e. Pingtel) send multiple calls with the same Call-ID and different
2602 tags in order to simplify billing. The RFC does state that we have to
2603 compare tags in addition to the call-id, but this generate substantially
2604 more overhead which is totally unnecessary for the vast majority of sane
2605 SIP implementations, and thus Asterisk does not enable this behavior
2606 by default. Short version: You'll need this option to support conferencing
2608 ast_copy_string(tmp, req->header[0], sizeof(tmp));
2610 c = strchr(tmp, ' ');
2613 if (!strcasecmp(cmd, "SIP/2.0"))
2614 ast_copy_string(tmp, get_header(req, "To"), sizeof(tmp));
2616 ast_copy_string(tmp, get_header(req, "From"), sizeof(tmp));
2617 tag = ast_strcasestr(tmp, "tag=");
2620 c = strchr(tag, ';');
2627 if (ast_strlen_zero(callid)) {
2628 ast_log(LOG_WARNING, "Call missing call ID from '%s'\n", ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr));
2631 ast_mutex_lock(&iflock);
2634 if (!strcmp(p->callid, callid) &&
2635 (!pedanticsipchecking || !tag || ast_strlen_zero(p->theirtag) || !strcmp(p->theirtag, tag))) {
2636 /* Found the call */
2637 ast_mutex_lock(&p->lock);
2638 ast_mutex_unlock(&iflock);
2643 ast_mutex_unlock(&iflock);
2644 p = sip_alloc(callid, sin, 1, intended_method);
2646 ast_mutex_lock(&p->lock);
2650 /*--- sip_register: Parse register=> line in sip.conf and add to registry */
2651 static int sip_register(char *value, int lineno)
2653 struct sip_registry *reg;
2654 char copy[256] = "";
2655 char *username=NULL, *hostname=NULL, *secret=NULL, *authuser=NULL;
2662 ast_copy_string(copy, value, sizeof(copy));
2665 hostname = strrchr(stringp, '@');
2670 if (!username || ast_strlen_zero(username) || !hostname || ast_strlen_zero(hostname)) {
2671 ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d\n", lineno);
2675 username = strsep(&stringp, ":");
2677 secret = strsep(&stringp, ":");
2679 authuser = strsep(&stringp, ":");
2682 hostname = strsep(&stringp, "/");
2684 contact = strsep(&stringp, "/");
2685 if (!contact || ast_strlen_zero(contact))
2688 hostname = strsep(&stringp, ":");
2689 porta = strsep(&stringp, ":");
2691 if (porta && !atoi(porta)) {
2692 ast_log(LOG_WARNING, "%s is not a valid port number at line %d\n", porta, lineno);
2695 reg = malloc(sizeof(struct sip_registry));
2697 memset(reg, 0, sizeof(struct sip_registry));
2700 ast_copy_string(reg->contact, contact, sizeof(reg->contact));
2702 ast_copy_string(reg->username, username, sizeof(reg->username));
2704 ast_copy_string(reg->hostname, hostname, sizeof(reg->hostname));
2706 ast_copy_string(reg->authuser, authuser, sizeof(reg->authuser));
2708 ast_copy_string(reg->secret, secret, sizeof(reg->secret));
2711 reg->refresh = default_expiry;
2712 reg->portno = porta ? atoi(porta) : 0;
2713 reg->callid_valid = 0;
2715 ASTOBJ_CONTAINER_LINK(®l, reg);
2716 ASTOBJ_UNREF(reg,sip_registry_destroy);
2718 ast_log(LOG_ERROR, "Out of memory\n");
2724 /*--- lws2sws: Parse multiline SIP headers into one header */
2725 /* This is enabled if pedanticsipchecking is enabled */
2726 static int lws2sws(char *msgbuf, int len)
2732 /* Eliminate all CRs */
2733 if (msgbuf[h] == '\r') {
2737 /* Check for end-of-line */
2738 if (msgbuf[h] == '\n') {
2739 /* Check for end-of-message */
2742 /* Check for a continuation line */
2743 if (msgbuf[h + 1] == ' ' || msgbuf[h + 1] == '\t') {
2744 /* Merge continuation line */
2748 /* Propagate LF and start new line */
2749 msgbuf[t++] = msgbuf[h++];
2753 if (msgbuf[h] == ' ' || msgbuf[h] == '\t') {
2758 msgbuf[t++] = msgbuf[h++];
2762 msgbuf[t++] = msgbuf[h++];
2770 /*--- parse: Parse a SIP message ----*/
2771 static void parse(struct sip_request *req)
2773 /* Divide fields by NULL's */
2778 /* First header starts immediately */
2782 /* We've got a new header */
2786 printf("Header: %s (%d)\n", req->header[f], strlen(req->header[f]));
2788 if (ast_strlen_zero(req->header[f])) {
2789 /* Line by itself means we're now in content */
2793 if (f >= SIP_MAX_HEADERS - 1) {
2794 ast_log(LOG_WARNING, "Too many SIP headers...\n");
2797 req->header[f] = c + 1;
2798 } else if (*c == '\r') {
2799 /* Ignore but eliminate \r's */
2804 /* Check for last header */
2805 if (!ast_strlen_zero(req->header[f]))
2808 /* Now we process any mime content */
2813 /* We've got a new line */
2816 printf("Line: %s (%d)\n", req->line[f], strlen(req->line[f]));
2818 if (f >= SIP_MAX_LINES - 1) {
2819 ast_log(LOG_WARNING, "Too many SDP lines...\n");
2822 req->line[f] = c + 1;
2823 } else if (*c == '\r') {
2824 /* Ignore and eliminate \r's */
2829 /* Check for last line */
2830 if (!ast_strlen_zero(req->line[f]))
2834 ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c);
2837 /*--- process_sdp: Process SIP SDP ---*/
2838 static int process_sdp(struct sip_pvt *p, struct sip_request *req)
2844 char iabuf[INET_ADDRSTRLEN];
2848 int peercapability, peernoncodeccapability;
2849 int vpeercapability=0, vpeernoncodeccapability=0;
2850 struct sockaddr_in sin;
2853 struct ast_hostent ahp;
2855 int destiterator = 0;
2859 int debug=sip_debug_test_pvt(p);
2861 /* Update our last rtprx when we receive an SDP, too */
2862 time(&p->lastrtprx);
2863 time(&p->lastrtptx);
2865 /* Get codec and RTP info from SDP */
2866 if (strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
2867 ast_log(LOG_NOTICE, "Content is '%s', not 'application/sdp'\n", get_header(req, "Content-Type"));
2870 m = get_sdp(req, "m");
2871 sdpLineNum_iterator_init(&destiterator);
2872 c = get_sdp_iterate(&destiterator, req, "c");
2873 if (ast_strlen_zero(m) || ast_strlen_zero(c)) {
2874 ast_log(LOG_WARNING, "Insufficient information for SDP (m = '%s', c = '%s')\n", m, c);
2877 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2878 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c);
2881 /* XXX This could block for a long time, and block the main thread! XXX */
2882 hp = ast_gethostbyname(host, &ahp);
2884 ast_log(LOG_WARNING, "Unable to lookup host in c= line, '%s'\n", c);
2887 sdpLineNum_iterator_init(&iterator);
2888 ast_set_flag(p, SIP_NOVIDEO);
2889 while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
2891 if ((sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1) ||
2892 (sscanf(m, "audio %d/%d RTP/AVP %n", &x, &y, &len) == 2)) {
2895 /* Scan through the RTP payload types specified in a "m=" line: */
2896 ast_rtp_pt_clear(p->rtp);
2898 while(!ast_strlen_zero(codecs)) {
2899 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2900 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2904 ast_verbose("Found RTP audio format %d\n", codec);
2905 ast_rtp_set_m_type(p->rtp, codec);
2907 /* Skip over any whitespace */
2908 while(*codecs && (*codecs < 33)) codecs++;
2912 ast_rtp_pt_clear(p->vrtp); /* Must be cleared in case no m=video line exists */
2914 if (p->vrtp && (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) {
2916 ast_clear_flag(p, SIP_NOVIDEO);
2918 /* Scan through the RTP payload types specified in a "m=" line: */
2920 while(!ast_strlen_zero(codecs)) {
2921 if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
2922 ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
2926 ast_verbose("Found video format %s\n", ast_getformatname(codec));
2927 ast_rtp_set_m_type(p->vrtp, codec);
2929 /* Skip over any whitespace */
2930 while(*codecs && (*codecs < 33)) codecs++;
2934 ast_log(LOG_WARNING, "Unknown SDP media type in offer: %s\n", m);
2936 if (portno == -1 && vportno == -1) {
2937 /* No acceptable offer found in SDP */
2940 /* Check for Media-description-level-address for audio */
2941 if (pedanticsipchecking) {
2942 c = get_sdp_iterate(&destiterator, req, "c");
2943 if (!ast_strlen_zero(c)) {
2944 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2945 ast_log(LOG_WARNING, "Invalid secondary host in c= line, '%s'\n", c);
2947 /* XXX This could block for a long time, and block the main thread! XXX */
2948 hp = ast_gethostbyname(host, &ahp);
2950 ast_log(LOG_WARNING, "Unable to lookup host in secondary c= line, '%s'\n", c);
2955 /* RTP addresses and ports for audio and video */
2956 sin.sin_family = AF_INET;
2957 memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
2959 /* Setup audio port number */
2960 sin.sin_port = htons(portno);
2961 if (p->rtp && sin.sin_port) {
2962 ast_rtp_set_peer(p->rtp, &sin);
2964 ast_verbose("Peer audio RTP is at port %s:%d\n", ast_inet_ntoa(iabuf,sizeof(iabuf), sin.sin_addr), ntohs(sin.sin_port));
2965 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));
2968 /* Check for Media-description-level-address for video */
2969 if (pedanticsipchecking) {
2970 c = get_sdp_iterate(&destiterator, req, "c");
2971 if (!ast_strlen_zero(c)) {
2972 if (sscanf(c, "IN IP4 %256s", host) != 1) {
2973 ast_log(LOG_WARNING, "Invalid secondary host in c= line, '%s'\n", c);
2975 /* XXX This could block for a long time, and block the main thread! XXX */
2976 hp = ast_gethostbyname(host, &ahp);
2978 ast_log(LOG_WARNING, "Unable to lookup host in secondary c= line, '%s'\n", c);
2983 /* Setup video port number */
2984 sin.sin_port = htons(vportno);
2985 if (p->vrtp && sin.sin_port) {
2986 ast_rtp_set_peer(p->vrtp, &sin);
2988 ast_verbose("Peer video RTP is at port %s:%d\n", ast_inet_ntoa(iabuf,sizeof(iabuf), sin.sin_addr), ntohs(sin.sin_port));
2989 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));
2993 /* Next, scan through each "a=rtpmap:" line, noting each
2994 * specified RTP payload type (with corresponding MIME subtype):
2996 sdpLineNum_iterator_init(&iterator);
2997 while ((a = get_sdp_iterate(&iterator, req, "a"))[0] != '\0') {
2998 char* mimeSubtype = ast_strdupa(a); /* ensures we have enough space */
2999 if (!strcasecmp(a, "sendonly")) {
3003 if (!strcasecmp(a, "sendrecv")) {
3006 if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) != 2) continue;
3008 ast_verbose("Found description format %s\n", mimeSubtype);
3009 /* Note: should really look at the 'freq' and '#chans' params too */
3010 ast_rtp_set_rtpmap_type(p->rtp, codec, "audio", mimeSubtype);
3012 ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
3015 /* Now gather all of the codecs that were asked for: */
3016 ast_rtp_get_current_formats(p->rtp,