12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"@(#)$Header: /tcpdump/master/tcpdump/print-fr.c,v 1.51 2006-06-23 22:20:32 hannes Exp $ (LBL)";
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h>
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ethertype.h"
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "nlpid.h"
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "oui.h"
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void frf15_print(const u_char *, u_int);
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the frame relay header has a variable length
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the EA bit determines if there is another byte
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in the header
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * minimum header length is 2 bytes
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * maximum header length is 4 bytes
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      7    6    5    4    3    2    1    0
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    |        DLCI (6 bits)        | CR | EA |
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    |   DLCI (4 bits)   |FECN|BECN| DE | EA |
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    |           DLCI (7 bits)          | EA |
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    |        DLCI (6 bits)        |SDLC| EA |
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_EA_BIT	0x01
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_CR_BIT       0x02000000
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_DE_BIT	0x00020000
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_BECN_BIT	0x00040000
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_FECN_BIT	0x00080000
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_SDLC_BIT	0x00000002
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok fr_header_flag_values[] = {
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_CR_BIT, "C!" },
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_DE_BIT, "DE" },
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_BECN_BIT, "BECN" },
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_FECN_BIT, "FECN" },
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_SDLC_BIT, "sdlcore" },
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* FRF.15 / FRF.16 */
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_B_BIT 0x80
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_E_BIT 0x40
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_C_BIT 0x20
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_BEC_MASK    (MFR_B_BIT | MFR_E_BIT | MFR_C_BIT)
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_FRAME  (MFR_B_BIT | MFR_E_BIT | MFR_C_BIT)
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_FRAG_FRAME  (MFR_B_BIT | MFR_E_BIT )
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok frf_flag_values[] = {
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_B_BIT, "Begin" },
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_E_BIT, "End" },
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_C_BIT, "Control" },
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Finds out Q.922 address length, DLCI and flags. Returns 0 on success
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * save the flags dep. on address length
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
10353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int parse_q922_addr(const u_char *p, u_int *dlci,
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           u_int *addr_len, u_int8_t *flags)
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((p[0] & FR_EA_BIT))
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return -1;
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	*addr_len = 2;
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	*dlci = ((p[0] & 0xFC) << 2) | ((p[1] & 0xF0) >> 4);
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        flags[0] = p[0] & 0x02; /* populate the first flag fields */
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        flags[1] = p[1] & 0x0c;
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        flags[2] = 0;           /* clear the rest of the flags */
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        flags[3] = 0;
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (p[1] & FR_EA_BIT)
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return 0;	/* 2-byte Q.922 address */
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p += 2;
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(*addr_len)++;		/* 3- or 4-byte Q.922 address */
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((p[0] & FR_EA_BIT) == 0) {
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		*dlci = (*dlci << 7) | (p[0] >> 1);
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(*addr_len)++;	/* 4-byte Q.922 address */
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		p++;
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((p[0] & FR_EA_BIT) == 0)
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return -1; /* more than 4 bytes of Q.922 address? */
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        flags[3] = p[0] & 0x02;
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        *dlci = (*dlci << 6) | (p[0] >> 2);
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 0;
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13853f17a9db278d33517d9888dd77848f554522a38JP Abgrallchar *q922_string(const u_char *p) {
13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    static u_int dlci, addr_len;
14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    static u_int8_t flags[4];
14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    static char buffer[sizeof("DLCI xxxxxxxxxx")];
14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    memset(buffer, 0, sizeof(buffer));
14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    if (parse_q922_addr(p, &dlci, &addr_len, flags) == 0){
14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        snprintf(buffer, sizeof(buffer), "DLCI %u", dlci);
14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    }
14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    return buffer;
15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
15253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Frame Relay packet structure, with flags and CRC removed
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +---------------------------+
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |       Q.922 Address*      |
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +--                       --+
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |                           |
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +---------------------------+
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  | Control (UI = 0x03)       |
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +---------------------------+
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  | Optional Pad      (0x00)  |
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +---------------------------+
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  | NLPID                     |
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +---------------------------+
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |             .             |
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |             .             |
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |             .             |
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |           Data            |
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |             .             |
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |             .             |
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +---------------------------+
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           * Q.922 addresses, as presently defined, are two octets and
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             contain a 10-bit DLCI.  In some networks Q.922 addresses
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project             may optionally be increased to three or four octets.
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project*/
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfr_hdrlen(const u_char *p, u_int addr_len)
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!p[addr_len + 1] /* pad exist */)
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return addr_len + 1 /* UI */ + 1 /* pad */ + 1 /* NLPID */;
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return addr_len + 1 /* UI */ + 1 /* NLPID */;
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfr_hdr_print(int length, u_int addr_len, u_int dlci, u_int8_t *flags, u_int16_t nlpid)
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (qflag) {
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        (void)printf("Q.922, DLCI %u, length %u: ",
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                     dlci,
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                     length);
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (nlpid <= 0xff) /* if its smaller than 256 then its a NLPID */
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            (void)printf("Q.922, hdr-len %u, DLCI %u, Flags [%s], NLPID %s (0x%02x), length %u: ",
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         addr_len,
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         dlci,
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         bittok2str(fr_header_flag_values, "none", EXTRACT_32BITS(flags)),
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         tok2str(nlpid_values,"unknown", nlpid),
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         nlpid,
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         length);
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        else /* must be an ethertype */
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            (void)printf("Q.922, hdr-len %u, DLCI %u, Flags [%s], cisco-ethertype %s (0x%04x), length %u: ",
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         addr_len,
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         dlci,
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         bittok2str(fr_header_flag_values, "none", EXTRACT_32BITS(flags)),
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         tok2str(ethertype_values, "unknown", nlpid),
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         nlpid,
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                         length);
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfr_if_print(const struct pcap_pkthdr *h, register const u_char *p)
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int length = h->len;
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int caplen = h->caplen;
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        TCHECK2(*p, 4); /* minimum frame header length */
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if ((length = fr_print(p, length)) == 0)
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (0);
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        else
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return length;
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc:
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("[|fr]");
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return caplen;
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfr_print(register const u_char *p, u_int length)
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t extracted_ethertype;
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int dlci;
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int addr_len;
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t nlpid;
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int hdr_len;
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t flags[4];
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (parse_q922_addr(p, &dlci, &addr_len, flags)) {
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("Q.922, invalid address");
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return 0;
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        TCHECK2(*p,addr_len+1+1);
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hdr_len = fr_hdrlen(p, addr_len);
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        TCHECK2(*p,hdr_len);
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (p[addr_len] != 0x03 && dlci != 0) {
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* lets figure out if we have cisco style encapsulation: */
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                extracted_ethertype = EXTRACT_16BITS(p+addr_len);
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (eflag)
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    fr_hdr_print(length, addr_len, dlci, flags, extracted_ethertype);
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (ethertype_print(gndo, extracted_ethertype,
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                      p+addr_len+ETHERTYPE_LEN,
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                      length-addr_len-ETHERTYPE_LEN,
26253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                      length-addr_len-ETHERTYPE_LEN) == 0)
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    /* ether_type not known, probably it wasn't one */
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("UI %02x! ", p[addr_len]);
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                else
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    return hdr_len;
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!p[addr_len + 1]) {	/* pad byte should be used with 3-byte Q.922 */
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (addr_len != 3)
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("Pad! ");
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (addr_len == 3)
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("No pad! ");
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	nlpid = p[hdr_len - 1];
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (eflag)
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fr_hdr_print(length, addr_len, dlci, flags, nlpid);
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p += hdr_len;
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	length -= hdr_len;
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (nlpid) {
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NLPID_IP:
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        ip_print(gndo, p, length);
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NLPID_IP6:
28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ip6_print(gndo, p, length);
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NLPID_CLNP:
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NLPID_ESIS:
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NLPID_ISIS:
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                isoclns_print(p-1, length+1, length+1); /* OSI printers need the NLPID field */
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NLPID_SNAP:
29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (snap_print(p, length, length, 0) == 0) {
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* ether_type not known, print raw packet */
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        if (!eflag)
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            fr_hdr_print(length + hdr_len, hdr_len,
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                         dlci, flags, nlpid);
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!suppress_default_print)
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                            default_print(p - hdr_len, length + hdr_len);
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case NLPID_Q933:
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		q933_print(p, length);
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case NLPID_MFR:
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                frf15_print(p, length);
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case NLPID_PPP:
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ppp_print(p, length);
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!eflag)
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    fr_hdr_print(length + hdr_len, addr_len,
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				     dlci, flags, nlpid);
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!xflag)
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default_print(p, length);
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return hdr_len;
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc:
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("[|fr]");
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return 0;
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmfr_if_print(const struct pcap_pkthdr *h, register const u_char *p)
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int length = h->len;
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int caplen = h->caplen;
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        TCHECK2(*p, 2); /* minimum frame header length */
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if ((length = mfr_print(p, length)) == 0)
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (0);
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        else
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return length;
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc:
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("[|mfr]");
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return caplen;
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_MSG_ADD_LINK        1
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_MSG_ADD_LINK_ACK    2
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_MSG_ADD_LINK_REJ    3
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_MSG_HELLO           4
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_MSG_HELLO_ACK       5
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_MSG_REMOVE_LINK     6
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_MSG_REMOVE_LINK_ACK 7
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
36353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok mfr_ctrl_msg_values[] = {
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_MSG_ADD_LINK, "Add Link" },
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_MSG_ADD_LINK_ACK, "Add Link ACK" },
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_MSG_ADD_LINK_REJ, "Add Link Reject" },
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_MSG_HELLO, "Hello" },
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_MSG_HELLO_ACK, "Hello ACK" },
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_MSG_REMOVE_LINK, "Remove Link" },
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_MSG_REMOVE_LINK_ACK, "Remove Link ACK" },
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_IE_BUNDLE_ID  1
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_IE_LINK_ID    2
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_IE_MAGIC_NUM  3
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_IE_TIMESTAMP  5
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_IE_VENDOR_EXT 6
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_CTRL_IE_CAUSE      7
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
38153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok mfr_ctrl_ie_values[] = {
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_IE_BUNDLE_ID, "Bundle ID"},
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_IE_LINK_ID, "Link ID"},
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_IE_MAGIC_NUM, "Magic Number"},
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_IE_TIMESTAMP, "Timestamp"},
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_IE_VENDOR_EXT, "Vendor Extension"},
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MFR_CTRL_IE_CAUSE, "Cause"},
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MFR_ID_STRING_MAXLEN 50
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct ie_tlv_header_t {
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t ie_type;
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t ie_len;
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmfr_print(register const u_char *p, u_int length)
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int tlen,idx,hdr_len = 0;
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int16_t sequence_num;
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t ie_type,ie_len;
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_int8_t *tptr;
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FRF.16 Link Integrity Control Frame
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      7    6    5    4    3    2    1    0
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    | B  | E  | C=1| 0    0    0    0  | EA |
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    | 0    0    0    0    0    0    0    0  |
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    |              message type             |
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK2(*p, 4); /* minimum frame header length */
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if ((p[0] & MFR_BEC_MASK) == MFR_CTRL_FRAME && p[1] == 0) {
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("FRF.16 Control, Flags [%s], %s, length %u",
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK)),
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tok2str(mfr_ctrl_msg_values,"Unknown Message (0x%02x)",p[2]),
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               length);
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tptr = p + 3;
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tlen = length -3;
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        hdr_len = 3;
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (!vflag)
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return hdr_len;
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        while (tlen>sizeof(struct ie_tlv_header_t)) {
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            TCHECK2(*tptr, sizeof(struct ie_tlv_header_t));
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            ie_type=tptr[0];
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            ie_len=tptr[1];
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\tIE %s (%u), length %u: ",
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   tok2str(mfr_ctrl_ie_values,"Unknown",ie_type),
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   ie_type,
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   ie_len);
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* infinite loop check */
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (ie_type == 0 || ie_len <= sizeof(struct ie_tlv_header_t))
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                return hdr_len;
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            TCHECK2(*tptr,ie_len);
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=sizeof(struct ie_tlv_header_t);
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* tlv len includes header */
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            ie_len-=sizeof(struct ie_tlv_header_t);
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tlen-=sizeof(struct ie_tlv_header_t);
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            switch (ie_type) {
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case MFR_CTRL_IE_MAGIC_NUM:
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("0x%08x",EXTRACT_32BITS(tptr));
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case MFR_CTRL_IE_BUNDLE_ID: /* same message format */
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case MFR_CTRL_IE_LINK_ID:
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                for (idx = 0; idx < ie_len && idx < MFR_ID_STRING_MAXLEN; idx++) {
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    if (*(tptr+idx) != 0) /* don't print null termination */
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        safeputchar(*(tptr+idx));
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    else
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        break;
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                }
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case MFR_CTRL_IE_TIMESTAMP:
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (ie_len == sizeof(struct timeval)) {
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    ts_print((const struct timeval *)tptr);
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    break;
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                }
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* fall through and hexdump if no unix timestamp */
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /*
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 * FIXME those are the defined IEs that lack a decoder
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 * you are welcome to contribute code ;-)
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 */
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case MFR_CTRL_IE_VENDOR_EXT:
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            case MFR_CTRL_IE_CAUSE:
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            default:
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (vflag <= 1)
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    print_unknown_data(tptr,"\n\t  ",ie_len);
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                break;
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* do we want to see a hexdump of the IE ? */
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (vflag > 1 )
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data(tptr,"\n\t  ",ie_len);
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tlen-=ie_len;
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tptr+=ie_len;
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return hdr_len;
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FRF.16 Fragmentation Frame
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      7    6    5    4    3    2    1    0
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    | B  | E  | C=0|seq. (high 4 bits) | EA  |
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    |        sequence  (low 8 bits)         |
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    |        DLCI (6 bits)        | CR | EA  |
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    |   DLCI (4 bits)   |FECN|BECN| DE | EA |
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    sequence_num = (p[0]&0x1e)<<7 | p[1];
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* whole packet or first fragment ? */
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if ((p[0] & MFR_BEC_MASK) == MFR_FRAG_FRAME ||
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        (p[0] & MFR_BEC_MASK) == MFR_B_BIT) {
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("FRF.16 Frag, seq %u, Flags [%s], ",
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               sequence_num,
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK)));
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        hdr_len = 2;
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        fr_print(p+hdr_len,length-hdr_len);
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return hdr_len;
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* must be a middle or the last fragment */
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("FRF.16 Frag, seq %u, Flags [%s]",
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           sequence_num,
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           bittok2str(frf_flag_values,"none",(p[0] & MFR_BEC_MASK)));
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    print_unknown_data(p,"\n\t",length);
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return hdr_len;
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc:
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|mfr]");
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return length;
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* an NLPID of 0xb1 indicates a 2-byte
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FRF.15 header
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      7    6    5    4    3    2    1    0
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    ~              Q.922 header             ~
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    |             NLPID (8 bits)            | NLPID=0xb1
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    | B  | E  | C  |seq. (high 4 bits) | R  |
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    |        sequence  (low 8 bits)         |
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    +----+----+----+----+----+----+----+----+
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_FRF15_FRAGTYPE 0x01
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfrf15_print (const u_char *p, u_int length) {
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int16_t sequence_num, flags;
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    flags = p[0]&MFR_BEC_MASK;
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    sequence_num = (p[0]&0x1e)<<7 | p[1];
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("FRF.15, seq 0x%03x, Flags [%s],%s Fragmentation, length %u",
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           sequence_num,
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           bittok2str(frf_flag_values,"none",flags),
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           p[0]&FR_FRF15_FRAGTYPE ? "Interface" : "End-to-End",
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           length);
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* TODO:
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * depending on all permutations of the B, E and C bit
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * dig as deep as we can - e.g. on the first (B) fragment
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * there is enough payload to print the IP header
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * on non (B) fragments it depends if the fragmentation
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * model is end-to-end or interface based wether we want to print
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * another Q.922 header
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Q.933 decoding portion for framerelay specific.
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Q.933 packet format
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                      Format of Other Protocols
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                          using Q.933 NLPID
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +-------------------------------+
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |        Q.922 Address          |
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +---------------+---------------+
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |Control  0x03  | NLPID   0x08  |
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +---------------+---------------+
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |          L2 Protocol ID       |
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  | octet 1       |  octet 2      |
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +-------------------------------+
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |          L3 Protocol ID       |
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  | octet 2       |  octet 2      |
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +-------------------------------+
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  |         Protocol Data         |
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +-------------------------------+
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  | FCS                           |
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                  +-------------------------------+
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* L2 (Octet 1)- Call Reference Usually is 0x0 */
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * L2 (Octet 2)- Message Types definition 1 byte long.
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Call Establish */
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_ESC_TO_NATIONAL  0x00
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_ALERT            0x01
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_CALL_PROCEEDING  0x02
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_CONNECT          0x07
6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_CONNECT_ACK      0x0F
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_PROGRESS         0x03
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_SETUP            0x05
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Call Clear */
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_DISCONNECT       0x45
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_RELEASE          0x4D
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_RELEASE_COMPLETE 0x5A
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_RESTART          0x46
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_RESTART_ACK      0x4E
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Status */
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_STATUS           0x7D
6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_TYPE_STATUS_ENQ       0x75
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
62953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok fr_q933_msg_values[] = {
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_ESC_TO_NATIONAL, "ESC to National" },
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_ALERT, "Alert" },
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_CALL_PROCEEDING, "Call proceeding" },
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_CONNECT, "Connect" },
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_CONNECT_ACK, "Connect ACK" },
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_PROGRESS, "Progress" },
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_SETUP, "Setup" },
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_DISCONNECT, "Disconnect" },
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_RELEASE, "Release" },
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_RELEASE_COMPLETE, "Release Complete" },
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_RESTART, "Restart" },
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_RESTART_ACK, "Restart ACK" },
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_STATUS, "Status Reply" },
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { MSG_TYPE_STATUS_ENQ, "Status Enquiry" },
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSG_ANSI_LOCKING_SHIFT	0x95
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_LMI_ANSI_REPORT_TYPE_IE	0x01
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_LMI_ANSI_LINK_VERIFY_IE_91	0x19 /* details? */
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_LMI_ANSI_LINK_VERIFY_IE	0x03
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_LMI_ANSI_PVC_STATUS_IE	0x07
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_LMI_CCITT_REPORT_TYPE_IE	0x51
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_LMI_CCITT_LINK_VERIFY_IE	0x53
6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_LMI_CCITT_PVC_STATUS_IE	0x57
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
65853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok fr_q933_ie_values_codeset5[] = {
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_LMI_ANSI_REPORT_TYPE_IE, "ANSI Report Type" },
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_LMI_ANSI_LINK_VERIFY_IE_91, "ANSI Link Verify" },
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_LMI_ANSI_LINK_VERIFY_IE, "ANSI Link Verify" },
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_LMI_ANSI_PVC_STATUS_IE, "ANSI PVC Status" },
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_LMI_CCITT_REPORT_TYPE_IE, "CCITT Report Type" },
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_LMI_CCITT_LINK_VERIFY_IE, "CCITT Link Verify" },
6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_LMI_CCITT_PVC_STATUS_IE, "CCITT PVC Status" },
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_LMI_REPORT_TYPE_IE_FULL_STATUS 0
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_LMI_REPORT_TYPE_IE_LINK_VERIFY 1
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FR_LMI_REPORT_TYPE_IE_ASYNC_PVC   2
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
67353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok fr_lmi_report_type_ie_values[] = {
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_LMI_REPORT_TYPE_IE_FULL_STATUS, "Full Status" },
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_LMI_REPORT_TYPE_IE_LINK_VERIFY, "Link verify" },
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { FR_LMI_REPORT_TYPE_IE_ASYNC_PVC, "Async PVC Status" },
6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL }
6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* array of 16 codepages - currently we only support codepage 1,5 */
68153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok *fr_q933_ie_codesets[] = {
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    fr_q933_ie_values_codeset5,
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    fr_q933_ie_values_codeset5,
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL
6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int fr_q933_print_ie_codeset5(const struct ie_tlv_header_t  *ie_p,
7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *p);
7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef int (*codeset_pr_func_t)(const struct ie_tlv_header_t  *ie_p,
7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *p);
7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* array of 16 codepages - currently we only support codepage 1,5 */
7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic codeset_pr_func_t fr_q933_print_ie_codeset[] = {
7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    fr_q933_print_ie_codeset5,
7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    fr_q933_print_ie_codeset5,
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL,
7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    NULL
7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectq933_print(const u_char *p, u_int length)
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *ptemp = p;
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ie_tlv_header_t  *ie_p;
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        int olen;
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int is_ansi = 0;
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        u_int codeset;
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        u_int ie_is_known = 0;
7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length < 9) {	/* shortest: Q.933a LINK VERIFY */
7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|q.933]");
7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        codeset = p[2]&0x0f;   /* extract the codeset */
7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
74353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (p[2] == MSG_ANSI_LOCKING_SHIFT) {
74453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	        is_ansi = 1;
74553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("%s", eflag ? "" : "Q.933, ");
7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* printing out header part */
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s, codeset %u", is_ansi ? "ANSI" : "CCITT", codeset);
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
75253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (p[0]) {
75353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	        printf(", Call Ref: 0x%02x", p[0]);
75453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
75553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (vflag) {
75653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf(", %s (0x%02x), length %u",
75753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		       tok2str(fr_q933_msg_values,
75853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			       "unknown message", p[1]),
75953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		       p[1],
76053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		       length);
76153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else {
76253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                printf(", %s",
76353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		       tok2str(fr_q933_msg_values,
76453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			       "unknown message 0x%02x", p[1]));
76553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        olen = length; /* preserve the original length for non verbose mode */
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (length < (u_int)(2 - is_ansi)) {
7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|q.933]");
7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
77353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	length -= 2 + is_ansi;
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ptemp += 2 + is_ansi;
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Loop through the rest of IE */
77753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	while (length > sizeof(struct ie_tlv_header_t)) {
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ie_p = (struct ie_tlv_header_t  *)ptemp;
77953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (length < sizeof(struct ie_tlv_header_t) ||
78053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    length < sizeof(struct ie_tlv_header_t) + ie_p->ie_len) {
78153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    if (vflag) { /* not bark if there is just a trailer */
7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        printf("\n[|q.933]");
78353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                    } else {
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        printf(", length %u",olen);
78553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    }
7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    return;
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* lets do the full IE parsing only in verbose mode
7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 * however some IEs (DLCI Status, Link Verify)
79153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * are also interestting in non-verbose mode */
79253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (vflag) {
7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf("\n\t%s IE (0x%02x), length %u: ",
79453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                           tok2str(fr_q933_ie_codesets[codeset],
79553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   "unknown", ie_p->ie_type),
7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ie_p->ie_type,
7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                           ie_p->ie_len);
79853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
79953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* sanity check */
80153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (ie_p->ie_type == 0 || ie_p->ie_len == 0) {
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    return;
80353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
80553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (fr_q933_print_ie_codeset[codeset] != NULL) {
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    ie_is_known = fr_q933_print_ie_codeset[codeset](ie_p, ptemp);
80753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
80853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
80953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (vflag >= 1 && !ie_is_known) {
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    print_unknown_data(ptemp+2,"\n\t",ie_p->ie_len);
81153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* do we want to see a hexdump of the IE ? */
81453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (vflag> 1 && ie_is_known) {
8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    print_unknown_data(ptemp+2,"\n\t  ",ie_p->ie_len);
81653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		length = length - ie_p->ie_len - 2;
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ptemp = ptemp + ie_p->ie_len + 2;
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
82153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (!vflag) {
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf(", length %u",olen);
82353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfr_q933_print_ie_codeset5(const struct ie_tlv_header_t  *ie_p, const u_char *p)
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        u_int dlci;
8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        switch (ie_p->ie_type) {
8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case FR_LMI_ANSI_REPORT_TYPE_IE: /* fall through */
8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case FR_LMI_CCITT_REPORT_TYPE_IE:
83553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (vflag) {
8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("%s (%u)",
8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(fr_lmi_report_type_ie_values,"unknown",p[2]),
8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       p[2]);
83953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    }
8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return 1;
8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case FR_LMI_ANSI_LINK_VERIFY_IE: /* fall through */
8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case FR_LMI_CCITT_LINK_VERIFY_IE:
8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case FR_LMI_ANSI_LINK_VERIFY_IE_91:
84553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (!vflag) {
8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", ");
84753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    }
8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("TX Seq: %3d, RX Seq: %3d", p[2], p[3]);
8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return 1;
8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case FR_LMI_ANSI_PVC_STATUS_IE: /* fall through */
8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case FR_LMI_CCITT_PVC_STATUS_IE:
85353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (!vflag) {
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf(", ");
85553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    }
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* now parse the DLCI information element. */
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if ((ie_p->ie_len < 3) ||
8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                (p[2] & 0x80) ||
8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ((ie_p->ie_len == 3) && !(p[3] & 0x80)) ||
8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ((ie_p->ie_len == 4) && ((p[3] & 0x80) || !(p[4] & 0x80))) ||
8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                ((ie_p->ie_len == 5) && ((p[3] & 0x80) || (p[4] & 0x80) ||
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                   !(p[5] & 0x80))) ||
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                (ie_p->ie_len > 5) ||
86453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                !(p[ie_p->ie_len + 1] & 0x80)) {
8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("Invalid DLCI IE");
86653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    }
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            dlci = ((p[2] & 0x3F) << 4) | ((p[3] & 0x78) >> 3);
86953f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (ie_p->ie_len == 4) {
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                dlci = (dlci << 6) | ((p[4] & 0x7E) >> 1);
87153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    }
87253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            else if (ie_p->ie_len == 5) {
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                dlci = (dlci << 13) | (p[4] & 0x7F) | ((p[5] & 0x7E) >> 1);
87453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    }
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("DLCI %u: status %s%s", dlci,
8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    p[ie_p->ie_len + 1] & 0x8 ? "New, " : "",
8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    p[ie_p->ie_len + 1] & 0x2 ? "Active" : "Inactive");
8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return 1;
8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return 0;
8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
884