Mercurial > hg > audiostuff
comparison spandsp-0.0.6pre17/src/t30_logging.c @ 4:26cd8f1ef0b1
import spandsp-0.0.6pre17
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
|---|---|
| date | Fri, 25 Jun 2010 15:50:58 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 3:c6c5a16ce2f2 | 4:26cd8f1ef0b1 |
|---|---|
| 1 /* | |
| 2 * SpanDSP - a series of DSP components for telephony | |
| 3 * | |
| 4 * t30_logging.c - ITU T.30 FAX transfer processing | |
| 5 * | |
| 6 * Written by Steve Underwood <steveu@coppice.org> | |
| 7 * | |
| 8 * Copyright (C) 2003, 2004, 2005, 2006, 2007 Steve Underwood | |
| 9 * | |
| 10 * All rights reserved. | |
| 11 * | |
| 12 * This program is free software; you can redistribute it and/or modify | |
| 13 * it under the terms of the GNU Lesser General Public License version 2.1, | |
| 14 * as published by the Free Software Foundation. | |
| 15 * | |
| 16 * This program is distributed in the hope that it will be useful, | |
| 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 19 * GNU Lesser General Public License for more details. | |
| 20 * | |
| 21 * You should have received a copy of the GNU Lesser General Public | |
| 22 * License along with this program; if not, write to the Free Software | |
| 23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 24 * | |
| 25 * $Id: t30_logging.c,v 1.12.4.2 2009/12/19 10:44:10 steveu Exp $ | |
| 26 */ | |
| 27 | |
| 28 /*! \file */ | |
| 29 | |
| 30 #if defined(HAVE_CONFIG_H) | |
| 31 #include "config.h" | |
| 32 #endif | |
| 33 | |
| 34 #include <stdlib.h> | |
| 35 #include <stdio.h> | |
| 36 #include <inttypes.h> | |
| 37 #include <string.h> | |
| 38 #include <fcntl.h> | |
| 39 #include <time.h> | |
| 40 #if defined(HAVE_TGMATH_H) | |
| 41 #include <tgmath.h> | |
| 42 #endif | |
| 43 #if defined(HAVE_MATH_H) | |
| 44 #include <math.h> | |
| 45 #endif | |
| 46 #include "floating_fudge.h" | |
| 47 #include <tiffio.h> | |
| 48 | |
| 49 #include "spandsp/telephony.h" | |
| 50 #include "spandsp/logging.h" | |
| 51 #include "spandsp/bit_operations.h" | |
| 52 #include "spandsp/queue.h" | |
| 53 #include "spandsp/power_meter.h" | |
| 54 #include "spandsp/complex.h" | |
| 55 #include "spandsp/tone_generate.h" | |
| 56 #include "spandsp/async.h" | |
| 57 #include "spandsp/hdlc.h" | |
| 58 #include "spandsp/fsk.h" | |
| 59 #include "spandsp/v29rx.h" | |
| 60 #include "spandsp/v29tx.h" | |
| 61 #include "spandsp/v27ter_rx.h" | |
| 62 #include "spandsp/v27ter_tx.h" | |
| 63 #include "spandsp/t4_rx.h" | |
| 64 #include "spandsp/t4_tx.h" | |
| 65 #include "spandsp/t30_fcf.h" | |
| 66 #include "spandsp/t35.h" | |
| 67 #include "spandsp/t30.h" | |
| 68 #include "spandsp/t30_logging.h" | |
| 69 | |
| 70 #include "spandsp/private/logging.h" | |
| 71 #include "spandsp/private/t4_rx.h" | |
| 72 #include "spandsp/private/t4_tx.h" | |
| 73 #include "spandsp/private/t30.h" | |
| 74 | |
| 75 #include "t30_local.h" | |
| 76 | |
| 77 /*! Value string pair structure */ | |
| 78 typedef struct | |
| 79 { | |
| 80 int val; | |
| 81 const char *str; | |
| 82 } value_string_t; | |
| 83 | |
| 84 enum | |
| 85 { | |
| 86 DISBIT1 = 0x01, | |
| 87 DISBIT2 = 0x02, | |
| 88 DISBIT3 = 0x04, | |
| 89 DISBIT4 = 0x08, | |
| 90 DISBIT5 = 0x10, | |
| 91 DISBIT6 = 0x20, | |
| 92 DISBIT7 = 0x40, | |
| 93 DISBIT8 = 0x80 | |
| 94 }; | |
| 95 | |
| 96 SPAN_DECLARE(const char *) t30_completion_code_to_str(int result) | |
| 97 { | |
| 98 switch (result) | |
| 99 { | |
| 100 case T30_ERR_OK: | |
| 101 return "OK"; | |
| 102 case T30_ERR_CEDTONE: | |
| 103 return "The CED tone exceeded 5s"; | |
| 104 case T30_ERR_T0_EXPIRED: | |
| 105 return "Timed out waiting for initial communication"; | |
| 106 case T30_ERR_T1_EXPIRED: | |
| 107 return "Timed out waiting for the first message"; | |
| 108 case T30_ERR_T3_EXPIRED: | |
| 109 return "Timed out waiting for procedural interrupt"; | |
| 110 case T30_ERR_HDLC_CARRIER: | |
| 111 return "The HDLC carrier did not stop in a timely manner"; | |
| 112 case T30_ERR_CANNOT_TRAIN: | |
| 113 return "Failed to train with any of the compatible modems"; | |
| 114 case T30_ERR_OPER_INT_FAIL: | |
| 115 return "Operator intervention failed"; | |
| 116 case T30_ERR_INCOMPATIBLE: | |
| 117 return "Far end is not compatible"; | |
| 118 case T30_ERR_RX_INCAPABLE: | |
| 119 return "Far end is not able to receive"; | |
| 120 case T30_ERR_TX_INCAPABLE: | |
| 121 return "Far end is not able to transmit"; | |
| 122 case T30_ERR_NORESSUPPORT: | |
| 123 return "Far end cannot receive at the resolution of the image"; | |
| 124 case T30_ERR_NOSIZESUPPORT: | |
| 125 return "Far end cannot receive at the size of image"; | |
| 126 case T30_ERR_UNEXPECTED: | |
| 127 return "Unexpected message received"; | |
| 128 case T30_ERR_TX_BADDCS: | |
| 129 return "Received bad response to DCS or training"; | |
| 130 case T30_ERR_TX_BADPG: | |
| 131 return "Received a DCN from remote after sending a page"; | |
| 132 case T30_ERR_TX_ECMPHD: | |
| 133 return "Invalid ECM response received from receiver"; | |
| 134 case T30_ERR_TX_GOTDCN: | |
| 135 return "Received a DCN while waiting for a DIS"; | |
| 136 case T30_ERR_TX_INVALRSP: | |
| 137 return "Invalid response after sending a page"; | |
| 138 case T30_ERR_TX_NODIS: | |
| 139 return "Received other than DIS while waiting for DIS"; | |
| 140 case T30_ERR_TX_PHBDEAD: | |
| 141 return "Received no response to DCS or TCF"; | |
| 142 case T30_ERR_TX_PHDDEAD: | |
| 143 return "No response after sending a page"; | |
| 144 case T30_ERR_TX_T5EXP: | |
| 145 return "Timed out waiting for receiver ready (ECM mode)"; | |
| 146 case T30_ERR_RX_ECMPHD: | |
| 147 return "Invalid ECM response received from transmitter"; | |
| 148 case T30_ERR_RX_GOTDCS: | |
| 149 return "DCS received while waiting for DTC"; | |
| 150 case T30_ERR_RX_INVALCMD: | |
| 151 return "Unexpected command after page received"; | |
| 152 case T30_ERR_RX_NOCARRIER: | |
| 153 return "Carrier lost during fax receive"; | |
| 154 case T30_ERR_RX_NOEOL: | |
| 155 return "Timed out while waiting for EOL (end Of line)"; | |
| 156 case T30_ERR_RX_NOFAX: | |
| 157 return "Timed out while waiting for first line"; | |
| 158 case T30_ERR_RX_T2EXPDCN: | |
| 159 return "Timer T2 expired while waiting for DCN"; | |
| 160 case T30_ERR_RX_T2EXPD: | |
| 161 return "Timer T2 expired while waiting for phase D"; | |
| 162 case T30_ERR_RX_T2EXPFAX: | |
| 163 return "Timer T2 expired while waiting for fax page"; | |
| 164 case T30_ERR_RX_T2EXPMPS: | |
| 165 return "Timer T2 expired while waiting for next fax page"; | |
| 166 case T30_ERR_RX_T2EXPRR: | |
| 167 return "Timer T2 expired while waiting for RR command"; | |
| 168 case T30_ERR_RX_T2EXP: | |
| 169 return "Timer T2 expired while waiting for NSS, DCS or MCF"; | |
| 170 case T30_ERR_RX_DCNWHY: | |
| 171 return "Unexpected DCN while waiting for DCS or DIS"; | |
| 172 case T30_ERR_RX_DCNDATA: | |
| 173 return "Unexpected DCN while waiting for image data"; | |
| 174 case T30_ERR_RX_DCNFAX: | |
| 175 return "Unexpected DCN while waiting for EOM, EOP or MPS"; | |
| 176 case T30_ERR_RX_DCNPHD: | |
| 177 return "Unexpected DCN after EOM or MPS sequence"; | |
| 178 case T30_ERR_RX_DCNRRD: | |
| 179 return "Unexpected DCN after RR/RNR sequence"; | |
| 180 case T30_ERR_RX_DCNNORTN: | |
| 181 return "Unexpected DCN after requested retransmission"; | |
| 182 case T30_ERR_FILEERROR: | |
| 183 return "TIFF/F file cannot be opened"; | |
| 184 case T30_ERR_NOPAGE: | |
| 185 return "TIFF/F page not found"; | |
| 186 case T30_ERR_BADTIFF: | |
| 187 return "TIFF/F format is not compatible"; | |
| 188 case T30_ERR_BADPAGE: | |
| 189 return "TIFF/F page number tag missing"; | |
| 190 case T30_ERR_BADTAG: | |
| 191 return "Incorrect values for TIFF/F tags"; | |
| 192 case T30_ERR_BADTIFFHDR: | |
| 193 return "Bad TIFF/F header - incorrect values in fields"; | |
| 194 case T30_ERR_NOMEM: | |
| 195 return "Cannot allocate memory for more pages"; | |
| 196 case T30_ERR_RETRYDCN: | |
| 197 return "Disconnected after permitted retries"; | |
| 198 case T30_ERR_CALLDROPPED: | |
| 199 return "The call dropped prematurely"; | |
| 200 case T30_ERR_NOPOLL: | |
| 201 return "Poll not accepted"; | |
| 202 case T30_ERR_IDENT_UNACCEPTABLE: | |
| 203 return "Ident not accepted"; | |
| 204 case T30_ERR_PSA_UNACCEPTABLE: | |
| 205 return "Polled sub-address not accepted"; | |
| 206 case T30_ERR_SEP_UNACCEPTABLE: | |
| 207 return "Selective polling address not accepted"; | |
| 208 case T30_ERR_SID_UNACCEPTABLE: | |
| 209 return "Sender identification not accepted"; | |
| 210 case T30_ERR_PWD_UNACCEPTABLE: | |
| 211 return "Password not accepted"; | |
| 212 case T30_ERR_SUB_UNACCEPTABLE: | |
| 213 return "Sub-address not accepted"; | |
| 214 case T30_ERR_TSA_UNACCEPTABLE: | |
| 215 return "Transmitting subscriber internet address not accepted"; | |
| 216 case T30_ERR_IRA_UNACCEPTABLE: | |
| 217 return "Internet routing address not accepted"; | |
| 218 case T30_ERR_CIA_UNACCEPTABLE: | |
| 219 return "Calling subscriber internet address not accepted"; | |
| 220 case T30_ERR_ISP_UNACCEPTABLE: | |
| 221 return "Internet selective polling address not accepted"; | |
| 222 case T30_ERR_CSA_UNACCEPTABLE: | |
| 223 return "Called subscriber internet address not accepted"; | |
| 224 } | |
| 225 return "???"; | |
| 226 } | |
| 227 /*- End of function --------------------------------------------------------*/ | |
| 228 | |
| 229 SPAN_DECLARE(const char *) t30_frametype(uint8_t x) | |
| 230 { | |
| 231 switch (x) | |
| 232 { | |
| 233 case T30_DIS: | |
| 234 return "DIS"; | |
| 235 case T30_CSI: | |
| 236 return "CSI"; | |
| 237 case T30_NSF: | |
| 238 return "NSF"; | |
| 239 case T30_DTC: | |
| 240 return "DTC"; | |
| 241 case T30_CIG: | |
| 242 return "CIG"; | |
| 243 case T30_NSC: | |
| 244 return "NSC"; | |
| 245 case T30_PWD: | |
| 246 return "PWD"; | |
| 247 case T30_SEP: | |
| 248 return "SEP"; | |
| 249 case T30_PSA: | |
| 250 return "PSA"; | |
| 251 case T30_CIA: | |
| 252 return "CIA"; | |
| 253 case T30_ISP: | |
| 254 return "ISP"; | |
| 255 case T30_DCS: | |
| 256 case T30_DCS | 0x01: | |
| 257 return "DCS"; | |
| 258 case T30_TSI: | |
| 259 case T30_TSI | 0x01: | |
| 260 return "TSI"; | |
| 261 case T30_NSS: | |
| 262 case T30_NSS | 0x01: | |
| 263 return "NSS"; | |
| 264 case T30_SUB: | |
| 265 case T30_SUB | 0x01: | |
| 266 return "SUB"; | |
| 267 case T30_SID: | |
| 268 case T30_SID | 0x01: | |
| 269 return "SID"; | |
| 270 case T30_CTC: | |
| 271 case T30_CTC | 0x01: | |
| 272 return "CTC"; | |
| 273 case T30_TSA: | |
| 274 case T30_TSA | 0x01: | |
| 275 return "TSA"; | |
| 276 case T30_IRA: | |
| 277 case T30_IRA | 0x01: | |
| 278 return "IRA"; | |
| 279 case T30_CFR: | |
| 280 case T30_CFR | 0x01: | |
| 281 return "CFR"; | |
| 282 case T30_FTT: | |
| 283 case T30_FTT | 0x01: | |
| 284 return "FTT"; | |
| 285 case T30_CTR: | |
| 286 case T30_CTR | 0x01: | |
| 287 return "CTR"; | |
| 288 case T30_CSA: | |
| 289 case T30_CSA | 0x01: | |
| 290 return "CSA"; | |
| 291 case T30_EOM: | |
| 292 case T30_EOM | 0x01: | |
| 293 return "EOM"; | |
| 294 case T30_MPS: | |
| 295 case T30_MPS | 0x01: | |
| 296 return "MPS"; | |
| 297 case T30_EOP: | |
| 298 case T30_EOP | 0x01: | |
| 299 return "EOP"; | |
| 300 case T30_PRI_EOM: | |
| 301 case T30_PRI_EOM | 0x01: | |
| 302 return "PRI-EOM"; | |
| 303 case T30_PRI_MPS: | |
| 304 case T30_PRI_MPS | 0x01: | |
| 305 return "PRI-MPS"; | |
| 306 case T30_PRI_EOP: | |
| 307 case T30_PRI_EOP | 0x01: | |
| 308 return "PRI-EOP"; | |
| 309 case T30_EOS: | |
| 310 case T30_EOS | 0x01: | |
| 311 return "EOS"; | |
| 312 case T30_PPS: | |
| 313 case T30_PPS | 0x01: | |
| 314 return "PPS"; | |
| 315 case T30_EOR: | |
| 316 case T30_EOR | 0x01: | |
| 317 return "EOR"; | |
| 318 case T30_RR: | |
| 319 case T30_RR | 0x01: | |
| 320 return "RR"; | |
| 321 case T30_MCF: | |
| 322 case T30_MCF | 0x01: | |
| 323 return "MCF"; | |
| 324 case T30_RTP: | |
| 325 case T30_RTP | 0x01: | |
| 326 return "RTP"; | |
| 327 case T30_RTN: | |
| 328 case T30_RTN | 0x01: | |
| 329 return "RTN"; | |
| 330 case T30_PIP: | |
| 331 case T30_PIP | 0x01: | |
| 332 return "PIP"; | |
| 333 case T30_PIN: | |
| 334 case T30_PIN | 0x01: | |
| 335 return "PIN"; | |
| 336 case T30_PPR: | |
| 337 case T30_PPR | 0x01: | |
| 338 return "PPR"; | |
| 339 case T30_RNR: | |
| 340 case T30_RNR | 0x01: | |
| 341 return "RNR"; | |
| 342 case T30_ERR: | |
| 343 case T30_ERR | 0x01: | |
| 344 return "ERR"; | |
| 345 case T30_FDM: | |
| 346 case T30_FDM | 0x01: | |
| 347 return "FDM"; | |
| 348 case T30_DCN: | |
| 349 case T30_DCN | 0x01: | |
| 350 return "DCN"; | |
| 351 case T30_CRP: | |
| 352 case T30_CRP | 0x01: | |
| 353 return "CRP"; | |
| 354 case T30_FNV: | |
| 355 case T30_FNV | 0x01: | |
| 356 return "FNV"; | |
| 357 case T30_TNR: | |
| 358 case T30_TNR | 0x01: | |
| 359 return "TNR"; | |
| 360 case T30_TR: | |
| 361 case T30_TR | 0x01: | |
| 362 return "TR"; | |
| 363 case T30_TK: | |
| 364 return "TK"; | |
| 365 case T30_RK: | |
| 366 return "RK"; | |
| 367 #if 0 | |
| 368 case T30_PSS: | |
| 369 return "PSS"; | |
| 370 #endif | |
| 371 case T30_DES: | |
| 372 return "DES"; | |
| 373 case T30_DEC: | |
| 374 return "DEC"; | |
| 375 case T30_DER: | |
| 376 return "DER"; | |
| 377 #if 0 | |
| 378 case T30_DTR: | |
| 379 return "DTR"; | |
| 380 #endif | |
| 381 case T30_DNK: | |
| 382 case T30_DNK | 0x01: | |
| 383 return "DNK"; | |
| 384 case T30_PID: | |
| 385 case T30_PID | 0x01: | |
| 386 return "PID"; | |
| 387 case T30_NULL: | |
| 388 return "NULL"; | |
| 389 case T4_FCD: | |
| 390 return "FCD"; | |
| 391 case T4_RCP: | |
| 392 return "RCP"; | |
| 393 } | |
| 394 return "???"; | |
| 395 } | |
| 396 /*- End of function --------------------------------------------------------*/ | |
| 397 | |
| 398 static void octet_reserved_bit(logging_state_t *log, | |
| 399 const uint8_t *msg, | |
| 400 int bit_no, | |
| 401 int expected) | |
| 402 { | |
| 403 char s[10] = ".... ...."; | |
| 404 int bit; | |
| 405 uint8_t octet; | |
| 406 | |
| 407 /* Break out the octet and the bit number within it. */ | |
| 408 octet = msg[((bit_no - 1) >> 3) + 3]; | |
| 409 bit_no = (bit_no - 1) & 7; | |
| 410 /* Now get the actual bit. */ | |
| 411 bit = (octet >> bit_no) & 1; | |
| 412 /* Is it what it should be. */ | |
| 413 if (bit ^ expected) | |
| 414 { | |
| 415 /* Only log unexpected values. */ | |
| 416 s[7 - bit_no + ((bit_no < 4) ? 1 : 0)] = (uint8_t) (bit + '0'); | |
| 417 span_log(log, SPAN_LOG_FLOW, " %s= Unexpected state for reserved bit: %d\n", s, bit); | |
| 418 } | |
| 419 } | |
| 420 /*- End of function --------------------------------------------------------*/ | |
| 421 | |
| 422 static void octet_bit_field(logging_state_t *log, | |
| 423 const uint8_t *msg, | |
| 424 int bit_no, | |
| 425 const char *desc, | |
| 426 const char *yeah, | |
| 427 const char *neigh) | |
| 428 { | |
| 429 char s[10] = ".... ...."; | |
| 430 int bit; | |
| 431 uint8_t octet; | |
| 432 const char *tag; | |
| 433 | |
| 434 /* Break out the octet and the bit number within it. */ | |
| 435 octet = msg[((bit_no - 1) >> 3) + 3]; | |
| 436 bit_no = (bit_no - 1) & 7; | |
| 437 /* Now get the actual bit. */ | |
| 438 bit = (octet >> bit_no) & 1; | |
| 439 /* Edit the bit string for display. */ | |
| 440 s[7 - bit_no + ((bit_no < 4) ? 1 : 0)] = (uint8_t) (bit + '0'); | |
| 441 /* Find the right tag to display. */ | |
| 442 if (bit) | |
| 443 { | |
| 444 if ((tag = yeah) == NULL) | |
| 445 tag = "Set"; | |
| 446 } | |
| 447 else | |
| 448 { | |
| 449 if ((tag = neigh) == NULL) | |
| 450 tag = "Not set"; | |
| 451 } | |
| 452 /* Eh, voila! */ | |
| 453 span_log(log, SPAN_LOG_FLOW, " %s= %s: %s\n", s, desc, tag); | |
| 454 } | |
| 455 /*- End of function --------------------------------------------------------*/ | |
| 456 | |
| 457 static void octet_field(logging_state_t *log, | |
| 458 const uint8_t *msg, | |
| 459 int start, | |
| 460 int end, | |
| 461 const char *desc, | |
| 462 const value_string_t tags[]) | |
| 463 { | |
| 464 char s[10] = ".... ...."; | |
| 465 int i; | |
| 466 uint8_t octet; | |
| 467 const char *tag; | |
| 468 | |
| 469 /* Break out the octet and the bit number range within it. */ | |
| 470 octet = msg[((start - 1) >> 3) + 3]; | |
| 471 start = (start - 1) & 7; | |
| 472 end = ((end - 1) & 7) + 1; | |
| 473 | |
| 474 /* Edit the bit string for display. */ | |
| 475 for (i = start; i < end; i++) | |
| 476 s[7 - i + ((i < 4) ? 1 : 0)] = (uint8_t) ((octet >> i) & 1) + '0'; | |
| 477 | |
| 478 /* Find the right tag to display. */ | |
| 479 octet = (uint8_t) ((octet >> start) & ((0xFF + (1 << (end - start))) & 0xFF)); | |
| 480 tag = "Invalid"; | |
| 481 for (i = 0; tags[i].str; i++) | |
| 482 { | |
| 483 if (octet == tags[i].val) | |
| 484 { | |
| 485 tag = tags[i].str; | |
| 486 break; | |
| 487 } | |
| 488 } | |
| 489 /* Eh, voila! */ | |
| 490 span_log(log, SPAN_LOG_FLOW, " %s= %s: %s\n", s, desc, tag); | |
| 491 } | |
| 492 /*- End of function --------------------------------------------------------*/ | |
| 493 | |
| 494 SPAN_DECLARE(void) t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *pkt, int len) | |
| 495 { | |
| 496 logging_state_t *log; | |
| 497 uint8_t frame_type; | |
| 498 static const value_string_t available_signalling_rate_tags[] = | |
| 499 { | |
| 500 { 0x00, "V.27 ter fall-back mode" }, | |
| 501 { 0x01, "V.29" }, | |
| 502 { 0x02, "V.27 ter" }, | |
| 503 { 0x03, "V.27 ter and V.29" }, | |
| 504 { 0x0B, "V.27 ter, V.29, and V.17" }, | |
| 505 { 0x06, "Reserved" }, | |
| 506 { 0x0A, "Reserved" }, | |
| 507 { 0x0E, "Reserved" }, | |
| 508 { 0x0F, "Reserved" }, | |
| 509 { 0x04, "Not used" }, | |
| 510 { 0x05, "Not used" }, | |
| 511 { 0x08, "Not used" }, | |
| 512 { 0x09, "Not used" }, | |
| 513 { 0x0C, "Not used" }, | |
| 514 { 0x0D, "Not used" }, | |
| 515 { 0x00, NULL } | |
| 516 }; | |
| 517 static const value_string_t selected_signalling_rate_tags[] = | |
| 518 { | |
| 519 { 0x00, "V.27ter 2400bps" }, | |
| 520 { 0x01, "V.29, 9600bps" }, | |
| 521 { 0x02, "V.27ter 4800bps" }, | |
| 522 { 0x03, "V.29 7200bps" }, | |
| 523 { 0x08, "V.17 14400bps" }, | |
| 524 { 0x09, "V.17 9600bps" }, | |
| 525 { 0x0A, "V.17 12000bps" }, | |
| 526 { 0x0B, "V.17 7200bps" }, | |
| 527 { 0x05, "Reserved" }, | |
| 528 { 0x07, "Reserved" }, | |
| 529 { 0x0C, "Reserved" }, | |
| 530 { 0x0D, "Reserved" }, | |
| 531 { 0x0E, "Reserved" }, | |
| 532 { 0x0F, "Reserved" }, | |
| 533 { 0x00, NULL } | |
| 534 }; | |
| 535 static const value_string_t available_scan_line_length_tags[] = | |
| 536 { | |
| 537 { 0x00, "215mm +- 1%" }, | |
| 538 { 0x01, "215mm +- 1% and 255mm +- 1%" }, | |
| 539 { 0x02, "215mm +- 1%, 255mm +- 1% and 303mm +- 1%" }, | |
| 540 { 0x00, NULL } | |
| 541 }; | |
| 542 static const value_string_t selected_scan_line_length_tags[] = | |
| 543 { | |
| 544 { 0x00, "215mm +- 1%" }, | |
| 545 { 0x01, "255mm +- 1%" }, | |
| 546 { 0x02, "303mm +- 1%" }, | |
| 547 { 0x00, NULL } | |
| 548 }; | |
| 549 static const value_string_t available_recording_length_tags[] = | |
| 550 { | |
| 551 { 0x00, "A4 (297mm)" }, | |
| 552 { 0x01, "A4 (297mm) and B4 (364mm)" }, | |
| 553 { 0x02, "Unlimited" }, | |
| 554 { 0x00, NULL } | |
| 555 }; | |
| 556 static const value_string_t selected_recording_length_tags[] = | |
| 557 { | |
| 558 { 0x00, "A4 (297mm)" }, | |
| 559 { 0x01, "B4 (364mm)" }, | |
| 560 { 0x02, "Unlimited" }, | |
| 561 { 0x00, NULL } | |
| 562 }; | |
| 563 static const value_string_t available_minimum_scan_line_time_tags[] = | |
| 564 { | |
| 565 { 0x00, "20ms at 3.85 l/mm; T7.7 = T3.85" }, | |
| 566 { 0x01, "5ms at 3.85 l/mm; T7.7 = T3.85" }, | |
| 567 { 0x02, "10ms at 3.85 l/mm; T7.7 = T3.85" }, | |
| 568 { 0x03, "20ms at 3.85 l/mm; T7.7 = 1/2 T3.85" }, | |
| 569 { 0x04, "40ms at 3.85 l/mm; T7.7 = T3.85" }, | |
| 570 { 0x05, "40ms at 3.85 l/mm; T7.7 = 1/2 T3.85" }, | |
| 571 { 0x06, "10ms at 3.85 l/mm; T7.7 = 1/2 T3.85" }, | |
| 572 { 0x07, "0ms at 3.85 l/mm; T7.7 = T3.85" }, | |
| 573 { 0x00, NULL } | |
| 574 }; | |
| 575 static const value_string_t selected_minimum_scan_line_time_tags[] = | |
| 576 { | |
| 577 { 0x00, "20ms" }, | |
| 578 { 0x01, "5ms" }, | |
| 579 { 0x02, "10ms" }, | |
| 580 { 0x04, "40ms" }, | |
| 581 { 0x07, "0ms" }, | |
| 582 { 0x00, NULL } | |
| 583 }; | |
| 584 static const value_string_t shared_data_memory_capacity_tags[] = | |
| 585 { | |
| 586 { 0x00, "Not available" }, | |
| 587 { 0x01, "Level 2 = 2.0 Mbytes" }, | |
| 588 { 0x02, "Level 1 = 1.0 Mbytes" }, | |
| 589 { 0x03, "Level 3 = unlimited (i.e. >= 32 Mbytes)" }, | |
| 590 { 0x00, NULL } | |
| 591 }; | |
| 592 static const value_string_t t89_profile_tags[] = | |
| 593 { | |
| 594 { 0x00, "Not used" }, | |
| 595 { 0x01, "Profiles 2 and 3" }, | |
| 596 { 0x02, "Profile 2" }, | |
| 597 { 0x04, "Profile 1" }, | |
| 598 { 0x06, "Profile 3" }, | |
| 599 { 0x03, "Reserved" }, | |
| 600 { 0x05, "Reserved" }, | |
| 601 { 0x07, "Reserved" }, | |
| 602 { 0x00, NULL } | |
| 603 }; | |
| 604 static const value_string_t t44_mixed_raster_content_tags[] = | |
| 605 { | |
| 606 { 0x00, "0" }, | |
| 607 { 0x01, "1" }, | |
| 608 { 0x02, "2" }, | |
| 609 { 0x32, "3" }, | |
| 610 { 0x04, "4" }, | |
| 611 { 0x05, "5" }, | |
| 612 { 0x06, "6" }, | |
| 613 { 0x07, "7" }, | |
| 614 { 0x00, NULL } | |
| 615 }; | |
| 616 | |
| 617 if (!span_log_test(&s->logging, SPAN_LOG_FLOW)) | |
| 618 return; | |
| 619 frame_type = pkt[2] & 0xFE; | |
| 620 log = &s->logging; | |
| 621 if (len <= 2) | |
| 622 { | |
| 623 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 624 return; | |
| 625 } | |
| 626 | |
| 627 span_log(log, SPAN_LOG_FLOW, "%s:\n", t30_frametype(pkt[2])); | |
| 628 if (len <= 3) | |
| 629 { | |
| 630 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 631 return; | |
| 632 } | |
| 633 octet_bit_field(log, pkt, 1, "Store and forward Internet fax (T.37)", NULL, NULL); | |
| 634 octet_reserved_bit(log, pkt, 2, 0); | |
| 635 octet_bit_field(log, pkt, 3, "Real-time Internet fax (T.38)", NULL, NULL); | |
| 636 octet_bit_field(log, pkt, 4, "3G mobile network", NULL, NULL); | |
| 637 octet_reserved_bit(log, pkt, 5, 0); | |
| 638 if (frame_type == T30_DCS) | |
| 639 { | |
| 640 octet_reserved_bit(log, pkt, 6, 0); | |
| 641 octet_reserved_bit(log, pkt, 7, 0); | |
| 642 } | |
| 643 else | |
| 644 { | |
| 645 octet_bit_field(log, pkt, 6, "V.8 capabilities", NULL, NULL); | |
| 646 octet_bit_field(log, pkt, 7, "Preferred octets", "64 octets", "256 octets"); | |
| 647 } | |
| 648 octet_reserved_bit(log, pkt, 8, 0); | |
| 649 if (len <= 4) | |
| 650 { | |
| 651 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 652 return; | |
| 653 } | |
| 654 | |
| 655 if (frame_type == T30_DCS) | |
| 656 { | |
| 657 octet_reserved_bit(log, pkt, 9, 0); | |
| 658 octet_bit_field(log, pkt, 10, "Receive fax", NULL, NULL); | |
| 659 octet_field(log, pkt, 11, 14, "Selected data signalling rate", selected_signalling_rate_tags); | |
| 660 } | |
| 661 else | |
| 662 { | |
| 663 octet_bit_field(log, pkt, 9, "Ready to transmit a fax document (polling)", NULL, NULL); | |
| 664 octet_bit_field(log, pkt, 10, "Can receive fax", NULL, NULL); | |
| 665 octet_field(log, pkt, 11, 14, "Supported data signalling rates", available_signalling_rate_tags); | |
| 666 } | |
| 667 octet_bit_field(log, pkt, 15, "R8x7.7lines/mm and/or 200x200pels/25.4mm", NULL, NULL); | |
| 668 octet_bit_field(log, pkt, 16, "2-D coding", NULL, NULL); | |
| 669 if (len <= 5) | |
| 670 { | |
| 671 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 672 return; | |
| 673 } | |
| 674 | |
| 675 if (frame_type == T30_DCS) | |
| 676 { | |
| 677 octet_field(log, pkt, 17, 18, "Recording width", selected_scan_line_length_tags); | |
| 678 octet_field(log, pkt, 19, 20, "Recording length", selected_recording_length_tags); | |
| 679 octet_field(log, pkt, 21, 23, "Minimum scan line time", selected_minimum_scan_line_time_tags); | |
| 680 } | |
| 681 else | |
| 682 { | |
| 683 octet_field(log, pkt, 17, 18, "Recording width", available_scan_line_length_tags); | |
| 684 octet_field(log, pkt, 19, 20, "Recording length", available_recording_length_tags); | |
| 685 octet_field(log, pkt, 21, 23, "Receiver's minimum scan line time", available_minimum_scan_line_time_tags); | |
| 686 } | |
| 687 octet_bit_field(log, pkt, 24, "Extension indicator", NULL, NULL); | |
| 688 if (!(pkt[5] & DISBIT8)) | |
| 689 return; | |
| 690 if (len <= 6) | |
| 691 { | |
| 692 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 693 return; | |
| 694 } | |
| 695 | |
| 696 octet_reserved_bit(log, pkt, 25, 0); | |
| 697 octet_bit_field(log, pkt, 26, "Compressed/uncompressed mode", "Uncompressed", "Compressed"); | |
| 698 octet_bit_field(log, pkt, 27, "Error correction mode (ECM)", "ECM", "Non-ECM"); | |
| 699 if (frame_type == T30_DCS) | |
| 700 octet_bit_field(log, pkt, 28, "Frame size", "64 octets", "256 octets"); | |
| 701 else | |
| 702 octet_reserved_bit(log, pkt, 28, 0); | |
| 703 octet_reserved_bit(log, pkt, 29, 0); | |
| 704 octet_reserved_bit(log, pkt, 30, 0); | |
| 705 octet_bit_field(log, pkt, 31, "T.6 coding", NULL, NULL); | |
| 706 octet_bit_field(log, pkt, 32, "Extension indicator", NULL, NULL); | |
| 707 if (!(pkt[6] & DISBIT8)) | |
| 708 return; | |
| 709 if (len <= 7) | |
| 710 { | |
| 711 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 712 return; | |
| 713 } | |
| 714 | |
| 715 octet_bit_field(log, pkt, 33, "\"Field not valid\" supported", NULL, NULL); | |
| 716 if (frame_type == T30_DCS) | |
| 717 { | |
| 718 octet_reserved_bit(log, pkt, 34, 0); | |
| 719 octet_reserved_bit(log, pkt, 35, 0); | |
| 720 } | |
| 721 else | |
| 722 { | |
| 723 octet_bit_field(log, pkt, 34, "Multiple selective polling", NULL, NULL); | |
| 724 octet_bit_field(log, pkt, 35, "Polled sub-address", NULL, NULL); | |
| 725 } | |
| 726 octet_bit_field(log, pkt, 36, "T.43 coding", NULL, NULL); | |
| 727 octet_bit_field(log, pkt, 37, "Plane interleave", NULL, NULL); | |
| 728 octet_bit_field(log, pkt, 38, "Voice coding with 32kbit/s ADPCM (Rec. G.726)", NULL, NULL); | |
| 729 octet_bit_field(log, pkt, 39, "Reserved for the use of extended voice coding set", NULL, NULL); | |
| 730 octet_bit_field(log, pkt, 40, "Extension indicator", NULL, NULL); | |
| 731 if (!(pkt[7] & DISBIT8)) | |
| 732 return; | |
| 733 if (len <= 8) | |
| 734 { | |
| 735 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 736 return; | |
| 737 } | |
| 738 octet_bit_field(log, pkt, 41, "R8x15.4lines/mm", NULL, NULL); | |
| 739 octet_bit_field(log, pkt, 42, "300x300pels/25.4mm", NULL, NULL); | |
| 740 octet_bit_field(log, pkt, 43, "R16x15.4lines/mm and/or 400x400pels/25.4mm", NULL, NULL); | |
| 741 if (frame_type == T30_DCS) | |
| 742 { | |
| 743 octet_bit_field(log, pkt, 44, "Resolution type selection", "Inch", "Metric"); | |
| 744 octet_reserved_bit(log, pkt, 45, 0); | |
| 745 octet_reserved_bit(log, pkt, 46, 0); | |
| 746 octet_reserved_bit(log, pkt, 47, 0); | |
| 747 } | |
| 748 else | |
| 749 { | |
| 750 octet_bit_field(log, pkt, 44, "Inch-based resolution preferred", NULL, NULL); | |
| 751 octet_bit_field(log, pkt, 45, "Metric-based resolution preferred", NULL, NULL); | |
| 752 octet_bit_field(log, pkt, 46, "Minimum scan line time for higher resolutions", "T15.4 = 1/2 T7.7", "T15.4 = T7.7"); | |
| 753 octet_bit_field(log, pkt, 47, "Selective polling", NULL, NULL); | |
| 754 } | |
| 755 octet_bit_field(log, pkt, 48, "Extension indicator", NULL, NULL); | |
| 756 if (!(pkt[8] & DISBIT8)) | |
| 757 return; | |
| 758 if (len <= 9) | |
| 759 { | |
| 760 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 761 return; | |
| 762 } | |
| 763 | |
| 764 octet_bit_field(log, pkt, 49, "Sub-addressing", NULL, NULL); | |
| 765 if (frame_type == T30_DCS) | |
| 766 { | |
| 767 octet_bit_field(log, pkt, 50, "Sender identification transmission", NULL, NULL); | |
| 768 octet_reserved_bit(log, pkt, 51, 0); | |
| 769 } | |
| 770 else | |
| 771 { | |
| 772 octet_bit_field(log, pkt, 50, "Password", NULL, NULL); | |
| 773 octet_bit_field(log, pkt, 51, "Ready to transmit a data file (polling)", NULL, NULL); | |
| 774 } | |
| 775 octet_reserved_bit(log, pkt, 52, 0); | |
| 776 octet_bit_field(log, pkt, 53, "Binary file transfer (BFT)", NULL, NULL); | |
| 777 octet_bit_field(log, pkt, 54, "Document transfer mode (DTM)", NULL, NULL); | |
| 778 octet_bit_field(log, pkt, 55, "Electronic data interchange (EDI)", NULL, NULL); | |
| 779 octet_bit_field(log, pkt, 56, "Extension indicator", NULL, NULL); | |
| 780 if (!(pkt[9] & DISBIT8)) | |
| 781 return; | |
| 782 if (len <= 10) | |
| 783 { | |
| 784 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 785 return; | |
| 786 } | |
| 787 | |
| 788 octet_bit_field(log, pkt, 57, "Basic transfer mode (BTM)", NULL, NULL); | |
| 789 octet_reserved_bit(log, pkt, 58, 0); | |
| 790 if (frame_type == T30_DCS) | |
| 791 octet_reserved_bit(log, pkt, 59, 0); | |
| 792 else | |
| 793 octet_bit_field(log, pkt, 59, "Ready to transfer a character or mixed mode document (polling)", NULL, NULL); | |
| 794 octet_bit_field(log, pkt, 60, "Character mode", NULL, NULL); | |
| 795 octet_reserved_bit(log, pkt, 61, 0); | |
| 796 octet_bit_field(log, pkt, 62, "Mixed mode (Annex E/T.4)", NULL, NULL); | |
| 797 octet_reserved_bit(log, pkt, 63, 0); | |
| 798 octet_bit_field(log, pkt, 64, "Extension indicator", NULL, NULL); | |
| 799 if (!(pkt[10] & DISBIT8)) | |
| 800 return; | |
| 801 if (len <= 11) | |
| 802 { | |
| 803 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 804 return; | |
| 805 } | |
| 806 | |
| 807 octet_bit_field(log, pkt, 65, "Processable mode 26 (Rec. T.505)", NULL, NULL); | |
| 808 octet_bit_field(log, pkt, 66, "Digital network capability", NULL, NULL); | |
| 809 octet_bit_field(log, pkt, 67, "Duplex capability", "Full", "Half only"); | |
| 810 if (frame_type == T30_DCS) | |
| 811 octet_bit_field(log, pkt, 68, "Full colour mode", NULL, NULL); | |
| 812 else | |
| 813 octet_bit_field(log, pkt, 68, "JPEG coding", NULL, NULL); | |
| 814 octet_bit_field(log, pkt, 69, "Full colour mode", NULL, NULL); | |
| 815 if (frame_type == T30_DCS) | |
| 816 octet_bit_field(log, pkt, 70, "Preferred Huffman tables", NULL, NULL); | |
| 817 else | |
| 818 octet_reserved_bit(log, pkt, 70, 0); | |
| 819 octet_bit_field(log, pkt, 71, "12bits/pel component", NULL, NULL); | |
| 820 octet_bit_field(log, pkt, 72, "Extension indicator", NULL, NULL); | |
| 821 if (!(pkt[11] & DISBIT8)) | |
| 822 return; | |
| 823 if (len <= 12) | |
| 824 { | |
| 825 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 826 return; | |
| 827 } | |
| 828 | |
| 829 octet_bit_field(log, pkt, 73, "No subsampling (1:1:1)", NULL, NULL); | |
| 830 octet_bit_field(log, pkt, 74, "Custom illuminant", NULL, NULL); | |
| 831 octet_bit_field(log, pkt, 75, "Custom gamut range", NULL, NULL); | |
| 832 octet_bit_field(log, pkt, 76, "North American Letter (215.9mm x 279.4mm)", NULL, NULL); | |
| 833 octet_bit_field(log, pkt, 77, "North American Legal (215.9mm x 355.6mm)", NULL, NULL); | |
| 834 octet_bit_field(log, pkt, 78, "Single-progression sequential coding (Rec. T.85) basic", NULL, NULL); | |
| 835 octet_bit_field(log, pkt, 79, "Single-progression sequential coding (Rec. T.85) optional L0", NULL, NULL); | |
| 836 octet_bit_field(log, pkt, 80, "Extension indicator", NULL, NULL); | |
| 837 if (!(pkt[12] & DISBIT8)) | |
| 838 return; | |
| 839 if (len <= 13) | |
| 840 { | |
| 841 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 842 return; | |
| 843 } | |
| 844 | |
| 845 octet_bit_field(log, pkt, 81, "HKM key management", NULL, NULL); | |
| 846 octet_bit_field(log, pkt, 82, "RSA key management", NULL, NULL); | |
| 847 octet_bit_field(log, pkt, 83, "Override", NULL, NULL); | |
| 848 octet_bit_field(log, pkt, 84, "HFX40 cipher", NULL, NULL); | |
| 849 octet_bit_field(log, pkt, 85, "Alternative cipher number 2", NULL, NULL); | |
| 850 octet_bit_field(log, pkt, 86, "Alternative cipher number 3", NULL, NULL); | |
| 851 octet_bit_field(log, pkt, 87, "HFX40-I hashing", NULL, NULL); | |
| 852 octet_bit_field(log, pkt, 88, "Extension indicator", NULL, NULL); | |
| 853 if (!(pkt[13] & DISBIT8)) | |
| 854 return; | |
| 855 if (len <= 14) | |
| 856 { | |
| 857 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 858 return; | |
| 859 } | |
| 860 | |
| 861 octet_bit_field(log, pkt, 89, "Alternative hashing system 2", NULL, NULL); | |
| 862 octet_bit_field(log, pkt, 90, "Alternative hashing system 3", NULL, NULL); | |
| 863 octet_bit_field(log, pkt, 91, "Reserved for future security features", NULL, NULL); | |
| 864 octet_field(log, pkt, 92, 94, "T.44 (Mixed Raster Content)", t44_mixed_raster_content_tags); | |
| 865 octet_bit_field(log, pkt, 95, "Page length maximum stripe size for T.44 (Mixed Raster Content)", NULL, NULL); | |
| 866 octet_bit_field(log, pkt, 96, "Extension indicator", NULL, NULL); | |
| 867 if (!(pkt[14] & DISBIT8)) | |
| 868 return; | |
| 869 if (len <= 15) | |
| 870 { | |
| 871 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 872 return; | |
| 873 } | |
| 874 | |
| 875 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); | |
| 876 octet_bit_field(log, pkt, 98, "100pels/25.4mm x 100lines/25.4mm for colour/gray scale", NULL, NULL); | |
| 877 octet_bit_field(log, pkt, 99, "Simple phase C BFT negotiations", NULL, NULL); | |
| 878 if (frame_type == T30_DCS) | |
| 879 { | |
| 880 octet_reserved_bit(log, pkt, 100, 0); | |
| 881 octet_reserved_bit(log, pkt, 101, 0); | |
| 882 } | |
| 883 else | |
| 884 { | |
| 885 octet_bit_field(log, pkt, 100, "Extended BFT Negotiations capable", NULL, NULL); | |
| 886 octet_bit_field(log, pkt, 101, "Internet Selective Polling address (ISP)", NULL, NULL); | |
| 887 } | |
| 888 octet_bit_field(log, pkt, 102, "Internet Routing Address (IRA)", NULL, NULL); | |
| 889 octet_reserved_bit(log, pkt, 103, 0); | |
| 890 octet_bit_field(log, pkt, 104, "Extension indicator", NULL, NULL); | |
| 891 if (!(pkt[15] & DISBIT8)) | |
| 892 return; | |
| 893 if (len <= 16) | |
| 894 { | |
| 895 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 896 return; | |
| 897 } | |
| 898 | |
| 899 octet_bit_field(log, pkt, 105, "600pels/25.4mm x 600lines/25.4mm", NULL, NULL); | |
| 900 octet_bit_field(log, pkt, 106, "1200pels/25.4mm x 1200lines/25.4mm", NULL, NULL); | |
| 901 octet_bit_field(log, pkt, 107, "300pels/25.4mm x 600lines/25.4mm", NULL, NULL); | |
| 902 octet_bit_field(log, pkt, 108, "400pels/25.4mm x 800lines/25.4mm", NULL, NULL); | |
| 903 octet_bit_field(log, pkt, 109, "600pels/25.4mm x 1200lines/25.4mm", NULL, NULL); | |
| 904 octet_bit_field(log, pkt, 110, "Colour/gray scale 600pels/25.4mm x 600lines/25.4mm", NULL, NULL); | |
| 905 octet_bit_field(log, pkt, 111, "Colour/gray scale 1200pels/25.4mm x 1200lines/25.4mm", NULL, NULL); | |
| 906 octet_bit_field(log, pkt, 112, "Extension indicator", NULL, NULL); | |
| 907 if (!(pkt[16] & DISBIT8)) | |
| 908 return; | |
| 909 if (len <= 17) | |
| 910 { | |
| 911 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 912 return; | |
| 913 } | |
| 914 | |
| 915 octet_bit_field(log, pkt, 113, "Double sided printing capability (alternate mode)", NULL, NULL); | |
| 916 octet_bit_field(log, pkt, 114, "Double sided printing capability (continuous mode)", NULL, NULL); | |
| 917 if (frame_type == T30_DCS) | |
| 918 octet_bit_field(log, pkt, 115, "Black and white mixed raster content profile (MRCbw)", NULL, NULL); | |
| 919 else | |
| 920 octet_reserved_bit(log, pkt, 115, 0); | |
| 921 octet_bit_field(log, pkt, 116, "T.45 (run length colour encoded)", NULL, NULL); | |
| 922 octet_field(log, pkt, 117, 118, "Shared memory", shared_data_memory_capacity_tags); | |
| 923 octet_bit_field(log, pkt, 119, "T.44 colour space", NULL, NULL); | |
| 924 octet_bit_field(log, pkt, 120, "Extension indicator", NULL, NULL); | |
| 925 if (!(pkt[17] & DISBIT8)) | |
| 926 return; | |
| 927 if (len <= 18) | |
| 928 { | |
| 929 span_log(log, SPAN_LOG_FLOW, " Frame is short\n"); | |
| 930 return; | |
| 931 } | |
| 932 | |
| 933 octet_bit_field(log, pkt, 121, "Flow control capability for T.38 communication", NULL, NULL); | |
| 934 octet_bit_field(log, pkt, 122, "K>4", NULL, NULL); | |
| 935 octet_bit_field(log, pkt, 123, "Internet aware T.38 mode fax (not affected by data signal rate bits)", NULL, NULL); | |
| 936 octet_field(log, pkt, 124, 126, "T.89 (Application profiles for ITU-T Rec T.88)", t89_profile_tags); | |
| 937 octet_bit_field(log, pkt, 127, "sYCC-JPEG coding", NULL, NULL); | |
| 938 octet_bit_field(log, pkt, 128, "Extension indicator", NULL, NULL); | |
| 939 if (!(pkt[18] & DISBIT8)) | |
| 940 return; | |
| 941 | |
| 942 span_log(log, SPAN_LOG_FLOW, " Extended beyond the current T.30 specification!\n"); | |
| 943 } | |
| 944 /*- End of function --------------------------------------------------------*/ | |
| 945 /*- End of file ------------------------------------------------------------*/ |
