#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_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) |
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) |
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 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
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.
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 }
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 | ) |
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.
udptl | The UDPTL session. | |
format | printf-style format string used to construct the tag |
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().
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 }
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 }