Named ACLs: Introduces a system for creating and sharing ACLs
[asterisk/asterisk.git] / channels / sip / include / sip.h
index 2f9beff..1e659a7 100644 (file)
 #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
 #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_NAT_AUTO_RPORT | SIP_PAGE3_NAT_AUTO_COMEDIA)
+       (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
 
@@ -462,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
@@ -733,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. */
@@ -750,7 +757,7 @@ struct sip_settings {
        char default_subscribecontext[AST_MAX_CONTEXT];
        char default_record_on_feature[FEATURE_MAX_LEN];
        char default_record_off_feature[FEATURE_MAX_LEN];
-       struct ast_ha *contact_ha;  /*! \brief Global list of addresses dynamic peers are not allowed to use */
+       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) */
@@ -962,10 +969,11 @@ 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 order_offered;              /*!< Order the media was offered in. Not offered is 0 */
-       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. */
@@ -986,6 +994,7 @@ struct sip_msg_hdr {
 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 */
@@ -1016,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 */
@@ -1034,6 +1044,8 @@ 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 */
@@ -1044,7 +1056,7 @@ struct sip_pvt {
        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 */
@@ -1065,7 +1077,6 @@ struct sip_pvt {
                                               */
        unsigned short req_secure_signaling:1;/*!< Whether we are required to have secure signaling or not */
        unsigned short natdetected:1;         /*!< Whether we detected a NAT when processing the Via */
-       char tag[11];                     /*!< Our tag for this session */
        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 */
@@ -1106,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 */
@@ -1116,6 +1127,7 @@ 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 */
        uint32_t pendinginvite; /*!< Any pending INVITE or state NOTIFY (in subscribe pvt's) ? (seqno of this) */
@@ -1128,12 +1140,14 @@ 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 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 */
@@ -1184,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 */
@@ -1293,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 */
 
@@ -1317,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 */