Mon Jun 27 16:51:21 2011

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

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

void ast_udptl_destroy ( struct ast_udptl udptl  ) 

Definition at line 1022 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(), and create_addr_from_peer().

01023 {
01024    if (udptl->ioid)
01025       ast_io_remove(udptl->io, udptl->ioid);
01026    if (udptl->fd > -1)
01027       close(udptl->fd);
01028    if (udptl->tag)
01029       ast_free(udptl->tag);
01030    ast_free(udptl);
01031 }

int ast_udptl_fd ( const struct ast_udptl udptl  ) 

Definition at line 630 of file udptl.c.

References ast_udptl::fd.

Referenced by __oh323_new(), and sip_new().

00631 {
00632    return udptl->fd;
00633 }

enum ast_t38_ec_modes ast_udptl_get_error_correction_scheme ( const struct ast_udptl udptl  ) 

Definition at line 817 of file udptl.c.

References ast_udptl::error_correction_scheme.

Referenced by add_sdp().

00818 {
00819    return udptl->error_correction_scheme;
00820 }

unsigned int ast_udptl_get_far_max_datagram ( const struct ast_udptl udptl  ) 

Definition at line 885 of file udptl.c.

References ast_udptl::far_max_datagram.

Referenced by process_sdp().

00886 {
00887    if (udptl->far_max_datagram < 0) {
00888       return 0;
00889    }
00890    return udptl->far_max_datagram;
00891 }

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

References calculate_far_max_ifp(), and ast_udptl::far_max_ifp.

Referenced by change_t38_state(), and interpret_t38_parameters().

00894 {
00895    if (udptl->far_max_ifp == -1) {
00896       calculate_far_max_ifp(udptl);
00897    }
00898 
00899    if (udptl->far_max_ifp < 0) {
00900       return 0;
00901    }
00902    return udptl->far_max_ifp;
00903 }

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

References calculate_local_max_datagram(), and ast_udptl::local_max_datagram.

Referenced by add_sdp().

00862 {
00863    if (udptl->local_max_datagram == -1) {
00864       calculate_local_max_datagram(udptl);
00865    }
00866 
00867    /* this function expects a unsigned value in return. */
00868    if (udptl->local_max_datagram < 0) {
00869       return 0;
00870    }
00871    return udptl->local_max_datagram;
00872 }

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

Definition at line 1007 of file udptl.c.

References ast_sockaddr_copy(), and ast_udptl::them.

Referenced by ast_udptl_bridge(), and sip_set_udptl_peer().

01008 {
01009    ast_sockaddr_copy(them, &udptl->them);
01010 }

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

Definition at line 1012 of file udptl.c.

References ast_sockaddr_copy(), and ast_udptl::us.

Referenced by add_sdp().

01013 {
01014    ast_sockaddr_copy(us, &udptl->us);
01015 }

void ast_udptl_init ( void   ) 

Definition at line 1405 of file udptl.c.

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

Referenced by main().

01406 {
01407    ast_cli_register_multiple(cli_udptl, ARRAY_LEN(cli_udptl));
01408    __ast_udptl_reload(0);
01409 }

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 905 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 create_addr_from_peer(), handle_request_invite(), and sip_alloc().

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

int ast_udptl_proto_register ( struct ast_udptl_protocol proto  ) 

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

01094 {
01095    struct ast_udptl_protocol *cur;
01096 
01097    AST_RWLIST_WRLOCK(&protos);
01098    AST_RWLIST_TRAVERSE(&protos, cur, list) {
01099       if (cur->type == proto->type) {
01100          ast_log(LOG_WARNING, "Tried to register same protocol '%s' twice\n", cur->type);
01101          AST_RWLIST_UNLOCK(&protos);
01102          return -1;
01103       }
01104    }
01105    AST_RWLIST_INSERT_TAIL(&protos, proto, list);
01106    AST_RWLIST_UNLOCK(&protos);
01107    return 0;
01108 }

void ast_udptl_proto_unregister ( struct ast_udptl_protocol proto  ) 

Definition at line 1086 of file udptl.c.

References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.

Referenced by unload_module().

01087 {
01088    AST_RWLIST_WRLOCK(&protos);
01089    AST_RWLIST_REMOVE(&protos, proto, list);
01090    AST_RWLIST_UNLOCK(&protos);
01091 }

struct ast_frame* ast_udptl_read ( struct ast_udptl udptl  ) 

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

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

int ast_udptl_reload ( void   ) 

Version:
1.6.1 return changed to int

Definition at line 1399 of file udptl.c.

References __ast_udptl_reload().

01400 {
01401    __ast_udptl_reload(1);
01402    return 0;
01403 }

void ast_udptl_reset ( struct ast_udptl udptl  ) 

void ast_udptl_set_callback ( struct ast_udptl udptl,
ast_udptl_callback  callback 
)

Definition at line 640 of file udptl.c.

References ast_udptl::callback.

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

void ast_udptl_set_data ( struct ast_udptl udptl,
void *  data 
)

Definition at line 635 of file udptl.c.

References ast_udptl::data.

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

void ast_udptl_set_error_correction_scheme ( struct ast_udptl udptl,
enum ast_t38_ec_modes  ec 
)

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

00823 {
00824    udptl->error_correction_scheme = ec;
00825    switch (ec) {
00826    case UDPTL_ERROR_CORRECTION_FEC:
00827       udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_FEC;
00828       if (udptl->error_correction_entries == 0) {
00829          udptl->error_correction_entries = 3;
00830       }
00831       if (udptl->error_correction_span == 0) {
00832          udptl->error_correction_span = 3;
00833       }
00834       break;
00835    case UDPTL_ERROR_CORRECTION_REDUNDANCY:
00836       udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_REDUNDANCY;
00837       if (udptl->error_correction_entries == 0) {
00838          udptl->error_correction_entries = 3;
00839       }
00840       break;
00841    default:
00842       /* nothing to do */
00843       break;
00844    };
00845    /* reset calculated values so they'll be computed again */
00846    udptl->local_max_datagram = -1;
00847    udptl->far_max_ifp = -1;
00848 }

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

00875 {
00876    if (!max_datagram || (max_datagram > FAX_MAX_DATAGRAM_LIMIT)) {
00877       udptl->far_max_datagram = DEFAULT_FAX_MAX_DATAGRAM;
00878    } else {
00879       udptl->far_max_datagram = max_datagram;
00880    }
00881    /* reset calculated values so they'll be computed again */
00882    udptl->far_max_ifp = -1;
00883 }

void ast_udptl_set_local_max_ifp ( struct ast_udptl udptl,
unsigned int  max_ifp 
)

Definition at line 850 of file udptl.c.

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

Referenced by interpret_t38_parameters().

00851 {
00852    /* make sure max_ifp is a positive value since a cast will take place when
00853     * when setting local_max_ifp */
00854    if ((signed int) max_ifp > 0) {
00855       udptl->local_max_ifp = max_ifp;
00856       /* reset calculated values so they'll be computed again */
00857       udptl->local_max_datagram = -1;
00858    }
00859 }

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

References ast_sockaddr_copy(), and ast_udptl::them.

Referenced by process_sdp().

01003 {
01004    ast_sockaddr_copy(&udptl->them, them);
01005 }

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

References ast_free, ast_vasprintf, and ast_udptl::tag.

Referenced by change_t38_state().

00983 {
00984    va_list ap;
00985 
00986    if (udptl->tag) {
00987       ast_free(udptl->tag);
00988       udptl->tag = NULL;
00989    }
00990    va_start(ap, format);
00991    if (ast_vasprintf(&udptl->tag, format, ap) == -1) {
00992       udptl->tag = NULL;
00993    }
00994    va_end(ap);
00995 }

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

References ast_udptl::nat.

Referenced by do_setnat().

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

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

Definition at line 997 of file udptl.c.

References ast_netsock_set_qos(), and ast_udptl::fd.

Referenced by sip_alloc().

00998 {
00999    return ast_netsock_set_qos(udptl->fd, tos, cos, "UDPTL");
01000 }

void ast_udptl_stop ( struct ast_udptl udptl  ) 

Definition at line 1017 of file udptl.c.

References ast_sockaddr_setnull(), and ast_udptl::them.

Referenced by process_sdp(), and stop_media_flows().

01018 {
01019    ast_sockaddr_setnull(&udptl->them);
01020 }

int ast_udptl_write ( struct ast_udptl udptl,
struct ast_frame f 
)

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

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


Generated on Mon Jun 27 16:51:22 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7