Mon Oct 8 12:39:30 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 1135 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.

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

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

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

Referenced by main().

01417 {
01418    ast_cli_register_multiple(cli_udptl, ARRAY_LEN(cli_udptl));
01419    __ast_udptl_reload(0);
01420 }

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

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

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

void ast_udptl_proto_unregister ( struct ast_udptl_protocol proto  ) 

Definition at line 1097 of file udptl.c.

References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.

Referenced by unload_module().

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

struct ast_frame* ast_udptl_read ( struct ast_udptl udptl  ) 

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

References __ast_udptl_reload().

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

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

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


Generated on Mon Oct 8 12:39:30 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7