1*cac3dcd5SXin LI /* 2*cac3dcd5SXin LI * Copyright (c) 2007-2011 Grégoire Henry, Juliusz Chroboczek 3*cac3dcd5SXin LI * 4*cac3dcd5SXin LI * Redistribution and use in source and binary forms, with or without 5*cac3dcd5SXin LI * modification, are permitted provided that the following conditions 6*cac3dcd5SXin LI * are met: 7*cac3dcd5SXin LI * 1. Redistributions of source code must retain the above copyright 8*cac3dcd5SXin LI * notice, this list of conditions and the following disclaimer. 9*cac3dcd5SXin LI * 2. Redistributions in binary form must reproduce the above copyright 10*cac3dcd5SXin LI * notice, this list of conditions and the following disclaimer in the 11*cac3dcd5SXin LI * documentation and/or other materials provided with the distribution. 12*cac3dcd5SXin LI * 3. Neither the name of the project nor the names of its contributors 13*cac3dcd5SXin LI * may be used to endorse or promote products derived from this software 14*cac3dcd5SXin LI * without specific prior written permission. 15*cac3dcd5SXin LI * 16*cac3dcd5SXin LI * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 17*cac3dcd5SXin LI * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*cac3dcd5SXin LI * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*cac3dcd5SXin LI * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 20*cac3dcd5SXin LI * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*cac3dcd5SXin LI * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*cac3dcd5SXin LI * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*cac3dcd5SXin LI * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*cac3dcd5SXin LI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*cac3dcd5SXin LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*cac3dcd5SXin LI * SUCH DAMAGE. 27*cac3dcd5SXin LI */ 28*cac3dcd5SXin LI 29*cac3dcd5SXin LI #ifdef HAVE_CONFIG_H 30*cac3dcd5SXin LI #include "config.h" 31*cac3dcd5SXin LI #endif 32*cac3dcd5SXin LI 33*cac3dcd5SXin LI #include <tcpdump-stdinc.h> 34*cac3dcd5SXin LI 35*cac3dcd5SXin LI #include <stdio.h> 36*cac3dcd5SXin LI #include <string.h> 37*cac3dcd5SXin LI 38*cac3dcd5SXin LI #include "addrtoname.h" 39*cac3dcd5SXin LI #include "interface.h" 40*cac3dcd5SXin LI #include "extract.h" 41*cac3dcd5SXin LI 42*cac3dcd5SXin LI static void babel_print_v2(const u_char *cp, u_int length); 43*cac3dcd5SXin LI 44*cac3dcd5SXin LI void 45*cac3dcd5SXin LI babel_print(const u_char *cp, u_int length) { 46*cac3dcd5SXin LI printf("babel"); 47*cac3dcd5SXin LI 48*cac3dcd5SXin LI TCHECK2(*cp, 4); 49*cac3dcd5SXin LI 50*cac3dcd5SXin LI if(cp[0] != 42) { 51*cac3dcd5SXin LI printf(" malformed header"); 52*cac3dcd5SXin LI return; 53*cac3dcd5SXin LI } else { 54*cac3dcd5SXin LI printf(" %d", cp[1]); 55*cac3dcd5SXin LI } 56*cac3dcd5SXin LI 57*cac3dcd5SXin LI switch(cp[1]) { 58*cac3dcd5SXin LI case 2: 59*cac3dcd5SXin LI babel_print_v2(cp,length); 60*cac3dcd5SXin LI break; 61*cac3dcd5SXin LI default: 62*cac3dcd5SXin LI printf(" unknown version"); 63*cac3dcd5SXin LI break; 64*cac3dcd5SXin LI } 65*cac3dcd5SXin LI 66*cac3dcd5SXin LI return; 67*cac3dcd5SXin LI 68*cac3dcd5SXin LI trunc: 69*cac3dcd5SXin LI printf(" [|babel]"); 70*cac3dcd5SXin LI return; 71*cac3dcd5SXin LI } 72*cac3dcd5SXin LI 73*cac3dcd5SXin LI #define MESSAGE_PAD1 0 74*cac3dcd5SXin LI #define MESSAGE_PADN 1 75*cac3dcd5SXin LI #define MESSAGE_ACK_REQ 2 76*cac3dcd5SXin LI #define MESSAGE_ACK 3 77*cac3dcd5SXin LI #define MESSAGE_HELLO 4 78*cac3dcd5SXin LI #define MESSAGE_IHU 5 79*cac3dcd5SXin LI #define MESSAGE_ROUTER_ID 6 80*cac3dcd5SXin LI #define MESSAGE_NH 7 81*cac3dcd5SXin LI #define MESSAGE_UPDATE 8 82*cac3dcd5SXin LI #define MESSAGE_REQUEST 9 83*cac3dcd5SXin LI #define MESSAGE_MH_REQUEST 10 84*cac3dcd5SXin LI 85*cac3dcd5SXin LI static const char * 86*cac3dcd5SXin LI format_id(const u_char *id) 87*cac3dcd5SXin LI { 88*cac3dcd5SXin LI static char buf[25]; 89*cac3dcd5SXin LI snprintf(buf, 25, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", 90*cac3dcd5SXin LI id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7]); 91*cac3dcd5SXin LI buf[24] = '\0'; 92*cac3dcd5SXin LI return buf; 93*cac3dcd5SXin LI } 94*cac3dcd5SXin LI 95*cac3dcd5SXin LI static const unsigned char v4prefix[16] = 96*cac3dcd5SXin LI {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 }; 97*cac3dcd5SXin LI 98*cac3dcd5SXin LI static const char * 99*cac3dcd5SXin LI format_prefix(const u_char *prefix, unsigned char plen) 100*cac3dcd5SXin LI { 101*cac3dcd5SXin LI static char buf[50]; 102*cac3dcd5SXin LI if(plen >= 96 && memcmp(prefix, v4prefix, 12) == 0) 103*cac3dcd5SXin LI snprintf(buf, 50, "%s/%u", ipaddr_string(prefix + 12), plen - 96); 104*cac3dcd5SXin LI else 105*cac3dcd5SXin LI snprintf(buf, 50, "%s/%u", ip6addr_string(prefix), plen); 106*cac3dcd5SXin LI buf[49] = '\0'; 107*cac3dcd5SXin LI return buf; 108*cac3dcd5SXin LI } 109*cac3dcd5SXin LI 110*cac3dcd5SXin LI static const char * 111*cac3dcd5SXin LI format_address(const u_char *prefix) 112*cac3dcd5SXin LI { 113*cac3dcd5SXin LI if(memcmp(prefix, v4prefix, 12) == 0) 114*cac3dcd5SXin LI return ipaddr_string(prefix + 12); 115*cac3dcd5SXin LI else 116*cac3dcd5SXin LI return ip6addr_string(prefix); 117*cac3dcd5SXin LI } 118*cac3dcd5SXin LI 119*cac3dcd5SXin LI static int 120*cac3dcd5SXin LI network_prefix(int ae, int plen, unsigned int omitted, 121*cac3dcd5SXin LI const unsigned char *p, const unsigned char *dp, 122*cac3dcd5SXin LI unsigned int len, unsigned char *p_r) 123*cac3dcd5SXin LI { 124*cac3dcd5SXin LI unsigned pb; 125*cac3dcd5SXin LI unsigned char prefix[16]; 126*cac3dcd5SXin LI 127*cac3dcd5SXin LI if(plen >= 0) 128*cac3dcd5SXin LI pb = (plen + 7) / 8; 129*cac3dcd5SXin LI else if(ae == 1) 130*cac3dcd5SXin LI pb = 4; 131*cac3dcd5SXin LI else 132*cac3dcd5SXin LI pb = 16; 133*cac3dcd5SXin LI 134*cac3dcd5SXin LI if(pb > 16) 135*cac3dcd5SXin LI return -1; 136*cac3dcd5SXin LI 137*cac3dcd5SXin LI memset(prefix, 0, 16); 138*cac3dcd5SXin LI 139*cac3dcd5SXin LI switch(ae) { 140*cac3dcd5SXin LI case 0: break; 141*cac3dcd5SXin LI case 1: 142*cac3dcd5SXin LI if(omitted > 4 || pb > 4 || (pb > omitted && len < pb - omitted)) 143*cac3dcd5SXin LI return -1; 144*cac3dcd5SXin LI memcpy(prefix, v4prefix, 12); 145*cac3dcd5SXin LI if(omitted) { 146*cac3dcd5SXin LI if (dp == NULL) return -1; 147*cac3dcd5SXin LI memcpy(prefix, dp, 12 + omitted); 148*cac3dcd5SXin LI } 149*cac3dcd5SXin LI if(pb > omitted) memcpy(prefix + 12 + omitted, p, pb - omitted); 150*cac3dcd5SXin LI break; 151*cac3dcd5SXin LI case 2: 152*cac3dcd5SXin LI if(omitted > 16 || (pb > omitted && len < pb - omitted)) 153*cac3dcd5SXin LI return -1; 154*cac3dcd5SXin LI if(omitted) { 155*cac3dcd5SXin LI if (dp == NULL) return -1; 156*cac3dcd5SXin LI memcpy(prefix, dp, omitted); 157*cac3dcd5SXin LI } 158*cac3dcd5SXin LI if(pb > omitted) memcpy(prefix + omitted, p, pb - omitted); 159*cac3dcd5SXin LI break; 160*cac3dcd5SXin LI case 3: 161*cac3dcd5SXin LI if(pb > 8 && len < pb - 8) return -1; 162*cac3dcd5SXin LI prefix[0] = 0xfe; 163*cac3dcd5SXin LI prefix[1] = 0x80; 164*cac3dcd5SXin LI if(pb > 8) memcpy(prefix + 8, p, pb - 8); 165*cac3dcd5SXin LI break; 166*cac3dcd5SXin LI default: 167*cac3dcd5SXin LI return -1; 168*cac3dcd5SXin LI } 169*cac3dcd5SXin LI 170*cac3dcd5SXin LI memcpy(p_r, prefix, 16); 171*cac3dcd5SXin LI return 1; 172*cac3dcd5SXin LI } 173*cac3dcd5SXin LI 174*cac3dcd5SXin LI static int 175*cac3dcd5SXin LI network_address(int ae, const unsigned char *a, unsigned int len, 176*cac3dcd5SXin LI unsigned char *a_r) 177*cac3dcd5SXin LI { 178*cac3dcd5SXin LI return network_prefix(ae, -1, 0, a, NULL, len, a_r); 179*cac3dcd5SXin LI } 180*cac3dcd5SXin LI 181*cac3dcd5SXin LI #define ICHECK(i, l) \ 182*cac3dcd5SXin LI if ((i) + (l) > bodylen || (i) + (l) > length) goto corrupt; 183*cac3dcd5SXin LI 184*cac3dcd5SXin LI static void 185*cac3dcd5SXin LI babel_print_v2(const u_char *cp, u_int length) { 186*cac3dcd5SXin LI u_int i; 187*cac3dcd5SXin LI u_short bodylen; 188*cac3dcd5SXin LI u_char v4_prefix[16] = 189*cac3dcd5SXin LI {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 }; 190*cac3dcd5SXin LI u_char v6_prefix[16] = {0}; 191*cac3dcd5SXin LI 192*cac3dcd5SXin LI TCHECK2(*cp, 4); 193*cac3dcd5SXin LI if (length < 4) 194*cac3dcd5SXin LI goto corrupt; 195*cac3dcd5SXin LI bodylen = EXTRACT_16BITS(cp + 2); 196*cac3dcd5SXin LI printf(" (%u)", bodylen); 197*cac3dcd5SXin LI 198*cac3dcd5SXin LI /* Process the TLVs in the body */ 199*cac3dcd5SXin LI i = 0; 200*cac3dcd5SXin LI while(i < bodylen) { 201*cac3dcd5SXin LI const u_char *message; 202*cac3dcd5SXin LI u_char type, len; 203*cac3dcd5SXin LI 204*cac3dcd5SXin LI message = cp + 4 + i; 205*cac3dcd5SXin LI TCHECK2(*message, 2); 206*cac3dcd5SXin LI ICHECK(i, 2); 207*cac3dcd5SXin LI type = message[0]; 208*cac3dcd5SXin LI len = message[1]; 209*cac3dcd5SXin LI 210*cac3dcd5SXin LI TCHECK2(*message, 2 + len); 211*cac3dcd5SXin LI ICHECK(i, 2 + len); 212*cac3dcd5SXin LI 213*cac3dcd5SXin LI switch(type) { 214*cac3dcd5SXin LI case MESSAGE_PAD1: { 215*cac3dcd5SXin LI if(!vflag) 216*cac3dcd5SXin LI printf(" pad1"); 217*cac3dcd5SXin LI else 218*cac3dcd5SXin LI printf("\n\tPad 1"); 219*cac3dcd5SXin LI } 220*cac3dcd5SXin LI break; 221*cac3dcd5SXin LI 222*cac3dcd5SXin LI case MESSAGE_PADN: { 223*cac3dcd5SXin LI if(!vflag) 224*cac3dcd5SXin LI printf(" padN"); 225*cac3dcd5SXin LI else 226*cac3dcd5SXin LI printf("\n\tPad %d", len + 2); 227*cac3dcd5SXin LI } 228*cac3dcd5SXin LI break; 229*cac3dcd5SXin LI 230*cac3dcd5SXin LI case MESSAGE_ACK_REQ: { 231*cac3dcd5SXin LI u_short nonce, interval; 232*cac3dcd5SXin LI if(!vflag) 233*cac3dcd5SXin LI printf(" ack-req"); 234*cac3dcd5SXin LI else { 235*cac3dcd5SXin LI printf("\n\tAcknowledgment Request "); 236*cac3dcd5SXin LI if(len < 6) goto corrupt; 237*cac3dcd5SXin LI nonce = EXTRACT_16BITS(message + 4); 238*cac3dcd5SXin LI interval = EXTRACT_16BITS(message + 6); 239*cac3dcd5SXin LI printf("%04x %d", nonce, interval); 240*cac3dcd5SXin LI } 241*cac3dcd5SXin LI } 242*cac3dcd5SXin LI break; 243*cac3dcd5SXin LI 244*cac3dcd5SXin LI case MESSAGE_ACK: { 245*cac3dcd5SXin LI u_short nonce; 246*cac3dcd5SXin LI if(!vflag) 247*cac3dcd5SXin LI printf(" ack"); 248*cac3dcd5SXin LI else { 249*cac3dcd5SXin LI printf("\n\tAcknowledgment "); 250*cac3dcd5SXin LI if(len < 2) goto corrupt; 251*cac3dcd5SXin LI nonce = EXTRACT_16BITS(message + 2); 252*cac3dcd5SXin LI printf("%04x", nonce); 253*cac3dcd5SXin LI } 254*cac3dcd5SXin LI } 255*cac3dcd5SXin LI break; 256*cac3dcd5SXin LI 257*cac3dcd5SXin LI case MESSAGE_HELLO: { 258*cac3dcd5SXin LI u_short seqno, interval; 259*cac3dcd5SXin LI if(!vflag) 260*cac3dcd5SXin LI printf(" hello"); 261*cac3dcd5SXin LI else { 262*cac3dcd5SXin LI printf("\n\tHello "); 263*cac3dcd5SXin LI if(len < 6) goto corrupt; 264*cac3dcd5SXin LI seqno = EXTRACT_16BITS(message + 4); 265*cac3dcd5SXin LI interval = EXTRACT_16BITS(message + 6); 266*cac3dcd5SXin LI printf("seqno %u interval %u", seqno, interval); 267*cac3dcd5SXin LI } 268*cac3dcd5SXin LI } 269*cac3dcd5SXin LI break; 270*cac3dcd5SXin LI 271*cac3dcd5SXin LI case MESSAGE_IHU: { 272*cac3dcd5SXin LI unsigned short txcost, interval; 273*cac3dcd5SXin LI if(!vflag) 274*cac3dcd5SXin LI printf(" ihu"); 275*cac3dcd5SXin LI else { 276*cac3dcd5SXin LI u_char address[16]; 277*cac3dcd5SXin LI int rc; 278*cac3dcd5SXin LI printf("\n\tIHU "); 279*cac3dcd5SXin LI if(len < 6) goto corrupt; 280*cac3dcd5SXin LI txcost = EXTRACT_16BITS(message + 4); 281*cac3dcd5SXin LI interval = EXTRACT_16BITS(message + 6); 282*cac3dcd5SXin LI rc = network_address(message[2], message + 8, len - 6, address); 283*cac3dcd5SXin LI if(rc < 0) { printf("[|babel]"); break; } 284*cac3dcd5SXin LI printf("%s txcost %u interval %d", 285*cac3dcd5SXin LI format_address(address), txcost, interval); 286*cac3dcd5SXin LI } 287*cac3dcd5SXin LI } 288*cac3dcd5SXin LI break; 289*cac3dcd5SXin LI 290*cac3dcd5SXin LI case MESSAGE_ROUTER_ID: { 291*cac3dcd5SXin LI if(!vflag) 292*cac3dcd5SXin LI printf(" router-id"); 293*cac3dcd5SXin LI else { 294*cac3dcd5SXin LI printf("\n\tRouter Id"); 295*cac3dcd5SXin LI if(len < 10) goto corrupt; 296*cac3dcd5SXin LI printf(" %s", format_id(message + 4)); 297*cac3dcd5SXin LI } 298*cac3dcd5SXin LI } 299*cac3dcd5SXin LI break; 300*cac3dcd5SXin LI 301*cac3dcd5SXin LI case MESSAGE_NH: { 302*cac3dcd5SXin LI if(!vflag) 303*cac3dcd5SXin LI printf(" nh"); 304*cac3dcd5SXin LI else { 305*cac3dcd5SXin LI int rc; 306*cac3dcd5SXin LI u_char nh[16]; 307*cac3dcd5SXin LI printf("\n\tNext Hop"); 308*cac3dcd5SXin LI if(len < 2) goto corrupt; 309*cac3dcd5SXin LI rc = network_address(message[2], message + 4, len - 2, nh); 310*cac3dcd5SXin LI if(rc < 0) goto corrupt; 311*cac3dcd5SXin LI printf(" %s", format_address(nh)); 312*cac3dcd5SXin LI } 313*cac3dcd5SXin LI } 314*cac3dcd5SXin LI break; 315*cac3dcd5SXin LI 316*cac3dcd5SXin LI case MESSAGE_UPDATE: { 317*cac3dcd5SXin LI if(!vflag) { 318*cac3dcd5SXin LI printf(" update"); 319*cac3dcd5SXin LI if(len < 1) 320*cac3dcd5SXin LI printf("/truncated"); 321*cac3dcd5SXin LI else 322*cac3dcd5SXin LI printf("%s%s%s", 323*cac3dcd5SXin LI (message[3] & 0x80) ? "/prefix": "", 324*cac3dcd5SXin LI (message[3] & 0x40) ? "/id" : "", 325*cac3dcd5SXin LI (message[3] & 0x3f) ? "/unknown" : ""); 326*cac3dcd5SXin LI } else { 327*cac3dcd5SXin LI u_short interval, seqno, metric; 328*cac3dcd5SXin LI u_char plen; 329*cac3dcd5SXin LI int rc; 330*cac3dcd5SXin LI u_char prefix[16]; 331*cac3dcd5SXin LI printf("\n\tUpdate"); 332*cac3dcd5SXin LI if(len < 10) goto corrupt; 333*cac3dcd5SXin LI plen = message[4] + (message[2] == 1 ? 96 : 0); 334*cac3dcd5SXin LI rc = network_prefix(message[2], message[4], message[5], 335*cac3dcd5SXin LI message + 12, 336*cac3dcd5SXin LI message[2] == 1 ? v4_prefix : v6_prefix, 337*cac3dcd5SXin LI len - 10, prefix); 338*cac3dcd5SXin LI if(rc < 0) goto corrupt; 339*cac3dcd5SXin LI interval = EXTRACT_16BITS(message + 6); 340*cac3dcd5SXin LI seqno = EXTRACT_16BITS(message + 8); 341*cac3dcd5SXin LI metric = EXTRACT_16BITS(message + 10); 342*cac3dcd5SXin LI printf("%s%s%s %s metric %u seqno %u interval %u", 343*cac3dcd5SXin LI (message[3] & 0x80) ? "/prefix": "", 344*cac3dcd5SXin LI (message[3] & 0x40) ? "/id" : "", 345*cac3dcd5SXin LI (message[3] & 0x3f) ? "/unknown" : "", 346*cac3dcd5SXin LI format_prefix(prefix, plen), 347*cac3dcd5SXin LI metric, seqno, interval); 348*cac3dcd5SXin LI if(message[3] & 0x80) { 349*cac3dcd5SXin LI if(message[2] == 1) 350*cac3dcd5SXin LI memcpy(v4_prefix, prefix, 16); 351*cac3dcd5SXin LI else 352*cac3dcd5SXin LI memcpy(v6_prefix, prefix, 16); 353*cac3dcd5SXin LI } 354*cac3dcd5SXin LI } 355*cac3dcd5SXin LI } 356*cac3dcd5SXin LI break; 357*cac3dcd5SXin LI 358*cac3dcd5SXin LI case MESSAGE_REQUEST: { 359*cac3dcd5SXin LI if(!vflag) 360*cac3dcd5SXin LI printf(" request"); 361*cac3dcd5SXin LI else { 362*cac3dcd5SXin LI int rc; 363*cac3dcd5SXin LI u_char prefix[16], plen; 364*cac3dcd5SXin LI printf("\n\tRequest "); 365*cac3dcd5SXin LI if(len < 2) goto corrupt; 366*cac3dcd5SXin LI plen = message[3] + (message[2] == 1 ? 96 : 0); 367*cac3dcd5SXin LI rc = network_prefix(message[2], message[3], 0, 368*cac3dcd5SXin LI message + 4, NULL, len - 2, prefix); 369*cac3dcd5SXin LI if(rc < 0) goto corrupt; 370*cac3dcd5SXin LI plen = message[3] + (message[2] == 1 ? 96 : 0); 371*cac3dcd5SXin LI printf("for %s", 372*cac3dcd5SXin LI message[2] == 0 ? "any" : format_prefix(prefix, plen)); 373*cac3dcd5SXin LI } 374*cac3dcd5SXin LI } 375*cac3dcd5SXin LI break; 376*cac3dcd5SXin LI 377*cac3dcd5SXin LI case MESSAGE_MH_REQUEST : { 378*cac3dcd5SXin LI if(!vflag) 379*cac3dcd5SXin LI printf(" mh-request"); 380*cac3dcd5SXin LI else { 381*cac3dcd5SXin LI int rc; 382*cac3dcd5SXin LI u_short seqno; 383*cac3dcd5SXin LI u_char prefix[16], plen; 384*cac3dcd5SXin LI printf("\n\tMH-Request "); 385*cac3dcd5SXin LI if(len < 14) goto corrupt; 386*cac3dcd5SXin LI seqno = EXTRACT_16BITS(message + 4); 387*cac3dcd5SXin LI rc = network_prefix(message[2], message[3], 0, 388*cac3dcd5SXin LI message + 16, NULL, len - 14, prefix); 389*cac3dcd5SXin LI if(rc < 0) goto corrupt; 390*cac3dcd5SXin LI plen = message[3] + (message[2] == 1 ? 96 : 0); 391*cac3dcd5SXin LI printf("(%u hops) for %s seqno %u id %s", 392*cac3dcd5SXin LI message[6], format_prefix(prefix, plen), 393*cac3dcd5SXin LI seqno, format_id(message + 8)); 394*cac3dcd5SXin LI } 395*cac3dcd5SXin LI } 396*cac3dcd5SXin LI break; 397*cac3dcd5SXin LI default: 398*cac3dcd5SXin LI if(!vflag) 399*cac3dcd5SXin LI printf(" unknown"); 400*cac3dcd5SXin LI else 401*cac3dcd5SXin LI printf("\n\tUnknown message type %d", type); 402*cac3dcd5SXin LI } 403*cac3dcd5SXin LI i += len + 2; 404*cac3dcd5SXin LI } 405*cac3dcd5SXin LI return; 406*cac3dcd5SXin LI 407*cac3dcd5SXin LI trunc: 408*cac3dcd5SXin LI printf(" [|babel]"); 409*cac3dcd5SXin LI return; 410*cac3dcd5SXin LI 411*cac3dcd5SXin LI corrupt: 412*cac3dcd5SXin LI printf(" (corrupt)"); 413*cac3dcd5SXin LI return; 414*cac3dcd5SXin LI } 415