53 #define T38_AUTOMATIC_REJECTION_SECONDS 5 136 if (old_state == new_state) {
141 ast_debug(2,
"T.38 state changed to '%u' from '%u' on channel '%s'\n",
142 new_state, old_state,
147 ast_debug(2,
"Automatic T.38 rejection on channel '%s' terminated\n",
160 ast_log(
LOG_WARNING,
"Scheduling of automatic T.38 rejection for channel '%s' failed\n",
211 ast_debug(2,
"Automatically rejecting T.38 request on channel '%s'\n",
238 return datastore->data;
247 state = datastore->data;
258 if (session_media->
udptl) {
292 struct pjsip_status_line status = rdata->msg_info.msg->line.status;
296 if (status.code / 100 <= 1) {
303 ast_debug(3,
"Received %d response to T.38 re-invite on '%s' but already had a final response (T.38 state:%d)\n",
311 if (!session->
channel || !state) {
312 ast_log(
LOG_WARNING,
"Received %d response to T.38 re-invite on '%s' but state unavailable\n",
318 if (status.code / 100 == 2) {
328 if (session_media && !session_media->
udptl) {
329 session_media =
NULL;
332 if (!session_media) {
333 ast_log(
LOG_WARNING,
"Received %d response to T.38 re-invite on '%s' but no active session media\n",
414 if (!session_media) {
447 }
else if (data->session->t38state ==
T38_ENABLED) {
471 if (!session_media) {
472 ast_log(
LOG_ERROR,
"Failed to negotiate parameters for reinvite on channel '%s' (No pending session media).\n",
473 data->session->channel ?
ast_channel_name(data->session->channel) :
"unknown channel");
479 }
else if ((data->session->t38state !=
T38_ENABLED) ||
490 if (!session_media) {
491 ast_log(
LOG_ERROR,
"Failed to negotiate parameters on channel '%s' (No default session media).\n",
492 data->session->channel ?
ast_channel_name(data->session->channel) :
"unknown channel");
507 }
else if (data->session->t38state ==
T38_ENABLED) {
518 if (!session_media) {
519 ast_log(
LOG_ERROR,
"Failed to request parameters for reinvite on channel '%s' (No pending session media).\n",
520 data->session->channel ?
ast_channel_name(data->session->channel) :
"unknown channel");
568 ast_debug(2,
"T.38 support not enabled on %s, refusing T.38 negotiation\n",
571 &rsp_refused,
sizeof(rsp_refused));
574 ast_debug(2,
"T.38 support not enabled on %s, 'terminating' T.38 session\n",
577 &rsp_terminated,
sizeof(rsp_terminated));
605 .
type =
"T38 framehook",
639 if (framehook_id < 0) {
640 ast_log(
LOG_WARNING,
"Could not attach T.38 Frame hook, T.38 will be unavailable on '%s'\n",
648 ast_log(
LOG_ERROR,
"Could not alloc T.38 Frame hook datastore, T.38 will be unavailable on '%s'\n",
703 const struct pjmedia_sdp_media *stream)
707 for (attr_i = 0; attr_i < stream->attr_count; attr_i++) {
708 pjmedia_sdp_attr *attr = stream->attr[attr_i];
710 if (!pj_stricmp2(&attr->name,
"t38faxmaxbuffer")) {
712 }
else if (!pj_stricmp2(&attr->name,
"t38maxbitrate") || !pj_stricmp2(&attr->name,
"t38faxmaxrate")) {
713 switch (pj_strtoul(&attr->value)) {
733 }
else if (!pj_stricmp2(&attr->name,
"t38faxversion")) {
735 }
else if (!pj_stricmp2(&attr->name,
"t38faxmaxdatagram") || !pj_stricmp2(&attr->name,
"t38maxdatagram")) {
739 }
else if (!pj_stricmp2(&attr->name,
"t38faxfillbitremoval")) {
741 }
else if (!pj_stricmp2(&attr->name,
"t38faxtranscodingmmr")) {
743 }
else if (!pj_stricmp2(&attr->name,
"t38faxtranscodingjbig")) {
745 }
else if (!pj_stricmp2(&attr->name,
"t38faxratemanagement")) {
746 if (!pj_stricmp2(&attr->value,
"localTCF")) {
748 }
else if (!pj_stricmp2(&attr->value,
"transferredTCF")) {
751 }
else if (!pj_stricmp2(&attr->name,
"t38faxudpec")) {
754 if (!pj_stricmp2(&attr->value,
"t38UDPFEC")) {
756 }
else if (!pj_stricmp2(&attr->value,
"t38UDPRedundancy")) {
762 if (!pj_stricmp2(&attr->value,
"t38UDPRedundancy")) {
771 if (!pj_stricmp2(&attr->value,
"t38UDPRedundancy")) {
773 }
else if (!pj_stricmp2(&attr->value,
"t38UDPFEC")) {
787 const struct pjmedia_sdp_session *sdp,
const struct pjmedia_sdp_media *stream)
820 int index,
struct ast_stream *asterisk_stream)
823 char host[NI_MAXHOST];
824 pjmedia_sdp_media *stream = sdp->media[index];
828 ast_debug(3,
"Declining; T.38 not enabled on session\n");
837 ast_debug(3,
"Declining; T.38 state is rejected or declined\n");
842 ast_copy_pj_str(host, stream->conn ? &stream->conn->addr : &sdp->conn->addr,
sizeof(host));
847 ast_debug(3,
"Declining; provided host is invalid\n");
855 ast_debug(3,
"Declining, provided host does not match configured address family\n");
864 struct pjmedia_sdp_session *sdp,
const struct pjmedia_sdp_session *remote,
struct ast_stream *stream)
867 static const pj_str_t STR_IN = {
"IN", 2 };
868 static const pj_str_t STR_IP4 = {
"IP4", 3};
869 static const pj_str_t STR_IP6 = {
"IP6", 3};
870 static const pj_str_t STR_UDPTL = {
"udptl", 5 };
871 static const pj_str_t STR_T38 = {
"t38", 3 };
872 static const pj_str_t STR_TRANSFERREDTCF = {
"transferredTCF", 14 };
873 static const pj_str_t STR_LOCALTCF = {
"localTCF", 8 };
874 static const pj_str_t STR_T38UDPFEC = {
"t38UDPFEC", 9 };
875 static const pj_str_t STR_T38UDPREDUNDANCY = {
"t38UDPRedundancy", 16 };
877 pjmedia_sdp_media *media;
878 const char *hostip =
NULL;
884 ast_debug(3,
"Not creating outgoing SDP stream: T.38 not enabled\n");
888 ast_debug(3,
"Not creating outgoing SDP stream: T.38 not enabled\n");
893 ast_debug(3,
"Not creating outgoing SDP stream: Failed to initialize T.38 session\n");
897 if (!(media = pj_pool_zalloc(pool,
sizeof(
struct pjmedia_sdp_media))) ||
898 !(media->conn = pj_pool_zalloc(pool,
sizeof(
struct pjmedia_sdp_conn)))) {
903 media->desc.transport = STR_UDPTL;
912 ast_debug(3,
"Not creating outgoing SDP stream: no known host IP\n");
916 media->conn->net_type = STR_IN;
918 pj_strdup2(pool, &media->conn->addr, hostip);
921 media->desc.port_count = 1;
922 media->desc.fmt[media->desc.fmt_count++] = STR_T38;
925 media->attr[media->attr_count++] = pjmedia_sdp_attr_create(pool,
"T38FaxVersion", pj_cstr(&stmp, tmp));
928 media->attr[media->attr_count++] = pjmedia_sdp_attr_create(pool,
"T38MaxBitRate", pj_cstr(&stmp, tmp));
931 media->attr[media->attr_count++] = pjmedia_sdp_attr_create(pool,
"T38FaxFillBitRemoval",
NULL);
935 media->attr[media->attr_count++] = pjmedia_sdp_attr_create(pool,
"T38FaxTranscodingMMR",
NULL);
939 media->attr[media->attr_count++] = pjmedia_sdp_attr_create(pool,
"T38FaxTranscodingJBIG",
NULL);
944 media->attr[media->attr_count++] = pjmedia_sdp_attr_create(pool,
"T38FaxRateManagement", &STR_TRANSFERREDTCF);
947 media->attr[media->attr_count++] = pjmedia_sdp_attr_create(pool,
"T38FaxRateManagement", &STR_LOCALTCF);
952 media->attr[media->attr_count++] = pjmedia_sdp_attr_create(pool,
"T38FaxMaxDatagram", pj_cstr(&stmp, tmp));
958 media->attr[media->attr_count++] = pjmedia_sdp_attr_create(pool,
"T38FaxUdpEC", &STR_T38UDPFEC);
961 media->attr[media->attr_count++] = pjmedia_sdp_attr_create(pool,
"T38FaxUdpEC", &STR_T38UDPREDUNDANCY);
965 sdp->media[sdp->media_count++] = media;
974 if (!session_media->
udptl) {
990 if (!session_media->
udptl) {
1000 const struct pjmedia_sdp_session *remote,
int index,
struct ast_stream *asterisk_stream)
1003 pjmedia_sdp_media *remote_stream = remote->media[index];
1004 char host[NI_MAXHOST];
1007 if (!session_media->
udptl) {
1008 ast_debug(3,
"Not applying negotiated SDP stream: no UDTPL session\n");
1016 ast_copy_pj_str(host, remote_stream->conn ? &remote_stream->conn->addr : &remote->conn->addr,
sizeof(host));
1021 ast_debug(3,
"Not applying negotiated SDP stream: failed to resolve remote stream host\n");
1041 char host[NI_MAXHOST];
1045 if (!stream->conn || !transport_state) {
1066 if (session_media->
udptl) {
1113 ast_log(
LOG_ERROR,
"Unable to register SDP handler for image stream type\n");
1129 .requires =
"res_pjsip,res_pjsip_session,udptl",
enum ast_sip_session_t38state t38state
#define ast_channel_lock(chan)
Main Channel structure associated with a channel.
struct ast_sip_endpoint * endpoint
static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, struct pjmedia_sdp_session *sdp, const struct pjmedia_sdp_session *remote, struct ast_stream *stream)
Function which creates an outgoing stream.
struct ast_sip_session_media_state * ast_sip_session_media_state_alloc(void)
Allocate a session media state structure.
#define ast_frdup(fr)
Copies a frame.
void ast_sip_session_media_state_free(struct ast_sip_session_media_state *media_state)
Free a session media state structure.
Asterisk main include file. File version handling, generic pbx functions.
#define ast_sip_transport_is_nonlocal(transport_state, addr)
struct ast_sip_session_media_state * pending_media_state
void ast_udptl_set_local_max_ifp(struct ast_udptl *udptl, unsigned int max_ifp)
static struct ast_frame * media_session_udptl_read_callback(struct ast_sip_session *session, struct ast_sip_session_media *session_media)
static int t38_reinvite_response_cb(struct ast_sip_session *session, pjsip_rx_data *rdata)
Callback for when a response is received for a T.38 re-invite.
static struct ast_sip_session_supplement t38_supplement
Supplement for adding framehook to session channel.
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
static int negotiate_incoming_sdp_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_session *sdp, int index, struct ast_stream *asterisk_stream)
Function which negotiates an incoming media stream.
void * ast_channel_tech_pvt(const struct ast_channel *chan)
static void t38_change_state(struct ast_sip_session *session, struct ast_sip_session_media *session_media, struct t38_state *state, enum ast_sip_session_t38state new_state)
Helper function for changing the T.38 state.
enum ast_t38_ec_modes error_correction
#define T38_AUTOMATIC_REJECTION_SECONDS
The number of seconds after receiving a T.38 re-invite before automatically rejecting it...
ast_framehook_event
These are the types of events that the framehook's event callback can receive.
static int load_module(void)
Load the module.
A handler for SDPs in SIP sessions.
static enum ast_sip_session_sdp_stream_defer 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)
Function which defers an incoming media stream.
static int apply_negotiated_sdp_stream(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_session *local, const struct pjmedia_sdp_session *remote, int index, struct ast_stream *asterisk_stream)
Function which applies a negotiated stream.
const char * ast_codec_media_type2str(enum ast_media_type type)
Conversion function to take a media type and turn it into a string.
static pj_pool_t * pool
Global memory pool for configuration and timers.
static struct ast_sip_session_sdp_handler image_sdp_handler
SDP handler for 'image' media stream.
int ast_framehook_detach(struct ast_channel *chan, int framehook_id)
Detach an framehook from a channel.
unsigned int ast_udptl_get_local_max_datagram(struct ast_udptl *udptl)
retrieves local_max_datagram.
enum ast_control_t38 request_response
Structure for a data store type.
A structure which contains a channel implementation and session.
struct ast_sip_session * session
Pointer to session.
static struct ast_sip_session_media_state * t38_create_media_state(struct ast_sip_session *session)
Helper function which creates a media state for strictly T.38.
enum ast_sip_session_t38state state
Current state.
void ast_udptl_set_far_max_datagram(struct ast_udptl *udptl, unsigned int max_datagram)
sets far max datagram size. If max_datagram is = 0, the far max datagram size is set to a default val...
Structure for a data store object.
void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size)
Copy a pj_str_t into a standard character buffer.
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
void ast_sip_session_unregister_supplement(struct ast_sip_session_supplement *supplement)
Unregister a an supplement to SIP session processing.
void ast_udptl_destroy(struct ast_udptl *udptl)
static int t38_automatic_reject(void *obj)
Task function which rejects a T.38 re-invite and resumes handling it.
struct ast_sip_session_media_state * ast_sip_session_media_state_clone(const struct ast_sip_session_media_state *media_state)
Clone a media state.
struct ast_frame * frame
T.38 control frame.
struct pjsip_inv_session * inv_session
void ast_stream_set_formats(struct ast_stream *stream, struct ast_format_cap *caps)
Set the current negotiated formats of a stream.
Socket address structure.
int ast_stream_topology_set_stream(struct ast_stream_topology *topology, unsigned int position, struct ast_stream *stream)
Set a specific position in a topology.
A structure describing a SIP session.
static int t38_consume(void *data, enum ast_frame_type type)
struct ast_frame_subclass subclass
enum ast_t38_ec_modes ast_udptl_get_error_correction_scheme(const struct ast_udptl *udptl)
#define ast_strlen_zero(foo)
struct ast_sip_session_media_state * active_media_state
const char * ast_sip_get_host_ip_string(int af)
Retrieve the local host address in string form.
struct ast_sip_session * session
Session itself.
struct ast_sip_endpoint_media_configuration media
void ast_udptl_get_us(const struct ast_udptl *udptl, struct ast_sockaddr *us)
#define ast_sockaddr_port(addr)
Get the port number of a socket address.
int ast_framehook_attach(struct ast_channel *chan, struct ast_framehook_interface *i)
Attach an framehook onto a channel for frame interception.
struct ast_sip_session_media * ast_sip_session_media_state_add(struct ast_sip_session *session, struct ast_sip_session_media_state *media_state, enum ast_media_type type, int position)
Allocate an ast_session_media and add it to the media state's vector.
#define ast_debug(level,...)
Log a DEBUG message.
unsigned int transcoding_mmr
static struct ast_frame * t38_framehook(struct ast_channel *chan, struct ast_frame *f, enum ast_framehook_event event, void *data)
Frame hook callback for T.38 related stuff.
Structure for SIP transport information.
static void t38_attach_framehook(struct ast_sip_session *session)
Function called to attach T.38 framehook to channel when appropriate.
General Asterisk PBX channel definitions.
int ast_sip_session_register_sdp_handler(struct ast_sip_session_sdp_handler *handler, const char *stream_type)
Register an SDP handler.
struct ast_datastore * ast_sip_session_alloc_datastore(const struct ast_datastore_info *info, const char *uid)
Alternative for ast_datastore_alloc()
struct ast_datastore * ast_sip_session_get_datastore(struct ast_sip_session *session, const char *name)
Retrieve a session datastore.
int ast_check_ipv6(void)
Test that an OS supports IPv6 Networking.
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
static int t38_incoming_invite_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
Function called when an INVITE arrives.
static struct ast_mansession session
struct ast_sip_session_media_state * media_state
static int media_session_udptl_write_callback(struct ast_sip_session *session, struct ast_sip_session_media *session_media, struct ast_frame *frame)
Access Control of various sorts.
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, struct ast_sip_session_media_state *media_state)
Send a reinvite or UPDATE on a session.
static struct t38_state * t38_state_get_or_alloc(struct ast_sip_session *session)
Helper function which retrieves or allocates a T.38 state information datastore.
#define ao2_ref(o, delta)
enum ast_control_t38_rate rate
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
struct ast_channel * channel
void ast_sip_session_resume_reinvite(struct ast_sip_session *session)
Resumes processing of a deferred incoming re-invite.
ast_sip_session_t38state
T.38 states for a session.
void ast_sip_session_unregister_sdp_handler(struct ast_sip_session_sdp_handler *handler, const char *stream_type)
Unregister an SDP handler.
struct ast_taskprocessor * serializer
ast_frame_type
Frame types.
unsigned int ast_udptl_get_far_max_ifp(struct ast_udptl *udptl)
retrieves far max ifp
Set when the stream is sending and receiving media.
void ast_udptl_set_peer(struct ast_udptl *udptl, const struct ast_sockaddr *them)
struct ast_stream_topology * ast_stream_topology_alloc(void)
Create a stream topology.
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
static void t38_masq(void *data, int framehook_id, struct ast_channel *old_chan, struct ast_channel *new_chan)
int ast_sip_push_task(struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
Pushes a task to SIP servants.
unsigned int fill_bit_removal
#define AST_FRAMEHOOK_INTERFACE_VERSION
static void t38_interpret_sdp(struct t38_state *state, struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_media *stream)
Parse a T.38 image stream and store the attribute information.
userdata associated with baseline taskprocessor test
#define ao2_alloc(data_size, destructor_fn)
ast_sip_session_sdp_stream_defer
#define ast_channel_unlock(chan)
struct ast_sip_transport_state * ast_sip_get_transport_state(const char *transport_id)
Retrieve transport state.
static void t38_outgoing_invite_request(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
Function called when an INVITE is sent.
#define ast_calloc(num, len)
A wrapper for calloc()
int ast_sip_session_media_add_read_callback(struct ast_sip_session *session, struct ast_sip_session_media *session_media, int fd, ast_sip_session_media_read_cb callback)
Set a read callback for a media session with a specific file descriptor.
static int unload_module(void)
Unloads the SIP T.38 module from Asterisk.
struct ast_control_t38_parameters our_parms
Our T.38 parameters.
void ast_stream_set_state(struct ast_stream *stream, enum ast_stream_state state)
Set the state of a stream.
int ast_udptl_fd(const struct ast_udptl *udptl)
Module has failed to load, may be in an inconsistent state.
static const struct ast_datastore_info t38_framehook_datastore
static int t38_reinvite_sdp_cb(struct ast_sip_session *session, pjmedia_sdp_session *sdp)
Callback for when T.38 reinvite SDP is created.
struct ast_control_t38_parameters their_parms
Their T.38 parameters.
pj_timer_entry timer
Timer entry for automatically rejecting an inbound re-invite.
AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS|AST_MODFLAG_LOAD_ORDER, "HTTP Phone Provisioning",.support_level=AST_MODULE_SUPPORT_EXTENDED,.load=load_module,.unload=unload_module,.reload=reload,.load_pri=AST_MODPRI_CHANNEL_DEPEND,.requires="http",)
struct ast_udptl * ast_udptl_new_with_bindaddr(struct ast_sched_context *sched, struct io_context *io, int callbackmode, struct ast_sockaddr *in)
A supplement to SIP message processing.
unsigned int transcoding_jbig
struct ast_frame * ast_udptl_read(struct ast_udptl *udptl)
pjsip_endpoint * ast_sip_get_pjsip_endpoint(void)
Get a pointer to the PJSIP endpoint.
struct ast_frame ast_null_frame
void ast_stream_free(struct ast_stream *stream)
Destroy a media stream representation.
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
static unsigned int t38_get_rate(enum ast_control_t38_rate rate)
Get Max T.38 Transmission rate from T38 capabilities.
struct ast_stream * ast_stream_alloc(const char *name, enum ast_media_type type)
Create a new media stream representation.
Structure for T.38 parameters task data.
const char * ast_channel_name(const struct ast_channel *chan)
void ast_udptl_set_error_correction_scheme(struct ast_udptl *udptl, enum ast_t38_ec_modes ec)
int ast_udptl_write(struct ast_udptl *udptl, struct ast_frame *f)
static const struct ast_datastore_info t38_datastore
Datastore for attaching T.38 state information.
enum ast_control_t38_rate_management rate_management
int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control, const void *data, size_t datalen)
Queue a control frame with payload.
int ast_sockaddr_is_ipv4(const struct ast_sockaddr *addr)
Determine if the address is an IPv4 address.
void ast_udptl_set_tag(struct ast_udptl *udptl, const char *format,...)
Associates a character string 'tag' with a UDPTL session.
Data structure associated with a single frame of data.
int ast_sip_session_media_set_write_callback(struct ast_sip_session *session, struct ast_sip_session_media *session_media, ast_sip_session_media_write_cb callback)
Set a write callback for a media session.
static int t38_initialize_session(struct ast_sip_session *session, struct ast_sip_session_media *session_media)
Initializes UDPTL support on a session, only done when actually needed.
#define ast_datastore_alloc(info, uid)
union ast_frame::@263 data
enum ast_frame_type frametype
static pj_timer_heap_t * timer_heap
Global timer heap.
void ast_sip_session_media_state_reset(struct ast_sip_session_media_state *media_state)
Reset a media state to a clean state.
static void stream_destroy(struct ast_sip_session_media *session_media)
Function which destroys the UDPTL instance when session ends.
#define ASTERISK_GPL_KEY
The text the key() function should return.
Asterisk module definitions.
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
static void change_outgoing_sdp_stream_media_address(pjsip_tx_data *tdata, struct pjmedia_sdp_media *stream, struct ast_sip_transport *transport)
Function which updates the media stream with external media address, if applicable.
void ast_udptl_setnat(struct ast_udptl *udptl, int nat)
static struct t38_parameters_task_data * t38_parameters_task_data_alloc(struct ast_sip_session *session, struct ast_frame *frame)
Allocator for T.38 data.
const struct ast_channel_tech * ast_channel_tech(const struct ast_channel *chan)
int ast_sockaddr_is_ipv6(const struct ast_sockaddr *addr)
Determine if this is an IPv6 address.
static int t38_interpret_parameters(void *obj)
Task for reacting to T.38 control frame.
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
static void t38_parameters_task_data_destroy(void *obj)
Destructor for T.38 data.
void(* stream_stop)(struct ast_sip_session_media *session_media)
Stop a session_media created by this handler but do not destroy resources.
static void t38_automatic_reject_timer_cb(pj_timer_heap_t *timer_heap, struct pj_timer_entry *entry)
Timer entry callback which queues a task to reject a T.38 re-invite and resume handling it...
int ast_sip_session_add_datastore(struct ast_sip_session *session, struct ast_datastore *datastore)
Add a datastore to a SIP session.
void ast_channel_set_unbridged(struct ast_channel *chan, int value)
Sets the unbridged flag and queues a NULL frame on the channel to trigger a check by bridge_channel_w...
static char * ast_sockaddr_stringify_host(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brack...
int ast_sockaddr_resolve(struct ast_sockaddr **addrs, const char *str, int flags, int family)
Parses a string with an IPv4 or IPv6 address and place results into an array.
#define ast_sip_session_register_supplement(supplement)
static void t38_state_destroy(void *obj)
Destructor for T.38 state information.