Fri Feb 10 06:37:42 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"

Include dependency graph for udptl.h:

This graph shows which files directly or indirectly include this file:

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

References ast_channel_lock, ast_channel_name(), 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.

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

void ast_udptl_destroy ( struct ast_udptl udptl  ) 

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

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

int ast_udptl_fd ( const struct ast_udptl udptl  ) 

Definition at line 632 of file udptl.c.

References ast_udptl::fd.

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

00633 {
00634    return udptl->fd;
00635 }

enum ast_t38_ec_modes ast_udptl_get_error_correction_scheme ( const struct ast_udptl udptl  ) 

Definition at line 830 of file udptl.c.

References ast_udptl::error_correction_scheme.

Referenced by add_sdp().

00831 {
00832    return udptl->error_correction_scheme;
00833 }

unsigned int ast_udptl_get_far_max_datagram ( const struct ast_udptl udptl  ) 

Definition at line 898 of file udptl.c.

References ast_udptl::far_max_datagram.

Referenced by process_sdp().

00899 {
00900    if (udptl->far_max_datagram < 0) {
00901       return 0;
00902    }
00903    return udptl->far_max_datagram;
00904 }

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

References calculate_far_max_ifp(), and ast_udptl::far_max_ifp.

Referenced by change_t38_state(), and interpret_t38_parameters().

00907 {
00908    if (udptl->far_max_ifp == -1) {
00909       calculate_far_max_ifp(udptl);
00910    }
00911 
00912    if (udptl->far_max_ifp < 0) {
00913       return 0;
00914    }
00915    return udptl->far_max_ifp;
00916 }

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

References calculate_local_max_datagram(), and ast_udptl::local_max_datagram.

Referenced by add_sdp().

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

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

Definition at line 1018 of file udptl.c.

References ast_sockaddr_copy(), and ast_udptl::them.

Referenced by ast_udptl_bridge(), and sip_set_udptl_peer().

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

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

Definition at line 1023 of file udptl.c.

References ast_sockaddr_copy(), and ast_udptl::us.

Referenced by add_sdp().

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

void ast_udptl_init ( void   ) 

Definition at line 1417 of file udptl.c.

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

Referenced by main().

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

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

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

int ast_udptl_proto_register ( struct ast_udptl_protocol proto  ) 

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

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

void ast_udptl_proto_unregister ( struct ast_udptl_protocol proto  ) 

Definition at line 1098 of file udptl.c.

References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.

Referenced by unload_module().

01099 {
01100    AST_RWLIST_WRLOCK(&protos);
01101    AST_RWLIST_REMOVE(&protos, proto, list);
01102    AST_RWLIST_UNLOCK(&protos);
01103 }

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

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

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

int ast_udptl_reload ( void   ) 

Version:
1.6.1 return changed to int

Definition at line 1411 of file udptl.c.

References __ast_udptl_reload().

01412 {
01413    __ast_udptl_reload(1);
01414    return 0;
01415 }

void ast_udptl_reset ( struct ast_udptl udptl  ) 

void ast_udptl_set_callback ( struct ast_udptl udptl,
ast_udptl_callback  callback 
)

Definition at line 642 of file udptl.c.

References ast_udptl::callback.

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

void ast_udptl_set_data ( struct ast_udptl udptl,
void *  data 
)

Definition at line 637 of file udptl.c.

References ast_udptl::data.

00638 {
00639    udptl->data = data;
00640 }

void ast_udptl_set_error_correction_scheme ( struct ast_udptl udptl,
enum ast_t38_ec_modes  ec 
)

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

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

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

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

void ast_udptl_set_local_max_ifp ( struct ast_udptl udptl,
unsigned int  max_ifp 
)

Definition at line 863 of file udptl.c.

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

Referenced by interpret_t38_parameters().

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

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

References ast_sockaddr_copy(), and ast_udptl::them.

Referenced by process_sdp().

01014 {
01015    ast_sockaddr_copy(&udptl->them, them);
01016 }

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

References ast_free, ast_vasprintf, and ast_udptl::tag.

Referenced by change_t38_state().

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

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

References ast_udptl::nat.

Referenced by do_setnat(), and initialize_udptl().

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

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

Definition at line 1008 of file udptl.c.

References ast_netsock_set_qos(), and ast_udptl::fd.

Referenced by initialize_udptl().

01009 {
01010    return ast_netsock_set_qos(udptl->fd, tos, cos, "UDPTL");
01011 }

void ast_udptl_stop ( struct ast_udptl udptl  ) 

Definition at line 1028 of file udptl.c.

References ast_sockaddr_setnull(), and ast_udptl::them.

Referenced by process_sdp(), and stop_media_flows().

01029 {
01030    ast_sockaddr_setnull(&udptl->them);
01031 }

int ast_udptl_write ( struct ast_udptl udptl,
struct ast_frame f 
)

Definition at line 1044 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::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, ast_frame_subclass::integer, 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().

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


Generated on Fri Feb 10 06:37:42 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.5.6