Named ACLs: Introduces a system for creating and sharing ACLs
[asterisk/asterisk.git] / channels / sip / include / sip.h
index 0a776ad..1e659a7 100644 (file)
@@ -34,6 +34,7 @@
 #include "asterisk/astobj.h"
 #include "asterisk/indications.h"
 #include "asterisk/security_events.h"
+#include "asterisk/features.h"
 
 #ifndef FALSE
 #define FALSE    0
  */
 /*@{*/
 #define DEFAULT_CONTEXT        "default"  /*!< The default context for [general] section as well as devices */
+#define DEFAULT_RECORD_FEATURE   "automon"  /*!< The default feature specified for use with INFO */
 #define DEFAULT_MOHINTERPRET   "default"  /*!< The default music class */
 #define DEFAULT_MOHSUGGEST     ""
 #define DEFAULT_VMEXTEN        "asterisk" /*!< Default voicemail extension */
 #define DEFAULT_NOTIFYRINGING  TRUE     /*!< Notify devicestate system on ringing state */
 #define DEFAULT_NOTIFYCID      DISABLED        /*!< Include CID with ringing notifications */
 #define DEFAULT_PEDANTIC       TRUE     /*!< Follow SIP standards for dialog matching */
-#define DEFAULT_AUTOCREATEPEER FALSE    /*!< Don't create peers automagically */
+#define DEFAULT_AUTOCREATEPEER AUTOPEERS_DISABLED    /*!< Don't create peers automagically */
 #define        DEFAULT_MATCHEXTERNADDRLOCALLY FALSE /*!< Match extern IP locally default setting */
 #define DEFAULT_QUALIFY        FALSE    /*!< Don't monitor devices */
+#define DEFAULT_KEEPALIVE      0        /*!< Don't send keep alive packets */
+#define DEFAULT_KEEPALIVE_INTERVAL 60   /*!< Send keep alive packets at 60 second intervals */
 #define DEFAULT_CALLEVENTS     FALSE    /*!< Extra manager SIP call events */
 #define DEFAULT_ALWAYSAUTHREJECT  TRUE  /*!< Don't reject authentication requests always */
 #define DEFAULT_AUTH_OPTIONS  FALSE
 #define DEFAULT_ACCEPT_OUTOFCALL_MESSAGE TRUE
 #define DEFAULT_REGEXTENONQUALIFY FALSE
 #define DEFAULT_LEGACY_USEROPTION_PARSING FALSE
+#define DEFAULT_SEND_DIVERSION TRUE
 #define DEFAULT_T1MIN             100   /*!< 100 MS for minimal roundtrip time */
 #define DEFAULT_MAX_CALL_BITRATE (384)  /*!< Max bitrate for video */
 #ifndef DEFAULT_USERAGENT
        a second page of flags (for flags[1] */
 /*@{*/
 /* realtime flags */
-#define SIP_PAGE2_RTCACHEFRIENDS               (1 <<  0)    /*!< GP: Should we keep RT objects in memory for extended time? */
-#define SIP_PAGE2_RTAUTOCLEAR                  (1 <<  1)    /*!< GP: Should we clean memory from peers after expiry? */
-#define SIP_PAGE2_RPID_UPDATE                  (1 <<  2)
-#define SIP_PAGE2_Q850_REASON                  (1 <<  3)    /*!< DP: Get/send cause code via Reason header */
-#define SIP_PAGE2_SYMMETRICRTP                 (1 <<  4)    /*!< GDP: Whether symmetric RTP is enabled or not */
-#define SIP_PAGE2_STATECHANGEQUEUE             (1 <<  5)    /*!< D: Unsent state pending change exists */
-#define SIP_PAGE2_CONNECTLINEUPDATE_PEND       (1 <<  6)
-#define SIP_PAGE2_RPID_IMMEDIATE               (1 <<  7)
-#define SIP_PAGE2_RPORT_PRESENT                        (1 <<  8)   /*!< Was rport received in the Via header? */
-#define SIP_PAGE2_PREFERRED_CODEC              (1 <<  9)   /*!< GDP: Only respond with single most preferred joint codec */
-#define SIP_PAGE2_VIDEOSUPPORT                 (1 << 10)   /*!< DP: Video supported if offered? */
-#define SIP_PAGE2_TEXTSUPPORT                  (1 << 11)   /*!< GDP: Global text enable */
-#define SIP_PAGE2_ALLOWSUBSCRIBE               (1 << 12)   /*!< GP: Allow subscriptions from this peer? */
-#define SIP_PAGE2_ALLOWOVERLAP                 (1 << 13)   /*!< DP: Allow overlap dialing ? */
-#define SIP_PAGE2_SUBSCRIBEMWIONLY             (1 << 14)   /*!< GP: Only issue MWI notification if subscribed to */
-#define SIP_PAGE2_IGNORESDPVERSION             (1 << 15)   /*!< GDP: Ignore the SDP session version number we receive and treat all sessions as new */
-
-#define SIP_PAGE2_T38SUPPORT                   (3 << 16)    /*!< GDP: T.38 Fax Support */
-#define SIP_PAGE2_T38SUPPORT_UDPTL             (1 << 16)    /*!< GDP: T.38 Fax Support (no error correction) */
-#define SIP_PAGE2_T38SUPPORT_UDPTL_FEC         (2 << 16)    /*!< GDP: T.38 Fax Support (FEC error correction) */
-#define SIP_PAGE2_T38SUPPORT_UDPTL_REDUNDANCY  (3 << 16)    /*!< GDP: T.38 Fax Support (redundancy error correction) */
-
-#define SIP_PAGE2_CALL_ONHOLD                  (3 << 18)  /*!< D: Call hold states: */
-#define SIP_PAGE2_CALL_ONHOLD_ACTIVE           (1 << 18)  /*!< D: Active hold */
-#define SIP_PAGE2_CALL_ONHOLD_ONEDIR           (2 << 18)  /*!< D: One directional hold */
-#define SIP_PAGE2_CALL_ONHOLD_INACTIVE         (3 << 18)  /*!< D: Inactive hold */
-
-#define SIP_PAGE2_RFC2833_COMPENSATE           (1 << 20)  /*!< DP: Compensate for buggy RFC2833 implementations */
-#define SIP_PAGE2_BUGGY_MWI                    (1 << 21)  /*!< DP: Buggy CISCO MWI fix */
-#define SIP_PAGE2_DIALOG_ESTABLISHED           (1 << 22)  /*!< 29: Has a dialog been established? */
-
-#define SIP_PAGE2_FAX_DETECT                   (3 << 23)  /*!< DP: Fax Detection support */
-#define SIP_PAGE2_FAX_DETECT_CNG               (1 << 23)  /*!< DP: Fax Detection support - detect CNG in audio */
-#define SIP_PAGE2_FAX_DETECT_T38               (2 << 23)  /*!< DP: Fax Detection support - detect T.38 reinvite from peer */
-#define SIP_PAGE2_FAX_DETECT_BOTH              (3 << 23)  /*!< DP: Fax Detection support - detect both */
-
-#define SIP_PAGE2_UDPTL_DESTINATION            (1 << 25)  /*!< DP: Use source IP of RTP as destination if NAT is enabled */
-#define SIP_PAGE2_VIDEOSUPPORT_ALWAYS          (1 << 26)  /*!< DP: Always set up video, even if endpoints don't support it */
-#define SIP_PAGE2_HAVEPEERCONTEXT      (1 << 27)       /*< Are we associated with a configured peer context? */
-#define SIP_PAGE2_USE_SRTP              (1 << 28)    /*!< DP: Whether we should offer (only)  SRTP */
+#define SIP_PAGE2_RTCACHEFRIENDS            (1 <<  0)   /*!< GP: Should we keep RT objects in memory for extended time? */
+#define SIP_PAGE2_RTAUTOCLEAR               (1 <<  1)   /*!< GP: Should we clean memory from peers after expiry? */
+#define SIP_PAGE2_RPID_UPDATE               (1 <<  2)
+#define SIP_PAGE2_Q850_REASON               (1 <<  3)   /*!< DP: Get/send cause code via Reason header */
+#define SIP_PAGE2_SYMMETRICRTP              (1 <<  4)   /*!< GDP: Whether symmetric RTP is enabled or not */
+#define SIP_PAGE2_STATECHANGEQUEUE          (1 <<  5)   /*!< D: Unsent state pending change exists */
+#define SIP_PAGE2_CONNECTLINEUPDATE_PEND    (1 <<  6)
+#define SIP_PAGE2_RPID_IMMEDIATE            (1 <<  7)
+#define SIP_PAGE2_RPORT_PRESENT             (1 <<  8)   /*!< Was rport received in the Via header? */
+#define SIP_PAGE2_PREFERRED_CODEC           (1 <<  9)   /*!< GDP: Only respond with single most preferred joint codec */
+#define SIP_PAGE2_VIDEOSUPPORT              (1 << 10)   /*!< DP: Video supported if offered? */
+#define SIP_PAGE2_TEXTSUPPORT               (1 << 11)   /*!< GDP: Global text enable */
+#define SIP_PAGE2_ALLOWSUBSCRIBE            (1 << 12)   /*!< GP: Allow subscriptions from this peer? */
+
+#define SIP_PAGE2_ALLOWOVERLAP              (3 << 13)   /*!< DP: Allow overlap dialing ? */
+#define SIP_PAGE2_ALLOWOVERLAP_NO           (0 << 13)   /*!< No, terminate with 404 Not found */
+#define SIP_PAGE2_ALLOWOVERLAP_YES          (1 << 13)   /*!< Yes, using the 484 Address Incomplete response */
+#define SIP_PAGE2_ALLOWOVERLAP_DTMF         (2 << 13)   /*!< Yes, using the DTMF transmission through Early Media */
+#define SIP_PAGE2_ALLOWOVERLAP_SPARE        (3 << 13)   /*!< Spare (reserved for another dialling transmission mechanisms like KPML) */
+
+#define SIP_PAGE2_SUBSCRIBEMWIONLY          (1 << 15)   /*!< GP: Only issue MWI notification if subscribed to */
+#define SIP_PAGE2_IGNORESDPVERSION          (1 << 16)   /*!< GDP: Ignore the SDP session version number we receive and treat all sessions as new */
+
+#define SIP_PAGE2_T38SUPPORT                (3 << 17)   /*!< GDP: T.38 Fax Support */
+#define SIP_PAGE2_T38SUPPORT_UDPTL          (1 << 17)   /*!< GDP: T.38 Fax Support (no error correction) */
+#define SIP_PAGE2_T38SUPPORT_UDPTL_FEC      (2 << 17)   /*!< GDP: T.38 Fax Support (FEC error correction) */
+#define SIP_PAGE2_T38SUPPORT_UDPTL_REDUNDANCY   (3 << 17)   /*!< GDP: T.38 Fax Support (redundancy error correction) */
+
+#define SIP_PAGE2_CALL_ONHOLD               (3 << 19)   /*!< D: Call hold states: */
+#define SIP_PAGE2_CALL_ONHOLD_ACTIVE        (1 << 19)   /*!< D: Active hold */
+#define SIP_PAGE2_CALL_ONHOLD_ONEDIR        (2 << 19)   /*!< D: One directional hold */
+#define SIP_PAGE2_CALL_ONHOLD_INACTIVE      (3 << 19)   /*!< D: Inactive hold */
+
+#define SIP_PAGE2_RFC2833_COMPENSATE        (1 << 21)   /*!< DP: Compensate for buggy RFC2833 implementations */
+#define SIP_PAGE2_BUGGY_MWI                 (1 << 22)   /*!< DP: Buggy CISCO MWI fix */
+#define SIP_PAGE2_DIALOG_ESTABLISHED        (1 << 23)   /*!< 29: Has a dialog been established? */
+
+#define SIP_PAGE2_FAX_DETECT                (3 << 24)   /*!< DP: Fax Detection support */
+#define SIP_PAGE2_FAX_DETECT_CNG            (1 << 24)   /*!< DP: Fax Detection support - detect CNG in audio */
+#define SIP_PAGE2_FAX_DETECT_T38            (2 << 24)   /*!< DP: Fax Detection support - detect T.38 reinvite from peer */
+#define SIP_PAGE2_FAX_DETECT_BOTH           (3 << 24)   /*!< DP: Fax Detection support - detect both */
+
+#define SIP_PAGE2_UDPTL_DESTINATION         (1 << 26)   /*!< DP: Use source IP of RTP as destination if NAT is enabled */
+#define SIP_PAGE2_VIDEOSUPPORT_ALWAYS       (1 << 27)   /*!< DP: Always set up video, even if endpoints don't support it */
+#define SIP_PAGE2_HAVEPEERCONTEXT           (1 << 28)   /*< Are we associated with a configured peer context? */
+#define SIP_PAGE2_USE_SRTP                  (1 << 29)   /*!< DP: Whether we should offer (only)  SRTP */
 
 #define SIP_PAGE2_FLAGS_TO_COPY \
        (SIP_PAGE2_ALLOWSUBSCRIBE | SIP_PAGE2_ALLOWOVERLAP | SIP_PAGE2_IGNORESDPVERSION | \
 
 #define SIP_PAGE3_SNOM_AOC               (1 << 0)  /*!< DPG: Allow snom aoc messages */
 #define SIP_PAGE3_SRTP_TAG_32            (1 << 1)  /*!< DP: Use a 32bit auth tag in INVITE not 80bit */
+#define SIP_PAGE3_NAT_AUTO_RPORT         (1 << 2)  /*!< DGP: Set SIP_NAT_FORCE_RPORT when NAT is detected */
+#define SIP_PAGE3_NAT_AUTO_COMEDIA       (1 << 3)  /*!< DGP: Set SIP_PAGE2_SYMMETRICRTP when NAT is detected */
+#define SIP_PAGE3_DIRECT_MEDIA_OUTGOING  (1 << 4)  /*!< DP: Only send direct media reinvites on outgoing calls */
 
 #define SIP_PAGE3_FLAGS_TO_COPY \
-       (SIP_PAGE3_SNOM_AOC | SIP_PAGE3_SRTP_TAG_32)
+       (SIP_PAGE3_SNOM_AOC | SIP_PAGE3_SRTP_TAG_32 | SIP_PAGE3_NAT_AUTO_RPORT | SIP_PAGE3_NAT_AUTO_COMEDIA | \
+        SIP_PAGE3_DIRECT_MEDIA_OUTGOING)
 
 #define CHECK_AUTH_BUF_INITLEN   256
 
@@ -452,6 +467,7 @@ enum media_type {
        SDP_VIDEO,   /*!< RTP/AVP Video */
        SDP_IMAGE,   /*!< Image udptl, not TCP or RTP */
        SDP_TEXT,    /*!< RTP/AVP Realtime Text */
+       SDP_UNKNOWN, /*!< Unknown media type */
 };
 
 /*! \brief Authentication types - proxy or www authentication
@@ -466,7 +482,7 @@ enum sip_auth_type {
 
 /*! \brief Result from get_destination function */
 enum sip_get_dest_result {
-       SIP_GET_DEST_PICKUP_EXTEN_FOUND = 1,
+       SIP_GET_DEST_EXTEN_MATCHMORE = 1,
        SIP_GET_DEST_EXTEN_FOUND = 0,
        SIP_GET_DEST_EXTEN_NOT_FOUND = -1,
        SIP_GET_DEST_REFUSED = -2,
@@ -550,6 +566,14 @@ enum sip_transport {
        SIP_TRANSPORT_TLS = 1 << 2,    /*!< TCP/TLS - reliable and secure transport for signalling */
 };
 
+/*! \brief Automatic peer registration behavior
+*/
+enum autocreatepeer_mode {
+       AUTOPEERS_DISABLED = 0,         /*!< Automatic peer creation disabled */
+       AUTOPEERS_VOLATILE,                     /*!< Automatic peers dropped on sip reload (pre-1.8 behavior) */
+       AUTOPEERS_PERSIST                       /*!< Automatic peers survive sip configuration reload */
+};
+
 /*! \brief States whether a SIP message can create a dialog in Asterisk. */
 enum can_create_dialog {
        CAN_NOT_CREATE_DIALOG,
@@ -703,7 +727,7 @@ struct sip_settings {
        int rtautoclear;            /*!< Realtime ?? */
        int directrtpsetup;         /*!< Enable support for Direct RTP setup (no re-invites) */
        int pedanticsipchecking;    /*!< Extra checking ?  Default off */
-       int autocreatepeer;         /*!< Auto creation of peers at registration? Default off. */
+       enum autocreatepeer_mode autocreatepeer;  /*!< Auto creation of peers at registration? Default off. */
        int srvlookup;              /*!< SRV Lookup on or off. Default is on */
        int allowguest;             /*!< allow unauthenticated peers to connect? */
        int alwaysauthreject;       /*!< Send 401 Unauthorized for all failing requests */
@@ -715,6 +739,7 @@ struct sip_settings {
        int callevents;             /*!< Whether we send manager events or not */
        int regextenonqualify;      /*!< Whether to add/remove regexten when qualifying peers */
        int legacy_useroption_parsing; /*!< Whether to strip useroptions in URI via semicolons */
+       int send_diversion;             /*!< Whether to Send SIP Diversion headers */
        int matchexternaddrlocally;   /*!< Match externaddr/externhost setting against localnet setting */
        char regcontext[AST_MAX_CONTEXT];  /*!< Context for auto-extensions */
        char messagecontext[AST_MAX_CONTEXT];  /*!< Default context for out of dialog msgs. */
@@ -730,7 +755,9 @@ struct sip_settings {
        struct sip_proxy outboundproxy; /*!< Outbound proxy */
        char default_context[AST_MAX_CONTEXT];
        char default_subscribecontext[AST_MAX_CONTEXT];
-       struct ast_ha *contact_ha;  /*! \brief Global list of addresses dynamic peers are not allowed to use */
+       char default_record_on_feature[FEATURE_MAX_LEN];
+       char default_record_off_feature[FEATURE_MAX_LEN];
+       struct ast_acl_list *contact_acl;  /*! \brief Global list of addresses dynamic peers are not allowed to use */
        struct ast_format_cap *caps; /*!< Supported codecs */
        int tcp_enabled;
        int default_max_forwards;    /*!< Default max forwards (SIP Anti-loop) */
@@ -803,7 +830,7 @@ struct sip_dual {
        struct ast_channel *chan1;   /*!< First channel involved */
        struct ast_channel *chan2;   /*!< Second channel involved */
        struct sip_request req;      /*!< Request that caused the transfer (REFER) */
-       int seqno;                   /*!< Sequence number */
+       uint32_t seqno;              /*!< Sequence number */
        char *park_exten;
        char *park_context;
 };
@@ -942,10 +969,22 @@ struct sip_st_cfg {
 };
 
 /*! \brief Structure for remembering offered media in an INVITE, to make sure we reply
-       to all media streams. In theory. In practise, we try our best. */
+       to all media streams. */
 struct offered_media {
-       int offered;
-       char codecs[128];
+       enum media_type type;           /*!< The type of media that was offered */
+       char *decline_m_line;           /*!< Used if the media type is unknown/unused or a media stream is declined */
+       AST_LIST_ENTRY(offered_media) next;
+};
+
+/*! Additional headers to send with MESSAGE method packet. */
+struct sip_msg_hdr {
+       AST_LIST_ENTRY(sip_msg_hdr) next;
+       /*! Name of header to stick in MESSAGE */
+       const char *name;
+       /*! Value of header to stick in MESSAGE */
+       const char *value;
+       /*! The name and value strings are stuffed here in that order. */
+       char stuff[0];
 };
 
 /*! \brief Structure used for each SIP dialog, ie. a call, a registration, a subscribe.
@@ -955,6 +994,7 @@ struct offered_media {
 struct sip_pvt {
        struct sip_pvt *next;                   /*!< Next dialog in chain */
        enum invitestates invitestate;          /*!< Track state of SIP_INVITEs */
+       struct ast_callid *logger_callid;               /*!< Identifier for call used in log messages */
        int method;                             /*!< SIP method that opened this dialog */
        AST_DECLARE_STRING_FIELDS(
                AST_STRING_FIELD(callid);       /*!< Global CallID */
@@ -985,6 +1025,7 @@ struct sip_pvt {
                AST_STRING_FIELD(rdnis);        /*!< Referring DNIS */
                AST_STRING_FIELD(redircause);   /*!< Referring cause */
                AST_STRING_FIELD(theirtag);     /*!< Their tag */
+               AST_STRING_FIELD(tag);          /*!< Our tag for this session */
                AST_STRING_FIELD(username);     /*!< [user] name */
                AST_STRING_FIELD(peername);     /*!< [peer] name, not set if [user] */
                AST_STRING_FIELD(authname);     /*!< Who we use for authentication */
@@ -1003,17 +1044,19 @@ struct sip_pvt {
                AST_STRING_FIELD(parkinglot);   /*!< Parkinglot */
                AST_STRING_FIELD(engine);       /*!< RTP engine to use */
                AST_STRING_FIELD(dialstring);   /*!< The dialstring used to call this SIP endpoint */
+               AST_STRING_FIELD(last_presence_subtype);   /*!< The last presence subtype sent for a subscription. */
+               AST_STRING_FIELD(last_presence_message);   /*!< The last presence message for a subscription */
                AST_STRING_FIELD(msg_body);     /*!< Text for a MESSAGE body */
        );
        char via[128];                          /*!< Via: header */
        int maxforwards;                        /*!< SIP Loop prevention */
        struct sip_socket socket;               /*!< The socket used for this dialog */
-       unsigned int ocseq;                     /*!< Current outgoing seqno */
-       unsigned int icseq;                     /*!< Current incoming seqno */
-       unsigned int init_icseq;                /*!< Initial incoming seqno from first request */
+       uint32_t ocseq;                         /*!< Current outgoing seqno */
+       uint32_t icseq;                         /*!< Current incoming seqno */
+       uint32_t init_icseq;                    /*!< Initial incoming seqno from first request */
        ast_group_t callgroup;                  /*!< Call group */
        ast_group_t pickupgroup;                /*!< Pickup group */
-       int lastinvite;                         /*!< Last Cseq of invite */
+       uint32_t lastinvite;                    /*!< Last seqno of invite */
        struct ast_flags flags[3];              /*!< SIP_ flags */
 
        /* boolean flags that don't belong in flags */
@@ -1033,7 +1076,7 @@ struct sip_pvt {
                                               *   for incoming calls
                                               */
        unsigned short req_secure_signaling:1;/*!< Whether we are required to have secure signaling or not */
-       char tag[11];                     /*!< Our tag for this session */
+       unsigned short natdetected:1;         /*!< Whether we detected a NAT when processing the Via */
        int timer_t1;                     /*!< SIP timer T1, ms rtt */
        int timer_b;                      /*!< SIP timer B, ms */
        unsigned int sipoptions;          /*!< Supported SIP options on the other end */
@@ -1074,7 +1117,7 @@ struct sip_pvt {
        int rtptimeout;                     /*!< RTP timeout time */
        int rtpholdtimeout;                 /*!< RTP timeout time on hold*/
        int rtpkeepalive;                   /*!< RTP send packets for keepalive */
-       struct ast_ha *directmediaha;           /*!< Which IPs are allowed to interchange direct media with this peer - copied from sip_peer */
+       struct ast_acl_list *directmediaacl; /*!< Which IPs are allowed to interchange direct media with this peer - copied from sip_peer */
        struct ast_sockaddr recv;            /*!< Received as */
        struct ast_sockaddr ourip;           /*!< Our IP (as seen from the outside) */
        enum transfermodes allowtransfer;   /*!< REFER: restriction scheme */
@@ -1084,10 +1127,11 @@ struct sip_pvt {
        struct sip_auth_container *peerauth;/*!< Realm authentication credentials */
        int noncecount;                     /*!< Nonce-count */
        unsigned int stalenonce:1;          /*!< Marks the current nonce as responded too */
+       unsigned int ongoing_reinvite:1;    /*!< There is a reinvite in progress that might need to be cleaned up */
        char lastmsg[256];                  /*!< Last Message sent/received */
        int amaflags;                       /*!< AMA Flags */
-       int pendinginvite;    /*!< Any pending INVITE or state NOTIFY (in subscribe pvt's) ? (seqno of this) */
-       int glareinvite;      /*!< A invite received while a pending invite is already present is stored here.  Its seqno is the
+       uint32_t pendinginvite; /*!< Any pending INVITE or state NOTIFY (in subscribe pvt's) ? (seqno of this) */
+       uint32_t glareinvite;      /*!< A invite received while a pending invite is already present is stored here.  Its seqno is the
                                   value. Since this glare invite's seqno is not the same as the pending invite's, it must be
                                   held in order to properly process acknowledgements for our 491 response. */
        struct sip_request initreq;         /*!< Latest request that opened a new transaction
@@ -1096,13 +1140,15 @@ struct sip_pvt {
 
        int initid;                         /*!< Auto-congest ID if appropriate (scheduler) */
        int waitid;                         /*!< Wait ID for scheduler after 491 or other delays */
+       int reinviteid;                     /*!< Reinvite in case of provisional, but no final response */
        int autokillid;                     /*!< Auto-kill ID (scheduler) */
        int t38id;                          /*!< T.38 Response ID */
        struct sip_refer *refer;            /*!< REFER: SIP transfer data structure */
        enum subscriptiontype subscribed;   /*!< SUBSCRIBE: Is this dialog a subscription?  */
        int stateid;                        /*!< SUBSCRIBE: ID for devicestate subscriptions */
        int laststate;                      /*!< SUBSCRIBE: Last known extension state */
-       int dialogver;                      /*!< SUBSCRIBE: Version for subscription dialog-info */
+       int last_presence_state;            /*!< SUBSCRIBE: Last known presence state */
+       uint32_t dialogver;                 /*!< SUBSCRIBE: Version for subscription dialog-info */
 
        struct ast_dsp *dsp;                /*!< Inband DTMF or Fax CNG tone Detection dsp */
 
@@ -1116,6 +1162,7 @@ struct sip_pvt {
        struct sip_history_head *history;   /*!< History of this SIP dialog */
        size_t history_entries;             /*!< Number of entires in the history */
        struct ast_variable *chanvars;      /*!< Channel variables to set for inbound call */
+       AST_LIST_HEAD_NOLOCK(, sip_msg_hdr) msg_headers; /*!< Additional MESSAGE headers to send. */
        AST_LIST_HEAD_NOLOCK(request_queue, sip_request) request_queue; /*!< Requests that arrived but could not be processed immediately */
        struct sip_invite_param *options;   /*!< Options for INVITE */
        struct sip_st_dlg *stimer;          /*!< SIP Session-Timers */
@@ -1151,7 +1198,7 @@ struct sip_pvt {
         *
         * The large-scale changes would be a good idea for implementing during an SDP rewrite.
         */
-       struct offered_media offered_media[OFFERED_MEDIA_COUNT];
+       AST_LIST_HEAD_NOLOCK(, offered_media) offered_media;
        struct ast_cc_config_params *cc_params;
        struct sip_epa_entry *epa_entry;
        int fromdomainport;                 /*!< Domain port to show in from field */
@@ -1167,7 +1214,7 @@ struct sip_pkt {
        struct sip_pkt *next;     /*!< Next packet in linked list */
        int retrans;              /*!< Retransmission number */
        int method;               /*!< SIP method for this packet */
-       int seqno;                /*!< Sequence number */
+       uint32_t seqno;           /*!< Sequence number */
        char is_resp;             /*!< 1 if this is a response packet (e.g. 200 OK), 0 if it is a request */
        char is_fatal;            /*!< non-zero if there is a fatal error */
        int response_code;        /*!< If this is a response, the response code */
@@ -1229,6 +1276,9 @@ struct sip_peer {
                AST_STRING_FIELD(engine);       /*!<  RTP Engine to use */
                AST_STRING_FIELD(unsolicited_mailbox);  /*!< Mailbox to store received unsolicited MWI NOTIFY messages information in */
                AST_STRING_FIELD(zone);         /*!< Tonezone for this device */
+               AST_STRING_FIELD(record_on_feature); /*!< Feature to use when receiving INFO with record: on during a call */
+               AST_STRING_FIELD(record_off_feature); /*!< Feature to use when receiving INFO with record: off during a call */
+               AST_STRING_FIELD(callback); /*!< Callback extension */
                );
        struct sip_socket socket;       /*!< Socket used for this peer */
        enum sip_transport default_outbound_transport;   /*!< Peer Registration may change the default outbound transport.
@@ -1257,6 +1307,7 @@ struct sip_peer {
        int maxforwards;                /*!< SIP Loop prevention */
        enum transfermodes allowtransfer;   /*! SIP Refer restriction scheme */
        struct ast_codec_pref prefs;    /*!<  codec prefs */
+       int lastmsgssent;                               /*!< The last known VM message counts (new/old) */
        unsigned int sipoptions;        /*!<  Supported SIP options */
        struct ast_flags flags[3];      /*!<  SIP_ flags */
 
@@ -1281,10 +1332,12 @@ struct sip_peer {
        int maxms;                      /*!<  Qualification: Max ms we will accept for the host to be up, 0 to not monitor */
        int qualifyfreq;                /*!<  Qualification: Qualification: How often to check for the host to be up */
        struct timeval ps;              /*!<  Qualification: Time for sending SIP OPTION in sip_pke_peer() */
+       int keepalive;                  /*!<  Keepalive: How often to send keep alive packet */
+       int keepalivesend;              /*!<  Keepalive: Scheduled item for sending keep alive packet */
        struct ast_sockaddr defaddr;     /*!<  Default IP address, used until registration */
-       struct ast_ha *ha;              /*!<  Access control list */
-       struct ast_ha *contactha;       /*!<  Restrict what IPs are allowed in the Contact header (for registration) */
-       struct ast_ha *directmediaha;   /*!<  Restrict what IPs are allowed to interchange direct media with */
+       struct ast_acl_list *acl;              /*!<  Access control list */
+       struct ast_acl_list *contactacl;       /*!<  Restrict what IPs are allowed in the Contact header (for registration) */
+       struct ast_acl_list *directmediaacl;   /*!<  Restrict what IPs are allowed to interchange direct media with */
        struct ast_variable *chanvars;  /*!<  Variables to set for channel created by user */
        struct sip_pvt *mwipvt;         /*!<  Subscription for MWI */
        struct sip_st_cfg stimer;       /*!<  SIP Session-Timers */
@@ -1313,7 +1366,7 @@ struct sip_peer {
  * \todo Convert this to astobj2
  */
 struct sip_registry {
-       ASTOBJ_COMPONENTS_FULL(struct sip_registry,1,1);
+       ASTOBJ_COMPONENTS_FULL(struct sip_registry, 80, 1);
        AST_DECLARE_STRING_FIELDS(
                AST_STRING_FIELD(callid);     /*!< Global Call-ID */
                AST_STRING_FIELD(realm);      /*!< Authorization realm */
@@ -1343,7 +1396,7 @@ struct sip_registry {
        enum sipregistrystate regstate; /*!< Registration state (see above) */
        struct timeval regtime;         /*!< Last successful registration time */
        int callid_valid;       /*!< 0 means we haven't chosen callid for this registry yet. */
-       unsigned int ocseq;     /*!< Sequence number we got to for REGISTERs for this registry */
+       uint32_t ocseq;         /*!< Sequence number we got to for REGISTERs for this registry */
        struct ast_dnsmgr_entry *dnsmgr;  /*!<  DNS refresh manager for register */
        struct ast_sockaddr us;  /*!< Who the server thinks we are */
        int noncecount;         /*!< Nonce-count */
@@ -1357,6 +1410,7 @@ struct tcptls_packet {
 };
 /*! \brief Definition of a thread that handles a socket */
 struct sip_threadinfo {
+       /*! TRUE if the thread needs to kill itself.  (The module is being unloaded.) */
        int stop;
        int alert_pipe[2];          /*! Used to alert tcptls thread when packet is ready to be written */
        pthread_t threadid;
@@ -1761,7 +1815,7 @@ struct contact {
        char *name;
        char *user;
        char *pass;
-       char *domain;
+       char *hostport;
        struct uriparams params;
        char *headers;
        char *expires;