summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2013-07-30 14:16:41 +0000
committerJoshua Colp <jcolp@digium.com>2013-07-30 14:16:41 +0000
commit7fded3378948b9076cc092145bb4823a50b8501c (patch)
treeb9edcf279aba4267edcfa007c2a9224cfc68994d /include
parent7c371a1add2fd624d18b8d786d7510e6aed762a8 (diff)
Add support for T.38 fax to chan_pjsip.
Review: https://reviewboard.asterisk.org/r/2692/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@395731 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'include')
-rw-r--r--include/asterisk/res_sip.h14
-rw-r--r--include/asterisk/res_sip_session.h49
2 files changed, 61 insertions, 2 deletions
diff --git a/include/asterisk/res_sip.h b/include/asterisk/res_sip.h
index 01d50bfb9..ed24f1e1b 100644
--- a/include/asterisk/res_sip.h
+++ b/include/asterisk/res_sip.h
@@ -32,6 +32,8 @@
#include "asterisk/dnsmgr.h"
/* Needed for ast_endpoint */
#include "asterisk/endpoints.h"
+/* Needed for ast_t38_ec_modes */
+#include "asterisk/udptl.h"
/* Needed for pj_sockaddr */
#include <pjlib.h>
/* Needed for ast_rtp_dtls_cfg struct */
@@ -434,6 +436,18 @@ struct ast_sip_endpoint {
struct ast_endpoint *persistent;
/*! The number of channels at which busy device state is returned */
unsigned int devicestate_busy_at;
+ /*! Whether T.38 UDPTL support is enabled or not */
+ unsigned int t38udptl;
+ /*! Error correction setting for T.38 UDPTL */
+ enum ast_t38_ec_modes t38udptl_ec;
+ /*! Explicit T.38 max datagram value, may be 0 to indicate the remote side can be trusted */
+ unsigned int t38udptl_maxdatagram;
+ /*! Whether fax detection is enabled or not (CNG tone detection) */
+ unsigned int faxdetect;
+ /*! Whether NAT Support is enabled for T.38 UDPTL sessions or not */
+ unsigned int t38udptl_nat;
+ /*! Whether to use IPv6 for UDPTL or not */
+ unsigned int t38udptl_ipv6;
/*! Determines if transfers (using REFER) are allowed by this endpoint */
unsigned int allowtransfer;
/*! DSCP TOS bits for audio streams */
diff --git a/include/asterisk/res_sip_session.h b/include/asterisk/res_sip_session.h
index fb482db9b..4c5ac5534 100644
--- a/include/asterisk/res_sip_session.h
+++ b/include/asterisk/res_sip_session.h
@@ -43,6 +43,16 @@ struct ast_party_id;
struct pjmedia_sdp_media;
struct pjmedia_sdp_session;
struct ast_dsp;
+struct ast_udptl;
+
+/*! \brief T.38 states for a session */
+enum ast_sip_session_t38state {
+ T38_DISABLED = 0, /*!< Not enabled */
+ T38_LOCAL_REINVITE, /*!< Offered from local - REINVITE */
+ T38_PEER_REINVITE, /*!< Offered from peer - REINVITE */
+ T38_ENABLED, /*!< Negotiated (enabled) */
+ T38_REJECTED, /*!< Refused */
+};
struct ast_sip_session_sdp_handler;
@@ -50,8 +60,12 @@ struct ast_sip_session_sdp_handler;
* \brief A structure containing SIP session media information
*/
struct ast_sip_session_media {
- /*! \brief RTP instance itself */
- struct ast_rtp_instance *rtp;
+ union {
+ /*! \brief RTP instance itself */
+ struct ast_rtp_instance *rtp;
+ /*! \brief UDPTL instance itself */
+ struct ast_udptl *udptl;
+ };
/*! \brief Direct media address */
struct ast_sockaddr direct_media_addr;
/*! \brief SDP handler that setup the RTP */
@@ -113,10 +127,15 @@ struct ast_sip_session {
struct ast_dsp *dsp;
/* Whether the termination of the session should be deferred */
unsigned int defer_terminate:1;
+ /* Deferred incoming re-invite */
+ pjsip_rx_data *deferred_reinvite;
+ /* Current T.38 state */
+ enum ast_sip_session_t38state t38state;
};
typedef int (*ast_sip_session_request_creation_cb)(struct ast_sip_session *session, pjsip_tx_data *tdata);
typedef int (*ast_sip_session_response_cb)(struct ast_sip_session *session, pjsip_rx_data *rdata);
+typedef int (*ast_sip_session_sdp_creation_cb)(struct ast_sip_session *session, pjmedia_sdp_session *sdp);
enum ast_sip_session_supplement_priority {
/*! Top priority. Supplements with this priority are those that need to run before any others */
@@ -210,6 +229,19 @@ struct ast_sip_session_sdp_handler {
/*! An identifier for this handler */
const char *id;
/*!
+ * \brief Determine whether a stream requires that the re-invite be deferred.
+ * If a stream can not be immediately negotiated the re-invite can be deferred and
+ * resumed at a later time. It is up to the handler which caused deferral to occur
+ * to resume it.
+ * \param session The session for which the media is being re-invited
+ * \param session_media The media being reinvited
+ * \param sdp The entire SDP.
+ * \retval 0 The stream was unhandled or does not need the re-invite to be deferred.
+ * \retval 1 Re-invite should be deferred and will be resumed later. No further operations will take place.
+ * \note This is optional, if not implemented the stream is assumed to not be deferred.
+ */
+ int (*defer_incoming_sdp_stream)(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_session *sdp, const struct pjmedia_sdp_media *stream);
+ /*!
* \brief Set session details based on a stream in an incoming SDP offer or answer
* \param session The session for which the media is being negotiated
* \param session_media The media to be setup for this session
@@ -443,6 +475,7 @@ void ast_sip_session_remove_datastore(struct ast_sip_session *session, const cha
*
* \param session The session on which the reinvite will be sent
* \param on_request_creation Callback called when request is created
+ * \param on_sdp_creation Callback called when SDP is created
* \param on_response Callback called when response for request is received
* \param method The method that should be used when constructing the session refresh
* \param generate_new_sdp Boolean to indicate if a new SDP should be created
@@ -451,6 +484,7 @@ void ast_sip_session_remove_datastore(struct ast_sip_session *session, const cha
*/
int ast_sip_session_refresh(struct ast_sip_session *session,
ast_sip_session_request_creation_cb on_request_creation,
+ ast_sip_session_sdp_creation_cb on_sdp_creation,
ast_sip_session_response_cb on_response,
enum ast_sip_session_refresh_method method,
int generate_new_sdp);
@@ -513,4 +547,15 @@ void ast_sip_session_send_request_with_cb(struct ast_sip_session *session, pjsip
*/
struct ast_sip_session *ast_sip_dialog_get_session(pjsip_dialog *dlg);
+/*!
+ * \brief Resumes processing of a deferred incoming re-invite
+ *
+ * \param session The session which has a pending incoming re-invite
+ *
+ * \note When resuming a re-invite it is given to the pjsip stack as if it
+ * had just been received from a transport, this means that the deferral
+ * callback will be called again.
+ */
+void ast_sip_session_resume_reinvite(struct ast_sip_session *session);
+
#endif /* _RES_SIP_SESSION_H */