From 9113f23b75a0e3066cd01f8f96ae7c2eb33129d7 Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Sun, 24 Jan 2016 01:58:36 +0800 Subject: [PATCH] Fixed the application of the T.30 T1 timeout in faxing. --- libs/spandsp/spandsp/fax-tests.xml | 64 ++++++++++++++++++ libs/spandsp/src/t30.c | 8 ++- libs/spandsp/src/t30_api.c | 86 +++++++++++++++++++++++++ libs/spandsp/src/t30_logging.c | 49 ++++++++++++++ libs/spandsp/tests/fax_tester.c | 12 +++- libs/spandsp/tests/tsb85_extra_tests.sh | 2 +- 6 files changed, 217 insertions(+), 4 deletions(-) diff --git a/libs/spandsp/spandsp/fax-tests.xml b/libs/spandsp/spandsp/fax-tests.xml index 2f52468721..1428bb97f5 100644 --- a/libs/spandsp/spandsp/fax-tests.xml +++ b/libs/spandsp/spandsp/fax-tests.xml @@ -589,5 +589,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libs/spandsp/src/t30.c b/libs/spandsp/src/t30.c index f13d4eb879..189a16b00c 100644 --- a/libs/spandsp/src/t30.c +++ b/libs/spandsp/src/t30.c @@ -2712,6 +2712,7 @@ static int send_cfr_sequence(t30_state_t *s, int start) s->step++; if (send_csa_frame(s)) break; + /*endif*/ /* Fall through */ case 1: s->step++; @@ -5721,6 +5722,7 @@ static void set_phase(t30_state_t *s, int phase) case T30_PHASE_D_TX: if (!s->far_end_detected && s->timer_t0_t1 > 0) { + /* Switch from T0 to T1 */ s->timer_t0_t1 = ms_to_samples(DEFAULT_TIMER_T1); s->far_end_detected = true; } @@ -5822,7 +5824,10 @@ static void set_state(t30_state_t *s, int state) static void repeat_last_command(t30_state_t *s) { s->step = 0; - if (++s->retries >= MAX_COMMAND_TRIES) + /* If T0 or T1 are in progress we do not want to apply a limit to the maximum number of retries. We + let T0 or T1 terminate things if the far end doesn't communicate. */ + s->retries++; + if (s->timer_t0_t1 == 0 && s->retries >= MAX_COMMAND_TRIES) { span_log(&s->logging, SPAN_LOG_FLOW, "Too many retries. Giving up.\n"); switch (s->state) @@ -6667,6 +6672,7 @@ static void t30_hdlc_rx_status(void *user_data, int status) case SIG_STATUS_FRAMING_OK: if (!s->far_end_detected && s->timer_t0_t1 > 0) { + /* Switch from T0 to T1 */ s->timer_t0_t1 = ms_to_samples(DEFAULT_TIMER_T1); s->far_end_detected = true; if (s->phase == T30_PHASE_A_CED || s->phase == T30_PHASE_A_CNG) diff --git a/libs/spandsp/src/t30_api.c b/libs/spandsp/src/t30_api.c index 724dcf9735..23c2d49375 100644 --- a/libs/spandsp/src/t30_api.c +++ b/libs/spandsp/src/t30_api.c @@ -120,26 +120,34 @@ SPAN_DECLARE(int) t33_sub_address_extract_field(uint8_t num[21], const uint8_t t { type = T33_SST; } + /*endif*/ while (t33[i]) { ch = t33[i++]; if (ch == '#') break; + /*endif*/ num[j++] = ch; if (j >= 20) return -1; + /*endif*/ } + /*endwhile*/ num[j] = '\0'; return type; } + /*endif*/ /* Skip this field */ i++; while (t33[i]) { if (t33[i++] == '#') break; + /*endif*/ } + /*endwhile*/ } + /*endfor*/ return T33_NONE; } /*- End of function --------------------------------------------------------*/ @@ -148,8 +156,10 @@ SPAN_DECLARE(void) t33_sub_address_add_field(uint8_t t33[], const uint8_t field[ { if (t33[0] != '\0') strcat((char *) t33, "#"); + /*endif*/ if (type == T33_SST) strcat((char *) t33, "#"); + /*endif*/ strcat((char *) t33, (const char *) field); } /*- End of function --------------------------------------------------------*/ @@ -161,8 +171,10 @@ SPAN_DECLARE(int) t30_set_tx_ident(t30_state_t *s, const char *id) s->tx_info.ident[0] = '\0'; return 0; } + /*endif*/ if (strlen(id) > T30_MAX_IDENT_LEN) return -1; + /*endif*/ strcpy(s->tx_info.ident, id); t4_tx_set_local_ident(&s->t4.tx, s->tx_info.ident); return 0; @@ -173,6 +185,7 @@ SPAN_DECLARE(const char *) t30_get_tx_ident(t30_state_t *s) { if (s->tx_info.ident[0] == '\0') return NULL; + /*endif*/ return s->tx_info.ident; } /*- End of function --------------------------------------------------------*/ @@ -181,6 +194,7 @@ SPAN_DECLARE(const char *) t30_get_rx_ident(t30_state_t *s) { if (s->rx_info.ident[0] == '\0') return NULL; + /*endif*/ return s->rx_info.ident; } /*- End of function --------------------------------------------------------*/ @@ -192,8 +206,10 @@ SPAN_DECLARE(int) t30_set_tx_sub_address(t30_state_t *s, const char *sub_address s->tx_info.sub_address[0] = '\0'; return 0; } + /*endif*/ if (strlen(sub_address) > T30_MAX_IDENT_LEN) return -1; + /*endif*/ strcpy(s->tx_info.sub_address, sub_address); return 0; } @@ -203,6 +219,7 @@ SPAN_DECLARE(const char *) t30_get_tx_sub_address(t30_state_t *s) { if (s->tx_info.sub_address[0] == '\0') return NULL; + /*endif*/ return s->tx_info.sub_address; } /*- End of function --------------------------------------------------------*/ @@ -211,6 +228,7 @@ SPAN_DECLARE(const char *) t30_get_rx_sub_address(t30_state_t *s) { if (s->rx_info.sub_address[0] == '\0') return NULL; + /*endif*/ return s->rx_info.sub_address; } /*- End of function --------------------------------------------------------*/ @@ -222,8 +240,10 @@ SPAN_DECLARE(int) t30_set_tx_selective_polling_address(t30_state_t *s, const cha s->tx_info.selective_polling_address[0] = '\0'; return 0; } + /*endif*/ if (strlen(selective_polling_address) > T30_MAX_IDENT_LEN) return -1; + /*endif*/ strcpy(s->tx_info.selective_polling_address, selective_polling_address); return 0; } @@ -233,6 +253,7 @@ SPAN_DECLARE(const char *) t30_get_tx_selective_polling_address(t30_state_t *s) { if (s->tx_info.selective_polling_address[0] == '\0') return NULL; + /*endif*/ return s->tx_info.selective_polling_address; } /*- End of function --------------------------------------------------------*/ @@ -241,6 +262,7 @@ SPAN_DECLARE(const char *) t30_get_rx_selective_polling_address(t30_state_t *s) { if (s->rx_info.selective_polling_address[0] == '\0') return NULL; + /*endif*/ return s->rx_info.selective_polling_address; } /*- End of function --------------------------------------------------------*/ @@ -252,8 +274,10 @@ SPAN_DECLARE(int) t30_set_tx_polled_sub_address(t30_state_t *s, const char *poll s->tx_info.polled_sub_address[0] = '\0'; return 0; } + /*endif*/ if (strlen(polled_sub_address) > T30_MAX_IDENT_LEN) return -1; + /*endif*/ strcpy(s->tx_info.polled_sub_address, polled_sub_address); return 0; } @@ -263,6 +287,7 @@ SPAN_DECLARE(const char *) t30_get_tx_polled_sub_address(t30_state_t *s) { if (s->tx_info.polled_sub_address[0] == '\0') return NULL; + /*endif*/ return s->tx_info.polled_sub_address; } /*- End of function --------------------------------------------------------*/ @@ -271,6 +296,7 @@ SPAN_DECLARE(const char *) t30_get_rx_polled_sub_address(t30_state_t *s) { if (s->rx_info.polled_sub_address[0] == '\0') return NULL; + /*endif*/ return s->rx_info.polled_sub_address; } /*- End of function --------------------------------------------------------*/ @@ -282,8 +308,10 @@ SPAN_DECLARE(int) t30_set_tx_sender_ident(t30_state_t *s, const char *sender_ide s->tx_info.sender_ident[0] = '\0'; return 0; } + /*endif*/ if (strlen(sender_ident) > T30_MAX_IDENT_LEN) return -1; + /*endif*/ strcpy(s->tx_info.sender_ident, sender_ident); return 0; } @@ -293,6 +321,7 @@ SPAN_DECLARE(const char *) t30_get_tx_sender_ident(t30_state_t *s) { if (s->tx_info.sender_ident[0] == '\0') return NULL; + /*endif*/ return s->tx_info.sender_ident; } /*- End of function --------------------------------------------------------*/ @@ -301,6 +330,7 @@ SPAN_DECLARE(const char *) t30_get_rx_sender_ident(t30_state_t *s) { if (s->rx_info.sender_ident[0] == '\0') return NULL; + /*endif*/ return s->rx_info.sender_ident; } /*- End of function --------------------------------------------------------*/ @@ -312,8 +342,10 @@ SPAN_DECLARE(int) t30_set_tx_password(t30_state_t *s, const char *password) s->tx_info.password[0] = '\0'; return 0; } + /*endif*/ if (strlen(password) > T30_MAX_IDENT_LEN) return -1; + /*endif*/ strcpy(s->tx_info.password, password); return 0; } @@ -323,6 +355,7 @@ SPAN_DECLARE(const char *) t30_get_tx_password(t30_state_t *s) { if (s->tx_info.password[0] == '\0') return NULL; + /*endif*/ return s->tx_info.password; } /*- End of function --------------------------------------------------------*/ @@ -331,6 +364,7 @@ SPAN_DECLARE(const char *) t30_get_rx_password(t30_state_t *s) { if (s->rx_info.password[0] == '\0') return NULL; + /*endif*/ return s->rx_info.password; } /*- End of function --------------------------------------------------------*/ @@ -339,6 +373,7 @@ SPAN_DECLARE(int) t30_set_tx_nsf(t30_state_t *s, const uint8_t *nsf, int len) { if (s->tx_info.nsf) span_free(s->tx_info.nsf); + /*endif*/ if (nsf && len > 0 && (s->tx_info.nsf = span_alloc(len + 3))) { memcpy(&s->tx_info.nsf[3], nsf, len); @@ -349,6 +384,7 @@ SPAN_DECLARE(int) t30_set_tx_nsf(t30_state_t *s, const uint8_t *nsf, int len) s->tx_info.nsf = NULL; s->tx_info.nsf_len = 0; } + /*endif*/ return 0; } /*- End of function --------------------------------------------------------*/ @@ -357,6 +393,7 @@ SPAN_DECLARE(size_t) t30_get_tx_nsf(t30_state_t *s, const uint8_t *nsf[]) { if (nsf) *nsf = s->tx_info.nsf; + /*endif*/ return s->tx_info.nsf_len; } /*- End of function --------------------------------------------------------*/ @@ -365,6 +402,7 @@ SPAN_DECLARE(size_t) t30_get_rx_nsf(t30_state_t *s, const uint8_t *nsf[]) { if (nsf) *nsf = s->rx_info.nsf; + /*endif*/ return s->rx_info.nsf_len; } /*- End of function --------------------------------------------------------*/ @@ -373,6 +411,7 @@ SPAN_DECLARE(int) t30_set_tx_nsc(t30_state_t *s, const uint8_t *nsc, int len) { if (s->tx_info.nsc) span_free(s->tx_info.nsc); + /*endif*/ if (nsc && len > 0 && (s->tx_info.nsc = span_alloc(len + 3))) { memcpy(&s->tx_info.nsc[3], nsc, len); @@ -383,6 +422,7 @@ SPAN_DECLARE(int) t30_set_tx_nsc(t30_state_t *s, const uint8_t *nsc, int len) s->tx_info.nsc = NULL; s->tx_info.nsc_len = 0; } + /*endif*/ return 0; } /*- End of function --------------------------------------------------------*/ @@ -391,6 +431,7 @@ SPAN_DECLARE(size_t) t30_get_tx_nsc(t30_state_t *s, const uint8_t *nsc[]) { if (nsc) *nsc = s->tx_info.nsc; + /*endif*/ return s->tx_info.nsc_len; } /*- End of function --------------------------------------------------------*/ @@ -399,6 +440,7 @@ SPAN_DECLARE(size_t) t30_get_rx_nsc(t30_state_t *s, const uint8_t *nsc[]) { if (nsc) *nsc = s->rx_info.nsc; + /*endif*/ return s->rx_info.nsc_len; } /*- End of function --------------------------------------------------------*/ @@ -407,6 +449,7 @@ SPAN_DECLARE(int) t30_set_tx_nss(t30_state_t *s, const uint8_t *nss, int len) { if (s->tx_info.nss) span_free(s->tx_info.nss); + /*endif*/ if (nss && len > 0 && (s->tx_info.nss = span_alloc(len + 3))) { memcpy(&s->tx_info.nss[3], nss, len); @@ -417,6 +460,7 @@ SPAN_DECLARE(int) t30_set_tx_nss(t30_state_t *s, const uint8_t *nss, int len) s->tx_info.nss = NULL; s->tx_info.nss_len = 0; } + /*endif*/ return 0; } /*- End of function --------------------------------------------------------*/ @@ -425,6 +469,7 @@ SPAN_DECLARE(size_t) t30_get_tx_nss(t30_state_t *s, const uint8_t *nss[]) { if (nss) *nss = s->tx_info.nss; + /*endif*/ return s->tx_info.nss_len; } /*- End of function --------------------------------------------------------*/ @@ -433,6 +478,7 @@ SPAN_DECLARE(size_t) t30_get_rx_nss(t30_state_t *s, const uint8_t *nss[]) { if (nss) *nss = s->rx_info.nss; + /*endif*/ return s->rx_info.nss_len; } /*- End of function --------------------------------------------------------*/ @@ -441,20 +487,24 @@ SPAN_DECLARE(int) t30_set_tx_tsa(t30_state_t *s, int type, const char *address, { if (s->tx_info.tsa) span_free(s->tx_info.tsa); + /*endif*/ if (address == NULL || len == 0) { s->tx_info.tsa = NULL; s->tx_info.tsa_len = 0; return 0; } + /*endif*/ s->tx_info.tsa_type = type; if (len < 0) len = strlen(address); + /*endif*/ if ((s->tx_info.tsa = span_alloc(len))) { memcpy(s->tx_info.tsa, address, len); s->tx_info.tsa_len = len; } + /*endif*/ return 0; } /*- End of function --------------------------------------------------------*/ @@ -463,8 +513,10 @@ SPAN_DECLARE(size_t) t30_get_tx_tsa(t30_state_t *s, int *type, const char *addre { if (type) *type = s->tx_info.tsa_type; + /*endif*/ if (address) *address = s->tx_info.tsa; + /*endif*/ return s->tx_info.tsa_len; } /*- End of function --------------------------------------------------------*/ @@ -473,8 +525,10 @@ SPAN_DECLARE(size_t) t30_get_rx_tsa(t30_state_t *s, int *type, const char *addre { if (type) *type = s->rx_info.tsa_type; + /*endif*/ if (address) *address = s->rx_info.tsa; + /*endif*/ return s->rx_info.tsa_len; } /*- End of function --------------------------------------------------------*/ @@ -483,11 +537,13 @@ SPAN_DECLARE(int) t30_set_tx_ira(t30_state_t *s, int type, const char *address, { if (s->tx_info.ira) span_free(s->tx_info.ira); + /*endif*/ if (address == NULL) { s->tx_info.ira = NULL; return 0; } + /*endif*/ s->tx_info.ira = strdup(address); return 0; } @@ -497,8 +553,10 @@ SPAN_DECLARE(size_t) t30_get_tx_ira(t30_state_t *s, int *type, const char *addre { if (type) *type = s->tx_info.ira_type; + /*endif*/ if (address) *address = s->tx_info.ira; + /*endif*/ return s->tx_info.ira_len; } /*- End of function --------------------------------------------------------*/ @@ -507,8 +565,10 @@ SPAN_DECLARE(size_t) t30_get_rx_ira(t30_state_t *s, int *type, const char *addre { if (type) *type = s->rx_info.ira_type; + /*endif*/ if (address) *address = s->rx_info.ira; + /*endif*/ return s->rx_info.ira_len; } /*- End of function --------------------------------------------------------*/ @@ -517,11 +577,13 @@ SPAN_DECLARE(int) t30_set_tx_cia(t30_state_t *s, int type, const char *address, { if (s->tx_info.cia) span_free(s->tx_info.cia); + /*endif*/ if (address == NULL) { s->tx_info.cia = NULL; return 0; } + /*endif*/ s->tx_info.cia = strdup(address); return 0; } @@ -531,8 +593,10 @@ SPAN_DECLARE(size_t) t30_get_tx_cia(t30_state_t *s, int *type, const char *addre { if (type) *type = s->tx_info.cia_type; + /*endif*/ if (address) *address = s->tx_info.cia; + /*endif*/ return s->tx_info.cia_len; } /*- End of function --------------------------------------------------------*/ @@ -541,8 +605,10 @@ SPAN_DECLARE(size_t) t30_get_rx_cia(t30_state_t *s, int *type, const char *addre { if (type) *type = s->rx_info.cia_type; + /*endif*/ if (address) *address = s->rx_info.cia; + /*endif*/ return s->rx_info.cia_len; } /*- End of function --------------------------------------------------------*/ @@ -551,11 +617,13 @@ SPAN_DECLARE(int) t30_set_tx_isp(t30_state_t *s, int type, const char *address, { if (s->tx_info.isp) span_free(s->tx_info.isp); + /*endif*/ if (address == NULL) { s->tx_info.isp = NULL; return 0; } + /*endif*/ s->tx_info.isp = strdup(address); return 0; } @@ -565,8 +633,10 @@ SPAN_DECLARE(size_t) t30_get_tx_isp(t30_state_t *s, int *type, const char *addre { if (type) *type = s->tx_info.isp_type; + /*endif*/ if (address) *address = s->tx_info.isp; + /*endif*/ return s->tx_info.isp_len; } /*- End of function --------------------------------------------------------*/ @@ -575,8 +645,10 @@ SPAN_DECLARE(size_t) t30_get_rx_isp(t30_state_t *s, int *type, const char *addre { if (type) *type = s->rx_info.isp_type; + /*endif*/ if (address) *address = s->rx_info.isp; + /*endif*/ return s->rx_info.isp_len; } /*- End of function --------------------------------------------------------*/ @@ -585,11 +657,13 @@ SPAN_DECLARE(int) t30_set_tx_csa(t30_state_t *s, int type, const char *address, { if (s->tx_info.csa) span_free(s->tx_info.csa); + /*endif*/ if (address == NULL) { s->tx_info.csa = NULL; return 0; } + /*endif*/ s->tx_info.csa = strdup(address); return 0; } @@ -599,8 +673,10 @@ SPAN_DECLARE(size_t) t30_get_tx_csa(t30_state_t *s, int *type, const char *addre { if (type) *type = s->tx_info.csa_type; + /*endif*/ if (address) *address = s->tx_info.csa; + /*endif*/ return s->tx_info.csa_len; } /*- End of function --------------------------------------------------------*/ @@ -609,8 +685,10 @@ SPAN_DECLARE(size_t) t30_get_rx_csa(t30_state_t *s, int *type, const char *addre { if (type) *type = s->rx_info.csa_type; + /*endif*/ if (address) *address = s->rx_info.csa; + /*endif*/ return s->rx_info.csa_len; } /*- End of function --------------------------------------------------------*/ @@ -630,8 +708,10 @@ SPAN_DECLARE(int) t30_set_tx_page_header_info(t30_state_t *s, const char *info) s->header_info[0] = '\0'; return 0; } + /*endif*/ if (strlen(info) > T30_MAX_PAGE_HEADER_INFO) return -1; + /*endif*/ strcpy(s->header_info, info); t4_tx_set_header_info(&s->t4.tx, s->header_info); return 0; @@ -642,6 +722,7 @@ SPAN_DECLARE(size_t) t30_get_tx_page_header_info(t30_state_t *s, char *info) { if (info) strcpy(info, s->header_info); + /*endif*/ return strlen(s->header_info); } /*- End of function --------------------------------------------------------*/ @@ -654,6 +735,7 @@ SPAN_DECLARE(int) t30_set_tx_page_header_tz(t30_state_t *s, const char *tzstring t4_tx_set_header_tz(&s->t4.tx, &s->tz); return 0; } + /*endif*/ return -1; } /*- End of function --------------------------------------------------------*/ @@ -758,6 +840,7 @@ SPAN_DECLARE(int) t30_set_minimum_scan_line_time(t30_state_t *s, int min_time) s->local_min_scan_time_code = 4; else return -1; + /*endif*/ t30_build_dis_or_dtc(s); return 0; } @@ -856,8 +939,10 @@ SPAN_DECLARE(int) t30_set_supported_image_sizes(t30_state_t *s, int supported_im /* Force the sizes which depend on sizes which are supported */ if ((supported_image_sizes & T4_SUPPORT_LENGTH_UNLIMITED)) supported_image_sizes |= T4_SUPPORT_LENGTH_B4; + /*endif*/ if ((supported_image_sizes & T4_SUPPORT_WIDTH_303MM)) supported_image_sizes |= T4_SUPPORT_WIDTH_255MM; + /*endif*/ s->supported_image_sizes = supported_image_sizes; t30_build_dis_or_dtc(s); return 0; @@ -879,6 +964,7 @@ SPAN_DECLARE(void) t30_set_status(t30_state_t *s, int status) span_log(&s->logging, SPAN_LOG_FLOW, "Status changing to '%s'\n", t30_completion_code_to_str(status)); s->current_status = status; } + /*endif*/ } /*- End of function --------------------------------------------------------*/ diff --git a/libs/spandsp/src/t30_logging.c b/libs/spandsp/src/t30_logging.c index 51739999d1..0ef46b9f31 100644 --- a/libs/spandsp/src/t30_logging.c +++ b/libs/spandsp/src/t30_logging.c @@ -497,12 +497,15 @@ static void octet_bit_field(logging_state_t *log, { if ((tag = yeah) == NULL) tag = "Set"; + /*endif*/ } else { if ((tag = neigh) == NULL) tag = "Not set"; + /*endif*/ } + /*endif*/ /* Eh, voila! */ span_log(log, SPAN_LOG_FLOW, " %s= %s: %s\n", s, desc, tag); } @@ -528,6 +531,7 @@ static void octet_field(logging_state_t *log, /* Edit the bit string for display. */ for (i = start; i < end; i++) s[7 - i + ((i < 4) ? 1 : 0)] = (uint8_t) ((octet >> i) & 1) + '0'; + /*endfor*/ /* Find the right tag to display. */ octet = (uint8_t) ((octet >> start) & ((0xFF + (1 << (end - start))) & 0xFF)); @@ -539,7 +543,9 @@ static void octet_field(logging_state_t *log, tag = tags[i].str; break; } + /*endif*/ } + /*endfor*/ /* Eh, voila! */ span_log(log, SPAN_LOG_FLOW, " %s= %s: %s\n", s, desc, tag); } @@ -670,6 +676,7 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in if (!span_log_test(&s->logging, SPAN_LOG_FLOW)) return; + /*endif*/ frame_type = pkt[2] & 0xFE; log = &s->logging; if (len <= 2) @@ -677,6 +684,7 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ span_log(log, SPAN_LOG_FLOW, "%s:\n", t30_frametype(pkt[2])); if (len <= 3) @@ -684,6 +692,7 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 1, "Store and forward Internet fax (T.37)", NULL, NULL); octet_reserved_bit(log, pkt, 2, 0); octet_bit_field(log, pkt, 3, "Real-time Internet fax (T.38)", NULL, NULL); @@ -699,12 +708,14 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 6, "V.8 capabilities", NULL, NULL); octet_bit_field(log, pkt, 7, "Preferred octets", "64 octets", "256 octets"); } + /*endif*/ octet_reserved_bit(log, pkt, 8, 0); if (len <= 4) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ if (frame_type == T30_DCS) { @@ -718,6 +729,7 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 10, "Can receive fax", NULL, NULL); octet_field(log, pkt, 11, 14, "Supported data signalling rates", available_signalling_rate_tags); } + /*endif*/ octet_bit_field(log, pkt, 15, "R8x7.7lines/mm and/or 200x200pels/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 16, "2-D coding", NULL, NULL); if (len <= 5) @@ -725,6 +737,7 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ if (frame_type == T30_DCS) { @@ -738,14 +751,17 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_field(log, pkt, 19, 20, "Recording length", available_recording_length_tags); octet_field(log, pkt, 21, 23, "Receiver's minimum scan line time", available_minimum_scan_line_time_tags); } + /*endif*/ octet_bit_field(log, pkt, 24, "Extension indicator", NULL, NULL); if (!(pkt[5] & DISBIT8)) return; + /*endif*/ if (len <= 6) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_reserved_bit(log, pkt, 25, 0); octet_bit_field(log, pkt, 26, "Compressed/uncompressed mode", "Uncompressed", "Compressed"); @@ -754,17 +770,20 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 28, "Frame size", "64 octets", "256 octets"); else octet_reserved_bit(log, pkt, 28, 0); + /*endif*/ octet_reserved_bit(log, pkt, 29, 0); octet_reserved_bit(log, pkt, 30, 0); octet_bit_field(log, pkt, 31, "T.6 coding", NULL, NULL); octet_bit_field(log, pkt, 32, "Extension indicator", NULL, NULL); if (!(pkt[6] & DISBIT8)) return; + /*endif*/ if (len <= 7) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 33, "\"Field not valid\" supported", NULL, NULL); if (frame_type == T30_DCS) @@ -777,6 +796,7 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 34, "Multiple selective polling", NULL, NULL); octet_bit_field(log, pkt, 35, "Polled sub-address", NULL, NULL); } + /*endif*/ octet_bit_field(log, pkt, 36, "T.43 coding", NULL, NULL); octet_bit_field(log, pkt, 37, "Plane interleave", NULL, NULL); octet_bit_field(log, pkt, 38, "Voice coding with 32kbit/s ADPCM (Rec. G.726)", NULL, NULL); @@ -784,11 +804,13 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 40, "Extension indicator", NULL, NULL); if (!(pkt[7] & DISBIT8)) return; + /*endif*/ if (len <= 8) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 41, "R8x15.4lines/mm", NULL, NULL); octet_bit_field(log, pkt, 42, "300x300pels/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 43, "R16x15.4lines/mm and/or 400x400pels/25.4mm", NULL, NULL); @@ -806,14 +828,17 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 46, "Minimum scan line time for higher resolutions", "T15.4 = 1/2 T7.7", "T15.4 = T7.7"); octet_bit_field(log, pkt, 47, "Selective polling", NULL, NULL); } + /*endif*/ octet_bit_field(log, pkt, 48, "Extension indicator", NULL, NULL); if (!(pkt[8] & DISBIT8)) return; + /*endif*/ if (len <= 9) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 49, "Sub-addressing", NULL, NULL); if (frame_type == T30_DCS) @@ -826,6 +851,7 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 50, "Password", NULL, NULL); octet_bit_field(log, pkt, 51, "Ready to transmit a data file (polling)", NULL, NULL); } + /*endif*/ octet_reserved_bit(log, pkt, 52, 0); octet_bit_field(log, pkt, 53, "Binary file transfer (BFT)", NULL, NULL); octet_bit_field(log, pkt, 54, "Document transfer mode (DTM)", NULL, NULL); @@ -833,11 +859,13 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 56, "Extension indicator", NULL, NULL); if (!(pkt[9] & DISBIT8)) return; + /*endif*/ if (len <= 10) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 57, "Basic transfer mode (BTM)", NULL, NULL); octet_reserved_bit(log, pkt, 58, 0); @@ -845,6 +873,7 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_reserved_bit(log, pkt, 59, 0); else octet_bit_field(log, pkt, 59, "Ready to transfer a character or mixed mode document (polling)", NULL, NULL); + /*endif*/ octet_bit_field(log, pkt, 60, "Character mode", NULL, NULL); octet_reserved_bit(log, pkt, 61, 0); octet_bit_field(log, pkt, 62, "Mixed mode (Annex E/T.4)", NULL, NULL); @@ -852,11 +881,13 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 64, "Extension indicator", NULL, NULL); if (!(pkt[10] & DISBIT8)) return; + /*endif*/ if (len <= 11) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 65, "Processable mode 26 (Rec. T.505)", NULL, NULL); octet_bit_field(log, pkt, 66, "Digital network capability", NULL, NULL); @@ -865,20 +896,24 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 68, "Full colour mode", NULL, NULL); else octet_bit_field(log, pkt, 68, "JPEG coding", NULL, NULL); + /*endif*/ octet_bit_field(log, pkt, 69, "Full colour mode", NULL, NULL); if (frame_type == T30_DCS) octet_bit_field(log, pkt, 70, "Preferred Huffman tables", NULL, NULL); else octet_reserved_bit(log, pkt, 70, 0); + /*endif*/ octet_bit_field(log, pkt, 71, "12bits/pel component", NULL, NULL); octet_bit_field(log, pkt, 72, "Extension indicator", NULL, NULL); if (!(pkt[11] & DISBIT8)) return; + /*endif*/ if (len <= 12) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 73, "No subsampling (1:1:1)", NULL, NULL); octet_bit_field(log, pkt, 74, "Custom illuminant", NULL, NULL); @@ -890,11 +925,13 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 80, "Extension indicator", NULL, NULL); if (!(pkt[12] & DISBIT8)) return; + /*endif*/ if (len <= 13) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 81, "HKM key management", NULL, NULL); octet_bit_field(log, pkt, 82, "RSA key management", NULL, NULL); @@ -906,11 +943,13 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 88, "Extension indicator", NULL, NULL); if (!(pkt[13] & DISBIT8)) return; + /*endif*/ if (len <= 14) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 89, "Alternative hashing system 2", NULL, NULL); octet_bit_field(log, pkt, 90, "Alternative hashing system 3", NULL, NULL); @@ -925,6 +964,7 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 97, "Colour/gray-scale 300pels/25.4mm x 300lines/25.4mm or 400pels/25.4mm x 400lines/25.4mm resolution", NULL, NULL); octet_bit_field(log, pkt, 98, "100pels/25.4mm x 100lines/25.4mm for colour/gray scale", NULL, NULL); @@ -939,16 +979,19 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 100, "Extended BFT Negotiations capable", NULL, NULL); octet_bit_field(log, pkt, 101, "Internet Selective Polling address (ISP)", NULL, NULL); } + /*endif*/ octet_bit_field(log, pkt, 102, "Internet Routing Address (IRA)", NULL, NULL); octet_reserved_bit(log, pkt, 103, 0); octet_bit_field(log, pkt, 104, "Extension indicator", NULL, NULL); if (!(pkt[15] & DISBIT8)) return; + /*endif*/ if (len <= 16) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 105, "600pels/25.4mm x 600lines/25.4mm", NULL, NULL); octet_bit_field(log, pkt, 106, "1200pels/25.4mm x 1200lines/25.4mm", NULL, NULL); @@ -960,11 +1003,13 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 112, "Extension indicator", NULL, NULL); if (!(pkt[16] & DISBIT8)) return; + /*endif*/ if (len <= 17) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 113, "Double sided printing capability (alternate mode)", NULL, NULL); octet_bit_field(log, pkt, 114, "Double sided printing capability (continuous mode)", NULL, NULL); @@ -972,17 +1017,20 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 115, "Black and white mixed raster content profile (MRCbw)", NULL, NULL); else octet_reserved_bit(log, pkt, 115, 0); + /*endif*/ octet_bit_field(log, pkt, 116, "T.45 (run length colour encoded)", NULL, NULL); octet_field(log, pkt, 117, 118, "Shared memory", shared_data_memory_capacity_tags); octet_bit_field(log, pkt, 119, "T.44 colour space", NULL, NULL); octet_bit_field(log, pkt, 120, "Extension indicator", NULL, NULL); if (!(pkt[17] & DISBIT8)) return; + /*endif*/ if (len <= 18) { span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); return; } + /*endif*/ octet_bit_field(log, pkt, 121, "Flow control capability for T.38 communication", NULL, NULL); octet_bit_field(log, pkt, 122, "K>4", NULL, NULL); @@ -992,6 +1040,7 @@ SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, in octet_bit_field(log, pkt, 128, "Extension indicator", NULL, NULL); if (!(pkt[18] & DISBIT8)) return; + /*endif*/ span_log(log, SPAN_LOG_FLOW, " Extended beyond the current T.30 specification!\n"); } diff --git a/libs/spandsp/tests/fax_tester.c b/libs/spandsp/tests/fax_tester.c index 8885957972..419fb705fa 100644 --- a/libs/spandsp/tests/fax_tester.c +++ b/libs/spandsp/tests/fax_tester.c @@ -771,8 +771,6 @@ void faxtester_set_tx_type(void *user_data, int type, int bit_rate, int short_tr s = (faxtester_state_t *) user_data; t = &s->modems; span_log(&s->logging, SPAN_LOG_FLOW, "Set tx type %d\n", type); - if (s->current_tx_type == type) - return; if (use_hdlc) { get_bit_func = (get_bit_func_t) hdlc_tx_get_bit; @@ -783,6 +781,12 @@ void faxtester_set_tx_type(void *user_data, int type, int bit_rate, int short_tr get_bit_func = non_ecm_get_bit; get_bit_user_data = (void *) s; } + if (type == s->current_tx_type) + { + if (type == T30_MODEM_PAUSE) + silence_gen_alter(&t->silence_gen, ms_to_samples(short_train)); + return; + } switch (type) { case T30_MODEM_PAUSE: @@ -1314,6 +1318,8 @@ SPAN_DECLARE(int) faxtester_next_step(faxtester_state_t *s) else if (strcasecmp((const char *) parms.type, "CLEAR") == 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Far end should drop the call\n"); + faxtester_set_rx_type(s, T30_MODEM_NONE, 0, false, false); + faxtester_set_tx_type(s, T30_MODEM_PAUSE, 0, s->timeout_x, false); s->test_for_call_clear = true; s->call_clear_timer = 0; } @@ -1648,6 +1654,8 @@ SPAN_DECLARE(int) faxtester_next_step(faxtester_state_t *s) else if (strcasecmp((const char *) parms.type, "CLEAR") == 0) { span_log(&s->logging, SPAN_LOG_FLOW, "Time to drop the call\n"); + faxtester_set_rx_type(s, T30_MODEM_NONE, 0, false, false); + faxtester_set_tx_type(s, T30_MODEM_PAUSE, 0, s->timeout_x, false); t30_terminate(s->far_t30); free_node_parms(&parms); return 0; diff --git a/libs/spandsp/tests/tsb85_extra_tests.sh b/libs/spandsp/tests/tsb85_extra_tests.sh index d7a3b08d40..25f7ab77ab 100755 --- a/libs/spandsp/tests/tsb85_extra_tests.sh +++ b/libs/spandsp/tests/tsb85_extra_tests.sh @@ -28,7 +28,7 @@ run_tsb85_test() fi } -for TEST in PPS-MPS-lost-PPS V17-12000-V29-9600 Phase-D-collision Modem-change-at-CTC ECM-DCN-clipped Non-ECM-DCN-clipped Tx-EOP-echo Tx-PPS-echo +for TEST in PPS-MPS-lost-PPS V17-12000-V29-9600 Phase-D-collision Modem-change-at-CTC ECM-DCN-clipped Non-ECM-DCN-clipped Tx-EOP-echo Tx-PPS-echo Invalid-signalling-rate No-caller-response No-answerer-response do run_tsb85_test done