Tue Aug 20 16:35:17 2013

Asterisk developer's documentation


udptl.h File Reference

UDPTL support for T.38. More...

#include "asterisk/network.h"
#include "asterisk/frame.h"
#include "asterisk/io.h"
#include "asterisk/sched.h"
#include "asterisk/channel.h"
#include "asterisk/netsock2.h"

Go to the source code of this file.

Data Structures

struct  ast_udptl_protocol

Typedefs

typedef int(* ast_udptl_callback )(struct ast_udptl *udptl, struct ast_frame *f, void *data)

Enumerations

enum  ast_t38_ec_modes { UDPTL_ERROR_CORRECTION_NONE, UDPTL_ERROR_CORRECTION_FEC, UDPTL_ERROR_CORRECTION_REDUNDANCY }

Functions

int ast_udptl_bridge (struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc)
void ast_udptl_destroy (struct ast_udptl *udptl)
int ast_udptl_fd (const struct ast_udptl *udptl)
enum ast_t38_ec_modes ast_udptl_get_error_correction_scheme (const struct ast_udptl *udptl)
unsigned int ast_udptl_get_far_max_datagram (const struct ast_udptl *udptl)
unsigned int ast_udptl_get_far_max_ifp (struct ast_udptl *udptl)
 retrieves far max ifp
unsigned int ast_udptl_get_local_max_datagram (struct ast_udptl *udptl)
 retrieves local_max_datagram.
void ast_udptl_get_peer (const struct ast_udptl *udptl, struct ast_sockaddr *them)
void ast_udptl_get_us (const struct ast_udptl *udptl, struct ast_sockaddr *us)
void ast_udptl_init (void)
struct ast_udptlast_udptl_new_with_bindaddr (struct sched_context *sched, struct io_context *io, int callbackmode, struct ast_sockaddr *in)
int ast_udptl_proto_register (struct ast_udptl_protocol *proto)
void ast_udptl_proto_unregister (struct ast_udptl_protocol *proto)
struct ast_frameast_udptl_read (struct ast_udptl *udptl)
int ast_udptl_reload (void)
void ast_udptl_reset (struct ast_udptl *udptl)
void ast_udptl_set_callback (struct ast_udptl *udptl, ast_udptl_callback callback)
void ast_udptl_set_data (struct ast_udptl *udptl, void *data)
void ast_udptl_set_error_correction_scheme (struct ast_udptl *udptl, enum ast_t38_ec_modes ec)
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 value.
void ast_udptl_set_local_max_ifp (struct ast_udptl *udptl, unsigned int max_ifp)
void ast_udptl_set_m_type (struct ast_udptl *udptl, unsigned int pt)
void ast_udptl_set_peer (struct ast_udptl *udptl, const struct ast_sockaddr *them)
void ast_udptl_set_tag (struct ast_udptl *udptl, const char *format,...)
 Associates a character string 'tag' with a UDPTL session.
void ast_udptl_set_udptlmap_type (struct ast_udptl *udptl, unsigned int pt, char *mimeType, char *mimeSubtype)
void ast_udptl_setnat (struct ast_udptl *udptl, int nat)
int ast_udptl_setqos (struct ast_udptl *udptl, unsigned int tos, unsigned int cos)
void ast_udptl_stop (struct ast_udptl *udptl)
int ast_udptl_write (struct ast_udptl *udptl, struct ast_frame *f)

Detailed Description

UDPTL support for T.38.

Author:
Steve Underwood <steveu@coppice.org> udptl.c
Todo:
add doxygen documentation to this file!

Definition in file udptl.h.


Typedef Documentation

typedef int(* ast_udptl_callback)(struct ast_udptl *udptl, struct ast_frame *f, void *data)

Definition at line 58 of file udptl.h.


Enumeration Type Documentation

Enumerator:
UDPTL_ERROR_CORRECTION_NONE 
UDPTL_ERROR_CORRECTION_FEC 
UDPTL_ERROR_CORRECTION_REDUNDANCY 

Definition at line 37 of file udptl.h.


Function Documentation

int ast_udptl_bridge ( struct ast_channel c0,
struct ast_channel c1,
int  flags,
struct ast_frame **  fo,
struct ast_channel **  rc 
)

Definition at line 1140 of file udptl.c.

References ast_channel_lock, ast_channel_trylock, ast_channel_unlock, ast_check_hangup(), ast_debug, AST_FRAME_MODEM, ast_frfree, ast_log(), ast_read(), ast_sockaddr_cmp(), ast_sockaddr_copy(), ast_sockaddr_stringify(), ast_udptl_get_peer(), ast_waitfor_n(), ast_write(), f, ast_frame::frametype, get_proto(), ast_udptl_protocol::get_udptl_info, LOG_WARNING, ast_channel::masq, ast_channel::masqr, ast_udptl_protocol::set_udptl_peer, and ast_channel::tech_pvt.

01141 {
01142    struct ast_frame *f;
01143    struct ast_channel *who;
01144    struct ast_channel *cs[3];
01145    struct ast_udptl *p0;
01146    struct ast_udptl *p1;
01147    struct ast_udptl_protocol *pr0;
01148    struct ast_udptl_protocol *pr1;
01149    struct ast_sockaddr ac0;
01150    struct ast_sockaddr ac1;
01151    struct ast_sockaddr t0;
01152    struct ast_sockaddr t1;
01153    void *pvt0;
01154    void *pvt1;
01155    int to;
01156    
01157    ast_channel_lock(c0);
01158    while (ast_channel_trylock(c1)) {
01159       ast_channel_unlock(c0);
01160       usleep(1);
01161       ast_channel_lock(c0);
01162    }
01163    pr0 = get_proto(c0);
01164    pr1 = get_proto(c1);
01165    if (!pr0) {
01166       ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c0->name);
01167       ast_channel_unlock(c0);
01168       ast_channel_unlock(c1);
01169       return -1;
01170    }
01171    if (!pr1) {
01172       ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c1->name);
01173       ast_channel_unlock(c0);
01174       ast_channel_unlock(c1);
01175       return -1;
01176    }
01177    pvt0 = c0->tech_pvt;
01178    pvt1 = c1->tech_pvt;
01179    p0 = pr0->get_udptl_info(c0);
01180    p1 = pr1->get_udptl_info(c1);
01181    if (!p0 || !p1) {
01182       /* Somebody doesn't want to play... */
01183       ast_channel_unlock(c0);
01184       ast_channel_unlock(c1);
01185       return -2;
01186    }
01187    if (pr0->set_udptl_peer(c0, p1)) {
01188       ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c0->name, c1->name);
01189       memset(&ac1, 0, sizeof(ac1));
01190    } else {
01191       /* Store UDPTL peer */
01192       ast_udptl_get_peer(p1, &ac1);
01193    }
01194    if (pr1->set_udptl_peer(c1, p0)) {
01195       ast_log(LOG_WARNING, "Channel '%s' failed to talk back to '%s'\n", c1->name, c0->name);
01196       memset(&ac0, 0, sizeof(ac0));
01197    } else {
01198       /* Store UDPTL peer */
01199       ast_udptl_get_peer(p0, &ac0);
01200    }
01201    ast_channel_unlock(c0);
01202    ast_channel_unlock(c1);
01203    cs[0] = c0;
01204    cs[1] = c1;
01205    cs[2] = NULL;
01206    for (;;) {
01207       if ((c0->tech_pvt != pvt0) ||
01208          (c1->tech_pvt != pvt1) ||
01209          (c0->masq || c0->masqr || c1->masq || c1->masqr)) {
01210             ast_debug(1, "Oooh, something is weird, backing out\n");
01211             /* Tell it to try again later */
01212             return -3;
01213       }
01214       to = -1;
01215       ast_udptl_get_peer(p1, &t1);
01216       ast_udptl_get_peer(p0, &t0);
01217       if (ast_sockaddr_cmp(&t1, &ac1)) {
01218          ast_debug(1, "Oooh, '%s' changed end address to %s\n", 
01219             c1->name, ast_sockaddr_stringify(&t1));
01220          ast_debug(1, "Oooh, '%s' was %s\n", 
01221             c1->name, ast_sockaddr_stringify(&ac1));
01222          ast_sockaddr_copy(&ac1, &t1);
01223       }
01224       if (ast_sockaddr_cmp(&t0, &ac0)) {
01225          ast_debug(1, "Oooh, '%s' changed end address to %s\n", 
01226             c0->name, ast_sockaddr_stringify(&t0));
01227          ast_debug(1, "Oooh, '%s' was %s\n", 
01228             c0->name, ast_sockaddr_stringify(&ac0));
01229          ast_sockaddr_copy(&ac0, &t0);
01230       }
01231       who = ast_waitfor_n(cs, 2, &to);
01232       if (!who) {
01233          ast_debug(1, "Ooh, empty read...\n");
01234          /* check for hangup / whentohangup */
01235          if (ast_check_hangup(c0) || ast_check_hangup(c1))
01236             break;
01237          continue;
01238       }
01239       f = ast_read(who);
01240       if (!f) {
01241          *fo = f;
01242          *rc = who;
01243          ast_debug(1, "Oooh, got a %s\n", f ? "digit" : "hangup");
01244          /* That's all we needed */
01245          return 0;
01246       } else {
01247          if (f->frametype == AST_FRAME_MODEM) {
01248             /* Forward T.38 frames if they happen upon us */
01249             if (who == c0) {
01250                ast_write(c1, f);
01251             } else if (who == c1) {
01252                ast_write(c0, f);
01253             }
01254          }
01255          ast_frfree(f);
01256       }
01257       /* Swap priority. Not that it's a big deal at this point */
01258       cs[2] = cs[0];
01259       cs[0] = cs[1];
01260       cs[1] = cs[2];
01261    }
01262    return -1;
01263 }

void ast_udptl_destroy ( struct ast_udptl udptl  ) 

Definition at line 1038 of file udptl.c.

References ast_free, ast_io_remove(), ast_udptl::fd, ast_udptl::io, ast_udptl::ioid, and ast_udptl::tag.

Referenced by __sip_destroy().

01039 {
01040    if (udptl->ioid)
01041       ast_io_remove(udptl->io, udptl->ioid);
01042    if (udptl->fd > -1)
01043       close(udptl->fd);
01044    if (udptl->tag)
01045       ast_free(udptl->tag);
01046    ast_free(udptl);
01047 }

int ast_udptl_fd ( const struct ast_udptl udptl  ) 

Definition at line 637 of file udptl.c.

References ast_udptl::fd.

Referenced by __oh323_new(), initialize_udptl(), and sip_new().

00638 {
00639    return udptl->fd;
00640 }

enum ast_t38_ec_modes ast_udptl_get_error_correction_scheme ( const struct ast_udptl udptl  ) 

Definition at line 835 of file udptl.c.

References ast_udptl::error_correction_scheme.

Referenced by add_sdp().

00836 {
00837    return udptl->error_correction_scheme;
00838 }

unsigned int ast_udptl_get_far_max_datagram ( const struct ast_udptl udptl  ) 

Definition at line 903 of file udptl.c.

References ast_udptl::far_max_datagram.

Referenced by process_sdp().

00904 {
00905    if (udptl->far_max_datagram < 0) {
00906       return 0;
00907    }
00908    return udptl->far_max_datagram;
00909 }

unsigned int ast_udptl_get_far_max_ifp ( struct ast_udptl udptl  ) 

retrieves far max ifp

Return values:
positive value representing max ifp size
0 if no value is present

Definition at line 911 of file udptl.c.

References calculate_far_max_ifp(), and ast_udptl::far_max_ifp.

Referenced by change_t38_state(), and interpret_t38_parameters().

00912 {
00913    if (udptl->far_max_ifp == -1) {
00914       calculate_far_max_ifp(udptl);
00915    }
00916 
00917    if (udptl->far_max_ifp < 0) {
00918       return 0;
00919    }
00920    return udptl->far_max_ifp;
00921 }

unsigned int ast_udptl_get_local_max_datagram ( struct ast_udptl udptl  ) 

retrieves local_max_datagram.

Return values:
positive value representing max datagram size.
0 if no value is present

Definition at line 879 of file udptl.c.

References calculate_local_max_datagram(), and ast_udptl::local_max_datagram.

Referenced by add_sdp().

00880 {
00881    if (udptl->local_max_datagram == -1) {
00882       calculate_local_max_datagram(udptl);
00883    }
00884 
00885    /* this function expects a unsigned value in return. */
00886    if (udptl->local_max_datagram < 0) {
00887       return 0;
00888    }
00889    return udptl->local_max_datagram;
00890 }

void ast_udptl_get_peer ( const struct ast_udptl udptl,
struct ast_sockaddr them 
)

Definition at line 1023 of file udptl.c.

References ast_sockaddr_copy(), and ast_udptl::them.

Referenced by ast_udptl_bridge(), and sip_set_udptl_peer().

01024 {
01025    ast_sockaddr_copy(them, &udptl->them);
01026 }

void ast_udptl_get_us ( const struct ast_udptl udptl,
struct ast_sockaddr us 
)

Definition at line 1028 of file udptl.c.

References ast_sockaddr_copy(), and ast_udptl::us.

Referenced by add_sdp().

01029 {
01030    ast_sockaddr_copy(us, &udptl->us);
01031 }

void ast_udptl_init ( void   ) 
struct ast_udptl* ast_udptl_new_with_bindaddr ( struct sched_context sched,
struct io_context io,
int  callbackmode,
struct ast_sockaddr in 
) [read]

Definition at line 923 of file udptl.c.

References ast_bind(), ast_calloc, ast_free, ast_io_add(), AST_IO_IN, ast_log(), ast_random(), ast_sockaddr_copy(), ast_sockaddr_is_ipv6(), ast_sockaddr_set_port, udptl_fec_tx_buffer_t::buf_len, udptl_fec_rx_buffer_t::buf_len, errno, ast_udptl::error_correction_entries, ast_udptl::error_correction_span, ast_udptl::far_max_datagram, ast_udptl::far_max_ifp, ast_udptl::fd, ast_udptl::flags, ast_udptl::io, ast_udptl::ioid, ast_udptl::local_max_datagram, ast_udptl::local_max_ifp, LOG_WARNING, ast_udptl::rx, ast_udptl::sched, ast_udptl::tx, UDPTL_BUF_MASK, udptlread(), and ast_udptl::us.

Referenced by initialize_udptl().

00924 {
00925    struct ast_udptl *udptl;
00926    int x;
00927    int startplace;
00928    int i;
00929    long int flags;
00930 
00931    if (!(udptl = ast_calloc(1, sizeof(*udptl))))
00932       return NULL;
00933 
00934    udptl->error_correction_span = udptlfecspan;
00935    udptl->error_correction_entries = udptlfecentries;
00936    
00937    udptl->far_max_datagram = -1;
00938    udptl->far_max_ifp = -1;
00939    udptl->local_max_ifp = -1;
00940    udptl->local_max_datagram = -1;
00941 
00942    for (i = 0; i <= UDPTL_BUF_MASK; i++) {
00943       udptl->rx[i].buf_len = -1;
00944       udptl->tx[i].buf_len = -1;
00945    }
00946 
00947    if ((udptl->fd = socket(ast_sockaddr_is_ipv6(addr) ?
00948                AF_INET6 : AF_INET, SOCK_DGRAM, 0)) < 0) {
00949       ast_free(udptl);
00950       ast_log(LOG_WARNING, "Unable to allocate socket: %s\n", strerror(errno));
00951       return NULL;
00952    }
00953    flags = fcntl(udptl->fd, F_GETFL);
00954    fcntl(udptl->fd, F_SETFL, flags | O_NONBLOCK);
00955 #ifdef SO_NO_CHECK
00956    if (nochecksums)
00957       setsockopt(udptl->fd, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums));
00958 #endif
00959    /* Find us a place */
00960    x = (udptlstart == udptlend) ? udptlstart : (ast_random() % (udptlend - udptlstart)) + udptlstart;
00961    if (use_even_ports && (x & 1)) {
00962       ++x;
00963    }
00964    startplace = x;
00965    for (;;) {
00966       ast_sockaddr_copy(&udptl->us, addr);
00967       ast_sockaddr_set_port(&udptl->us, x);
00968       if (ast_bind(udptl->fd, &udptl->us) == 0) {
00969          break;
00970       }
00971       if (errno != EADDRINUSE) {
00972          ast_log(LOG_WARNING, "Unexpected bind error: %s\n", strerror(errno));
00973          close(udptl->fd);
00974          ast_free(udptl);
00975          return NULL;
00976       }
00977       if (use_even_ports) {
00978          x += 2;
00979       } else {
00980          ++x;
00981       }
00982       if (x > udptlend)
00983          x = udptlstart;
00984       if (x == startplace) {
00985          ast_log(LOG_WARNING, "No UDPTL ports remaining\n");
00986          close(udptl->fd);
00987          ast_free(udptl);
00988          return NULL;
00989       }
00990    }
00991    if (io && sched && callbackmode) {
00992       /* Operate this one in a callback mode */
00993       udptl->sched = sched;
00994       udptl->io = io;
00995       udptl->ioid = ast_io_add(udptl->io, udptl->fd, udptlread, AST_IO_IN, udptl);
00996    }
00997    return udptl;
00998 }

int ast_udptl_proto_register ( struct ast_udptl_protocol proto  ) 

Definition at line 1109 of file udptl.c.

References ast_log(), AST_RWLIST_INSERT_TAIL, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_udptl_protocol::list, LOG_WARNING, and ast_udptl_protocol::type.

Referenced by load_module().

01110 {
01111    struct ast_udptl_protocol *cur;
01112 
01113    AST_RWLIST_WRLOCK(&protos);
01114    AST_RWLIST_TRAVERSE(&protos, cur, list) {
01115       if (cur->type == proto->type) {
01116          ast_log(LOG_WARNING, "Tried to register same protocol '%s' twice\n", cur->type);
01117          AST_RWLIST_UNLOCK(&protos);
01118          return -1;
01119       }
01120    }
01121    AST_RWLIST_INSERT_TAIL(&protos, proto, list);
01122    AST_RWLIST_UNLOCK(&protos);
01123    return 0;
01124 }

void ast_udptl_proto_unregister ( struct ast_udptl_protocol proto  ) 

Definition at line 1102 of file udptl.c.

References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.

Referenced by unload_module().

01103 {
01104    AST_RWLIST_WRLOCK(&protos);
01105    AST_RWLIST_REMOVE(&protos, proto, list);
01106    AST_RWLIST_UNLOCK(&protos);
01107 }

struct ast_frame* ast_udptl_read ( struct ast_udptl udptl  )  [read]

Definition at line 669 of file udptl.c.

References ast_assert, ast_debug, AST_FRIENDLY_OFFSET, ast_log(), ast_null_frame, ast_recvfrom(), ast_sockaddr_cmp(), ast_sockaddr_copy(), ast_sockaddr_isnull(), ast_sockaddr_stringify(), ast_verb, errno, ast_udptl::f, ast_udptl::fd, LOG_TAG, LOG_WARNING, ast_udptl::nat, ast_udptl::rawdata, ast_udptl::them, udptl_debug_test_addr(), and udptl_rx_packet().

Referenced by sip_rtp_read(), skinny_rtp_read(), and udptlread().

00670 {
00671    int res;
00672    struct ast_sockaddr addr;
00673    uint8_t *buf;
00674 
00675    buf = udptl->rawdata + AST_FRIENDLY_OFFSET;
00676 
00677    /* Cache where the header will go */
00678    res = ast_recvfrom(udptl->fd,
00679          buf,
00680          sizeof(udptl->rawdata) - AST_FRIENDLY_OFFSET,
00681          0,
00682          &addr);
00683    if (res < 0) {
00684       if (errno != EAGAIN)
00685          ast_log(LOG_WARNING, "UDPTL (%s): read error: %s\n",
00686             LOG_TAG(udptl), strerror(errno));
00687       ast_assert(errno != EBADF);
00688       return &ast_null_frame;
00689    }
00690 
00691    /* Ignore if the other side hasn't been given an address yet. */
00692    if (ast_sockaddr_isnull(&udptl->them)) {
00693       return &ast_null_frame;
00694    }
00695 
00696    if (udptl->nat) {
00697       /* Send to whoever sent to us */
00698       if (ast_sockaddr_cmp(&udptl->them, &addr)) {
00699          ast_sockaddr_copy(&udptl->them, &addr);
00700          ast_debug(1, "UDPTL (%s): NAT, Using address %s\n",
00701               LOG_TAG(udptl), ast_sockaddr_stringify(&udptl->them));
00702       }
00703    }
00704 
00705    if (udptl_debug_test_addr(&addr)) {
00706       int seq_no;
00707 
00708       /* Decode sequence number just for verbose message. */
00709       if (res < 2) {
00710          /* Short packet. */
00711          seq_no = -1;
00712       } else {
00713          seq_no = (buf[0] << 8) | buf[1];
00714       }
00715 
00716       ast_verb(1, "UDPTL (%s): packet from %s (seq %d, len %d)\n",
00717          LOG_TAG(udptl), ast_sockaddr_stringify(&addr), seq_no, res);
00718    }
00719    if (udptl_rx_packet(udptl, buf, res) < 1) {
00720       return &ast_null_frame;
00721    }
00722 
00723    return &udptl->f[0];
00724 }

int ast_udptl_reload ( void   ) 
Version:
1.6.1 return changed to int

Definition at line 1415 of file udptl.c.

References __ast_udptl_reload().

01416 {
01417    __ast_udptl_reload(1);
01418    return 0;
01419 }

void ast_udptl_reset ( struct ast_udptl udptl  ) 
void ast_udptl_set_callback ( struct ast_udptl udptl,
ast_udptl_callback  callback 
)

Definition at line 647 of file udptl.c.

References ast_udptl::callback.

00648 {
00649    udptl->callback = callback;
00650 }

void ast_udptl_set_data ( struct ast_udptl udptl,
void *  data 
)

Definition at line 642 of file udptl.c.

References ast_udptl::data.

00643 {
00644    udptl->data = data;
00645 }

void ast_udptl_set_error_correction_scheme ( struct ast_udptl udptl,
enum ast_t38_ec_modes  ec 
)

Definition at line 840 of file udptl.c.

References ast_udptl::error_correction_entries, ast_udptl::error_correction_scheme, ast_udptl::error_correction_span, ast_udptl::far_max_ifp, ast_udptl::local_max_datagram, UDPTL_ERROR_CORRECTION_FEC, and UDPTL_ERROR_CORRECTION_REDUNDANCY.

Referenced by process_sdp(), process_sdp_a_image(), and set_t38_capabilities().

00841 {
00842    udptl->error_correction_scheme = ec;
00843    switch (ec) {
00844    case UDPTL_ERROR_CORRECTION_FEC:
00845       udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_FEC;
00846       if (udptl->error_correction_entries == 0) {
00847          udptl->error_correction_entries = 3;
00848       }
00849       if (udptl->error_correction_span == 0) {
00850          udptl->error_correction_span = 3;
00851       }
00852       break;
00853    case UDPTL_ERROR_CORRECTION_REDUNDANCY:
00854       udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_REDUNDANCY;
00855       if (udptl->error_correction_entries == 0) {
00856          udptl->error_correction_entries = 3;
00857       }
00858       break;
00859    default:
00860       /* nothing to do */
00861       break;
00862    };
00863    /* reset calculated values so they'll be computed again */
00864    udptl->local_max_datagram = -1;
00865    udptl->far_max_ifp = -1;
00866 }

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 value.

Definition at line 892 of file udptl.c.

References DEFAULT_FAX_MAX_DATAGRAM, ast_udptl::far_max_datagram, ast_udptl::far_max_ifp, and FAX_MAX_DATAGRAM_LIMIT.

Referenced by process_sdp(), and process_sdp_a_image().

00893 {
00894    if (!max_datagram || (max_datagram > FAX_MAX_DATAGRAM_LIMIT)) {
00895       udptl->far_max_datagram = DEFAULT_FAX_MAX_DATAGRAM;
00896    } else {
00897       udptl->far_max_datagram = max_datagram;
00898    }
00899    /* reset calculated values so they'll be computed again */
00900    udptl->far_max_ifp = -1;
00901 }

void ast_udptl_set_local_max_ifp ( struct ast_udptl udptl,
unsigned int  max_ifp 
)

Definition at line 868 of file udptl.c.

References ast_udptl::local_max_datagram, and ast_udptl::local_max_ifp.

Referenced by interpret_t38_parameters().

00869 {
00870    /* make sure max_ifp is a positive value since a cast will take place when
00871     * when setting local_max_ifp */
00872    if ((signed int) max_ifp > 0) {
00873       udptl->local_max_ifp = max_ifp;
00874       /* reset calculated values so they'll be computed again */
00875       udptl->local_max_datagram = -1;
00876    }
00877 }

void ast_udptl_set_m_type ( struct ast_udptl udptl,
unsigned int  pt 
)
void ast_udptl_set_peer ( struct ast_udptl udptl,
const struct ast_sockaddr them 
)

Definition at line 1018 of file udptl.c.

References ast_sockaddr_copy(), and ast_udptl::them.

Referenced by process_sdp().

01019 {
01020    ast_sockaddr_copy(&udptl->them, them);
01021 }

void ast_udptl_set_tag ( struct ast_udptl udptl,
const char *  format,
  ... 
)

Associates a character string 'tag' with a UDPTL session.

Parameters:
udptl The UDPTL session.
format printf-style format string used to construct the tag

This function formats a tag for the specified UDPTL session, so that any log messages generated by the UDPTL stack related to that session will include the tag and the reader of the messages will be able to identify which endpoint caused them to be generated.

Return values:
none 

Definition at line 1000 of file udptl.c.

References ast_free, ast_vasprintf, and ast_udptl::tag.

Referenced by change_t38_state().

01001 {
01002    va_list ap;
01003 
01004    ast_free(udptl->tag);
01005    udptl->tag = NULL;
01006    va_start(ap, format);
01007    if (ast_vasprintf(&udptl->tag, format, ap) == -1) {
01008       udptl->tag = NULL;
01009    }
01010    va_end(ap);
01011 }

void ast_udptl_set_udptlmap_type ( struct ast_udptl udptl,
unsigned int  pt,
char *  mimeType,
char *  mimeSubtype 
)
void ast_udptl_setnat ( struct ast_udptl udptl,
int  nat 
)

Definition at line 652 of file udptl.c.

References ast_udptl::nat.

Referenced by do_setnat(), and initialize_udptl().

00653 {
00654    udptl->nat = nat;
00655 }

int ast_udptl_setqos ( struct ast_udptl udptl,
unsigned int  tos,
unsigned int  cos 
)

Definition at line 1013 of file udptl.c.

References ast_netsock_set_qos(), and ast_udptl::fd.

Referenced by initialize_udptl().

01014 {
01015    return ast_netsock_set_qos(udptl->fd, tos, cos, "UDPTL");
01016 }

void ast_udptl_stop ( struct ast_udptl udptl  ) 

Definition at line 1033 of file udptl.c.

References ast_sockaddr_setnull(), and ast_udptl::them.

Referenced by process_sdp(), and stop_media_flows().

01034 {
01035    ast_sockaddr_setnull(&udptl->them);
01036 }

int ast_udptl_write ( struct ast_udptl udptl,
struct ast_frame f 
)

Definition at line 1049 of file udptl.c.

References AST_FRAME_MODEM, ast_log(), AST_MODEM_T38, ast_sendto(), ast_sockaddr_isnull(), ast_sockaddr_stringify(), ast_verb, ast_frame_subclass::codec, ast_frame::data, ast_frame::datalen, DEFAULT_FAX_MAX_DATAGRAM, errno, ast_udptl::far_max_datagram, ast_udptl::far_max_ifp, ast_udptl::fd, ast_frame::frametype, len(), LOG_NOTICE, LOG_TAG, LOG_WARNING, ast_frame::ptr, seq, ast_frame::subclass, ast_udptl::them, ast_udptl::tx_seq_no, udptl_build_packet(), and udptl_debug_test_addr().

Referenced by sip_write().

01050 {
01051    unsigned int seq;
01052    unsigned int len = f->datalen;
01053    int res;
01054    /* if no max datagram size is provided, use default value */
01055    const int bufsize = (s->far_max_datagram > 0) ? s->far_max_datagram : DEFAULT_FAX_MAX_DATAGRAM;
01056    uint8_t buf[bufsize];
01057 
01058    memset(buf, 0, sizeof(buf));
01059 
01060    /* If we have no peer, return immediately */
01061    if (ast_sockaddr_isnull(&s->them)) {
01062       return 0;
01063    }
01064 
01065    /* If there is no data length, return immediately */
01066    if (f->datalen == 0)
01067       return 0;
01068    
01069    if ((f->frametype != AST_FRAME_MODEM) ||
01070        (f->subclass.codec != AST_MODEM_T38)) {
01071       ast_log(LOG_WARNING, "UDPTL (%s): UDPTL can only send T.38 data.\n",
01072          LOG_TAG(s));
01073       return -1;
01074    }
01075 
01076    if (len > s->far_max_ifp) {
01077       ast_log(LOG_WARNING,
01078          "UDPTL (%s): UDPTL asked to send %d bytes of IFP when far end only prepared to accept %d bytes; data loss will occur."
01079          "You may need to override the T38FaxMaxDatagram value for this endpoint in the channel driver configuration.\n",
01080          LOG_TAG(s), len, s->far_max_ifp);
01081       len = s->far_max_ifp;
01082    }
01083 
01084    /* Save seq_no for debug output because udptl_build_packet increments it */
01085    seq = s->tx_seq_no & 0xFFFF;
01086 
01087    /* Cook up the UDPTL packet, with the relevant EC info. */
01088    len = udptl_build_packet(s, buf, sizeof(buf), f->data.ptr, len);
01089 
01090    if ((signed int) len > 0 && !ast_sockaddr_isnull(&s->them)) {
01091       if ((res = ast_sendto(s->fd, buf, len, 0, &s->them)) < 0)
01092          ast_log(LOG_NOTICE, "UDPTL (%s): Transmission error to %s: %s\n",
01093             LOG_TAG(s), ast_sockaddr_stringify(&s->them), strerror(errno));
01094       if (udptl_debug_test_addr(&s->them))
01095          ast_verb(1, "UDPTL (%s): packet to %s (seq %d, len %d)\n",
01096             LOG_TAG(s), ast_sockaddr_stringify(&s->them), seq, len);
01097    }
01098       
01099    return 0;
01100 }


Generated on 20 Aug 2013 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1