BuildSystem: Remove unused variables.
[asterisk/asterisk.git] / main / udptl.c
index 9145848..5a491e6 100644 (file)
@@ -63,8 +63,6 @@
 
 #include "asterisk.h"
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include <sys/time.h>
 #include <signal.h>
 #include <fcntl.h>
@@ -239,9 +237,9 @@ static int udptl_pre_apply_config(void);
 static struct aco_type general_option = {
        .type = ACO_GLOBAL,
        .name = "global",
-       .category_match = ACO_WHITELIST,
+       .category_match = ACO_WHITELIST_EXACT,
        .item_offset = offsetof(struct udptl_config, general),
-       .category = "^general$",
+       .category = "general",
 };
 
 static struct aco_type *general_options[] = ACO_TYPES(&general_option);
@@ -305,16 +303,15 @@ static int decode_open_type(uint8_t *buf, unsigned int limit, unsigned int *len,
        if (decode_length(buf, limit, len, &octet_cnt) != 0)
                return -1;
 
-       if (octet_cnt > 0) {
-               /* Make sure the buffer contains at least the number of bits requested */
-               if ((*len + octet_cnt) > limit)
-                       return -1;
-
-               *p_num_octets = octet_cnt;
-               *p_object = &buf[*len];
-               *len += octet_cnt;
+       /* Make sure the buffer contains at least the number of bits requested */
+       if ((*len + octet_cnt) > limit) {
+               return -1;
        }
 
+       *p_num_octets = octet_cnt;
+       *p_object = &buf[*len];
+       *len += octet_cnt;
+
        return 0;
 }
 /*- End of function --------------------------------------------------------*/
@@ -362,8 +359,7 @@ static int encode_open_type(const struct ast_udptl *udptl, uint8_t *buf, unsigne
        }
        /* Encode the open type */
        for (octet_idx = 0; ; num_octets -= enclen, octet_idx += enclen) {
-               if ((enclen = encode_length(buf, len, num_octets)) < 0)
-                       return -1;
+               enclen = encode_length(buf, len, num_octets);
                if (enclen + *len > buflen) {
                        ast_log(LOG_ERROR, "UDPTL (%s): Buffer overflow detected (%u + %u > %u)\n",
                                LOG_TAG(udptl), enclen, *len, buflen);
@@ -646,8 +642,7 @@ static int udptl_build_packet(struct ast_udptl *s, uint8_t *buf, unsigned int bu
                buf[len++] = 0x00;
                /* The number of entries will always be zero, so it is pointless allowing
                   for the fragmented case here. */
-               if (encode_length(buf, &len, 0) < 0)
-                       return -1;
+               encode_length(buf, &len, 0);
                break;
        case UDPTL_ERROR_CORRECTION_REDUNDANCY:
                /* Encode the error recovery type */
@@ -658,8 +653,7 @@ static int udptl_build_packet(struct ast_udptl *s, uint8_t *buf, unsigned int bu
                        entries = s->tx_seq_no;
                /* The number of entries will always be small, so it is pointless allowing
                   for the fragmented case here. */
-               if (encode_length(buf, &len, entries) < 0)
-                       return -1;
+               encode_length(buf, &len, entries);
                /* Encode the elements */
                for (i = 0; i < entries; i++) {
                        j = (entry - i - 1) & UDPTL_BUF_MASK;
@@ -773,6 +767,18 @@ struct ast_frame *ast_udptl_read(struct ast_udptl *udptl)
                return &ast_null_frame;
        }
 
+       /*
+        * If early media isn't turned on for the channel driver, it's going to
+        * drop this frame.  By that time though, udptl has already incremented
+        * the expected sequence number so if the CPE re-sends, the second frame
+        * will be dropped as a dup even though the first frame never went through.
+        * So we drop the frame here if the channel isn't up. 'tag' is set by the
+        * channel drivers on T38_ENABLED or T38_PEER_REINVITE.
+        */
+       if (udptl->tag == NULL) {
+               return &ast_null_frame;
+       }
+
        if (udptl->nat) {
                /* Send to whoever sent to us */
                if (ast_sockaddr_cmp(&udptl->them, &addr)) {
@@ -1006,7 +1012,6 @@ struct ast_udptl *ast_udptl_new_with_bindaddr(struct ast_sched_context *sched, s
        int x;
        int startplace;
        int i;
-       long int flags;
        RAII_VAR(struct udptl_config *, cfg, ao2_global_obj_ref(globals), ao2_cleanup);
 
        if (!cfg || !cfg->general) {
@@ -1037,8 +1042,7 @@ struct ast_udptl *ast_udptl_new_with_bindaddr(struct ast_sched_context *sched, s
                ast_log(LOG_WARNING, "Unable to allocate socket: %s\n", strerror(errno));
                return NULL;
        }
-       flags = fcntl(udptl->fd, F_GETFL);
-       fcntl(udptl->fd, F_SETFL, flags | O_NONBLOCK);
+       ast_fd_set_flags(udptl->fd, O_NONBLOCK);
 
 #ifdef SO_NO_CHECK
        if (cfg->general->nochecksums)