#include "asterisk/frame.h"
#include "asterisk/io.h"
#include "asterisk/sched.h"
#include "asterisk/channel.h"
#include <netinet/in.h>
Include dependency graph for udptl.h:
This graph shows which files directly or indirectly include this file:
Go to the source code of this file.
typedef int(*) ast_udptl_callback(struct ast_udptl *udptl, struct ast_frame *f, void *data) |
anonymous enum |
UDPTL_ERROR_CORRECTION_NONE | |
UDPTL_ERROR_CORRECTION_FEC | |
UDPTL_ERROR_CORRECTION_REDUNDANCY |
Definition at line 28 of file udptl.h.
00029 { 00030 UDPTL_ERROR_CORRECTION_NONE, 00031 UDPTL_ERROR_CORRECTION_FEC, 00032 UDPTL_ERROR_CORRECTION_REDUNDANCY 00033 };
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 1002 of file udptl.c.
References ast_channel_lock, ast_channel_trylock, ast_channel_unlock, ast_check_hangup(), AST_FRAME_MODEM, ast_frfree(), ast_inet_ntoa(), ast_log(), ast_read(), ast_udptl_get_peer(), ast_waitfor_n(), ast_write(), f, get_proto(), ast_udptl_protocol::get_udptl_info, inaddrcmp(), LOG_DEBUG, LOG_WARNING, ast_channel::masq, ast_channel::masqr, ast_udptl_protocol::set_udptl_peer, and ast_channel::tech_pvt.
01003 { 01004 struct ast_frame *f; 01005 struct ast_channel *who; 01006 struct ast_channel *cs[3]; 01007 struct ast_udptl *p0; 01008 struct ast_udptl *p1; 01009 struct ast_udptl_protocol *pr0; 01010 struct ast_udptl_protocol *pr1; 01011 struct sockaddr_in ac0; 01012 struct sockaddr_in ac1; 01013 struct sockaddr_in t0; 01014 struct sockaddr_in t1; 01015 void *pvt0; 01016 void *pvt1; 01017 int to; 01018 01019 ast_channel_lock(c0); 01020 while (ast_channel_trylock(c1)) { 01021 ast_channel_unlock(c0); 01022 usleep(1); 01023 ast_channel_lock(c0); 01024 } 01025 pr0 = get_proto(c0); 01026 pr1 = get_proto(c1); 01027 if (!pr0) { 01028 ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c0->name); 01029 ast_channel_unlock(c0); 01030 ast_channel_unlock(c1); 01031 return -1; 01032 } 01033 if (!pr1) { 01034 ast_log(LOG_WARNING, "Can't find native functions for channel '%s'\n", c1->name); 01035 ast_channel_unlock(c0); 01036 ast_channel_unlock(c1); 01037 return -1; 01038 } 01039 pvt0 = c0->tech_pvt; 01040 pvt1 = c1->tech_pvt; 01041 p0 = pr0->get_udptl_info(c0); 01042 p1 = pr1->get_udptl_info(c1); 01043 if (!p0 || !p1) { 01044 /* Somebody doesn't want to play... */ 01045 ast_channel_unlock(c0); 01046 ast_channel_unlock(c1); 01047 return -2; 01048 } 01049 if (pr0->set_udptl_peer(c0, p1)) { 01050 ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c0->name, c1->name); 01051 } else { 01052 /* Store UDPTL peer */ 01053 ast_udptl_get_peer(p1, &ac1); 01054 } 01055 if (pr1->set_udptl_peer(c1, p0)) 01056 ast_log(LOG_WARNING, "Channel '%s' failed to talk back to '%s'\n", c1->name, c0->name); 01057 else { 01058 /* Store UDPTL peer */ 01059 ast_udptl_get_peer(p0, &ac0); 01060 } 01061 ast_channel_unlock(c0); 01062 ast_channel_unlock(c1); 01063 cs[0] = c0; 01064 cs[1] = c1; 01065 cs[2] = NULL; 01066 for (;;) { 01067 if ((c0->tech_pvt != pvt0) || 01068 (c1->tech_pvt != pvt1) || 01069 (c0->masq || c0->masqr || c1->masq || c1->masqr)) { 01070 ast_log(LOG_DEBUG, "Oooh, something is weird, backing out\n"); 01071 /* Tell it to try again later */ 01072 return -3; 01073 } 01074 to = -1; 01075 ast_udptl_get_peer(p1, &t1); 01076 ast_udptl_get_peer(p0, &t0); 01077 if (inaddrcmp(&t1, &ac1)) { 01078 ast_log(LOG_DEBUG, "Oooh, '%s' changed end address to %s:%d\n", 01079 c1->name, ast_inet_ntoa(t1.sin_addr), ntohs(t1.sin_port)); 01080 ast_log(LOG_DEBUG, "Oooh, '%s' was %s:%d\n", 01081 c1->name, ast_inet_ntoa(ac1.sin_addr), ntohs(ac1.sin_port)); 01082 memcpy(&ac1, &t1, sizeof(ac1)); 01083 } 01084 if (inaddrcmp(&t0, &ac0)) { 01085 ast_log(LOG_DEBUG, "Oooh, '%s' changed end address to %s:%d\n", 01086 c0->name, ast_inet_ntoa(t0.sin_addr), ntohs(t0.sin_port)); 01087 ast_log(LOG_DEBUG, "Oooh, '%s' was %s:%d\n", 01088 c0->name, ast_inet_ntoa(ac0.sin_addr), ntohs(ac0.sin_port)); 01089 memcpy(&ac0, &t0, sizeof(ac0)); 01090 } 01091 who = ast_waitfor_n(cs, 2, &to); 01092 if (!who) { 01093 ast_log(LOG_DEBUG, "Ooh, empty read...\n"); 01094 /* check for hangup / whentohangup */ 01095 if (ast_check_hangup(c0) || ast_check_hangup(c1)) 01096 break; 01097 continue; 01098 } 01099 f = ast_read(who); 01100 if (!f) { 01101 *fo = f; 01102 *rc = who; 01103 ast_log(LOG_DEBUG, "Oooh, got a %s\n", f ? "digit" : "hangup"); 01104 /* That's all we needed */ 01105 return 0; 01106 } else { 01107 if (f->frametype == AST_FRAME_MODEM) { 01108 /* Forward T.38 frames if they happen upon us */ 01109 if (who == c0) { 01110 ast_write(c1, f); 01111 } else if (who == c1) { 01112 ast_write(c0, f); 01113 } 01114 } 01115 ast_frfree(f); 01116 } 01117 /* Swap priority. Not that it's a big deal at this point */ 01118 cs[2] = cs[0]; 01119 cs[0] = cs[1]; 01120 cs[1] = cs[2]; 01121 } 01122 return -1; 01123 }
void ast_udptl_destroy | ( | struct ast_udptl * | udptl | ) |
Definition at line 906 of file udptl.c.
References ast_io_remove(), ast_udptl::fd, free, ast_udptl::io, and ast_udptl::ioid.
Referenced by __sip_destroy(), and create_addr_from_peer().
00907 { 00908 if (udptl->ioid) 00909 ast_io_remove(udptl->io, udptl->ioid); 00910 if (udptl->fd > -1) 00911 close(udptl->fd); 00912 free(udptl); 00913 }
int ast_udptl_fd | ( | struct ast_udptl * | udptl | ) |
Definition at line 632 of file udptl.c.
References ast_udptl::fd.
Referenced by __oh323_new(), and sip_new().
00633 { 00634 return udptl->fd; 00635 }
void ast_udptl_get_current_formats | ( | struct ast_udptl * | udptl, | |
int * | astFormats, | |||
int * | nonAstFormats | |||
) |
int ast_udptl_get_error_correction_scheme | ( | struct ast_udptl * | udptl | ) |
Definition at line 723 of file udptl.c.
References ast_log(), ast_udptl::error_correction_scheme, and LOG_WARNING.
Referenced by create_addr_from_peer(), sip_alloc(), and sip_handle_t38_reinvite().
00724 { 00725 if (udptl) 00726 return udptl->error_correction_scheme; 00727 else { 00728 ast_log(LOG_WARNING, "udptl structure is null\n"); 00729 return -1; 00730 } 00731 }
int ast_udptl_get_far_max_datagram | ( | struct ast_udptl * | udptl | ) |
Definition at line 763 of file udptl.c.
References ast_log(), ast_udptl::far_max_datagram_size, and LOG_WARNING.
00764 { 00765 if (udptl) 00766 return udptl->far_max_datagram_size; 00767 else { 00768 ast_log(LOG_WARNING, "udptl structure is null\n"); 00769 return -1; 00770 } 00771 }
int ast_udptl_get_local_max_datagram | ( | struct ast_udptl * | udptl | ) |
Definition at line 753 of file udptl.c.
References ast_log(), ast_udptl::local_max_datagram_size, and LOG_WARNING.
Referenced by add_t38_sdp(), and sip_handle_t38_reinvite().
00754 { 00755 if (udptl) 00756 return udptl->local_max_datagram_size; 00757 else { 00758 ast_log(LOG_WARNING, "udptl structure is null\n"); 00759 return -1; 00760 } 00761 }
void ast_udptl_get_peer | ( | struct ast_udptl * | udptl, | |
struct sockaddr_in * | them | |||
) |
Definition at line 888 of file udptl.c.
References ast_udptl::them.
Referenced by ast_udptl_bridge(), sip_handle_t38_reinvite(), and sip_set_udptl_peer().
00889 { 00890 them->sin_family = AF_INET; 00891 them->sin_port = udptl->them.sin_port; 00892 them->sin_addr = udptl->them.sin_addr; 00893 }
void ast_udptl_get_us | ( | struct ast_udptl * | udptl, | |
struct sockaddr_in * | us | |||
) |
void ast_udptl_init | ( | void | ) |
Definition at line 1282 of file udptl.c.
References ast_cli_register_multiple(), ast_udptl_reload(), and cli_udptl.
Referenced by main().
01283 { 01284 ast_cli_register_multiple(cli_udptl, sizeof(cli_udptl) / sizeof(struct ast_cli_entry)); 01285 ast_udptl_reload(); 01286 }
int ast_udptl_lookup_code | ( | struct ast_udptl * | udptl, | |
int | isAstFormat, | |||
int | code | |||
) |
struct ast_udptl* ast_udptl_new | ( | struct sched_context * | sched, | |
struct io_context * | io, | |||
int | callbackmode | |||
) |
Definition at line 866 of file udptl.c.
References ast_udptl_new_with_bindaddr(), io, and sched.
00867 { 00868 struct in_addr ia; 00869 memset(&ia, 0, sizeof(ia)); 00870 return ast_udptl_new_with_bindaddr(sched, io, callbackmode, ia); 00871 }
struct ast_udptl* ast_udptl_new_with_bindaddr | ( | struct sched_context * | sched, | |
struct io_context * | io, | |||
int | callbackmode, | |||
struct in_addr | in | |||
) |
Definition at line 789 of file udptl.c.
References ast_calloc, ast_io_add(), AST_IO_IN, ast_log(), ast_random(), ast_udptl::flags, free, io, LOG_WARNING, sched, UDPTL_ERROR_CORRECTION_FEC, UDPTL_ERROR_CORRECTION_NONE, UDPTL_ERROR_CORRECTION_REDUNDANCY, udptlend, udptlfecentries, udptlfecspan, udptlfectype, udptlmaxdatagram, udptlread(), and udptlstart.
Referenced by ast_udptl_new(), and sip_alloc().
00790 { 00791 struct ast_udptl *udptl; 00792 int x; 00793 int startplace; 00794 int i; 00795 long int flags; 00796 00797 if (!(udptl = ast_calloc(1, sizeof(*udptl)))) 00798 return NULL; 00799 00800 if (udptlfectype == 2) 00801 udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_FEC; 00802 else if (udptlfectype == 1) 00803 udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_REDUNDANCY; 00804 else 00805 udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_NONE; 00806 udptl->error_correction_span = udptlfecspan; 00807 udptl->error_correction_entries = udptlfecentries; 00808 00809 udptl->far_max_datagram_size = udptlmaxdatagram; 00810 udptl->local_max_datagram_size = udptlmaxdatagram; 00811 00812 memset(&udptl->rx, 0, sizeof(udptl->rx)); 00813 memset(&udptl->tx, 0, sizeof(udptl->tx)); 00814 for (i = 0; i <= UDPTL_BUF_MASK; i++) { 00815 udptl->rx[i].buf_len = -1; 00816 udptl->tx[i].buf_len = -1; 00817 } 00818 00819 udptl->seqno = ast_random() & 0xffff; 00820 udptl->them.sin_family = AF_INET; 00821 udptl->us.sin_family = AF_INET; 00822 00823 if ((udptl->fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 00824 free(udptl); 00825 ast_log(LOG_WARNING, "Unable to allocate socket: %s\n", strerror(errno)); 00826 return NULL; 00827 } 00828 flags = fcntl(udptl->fd, F_GETFL); 00829 fcntl(udptl->fd, F_SETFL, flags | O_NONBLOCK); 00830 #ifdef SO_NO_CHECK 00831 if (nochecksums) 00832 setsockopt(udptl->fd, SOL_SOCKET, SO_NO_CHECK, &nochecksums, sizeof(nochecksums)); 00833 #endif 00834 /* Find us a place */ 00835 x = (ast_random() % (udptlend - udptlstart)) + udptlstart; 00836 startplace = x; 00837 for (;;) { 00838 udptl->us.sin_port = htons(x); 00839 udptl->us.sin_addr = addr; 00840 if (bind(udptl->fd, (struct sockaddr *) &udptl->us, sizeof(udptl->us)) == 0) 00841 break; 00842 if (errno != EADDRINUSE) { 00843 ast_log(LOG_WARNING, "Unexpected bind error: %s\n", strerror(errno)); 00844 close(udptl->fd); 00845 free(udptl); 00846 return NULL; 00847 } 00848 if (++x > udptlend) 00849 x = udptlstart; 00850 if (x == startplace) { 00851 ast_log(LOG_WARNING, "No UDPTL ports remaining\n"); 00852 close(udptl->fd); 00853 free(udptl); 00854 return NULL; 00855 } 00856 } 00857 if (io && sched && callbackmode) { 00858 /* Operate this one in a callback mode */ 00859 udptl->sched = sched; 00860 udptl->io = io; 00861 udptl->ioid = ast_io_add(udptl->io, udptl->fd, udptlread, AST_IO_IN, udptl); 00862 } 00863 return udptl; 00864 }
void ast_udptl_offered_from_local | ( | struct ast_udptl * | udptl, | |
int | local | |||
) |
Definition at line 715 of file udptl.c.
References ast_log(), LOG_WARNING, and ast_udptl::udptl_offered_from_local.
Referenced by transmit_invite(), transmit_reinvite_with_t38_sdp(), and transmit_response_with_t38_sdp().
00716 { 00717 if (udptl) 00718 udptl->udptl_offered_from_local = local; 00719 else 00720 ast_log(LOG_WARNING, "udptl structure is null\n"); 00721 }
int ast_udptl_proto_register | ( | struct ast_udptl_protocol * | proto | ) |
Definition at line 972 of file udptl.c.
References ast_log(), LOG_WARNING, ast_udptl_protocol::next, protos, and ast_udptl_protocol::type.
Referenced by load_module().
00973 { 00974 struct ast_udptl_protocol *cur; 00975 00976 cur = protos; 00977 while (cur) { 00978 if (cur->type == proto->type) { 00979 ast_log(LOG_WARNING, "Tried to register same protocol '%s' twice\n", cur->type); 00980 return -1; 00981 } 00982 cur = cur->next; 00983 } 00984 proto->next = protos; 00985 protos = proto; 00986 return 0; 00987 }
void ast_udptl_proto_unregister | ( | struct ast_udptl_protocol * | proto | ) |
Definition at line 952 of file udptl.c.
References ast_udptl_protocol::next, and protos.
Referenced by unload_module().
00953 { 00954 struct ast_udptl_protocol *cur; 00955 struct ast_udptl_protocol *prev; 00956 00957 cur = protos; 00958 prev = NULL; 00959 while (cur) { 00960 if (cur == proto) { 00961 if (prev) 00962 prev->next = proto->next; 00963 else 00964 protos = proto->next; 00965 return; 00966 } 00967 prev = cur; 00968 cur = cur->next; 00969 } 00970 }
Definition at line 664 of file udptl.c.
References AST_FRIENDLY_OFFSET, ast_inet_ntoa(), ast_log(), ast_null_frame, ast_verbose(), CRASH, ast_udptl::f, ast_udptl::fd, len, LOG_DEBUG, 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 sockaddr_in sin; 00668 socklen_t len; 00669 uint16_t seqno = 0; 00670 uint16_t *udptlheader; 00671 00672 len = sizeof(sin); 00673 00674 /* Cache where the header will go */ 00675 res = recvfrom(udptl->fd, 00676 udptl->rawdata + AST_FRIENDLY_OFFSET, 00677 sizeof(udptl->rawdata) - AST_FRIENDLY_OFFSET, 00678 0, 00679 (struct sockaddr *) &sin, 00680 &len); 00681 udptlheader = (uint16_t *)(udptl->rawdata + AST_FRIENDLY_OFFSET); 00682 if (res < 0) { 00683 if (errno != EAGAIN) 00684 ast_log(LOG_WARNING, "UDPTL read error: %s\n", strerror(errno)); 00685 if (errno == EBADF) 00686 CRASH; 00687 return &ast_null_frame; 00688 } 00689 00690 /* Ignore if the other side hasn't been given an address yet. */ 00691 if (!udptl->them.sin_addr.s_addr || !udptl->them.sin_port) 00692 return &ast_null_frame; 00693 00694 if (udptl->nat) { 00695 /* Send to whoever sent to us */ 00696 if ((udptl->them.sin_addr.s_addr != sin.sin_addr.s_addr) || 00697 (udptl->them.sin_port != sin.sin_port)) { 00698 memcpy(&udptl->them, &sin, sizeof(udptl->them)); 00699 ast_log(LOG_DEBUG, "UDPTL NAT: Using address %s:%d\n", ast_inet_ntoa(udptl->them.sin_addr), ntohs(udptl->them.sin_port)); 00700 } 00701 } 00702 00703 if (udptl_debug_test_addr(&sin)) { 00704 ast_verbose("Got UDPTL packet from %s:%d (type %d, seq %d, len %d)\n", 00705 ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), 0, seqno, res); 00706 } 00707 #if 0 00708 printf("Got UDPTL packet from %s:%d (seq %d, len = %d)\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), seqno, res); 00709 #endif 00710 udptl_rx_packet(udptl, udptl->rawdata + AST_FRIENDLY_OFFSET, res); 00711 00712 return &udptl->f[0]; 00713 }
void ast_udptl_reload | ( | void | ) |
Definition at line 1206 of file udptl.c.
References ast_config_destroy(), ast_config_load(), ast_false(), ast_log(), ast_variable_retrieve(), ast_verbose(), LOCAL_FAX_MAX_DATAGRAM, LOG_WARNING, MAX_FEC_ENTRIES, MAX_FEC_SPAN, option_verbose, s, udptlend, udptlfecentries, udptlfecspan, udptlfectype, udptlmaxdatagram, udptlstart, and VERBOSE_PREFIX_2.
Referenced by ast_udptl_init().
01207 { 01208 struct ast_config *cfg; 01209 const char *s; 01210 01211 udptlstart = 4500; 01212 udptlend = 4999; 01213 udptlfectype = 0; 01214 udptlfecentries = 0; 01215 udptlfecspan = 0; 01216 udptlmaxdatagram = 0; 01217 01218 if ((cfg = ast_config_load("udptl.conf"))) { 01219 if ((s = ast_variable_retrieve(cfg, "general", "udptlstart"))) { 01220 udptlstart = atoi(s); 01221 if (udptlstart < 1024) 01222 udptlstart = 1024; 01223 if (udptlstart > 65535) 01224 udptlstart = 65535; 01225 } 01226 if ((s = ast_variable_retrieve(cfg, "general", "udptlend"))) { 01227 udptlend = atoi(s); 01228 if (udptlend < 1024) 01229 udptlend = 1024; 01230 if (udptlend > 65535) 01231 udptlend = 65535; 01232 } 01233 if ((s = ast_variable_retrieve(cfg, "general", "udptlchecksums"))) { 01234 #ifdef SO_NO_CHECK 01235 if (ast_false(s)) 01236 nochecksums = 1; 01237 else 01238 nochecksums = 0; 01239 #else 01240 if (ast_false(s)) 01241 ast_log(LOG_WARNING, "Disabling UDPTL checksums is not supported on this operating system!\n"); 01242 #endif 01243 } 01244 if ((s = ast_variable_retrieve(cfg, "general", "T38FaxUdpEC"))) { 01245 if (strcmp(s, "t38UDPFEC") == 0) 01246 udptlfectype = 2; 01247 else if (strcmp(s, "t38UDPRedundancy") == 0) 01248 udptlfectype = 1; 01249 } 01250 if ((s = ast_variable_retrieve(cfg, "general", "T38FaxMaxDatagram"))) { 01251 udptlmaxdatagram = atoi(s); 01252 if (udptlmaxdatagram < 0) 01253 udptlmaxdatagram = 0; 01254 if (udptlmaxdatagram > LOCAL_FAX_MAX_DATAGRAM) 01255 udptlmaxdatagram = LOCAL_FAX_MAX_DATAGRAM; 01256 } 01257 if ((s = ast_variable_retrieve(cfg, "general", "UDPTLFECentries"))) { 01258 udptlfecentries = atoi(s); 01259 if (udptlfecentries < 0) 01260 udptlfecentries = 0; 01261 if (udptlfecentries > MAX_FEC_ENTRIES) 01262 udptlfecentries = MAX_FEC_ENTRIES; 01263 } 01264 if ((s = ast_variable_retrieve(cfg, "general", "UDPTLFECspan"))) { 01265 udptlfecspan = atoi(s); 01266 if (udptlfecspan < 0) 01267 udptlfecspan = 0; 01268 if (udptlfecspan > MAX_FEC_SPAN) 01269 udptlfecspan = MAX_FEC_SPAN; 01270 } 01271 ast_config_destroy(cfg); 01272 } 01273 if (udptlstart >= udptlend) { 01274 ast_log(LOG_WARNING, "Unreasonable values for UDPTL start/end\n"); 01275 udptlstart = 4500; 01276 udptlend = 4999; 01277 } 01278 if (option_verbose > 1) 01279 ast_verbose(VERBOSE_PREFIX_2 "UDPTL allocating from port range %d -> %d\n", udptlstart, udptlend); 01280 }
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, | |
int | ec | |||
) |
Definition at line 733 of file udptl.c.
References ast_log(), ast_udptl::error_correction_scheme, LOG_WARNING, UDPTL_ERROR_CORRECTION_FEC, UDPTL_ERROR_CORRECTION_NONE, and UDPTL_ERROR_CORRECTION_REDUNDANCY.
Referenced by process_sdp(), and sip_handle_t38_reinvite().
00734 { 00735 if (udptl) { 00736 switch (ec) { 00737 case UDPTL_ERROR_CORRECTION_FEC: 00738 udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_FEC; 00739 break; 00740 case UDPTL_ERROR_CORRECTION_REDUNDANCY: 00741 udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_REDUNDANCY; 00742 break; 00743 case UDPTL_ERROR_CORRECTION_NONE: 00744 udptl->error_correction_scheme = UDPTL_ERROR_CORRECTION_NONE; 00745 break; 00746 default: 00747 ast_log(LOG_WARNING, "error correction parameter invalid\n"); 00748 }; 00749 } else 00750 ast_log(LOG_WARNING, "udptl structure is null\n"); 00751 }
void ast_udptl_set_far_max_datagram | ( | struct ast_udptl * | udptl, | |
int | max_datagram | |||
) |
Definition at line 781 of file udptl.c.
References ast_log(), ast_udptl::far_max_datagram_size, and LOG_WARNING.
Referenced by process_sdp(), and sip_handle_t38_reinvite().
00782 { 00783 if (udptl) 00784 udptl->far_max_datagram_size = max_datagram; 00785 else 00786 ast_log(LOG_WARNING, "udptl structure is null\n"); 00787 }
void ast_udptl_set_local_max_datagram | ( | struct ast_udptl * | udptl, | |
int | max_datagram | |||
) |
Definition at line 773 of file udptl.c.
References ast_log(), ast_udptl::local_max_datagram_size, and LOG_WARNING.
Referenced by process_sdp(), and sip_handle_t38_reinvite().
00774 { 00775 if (udptl) 00776 udptl->local_max_datagram_size = max_datagram; 00777 else 00778 ast_log(LOG_WARNING, "udptl structure is null\n"); 00779 }
void ast_udptl_set_m_type | ( | struct ast_udptl * | udptl, | |
int | pt | |||
) |
void ast_udptl_set_peer | ( | struct ast_udptl * | udptl, | |
struct sockaddr_in * | them | |||
) |
Definition at line 882 of file udptl.c.
References ast_udptl::them.
Referenced by process_sdp().
00883 { 00884 udptl->them.sin_port = them->sin_port; 00885 udptl->them.sin_addr = them->sin_addr; 00886 }
void ast_udptl_set_udptlmap_type | ( | struct ast_udptl * | udptl, | |
int | pt, | |||
char * | mimeType, | |||
char * | mimeSubtype | |||
) |
void ast_udptl_setnat | ( | struct ast_udptl * | udptl, | |
int | nat | |||
) |
int ast_udptl_settos | ( | struct ast_udptl * | udptl, | |
int | tos | |||
) |
Definition at line 873 of file udptl.c.
References ast_log(), ast_udptl::fd, and LOG_WARNING.
Referenced by sip_alloc().
00874 { 00875 int res; 00876 00877 if ((res = setsockopt(udptl->fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)))) 00878 ast_log(LOG_WARNING, "UDPTL unable to set TOS to %d\n", tos); 00879 return res; 00880 }
void ast_udptl_stop | ( | struct ast_udptl * | udptl | ) |
Definition at line 900 of file udptl.c.
References ast_udptl::them.
Referenced by process_sdp(), and stop_media_flows().
00901 { 00902 memset(&udptl->them.sin_addr, 0, sizeof(udptl->them.sin_addr)); 00903 memset(&udptl->them.sin_port, 0, sizeof(udptl->them.sin_port)); 00904 }
Definition at line 915 of file udptl.c.
References AST_FRAME_MODEM, ast_inet_ntoa(), ast_log(), ast_verbose(), f, len, LOCAL_FAX_MAX_DATAGRAM, LOG_NOTICE, LOG_WARNING, s, udptl_build_packet(), and udptl_debug_test_addr().
Referenced by sip_write().
00916 { 00917 int len; 00918 int res; 00919 uint8_t buf[LOCAL_FAX_MAX_DATAGRAM]; 00920 00921 /* If we have no peer, return immediately */ 00922 if (s->them.sin_addr.s_addr == INADDR_ANY) 00923 return 0; 00924 00925 /* If there is no data length, return immediately */ 00926 if (f->datalen == 0) 00927 return 0; 00928 00929 if (f->frametype != AST_FRAME_MODEM) { 00930 ast_log(LOG_WARNING, "UDPTL can only send T.38 data\n"); 00931 return -1; 00932 } 00933 00934 /* Cook up the UDPTL packet, with the relevant EC info. */ 00935 len = udptl_build_packet(s, buf, f->data, f->datalen); 00936 00937 if (len > 0 && s->them.sin_port && s->them.sin_addr.s_addr) { 00938 if ((res = sendto(s->fd, buf, len, 0, (struct sockaddr *) &s->them, sizeof(s->them))) < 0) 00939 ast_log(LOG_NOTICE, "UDPTL Transmission error to %s:%d: %s\n", ast_inet_ntoa(s->them.sin_addr), ntohs(s->them.sin_port), strerror(errno)); 00940 #if 0 00941 printf("Sent %d bytes of UDPTL data to %s:%d\n", res, ast_inet_ntoa(udptl->them.sin_addr), ntohs(udptl->them.sin_port)); 00942 #endif 00943 if (udptl_debug_test_addr(&s->them)) 00944 ast_verbose("Sent UDPTL packet to %s:%d (type %d, seq %d, len %d)\n", 00945 ast_inet_ntoa(s->them.sin_addr), 00946 ntohs(s->them.sin_port), 0, s->seqno, len); 00947 } 00948 00949 return 0; 00950 }