UDPTL support for T.38. More...
#include "asterisk/network.h"
#include "asterisk/frame.h"
#include "asterisk/io.h"
#include "asterisk/sched.h"
#include "asterisk/channel.h"
#include "asterisk/netsock2.h"
Go to the source code of this file.
Data Structures | |
struct | ast_udptl_protocol |
Typedefs | |
typedef int(* | ast_udptl_callback )(struct ast_udptl *udptl, struct ast_frame *f, void *data) |
Enumerations | |
enum | ast_t38_ec_modes { UDPTL_ERROR_CORRECTION_NONE, UDPTL_ERROR_CORRECTION_FEC, UDPTL_ERROR_CORRECTION_REDUNDANCY } |
Functions | |
int | ast_udptl_bridge (struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc) |
void | ast_udptl_destroy (struct ast_udptl *udptl) |
int | ast_udptl_fd (const struct ast_udptl *udptl) |
enum ast_t38_ec_modes | ast_udptl_get_error_correction_scheme (const struct ast_udptl *udptl) |
unsigned int | ast_udptl_get_far_max_datagram (const struct ast_udptl *udptl) |
unsigned int | ast_udptl_get_far_max_ifp (struct ast_udptl *udptl) |
retrieves far max ifp | |
unsigned int | ast_udptl_get_local_max_datagram (struct ast_udptl *udptl) |
retrieves local_max_datagram. | |
void | ast_udptl_get_peer (const struct ast_udptl *udptl, struct ast_sockaddr *them) |
void | ast_udptl_get_us (const struct ast_udptl *udptl, struct ast_sockaddr *us) |
void | ast_udptl_init (void) |
struct ast_udptl * | ast_udptl_new_with_bindaddr (struct sched_context *sched, struct io_context *io, int callbackmode, struct ast_sockaddr *in) |
int | ast_udptl_proto_register (struct ast_udptl_protocol *proto) |
void | ast_udptl_proto_unregister (struct ast_udptl_protocol *proto) |
struct ast_frame * | ast_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) |
UDPTL support for T.38.
Definition in file udptl.h.
typedef int(* ast_udptl_callback)(struct ast_udptl *udptl, struct ast_frame *f, void *data) |
enum ast_t38_ec_modes |
UDPTL_ERROR_CORRECTION_NONE | |
UDPTL_ERROR_CORRECTION_FEC | |
UDPTL_ERROR_CORRECTION_REDUNDANCY |
Definition at line 37 of file udptl.h.
00037 { 00038 UDPTL_ERROR_CORRECTION_NONE, 00039 UDPTL_ERROR_CORRECTION_FEC, 00040 UDPTL_ERROR_CORRECTION_REDUNDANCY 00041 };
int ast_udptl_bridge | ( | struct ast_channel * | c0, | |
struct ast_channel * | c1, | |||
int | flags, | |||
struct ast_frame ** | fo, | |||
struct ast_channel ** | rc | |||
) |
Definition at line 1140 of file udptl.c.
References ast_channel_lock, ast_channel_trylock, ast_channel_unlock, ast_check_hangup(), ast_debug, AST_FRAME_MODEM, ast_frfree, ast_log(), ast_read(), ast_sockaddr_cmp(), ast_sockaddr_copy(), ast_sockaddr_stringify(), ast_udptl_get_peer(), ast_waitfor_n(), ast_write(), f, ast_frame::frametype, get_proto(), ast_udptl_protocol::get_udptl_info, LOG_WARNING, ast_channel::masq, ast_channel::masqr, ast_udptl_protocol::set_udptl_peer, and ast_channel::tech_pvt.
01141 { 01142 struct ast_frame *f; 01143 struct ast_channel *who; 01144 struct ast_channel *cs[3]; 01145 struct ast_udptl *p0; 01146 struct ast_udptl *p1; 01147 struct ast_udptl_protocol *pr0; 01148 struct ast_udptl_protocol *pr1; 01149 struct ast_sockaddr ac0; 01150 struct ast_sockaddr ac1; 01151 struct ast_sockaddr t0; 01152 struct ast_sockaddr t1; 01153 void *pvt0; 01154 void *pvt1; 01155 int to; 01156 01157 ast_channel_lock(c0); 01158 while (ast_channel_trylock(c1)) { 01159 ast_channel_unlock(c0); 01160 usleep(1); 01161 ast_channel_lock(c0); 01162 } 01163 pr0 = get_proto(c0); 01164 pr1 = get_proto(c1); 01165 if (!pr0) { 01166 ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c0->name); 01167 ast_channel_unlock(c0); 01168 ast_channel_unlock(c1); 01169 return -1; 01170 } 01171 if (!pr1) { 01172 ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c1->name); 01173 ast_channel_unlock(c0); 01174 ast_channel_unlock(c1); 01175 return -1; 01176 } 01177 pvt0 = c0->tech_pvt; 01178 pvt1 = c1->tech_pvt; 01179 p0 = pr0->get_udptl_info(c0); 01180 p1 = pr1->get_udptl_info(c1); 01181 if (!p0 || !p1) { 01182 /* Somebody doesn't want to play... */ 01183 ast_channel_unlock(c0); 01184 ast_channel_unlock(c1); 01185 return -2; 01186 } 01187 if (pr0->set_udptl_peer(c0, p1)) { 01188 ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c0->name, c1->name); 01189 memset(&ac1, 0, sizeof(ac1)); 01190 } else { 01191 /* Store UDPTL peer */ 01192 ast_udptl_get_peer(p1, &ac1); 01193 } 01194 if (pr1->set_udptl_peer(c1, p0)) { 01195 ast_log(LOG_WARNING, "Channel '%s' failed to talk back to '%s'\n", c1->name, c0->name); 01196 memset(&ac0, 0, sizeof(ac0)); 01197 } else { 01198 /* Store UDPTL peer */ 01199 ast_udptl_get_peer(p0, &ac0); 01200 } 01201 ast_channel_unlock(c0); 01202 ast_channel_unlock(c1); 01203 cs[0] = c0; 01204 cs[1] = c1; 01205 cs[2] = NULL; 01206 for (;;) { 01207 if ((c0->tech_pvt != pvt0) || 01208 (c1->tech_pvt != pvt1) || 01209 (c0->masq || c0->masqr || c1->masq || c1->masqr)) { 01210 ast_debug(1, "Oooh, something is weird, backing out\n"); 01211 /* Tell it to try again later */ 01212 return -3; 01213 } 01214 to = -1; 01215 ast_udptl_get_peer(p1, &t1); 01216 ast_udptl_get_peer(p0, &t0); 01217 if (ast_sockaddr_cmp(&t1, &ac1)) { 01218 ast_debug(1, "Oooh, '%s' changed end address to %s\n", 01219 c1->name, ast_sockaddr_stringify(&t1)); 01220 ast_debug(1, "Oooh, '%s' was %s\n", 01221 c1->name, ast_sockaddr_stringify(&ac1)); 01222 ast_sockaddr_copy(&ac1, &t1); 01223 } 01224 if (ast_sockaddr_cmp(&t0, &ac0)) { 01225 ast_debug(1, "Oooh, '%s' changed end address to %s\n", 01226 c0->name, ast_sockaddr_stringify(&t0)); 01227 ast_debug(1, "Oooh, '%s' was %s\n", 01228 c0->name, ast_sockaddr_stringify(&ac0)); 01229 ast_sockaddr_copy(&ac0, &t0); 01230 } 01231 who = ast_waitfor_n(cs, 2, &to); 01232 if (!who) { 01233 ast_debug(1, "Ooh, empty read...\n"); 01234 /* check for hangup / whentohangup */ 01235 if (ast_check_hangup(c0) || ast_check_hangup(c1)) 01236 break; 01237 continue; 01238 } 01239 f = ast_read(who); 01240 if (!f) { 01241 *fo = f; 01242 *rc = who; 01243 ast_debug(1, "Oooh, got a %s\n", f ? "digit" : "hangup"); 01244 /* That's all we needed */ 01245 return 0; 01246 } else { 01247 if (f->frametype == AST_FRAME_MODEM) { 01248 /* Forward T.38 frames if they happen upon us */ 01249 if (who == c0) { 01250 ast_write(c1, f); 01251 } else if (who == c1) { 01252 ast_write(c0, f); 01253 } 01254 } 01255 ast_frfree(f); 01256 } 01257 /* Swap priority. Not that it's a big deal at this point */ 01258 cs[2] = cs[0]; 01259 cs[0] = cs[1]; 01260 cs[1] = cs[2]; 01261 } 01262 return -1; 01263 }
void ast_udptl_destroy | ( | struct ast_udptl * | udptl | ) |
Definition at line 1038 of file udptl.c.
References ast_free, ast_io_remove(), ast_udptl::fd, ast_udptl::io, ast_udptl::ioid, and ast_udptl::tag.
Referenced by __sip_destroy().
int ast_udptl_fd | ( | const struct ast_udptl * | udptl | ) |
Definition at line 637 of file udptl.c.
References ast_udptl::fd.
Referenced by __oh323_new(), initialize_udptl(), and sip_new().
00638 { 00639 return udptl->fd; 00640 }
enum ast_t38_ec_modes ast_udptl_get_error_correction_scheme | ( | const struct ast_udptl * | udptl | ) |
Definition at line 835 of file udptl.c.
References ast_udptl::error_correction_scheme.
Referenced by add_sdp().
00836 { 00837 return udptl->error_correction_scheme; 00838 }
unsigned int ast_udptl_get_far_max_datagram | ( | const struct ast_udptl * | udptl | ) |
Definition at line 903 of file udptl.c.
References ast_udptl::far_max_datagram.
Referenced by process_sdp().
00904 { 00905 if (udptl->far_max_datagram < 0) { 00906 return 0; 00907 } 00908 return udptl->far_max_datagram; 00909 }
unsigned int ast_udptl_get_far_max_ifp | ( | struct ast_udptl * | udptl | ) |
retrieves far max ifp
positive | value representing max ifp size | |
0 | if no value is present |
Definition at line 911 of file udptl.c.
References calculate_far_max_ifp(), and ast_udptl::far_max_ifp.
Referenced by change_t38_state(), and interpret_t38_parameters().
00912 { 00913 if (udptl->far_max_ifp == -1) { 00914 calculate_far_max_ifp(udptl); 00915 } 00916 00917 if (udptl->far_max_ifp < 0) { 00918 return 0; 00919 } 00920 return udptl->far_max_ifp; 00921 }
unsigned int ast_udptl_get_local_max_datagram | ( | struct ast_udptl * | udptl | ) |
retrieves local_max_datagram.
positive | value representing max datagram size. | |
0 | if no value is present |
Definition at line 879 of file udptl.c.
References calculate_local_max_datagram(), and ast_udptl::local_max_datagram.
Referenced by add_sdp().
00880 { 00881 if (udptl->local_max_datagram == -1) { 00882 calculate_local_max_datagram(udptl); 00883 } 00884 00885 /* this function expects a unsigned value in return. */ 00886 if (udptl->local_max_datagram < 0) { 00887 return 0; 00888 } 00889 return udptl->local_max_datagram; 00890 }
void ast_udptl_get_peer | ( | const struct ast_udptl * | udptl, | |
struct ast_sockaddr * | them | |||
) |
Definition at line 1023 of file udptl.c.
References ast_sockaddr_copy(), and ast_udptl::them.
Referenced by ast_udptl_bridge(), and sip_set_udptl_peer().
01024 { 01025 ast_sockaddr_copy(them, &udptl->them); 01026 }
void ast_udptl_get_us | ( | const struct ast_udptl * | udptl, | |
struct ast_sockaddr * | us | |||
) |
Definition at line 1028 of file udptl.c.
References ast_sockaddr_copy(), and ast_udptl::us.
Referenced by add_sdp().
01029 { 01030 ast_sockaddr_copy(us, &udptl->us); 01031 }
void ast_udptl_init | ( | void | ) |
Definition at line 1430 of file udptl.c.
References __ast_udptl_reload(), ARRAY_LEN, ast_cli_register_multiple(), ast_register_atexit(), and udptl_shutdown().
Referenced by main().
01431 { 01432 __ast_udptl_reload(0); 01433 01434 ast_cli_register_multiple(cli_udptl, ARRAY_LEN(cli_udptl)); 01435 01436 ast_register_atexit(udptl_shutdown); 01437 }
struct ast_udptl* ast_udptl_new_with_bindaddr | ( | struct sched_context * | sched, | |
struct io_context * | io, | |||
int | callbackmode, | |||
struct ast_sockaddr * | in | |||
) | [read] |
Definition at line 923 of file udptl.c.
References ast_bind(), ast_calloc, ast_free, ast_io_add(), AST_IO_IN, ast_log(), ast_random(), ast_sockaddr_copy(), ast_sockaddr_is_ipv6(), ast_sockaddr_set_port, udptl_fec_tx_buffer_t::buf_len, udptl_fec_rx_buffer_t::buf_len, errno, ast_udptl::error_correction_entries, ast_udptl::error_correction_span, ast_udptl::far_max_datagram, ast_udptl::far_max_ifp, ast_udptl::fd, ast_udptl::flags, ast_udptl::io, ast_udptl::ioid, ast_udptl::local_max_datagram, ast_udptl::local_max_ifp, LOG_WARNING, ast_udptl::rx, ast_udptl::sched, ast_udptl::tx, UDPTL_BUF_MASK, udptlread(), and ast_udptl::us.
Referenced by initialize_udptl().
00924 { 00925 struct ast_udptl *udptl; 00926 int x; 00927 int startplace; 00928 int i; 00929 long int flags; 00930 00931 if (!(udptl = ast_calloc(1, sizeof(*udptl)))) 00932 return NULL; 00933 00934 udptl->error_correction_span = udptlfecspan; 00935 udptl->error_correction_entries = udptlfecentries; 00936 00937 udptl->far_max_datagram = -1; 00938 udptl->far_max_ifp = -1; 00939 udptl->local_max_ifp = -1; 00940 udptl->local_max_datagram = -1; 00941 00942 for (i = 0; i <= UDPTL_BUF_MASK; i++) { 00943 udptl->rx[i].buf_len = -1; 00944 udptl->tx[i].buf_len = -1; 00945 } 00946 00947 if ((udptl->fd = socket(ast_sockaddr_is_ipv6(addr) ? 00948 AF_INET6 : AF_INET, SOCK_DGRAM, 0)) < 0) { 00949 ast_free(udptl); 00950 ast_log(LOG_WARNING, "Unable to allocate socket: %s\n", strerror(errno)); 00951 return NULL; 00952 } 00953 flags = fcntl(udptl->fd, F_GETFL); 00954 fcntl(udptl->fd, F_SETFL, flags | O_NONBLOCK); 00955 #ifdef SO_NO_CHECK 00956 if (nochecksums) 00957 setsockopt(udptl->fd, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums)); 00958 #endif 00959 /* Find us a place */ 00960 x = (udptlstart == udptlend) ? udptlstart : (ast_random() % (udptlend - udptlstart)) + udptlstart; 00961 if (use_even_ports && (x & 1)) { 00962 ++x; 00963 } 00964 startplace = x; 00965 for (;;) { 00966 ast_sockaddr_copy(&udptl->us, addr); 00967 ast_sockaddr_set_port(&udptl->us, x); 00968 if (ast_bind(udptl->fd, &udptl->us) == 0) { 00969 break; 00970 } 00971 if (errno != EADDRINUSE) { 00972 ast_log(LOG_WARNING, "Unexpected bind error: %s\n", strerror(errno)); 00973 close(udptl->fd); 00974 ast_free(udptl); 00975 return NULL; 00976 } 00977 if (use_even_ports) { 00978 x += 2; 00979 } else { 00980 ++x; 00981 } 00982 if (x > udptlend) 00983 x = udptlstart; 00984 if (x == startplace) { 00985 ast_log(LOG_WARNING, "No UDPTL ports remaining\n"); 00986 close(udptl->fd); 00987 ast_free(udptl); 00988 return NULL; 00989 } 00990 } 00991 if (io && sched && callbackmode) { 00992 /* Operate this one in a callback mode */ 00993 udptl->sched = sched; 00994 udptl->io = io; 00995 udptl->ioid = ast_io_add(udptl->io, udptl->fd, udptlread, AST_IO_IN, udptl); 00996 } 00997 return udptl; 00998 }
int ast_udptl_proto_register | ( | struct ast_udptl_protocol * | proto | ) |
Definition at line 1109 of file udptl.c.
References ast_log(), AST_RWLIST_INSERT_TAIL, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_udptl_protocol::list, LOG_WARNING, and ast_udptl_protocol::type.
Referenced by load_module().
01110 { 01111 struct ast_udptl_protocol *cur; 01112 01113 AST_RWLIST_WRLOCK(&protos); 01114 AST_RWLIST_TRAVERSE(&protos, cur, list) { 01115 if (cur->type == proto->type) { 01116 ast_log(LOG_WARNING, "Tried to register same protocol '%s' twice\n", cur->type); 01117 AST_RWLIST_UNLOCK(&protos); 01118 return -1; 01119 } 01120 } 01121 AST_RWLIST_INSERT_TAIL(&protos, proto, list); 01122 AST_RWLIST_UNLOCK(&protos); 01123 return 0; 01124 }
void ast_udptl_proto_unregister | ( | struct ast_udptl_protocol * | proto | ) |
Definition at line 1102 of file udptl.c.
References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.
Referenced by unload_module().
01103 { 01104 AST_RWLIST_WRLOCK(&protos); 01105 AST_RWLIST_REMOVE(&protos, proto, list); 01106 AST_RWLIST_UNLOCK(&protos); 01107 }
Definition at line 669 of file udptl.c.
References ast_assert, ast_debug, AST_FRIENDLY_OFFSET, ast_log(), ast_null_frame, ast_recvfrom(), ast_sockaddr_cmp(), ast_sockaddr_copy(), ast_sockaddr_isnull(), ast_sockaddr_stringify(), ast_verb, errno, ast_udptl::f, ast_udptl::fd, LOG_TAG, LOG_WARNING, ast_udptl::nat, ast_udptl::rawdata, ast_udptl::them, udptl_debug_test_addr(), and udptl_rx_packet().
Referenced by sip_rtp_read(), skinny_rtp_read(), and udptlread().
00670 { 00671 int res; 00672 struct ast_sockaddr addr; 00673 uint8_t *buf; 00674 00675 buf = udptl->rawdata + AST_FRIENDLY_OFFSET; 00676 00677 /* Cache where the header will go */ 00678 res = ast_recvfrom(udptl->fd, 00679 buf, 00680 sizeof(udptl->rawdata) - AST_FRIENDLY_OFFSET, 00681 0, 00682 &addr); 00683 if (res < 0) { 00684 if (errno != EAGAIN) 00685 ast_log(LOG_WARNING, "UDPTL (%s): read error: %s\n", 00686 LOG_TAG(udptl), strerror(errno)); 00687 ast_assert(errno != EBADF); 00688 return &ast_null_frame; 00689 } 00690 00691 /* Ignore if the other side hasn't been given an address yet. */ 00692 if (ast_sockaddr_isnull(&udptl->them)) { 00693 return &ast_null_frame; 00694 } 00695 00696 if (udptl->nat) { 00697 /* Send to whoever sent to us */ 00698 if (ast_sockaddr_cmp(&udptl->them, &addr)) { 00699 ast_sockaddr_copy(&udptl->them, &addr); 00700 ast_debug(1, "UDPTL (%s): NAT, Using address %s\n", 00701 LOG_TAG(udptl), ast_sockaddr_stringify(&udptl->them)); 00702 } 00703 } 00704 00705 if (udptl_debug_test_addr(&addr)) { 00706 int seq_no; 00707 00708 /* Decode sequence number just for verbose message. */ 00709 if (res < 2) { 00710 /* Short packet. */ 00711 seq_no = -1; 00712 } else { 00713 seq_no = (buf[0] << 8) | buf[1]; 00714 } 00715 00716 ast_verb(1, "UDPTL (%s): packet from %s (seq %d, len %d)\n", 00717 LOG_TAG(udptl), ast_sockaddr_stringify(&addr), seq_no, res); 00718 } 00719 if (udptl_rx_packet(udptl, buf, res) < 1) { 00720 return &ast_null_frame; 00721 } 00722 00723 return &udptl->f[0]; 00724 }
int ast_udptl_reload | ( | void | ) |
Definition at line 1415 of file udptl.c.
References __ast_udptl_reload().
01416 { 01417 __ast_udptl_reload(1); 01418 return 0; 01419 }
void ast_udptl_reset | ( | struct ast_udptl * | udptl | ) |
void ast_udptl_set_callback | ( | struct ast_udptl * | udptl, | |
ast_udptl_callback | callback | |||
) |
Definition at line 647 of file udptl.c.
References ast_udptl::callback.
00648 { 00649 udptl->callback = callback; 00650 }
void ast_udptl_set_data | ( | struct ast_udptl * | udptl, | |
void * | data | |||
) |
Definition at line 642 of file udptl.c.
References ast_udptl::data.
00643 { 00644 udptl->data = data; 00645 }
void ast_udptl_set_error_correction_scheme | ( | struct ast_udptl * | udptl, | |
enum ast_t38_ec_modes | ec | |||
) |
Definition at line 840 of file udptl.c.
References ast_udptl::error_correction_entries, ast_udptl::error_correction_scheme, ast_udptl::error_correction_span, ast_udptl::far_max_ifp, ast_udptl::local_max_datagram, UDPTL_ERROR_CORRECTION_FEC, and UDPTL_ERROR_CORRECTION_REDUNDANCY.
Referenced by process_sdp(), process_sdp_a_image(), and set_t38_capabilities().
00841 { 00842 udptl->error_correction_scheme = ec; 00843 switch (ec) { 00844 case UDPTL_ERROR_CORRECTION_FEC: 00845 udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_FEC; 00846 if (udptl->error_correction_entries == 0) { 00847 udptl->error_correction_entries = 3; 00848 } 00849 if (udptl->error_correction_span == 0) { 00850 udptl->error_correction_span = 3; 00851 } 00852 break; 00853 case UDPTL_ERROR_CORRECTION_REDUNDANCY: 00854 udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_REDUNDANCY; 00855 if (udptl->error_correction_entries == 0) { 00856 udptl->error_correction_entries = 3; 00857 } 00858 break; 00859 default: 00860 /* nothing to do */ 00861 break; 00862 }; 00863 /* reset calculated values so they'll be computed again */ 00864 udptl->local_max_datagram = -1; 00865 udptl->far_max_ifp = -1; 00866 }
void ast_udptl_set_far_max_datagram | ( | struct ast_udptl * | udptl, | |
unsigned int | max_datagram | |||
) |
sets far max datagram size. If max_datagram is = 0, the far max datagram size is set to a default value.
Definition at line 892 of file udptl.c.
References DEFAULT_FAX_MAX_DATAGRAM, ast_udptl::far_max_datagram, ast_udptl::far_max_ifp, and FAX_MAX_DATAGRAM_LIMIT.
Referenced by process_sdp(), and process_sdp_a_image().
00893 { 00894 if (!max_datagram || (max_datagram > FAX_MAX_DATAGRAM_LIMIT)) { 00895 udptl->far_max_datagram = DEFAULT_FAX_MAX_DATAGRAM; 00896 } else { 00897 udptl->far_max_datagram = max_datagram; 00898 } 00899 /* reset calculated values so they'll be computed again */ 00900 udptl->far_max_ifp = -1; 00901 }
void ast_udptl_set_local_max_ifp | ( | struct ast_udptl * | udptl, | |
unsigned int | max_ifp | |||
) |
Definition at line 868 of file udptl.c.
References ast_udptl::local_max_datagram, and ast_udptl::local_max_ifp.
Referenced by interpret_t38_parameters().
00869 { 00870 /* make sure max_ifp is a positive value since a cast will take place when 00871 * when setting local_max_ifp */ 00872 if ((signed int) max_ifp > 0) { 00873 udptl->local_max_ifp = max_ifp; 00874 /* reset calculated values so they'll be computed again */ 00875 udptl->local_max_datagram = -1; 00876 } 00877 }
void ast_udptl_set_m_type | ( | struct ast_udptl * | udptl, | |
unsigned int | pt | |||
) |
void ast_udptl_set_peer | ( | struct ast_udptl * | udptl, | |
const struct ast_sockaddr * | them | |||
) |
Definition at line 1018 of file udptl.c.
References ast_sockaddr_copy(), and ast_udptl::them.
Referenced by process_sdp().
01019 { 01020 ast_sockaddr_copy(&udptl->them, them); 01021 }
void ast_udptl_set_tag | ( | struct ast_udptl * | udptl, | |
const char * | format, | |||
... | ||||
) |
Associates a character string 'tag' with a UDPTL session.
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.
none |
Definition at line 1000 of file udptl.c.
References ast_free, ast_vasprintf, and ast_udptl::tag.
Referenced by change_t38_state().
void ast_udptl_set_udptlmap_type | ( | struct ast_udptl * | udptl, | |
unsigned int | pt, | |||
char * | mimeType, | |||
char * | mimeSubtype | |||
) |
void ast_udptl_setnat | ( | struct ast_udptl * | udptl, | |
int | nat | |||
) |
Definition at line 652 of file udptl.c.
References ast_udptl::nat.
Referenced by do_setnat(), and initialize_udptl().
int ast_udptl_setqos | ( | struct ast_udptl * | udptl, | |
unsigned int | tos, | |||
unsigned int | cos | |||
) |
Definition at line 1013 of file udptl.c.
References ast_netsock_set_qos(), and ast_udptl::fd.
Referenced by initialize_udptl().
01014 { 01015 return ast_netsock_set_qos(udptl->fd, tos, cos, "UDPTL"); 01016 }
void ast_udptl_stop | ( | struct ast_udptl * | udptl | ) |
Definition at line 1033 of file udptl.c.
References ast_sockaddr_setnull(), and ast_udptl::them.
Referenced by process_sdp(), and stop_media_flows().
01034 { 01035 ast_sockaddr_setnull(&udptl->them); 01036 }
Definition at line 1049 of file udptl.c.
References AST_FRAME_MODEM, ast_log(), AST_MODEM_T38, ast_sendto(), ast_sockaddr_isnull(), ast_sockaddr_stringify(), ast_verb, ast_frame_subclass::codec, ast_frame::data, ast_frame::datalen, DEFAULT_FAX_MAX_DATAGRAM, errno, ast_udptl::far_max_datagram, ast_udptl::far_max_ifp, ast_udptl::fd, ast_frame::frametype, len(), LOG_NOTICE, LOG_TAG, LOG_WARNING, ast_frame::ptr, seq, ast_frame::subclass, ast_udptl::them, ast_udptl::tx_seq_no, udptl_build_packet(), and udptl_debug_test_addr().
Referenced by sip_write().
01050 { 01051 unsigned int seq; 01052 unsigned int len = f->datalen; 01053 int res; 01054 /* if no max datagram size is provided, use default value */ 01055 const int bufsize = (s->far_max_datagram > 0) ? s->far_max_datagram : DEFAULT_FAX_MAX_DATAGRAM; 01056 uint8_t buf[bufsize]; 01057 01058 memset(buf, 0, sizeof(buf)); 01059 01060 /* If we have no peer, return immediately */ 01061 if (ast_sockaddr_isnull(&s->them)) { 01062 return 0; 01063 } 01064 01065 /* If there is no data length, return immediately */ 01066 if (f->datalen == 0) 01067 return 0; 01068 01069 if ((f->frametype != AST_FRAME_MODEM) || 01070 (f->subclass.codec != AST_MODEM_T38)) { 01071 ast_log(LOG_WARNING, "UDPTL (%s): UDPTL can only send T.38 data.\n", 01072 LOG_TAG(s)); 01073 return -1; 01074 } 01075 01076 if (len > s->far_max_ifp) { 01077 ast_log(LOG_WARNING, 01078 "UDPTL (%s): UDPTL asked to send %d bytes of IFP when far end only prepared to accept %d bytes; data loss will occur." 01079 "You may need to override the T38FaxMaxDatagram value for this endpoint in the channel driver configuration.\n", 01080 LOG_TAG(s), len, s->far_max_ifp); 01081 len = s->far_max_ifp; 01082 } 01083 01084 /* Save seq_no for debug output because udptl_build_packet increments it */ 01085 seq = s->tx_seq_no & 0xFFFF; 01086 01087 /* Cook up the UDPTL packet, with the relevant EC info. */ 01088 len = udptl_build_packet(s, buf, sizeof(buf), f->data.ptr, len); 01089 01090 if ((signed int) len > 0 && !ast_sockaddr_isnull(&s->them)) { 01091 if ((res = ast_sendto(s->fd, buf, len, 0, &s->them)) < 0) 01092 ast_log(LOG_NOTICE, "UDPTL (%s): Transmission error to %s: %s\n", 01093 LOG_TAG(s), ast_sockaddr_stringify(&s->them), strerror(errno)); 01094 if (udptl_debug_test_addr(&s->them)) 01095 ast_verb(1, "UDPTL (%s): packet to %s (seq %d, len %d)\n", 01096 LOG_TAG(s), ast_sockaddr_stringify(&s->them), seq, len); 01097 } 01098 01099 return 0; 01100 }