Sat Mar 10 01:55:49 2012

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)
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)
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

enum ast_t38_ec_modes

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 1132 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, get_proto(), ast_udptl_protocol::get_udptl_info, LOG_WARNING, ast_channel::masq, ast_channel::masqr, ast_channel::name, ast_udptl_protocol::set_udptl_peer, t1, and ast_channel::tech_pvt.

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

void ast_udptl_destroy ( struct ast_udptl udptl  ) 

Definition at line 1030 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().

01031 {
01032    if (udptl->ioid)
01033       ast_io_remove(udptl->io, udptl->ioid);
01034    if (udptl->fd > -1)
01035       close(udptl->fd);
01036    if (udptl->tag)
01037       ast_free(udptl->tag);
01038    ast_free(udptl);
01039 }

int ast_udptl_fd ( const struct ast_udptl udptl  ) 

Definition at line 629 of file udptl.c.

References ast_udptl::fd.

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

00630 {
00631    return udptl->fd;
00632 }

enum ast_t38_ec_modes ast_udptl_get_error_correction_scheme ( const struct ast_udptl udptl  ) 

Definition at line 827 of file udptl.c.

References ast_udptl::error_correction_scheme.

Referenced by add_sdp().

00828 {
00829    return udptl->error_correction_scheme;
00830 }

unsigned int ast_udptl_get_far_max_datagram ( const struct ast_udptl udptl  ) 

Definition at line 895 of file udptl.c.

References ast_udptl::far_max_datagram.

Referenced by process_sdp().

00896 {
00897    if (udptl->far_max_datagram < 0) {
00898       return 0;
00899    }
00900    return udptl->far_max_datagram;
00901 }

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 903 of file udptl.c.

References calculate_far_max_ifp(), and ast_udptl::far_max_ifp.

Referenced by change_t38_state(), and interpret_t38_parameters().

00904 {
00905    if (udptl->far_max_ifp == -1) {
00906       calculate_far_max_ifp(udptl);
00907    }
00908 
00909    if (udptl->far_max_ifp < 0) {
00910       return 0;
00911    }
00912    return udptl->far_max_ifp;
00913 }

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 871 of file udptl.c.

References calculate_local_max_datagram(), and ast_udptl::local_max_datagram.

Referenced by add_sdp().

00872 {
00873    if (udptl->local_max_datagram == -1) {
00874       calculate_local_max_datagram(udptl);
00875    }
00876 
00877    /* this function expects a unsigned value in return. */
00878    if (udptl->local_max_datagram < 0) {
00879       return 0;
00880    }
00881    return udptl->local_max_datagram;
00882 }

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

Definition at line 1015 of file udptl.c.

References ast_sockaddr_copy(), and ast_udptl::them.

Referenced by ast_udptl_bridge(), and sip_set_udptl_peer().

01016 {
01017    ast_sockaddr_copy(them, &udptl->them);
01018 }

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

Definition at line 1020 of file udptl.c.

References ast_sockaddr_copy(), and ast_udptl::us.

Referenced by add_sdp().

01021 {
01022    ast_sockaddr_copy(us, &udptl->us);
01023 }

void ast_udptl_init ( void   ) 

Definition at line 1413 of file udptl.c.

References __ast_udptl_reload(), ARRAY_LEN, ast_cli_register_multiple(), and cli_udptl.

Referenced by main().

01414 {
01415    ast_cli_register_multiple(cli_udptl, ARRAY_LEN(cli_udptl));
01416    __ast_udptl_reload(0);
01417 }

struct ast_udptl* ast_udptl_new_with_bindaddr ( struct sched_context sched,
struct io_context io,
int  callbackmode,
struct ast_sockaddr in 
)

Definition at line 915 of file udptl.c.

References ast_bind(), ast_calloc, ast_free, ast_log(), ast_random(), ast_sockaddr_copy(), ast_sockaddr_is_ipv6(), ast_sockaddr_set_port, errno, ast_udptl::flags, and LOG_WARNING.

Referenced by initialize_udptl().

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

int ast_udptl_proto_register ( struct ast_udptl_protocol proto  ) 

Definition at line 1101 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().

01102 {
01103    struct ast_udptl_protocol *cur;
01104 
01105    AST_RWLIST_WRLOCK(&protos);
01106    AST_RWLIST_TRAVERSE(&protos, cur, list) {
01107       if (cur->type == proto->type) {
01108          ast_log(LOG_WARNING, "Tried to register same protocol '%s' twice\n", cur->type);
01109          AST_RWLIST_UNLOCK(&protos);
01110          return -1;
01111       }
01112    }
01113    AST_RWLIST_INSERT_TAIL(&protos, proto, list);
01114    AST_RWLIST_UNLOCK(&protos);
01115    return 0;
01116 }

void ast_udptl_proto_unregister ( struct ast_udptl_protocol proto  ) 

Definition at line 1094 of file udptl.c.

References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.

Referenced by unload_module().

01095 {
01096    AST_RWLIST_WRLOCK(&protos);
01097    AST_RWLIST_REMOVE(&protos, proto, list);
01098    AST_RWLIST_UNLOCK(&protos);
01099 }

struct ast_frame* ast_udptl_read ( struct ast_udptl udptl  ) 

Definition at line 661 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().

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

int ast_udptl_reload ( void   ) 

Version:
1.6.1 return changed to int

Definition at line 1407 of file udptl.c.

References __ast_udptl_reload().

01408 {
01409    __ast_udptl_reload(1);
01410    return 0;
01411 }

void ast_udptl_reset ( struct ast_udptl udptl  ) 

void ast_udptl_set_callback ( struct ast_udptl udptl,
ast_udptl_callback  callback 
)

Definition at line 639 of file udptl.c.

References ast_udptl::callback.

00640 {
00641    udptl->callback = callback;
00642 }

void ast_udptl_set_data ( struct ast_udptl udptl,
void *  data 
)

Definition at line 634 of file udptl.c.

References ast_udptl::data.

00635 {
00636    udptl->data = data;
00637 }

void ast_udptl_set_error_correction_scheme ( struct ast_udptl udptl,
enum ast_t38_ec_modes  ec 
)

Definition at line 832 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().

00833 {
00834    udptl->error_correction_scheme = ec;
00835    switch (ec) {
00836    case UDPTL_ERROR_CORRECTION_FEC:
00837       udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_FEC;
00838       if (udptl->error_correction_entries == 0) {
00839          udptl->error_correction_entries = 3;
00840       }
00841       if (udptl->error_correction_span == 0) {
00842          udptl->error_correction_span = 3;
00843       }
00844       break;
00845    case UDPTL_ERROR_CORRECTION_REDUNDANCY:
00846       udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_REDUNDANCY;
00847       if (udptl->error_correction_entries == 0) {
00848          udptl->error_correction_entries = 3;
00849       }
00850       break;
00851    default:
00852       /* nothing to do */
00853       break;
00854    };
00855    /* reset calculated values so they'll be computed again */
00856    udptl->local_max_datagram = -1;
00857    udptl->far_max_ifp = -1;
00858 }

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 884 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().

00885 {
00886    if (!max_datagram || (max_datagram > FAX_MAX_DATAGRAM_LIMIT)) {
00887       udptl->far_max_datagram = DEFAULT_FAX_MAX_DATAGRAM;
00888    } else {
00889       udptl->far_max_datagram = max_datagram;
00890    }
00891    /* reset calculated values so they'll be computed again */
00892    udptl->far_max_ifp = -1;
00893 }

void ast_udptl_set_local_max_ifp ( struct ast_udptl udptl,
unsigned int  max_ifp 
)

Definition at line 860 of file udptl.c.

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

Referenced by interpret_t38_parameters().

00861 {
00862    /* make sure max_ifp is a positive value since a cast will take place when
00863     * when setting local_max_ifp */
00864    if ((signed int) max_ifp > 0) {
00865       udptl->local_max_ifp = max_ifp;
00866       /* reset calculated values so they'll be computed again */
00867       udptl->local_max_datagram = -1;
00868    }
00869 }

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 1010 of file udptl.c.

References ast_sockaddr_copy(), and ast_udptl::them.

Referenced by process_sdp().

01011 {
01012    ast_sockaddr_copy(&udptl->them, them);
01013 }

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 992 of file udptl.c.

References ast_free, ast_vasprintf, and ast_udptl::tag.

Referenced by change_t38_state().

00993 {
00994    va_list ap;
00995 
00996    ast_free(udptl->tag);
00997    udptl->tag = NULL;
00998    va_start(ap, format);
00999    if (ast_vasprintf(&udptl->tag, format, ap) == -1) {
01000       udptl->tag = NULL;
01001    }
01002    va_end(ap);
01003 }

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 644 of file udptl.c.

References ast_udptl::nat.

Referenced by do_setnat(), and initialize_udptl().

00645 {
00646    udptl->nat = nat;
00647 }

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

Definition at line 1005 of file udptl.c.

References ast_netsock_set_qos(), and ast_udptl::fd.

Referenced by initialize_udptl().

01006 {
01007    return ast_netsock_set_qos(udptl->fd, tos, cos, "UDPTL");
01008 }

void ast_udptl_stop ( struct ast_udptl udptl  ) 

Definition at line 1025 of file udptl.c.

References ast_sockaddr_setnull(), and ast_udptl::them.

Referenced by process_sdp(), and stop_media_flows().

01026 {
01027    ast_sockaddr_setnull(&udptl->them);
01028 }

int ast_udptl_write ( struct ast_udptl udptl,
struct ast_frame f 
)

Definition at line 1041 of file udptl.c.

References AST_FRAME_MODEM, ast_log(), AST_MODEM_T38, ast_sendto(), ast_sockaddr_isnull(), ast_sockaddr_stringify(), ast_verb, DEFAULT_FAX_MAX_DATAGRAM, errno, f, ast_udptl::far_max_datagram, ast_udptl::far_max_ifp, ast_udptl::fd, len(), LOG_NOTICE, LOG_TAG, LOG_WARNING, seq, ast_udptl::them, ast_udptl::tx_seq_no, udptl_build_packet(), and udptl_debug_test_addr().

Referenced by sip_write().

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


Generated on Sat Mar 10 01:55:49 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7