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