1127668Sbms/* 2127668Sbms * Copyright (c) 2003 Bruce M. Simpson <bms@spc.org> 3127668Sbms * All rights reserved. 4127668Sbms * 5127668Sbms * Redistribution and use in source and binary forms, with or without 6127668Sbms * modification, are permitted provided that the following conditions 7127668Sbms * are met: 8127668Sbms * 1. Redistributions of source code must retain the above copyright 9127668Sbms * notice, this list of conditions and the following disclaimer. 10127668Sbms * 2. Redistributions in binary form must reproduce the above copyright 11127668Sbms * notice, this list of conditions and the following disclaimer in the 12127668Sbms * documentation and/or other materials provided with the distribution. 13127668Sbms * 3. All advertising materials mentioning features or use of this software 14127668Sbms * must display the following acknowledgement: 15127668Sbms * This product includes software developed by Bruce M. Simpson. 16127668Sbms * 4. Neither the name of Bruce M. Simpson nor the names of co- 17127668Sbms * contributors may be used to endorse or promote products derived 18127668Sbms * from this software without specific prior written permission. 19127668Sbms * 20127668Sbms * THIS SOFTWARE IS PROVIDED BY Bruce M. Simpson AND CONTRIBUTORS 21127668Sbms * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22127668Sbms * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23127668Sbms * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Bruce M. Simpson OR CONTRIBUTORS 24127668Sbms * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25127668Sbms * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26127668Sbms * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27127668Sbms * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28127668Sbms * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29127668Sbms * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30127668Sbms * POSSIBILITY OF SUCH DAMAGE. 31127668Sbms */ 32127668Sbms 33127668Sbms#ifndef lint 34127668Sbmsstatic const char rcsid[] _U_ = 35190207Srpaulo "@(#) $Header: /tcpdump/master/tcpdump/print-aodv.c,v 1.11 2004-03-24 00:30:19 guy Exp $ (LBL)"; 36127668Sbms#endif 37127668Sbms 38127668Sbms#ifdef HAVE_CONFIG_H 39127668Sbms#include "config.h" 40127668Sbms#endif 41127668Sbms 42127668Sbms#include <tcpdump-stdinc.h> 43127668Sbms 44127668Sbms#include <stddef.h> 45127668Sbms#include <stdio.h> 46127668Sbms#include <ctype.h> 47127668Sbms#include <string.h> 48127668Sbms 49127668Sbms#include "interface.h" 50127668Sbms#include "addrtoname.h" 51127668Sbms#include "extract.h" /* must come after interface.h */ 52127668Sbms 53127668Sbms#include "aodv.h" 54127668Sbms 55127668Sbmsstatic void 56127668Sbmsaodv_extension(const struct aodv_ext *ep, u_int length) 57127668Sbms{ 58127668Sbms u_int i; 59127668Sbms const struct aodv_hello *ah; 60127668Sbms 61127668Sbms switch (ep->type) { 62127668Sbms case AODV_EXT_HELLO: 63127668Sbms if (snapend < (u_char *) ep) { 64127668Sbms printf(" [|hello]"); 65127668Sbms return; 66127668Sbms } 67127668Sbms i = min(length, (u_int)(snapend - (u_char *)ep)); 68127668Sbms if (i < sizeof(struct aodv_hello)) { 69127668Sbms printf(" [|hello]"); 70127668Sbms return; 71127668Sbms } 72127668Sbms i -= sizeof(struct aodv_hello); 73127668Sbms ah = (void *)ep; 74127668Sbms printf("\n\text HELLO %ld ms", 75127668Sbms (unsigned long)EXTRACT_32BITS(&ah->interval)); 76127668Sbms break; 77127668Sbms 78127668Sbms default: 79127668Sbms printf("\n\text %u %u", ep->type, ep->length); 80127668Sbms break; 81127668Sbms } 82127668Sbms} 83127668Sbms 84127668Sbmsstatic void 85127668Sbmsaodv_rreq(const union aodv *ap, const u_char *dat, u_int length) 86127668Sbms{ 87127668Sbms u_int i; 88127668Sbms 89127668Sbms if (snapend < dat) { 90127668Sbms printf(" [|aodv]"); 91127668Sbms return; 92127668Sbms } 93127668Sbms i = min(length, (u_int)(snapend - dat)); 94127668Sbms if (i < sizeof(ap->rreq)) { 95127668Sbms printf(" [|rreq]"); 96127668Sbms return; 97127668Sbms } 98127668Sbms i -= sizeof(ap->rreq); 99127668Sbms printf(" rreq %u %s%s%s%s%shops %u id 0x%08lx\n" 100127668Sbms "\tdst %s seq %lu src %s seq %lu", length, 101127668Sbms ap->rreq.rreq_type & RREQ_JOIN ? "[J]" : "", 102127668Sbms ap->rreq.rreq_type & RREQ_REPAIR ? "[R]" : "", 103127668Sbms ap->rreq.rreq_type & RREQ_GRAT ? "[G]" : "", 104127668Sbms ap->rreq.rreq_type & RREQ_DEST ? "[D]" : "", 105127668Sbms ap->rreq.rreq_type & RREQ_UNKNOWN ? "[U] " : " ", 106127668Sbms ap->rreq.rreq_hops, 107127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_id), 108127668Sbms ipaddr_string(&ap->rreq.rreq_da), 109127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_ds), 110127668Sbms ipaddr_string(&ap->rreq.rreq_oa), 111127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rreq.rreq_os)); 112127668Sbms if (i >= sizeof(struct aodv_ext)) 113127668Sbms aodv_extension((void *)(&ap->rreq + 1), i); 114127668Sbms} 115127668Sbms 116127668Sbmsstatic void 117127668Sbmsaodv_rrep(const union aodv *ap, const u_char *dat, u_int length) 118127668Sbms{ 119127668Sbms u_int i; 120127668Sbms 121127668Sbms if (snapend < dat) { 122127668Sbms printf(" [|aodv]"); 123127668Sbms return; 124127668Sbms } 125127668Sbms i = min(length, (u_int)(snapend - dat)); 126127668Sbms if (i < sizeof(ap->rrep)) { 127127668Sbms printf(" [|rrep]"); 128127668Sbms return; 129127668Sbms } 130127668Sbms i -= sizeof(ap->rrep); 131127668Sbms printf(" rrep %u %s%sprefix %u hops %u\n" 132127668Sbms "\tdst %s dseq %lu src %s %lu ms", length, 133127668Sbms ap->rrep.rrep_type & RREP_REPAIR ? "[R]" : "", 134127668Sbms ap->rrep.rrep_type & RREP_ACK ? "[A] " : " ", 135127668Sbms ap->rrep.rrep_ps & RREP_PREFIX_MASK, 136127668Sbms ap->rrep.rrep_hops, 137127668Sbms ipaddr_string(&ap->rrep.rrep_da), 138127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rrep.rrep_ds), 139127668Sbms ipaddr_string(&ap->rrep.rrep_oa), 140127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rrep.rrep_life)); 141127668Sbms if (i >= sizeof(struct aodv_ext)) 142127668Sbms aodv_extension((void *)(&ap->rrep + 1), i); 143127668Sbms} 144127668Sbms 145127668Sbmsstatic void 146127668Sbmsaodv_rerr(const union aodv *ap, const u_char *dat, u_int length) 147127668Sbms{ 148127668Sbms u_int i; 149127668Sbms const struct rerr_unreach *dp = NULL; 150127668Sbms int n, trunc; 151127668Sbms 152127668Sbms if (snapend < dat) { 153127668Sbms printf(" [|aodv]"); 154127668Sbms return; 155127668Sbms } 156127668Sbms i = min(length, (u_int)(snapend - dat)); 157127668Sbms if (i < offsetof(struct aodv_rerr, r)) { 158127668Sbms printf(" [|rerr]"); 159127668Sbms return; 160127668Sbms } 161127668Sbms i -= offsetof(struct aodv_rerr, r); 162127668Sbms dp = &ap->rerr.r.dest[0]; 163127668Sbms n = ap->rerr.rerr_dc * sizeof(ap->rerr.r.dest[0]); 164127668Sbms printf(" rerr %s [items %u] [%u]:", 165127668Sbms ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "", 166127668Sbms ap->rerr.rerr_dc, length); 167127668Sbms trunc = n - (i/sizeof(ap->rerr.r.dest[0])); 168127668Sbms for (; i >= sizeof(ap->rerr.r.dest[0]); 169127668Sbms ++dp, i -= sizeof(ap->rerr.r.dest[0])) { 170127668Sbms printf(" {%s}(%ld)", ipaddr_string(&dp->u_da), 171127668Sbms (unsigned long)EXTRACT_32BITS(&dp->u_ds)); 172127668Sbms } 173127668Sbms if (trunc) 174127668Sbms printf("[|rerr]"); 175127668Sbms} 176127668Sbms 177127668Sbmsstatic void 178127668Sbms#ifdef INET6 179127668Sbmsaodv_v6_rreq(const union aodv *ap, const u_char *dat, u_int length) 180127668Sbms#else 181127668Sbmsaodv_v6_rreq(const union aodv *ap _U_, const u_char *dat _U_, u_int length) 182127668Sbms#endif 183127668Sbms{ 184127668Sbms#ifdef INET6 185127668Sbms u_int i; 186127668Sbms 187127668Sbms if (snapend < dat) { 188127668Sbms printf(" [|aodv]"); 189127668Sbms return; 190127668Sbms } 191127668Sbms i = min(length, (u_int)(snapend - dat)); 192127668Sbms if (i < sizeof(ap->rreq6)) { 193127668Sbms printf(" [|rreq6]"); 194127668Sbms return; 195127668Sbms } 196127668Sbms i -= sizeof(ap->rreq6); 197127668Sbms printf(" v6 rreq %u %s%s%s%s%shops %u id 0x%08lx\n" 198127668Sbms "\tdst %s seq %lu src %s seq %lu", length, 199127668Sbms ap->rreq6.rreq_type & RREQ_JOIN ? "[J]" : "", 200127668Sbms ap->rreq6.rreq_type & RREQ_REPAIR ? "[R]" : "", 201127668Sbms ap->rreq6.rreq_type & RREQ_GRAT ? "[G]" : "", 202127668Sbms ap->rreq6.rreq_type & RREQ_DEST ? "[D]" : "", 203127668Sbms ap->rreq6.rreq_type & RREQ_UNKNOWN ? "[U] " : " ", 204127668Sbms ap->rreq6.rreq_hops, 205127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_id), 206127668Sbms ip6addr_string(&ap->rreq6.rreq_da), 207127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_ds), 208127668Sbms ip6addr_string(&ap->rreq6.rreq_oa), 209127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rreq6.rreq_os)); 210127668Sbms if (i >= sizeof(struct aodv_ext)) 211127668Sbms aodv_extension((void *)(&ap->rreq6 + 1), i); 212127668Sbms#else 213127668Sbms printf(" v6 rreq %u", length); 214127668Sbms#endif 215127668Sbms} 216127668Sbms 217127668Sbmsstatic void 218127668Sbms#ifdef INET6 219127668Sbmsaodv_v6_rrep(const union aodv *ap, const u_char *dat, u_int length) 220127668Sbms#else 221127668Sbmsaodv_v6_rrep(const union aodv *ap _U_, const u_char *dat _U_, u_int length) 222127668Sbms#endif 223127668Sbms{ 224127668Sbms#ifdef INET6 225127668Sbms u_int i; 226127668Sbms 227127668Sbms if (snapend < dat) { 228127668Sbms printf(" [|aodv]"); 229127668Sbms return; 230127668Sbms } 231127668Sbms i = min(length, (u_int)(snapend - dat)); 232127668Sbms if (i < sizeof(ap->rrep6)) { 233127668Sbms printf(" [|rrep6]"); 234127668Sbms return; 235127668Sbms } 236127668Sbms i -= sizeof(ap->rrep6); 237127668Sbms printf(" rrep %u %s%sprefix %u hops %u\n" 238127668Sbms "\tdst %s dseq %lu src %s %lu ms", length, 239127668Sbms ap->rrep6.rrep_type & RREP_REPAIR ? "[R]" : "", 240127668Sbms ap->rrep6.rrep_type & RREP_ACK ? "[A] " : " ", 241127668Sbms ap->rrep6.rrep_ps & RREP_PREFIX_MASK, 242127668Sbms ap->rrep6.rrep_hops, 243127668Sbms ip6addr_string(&ap->rrep6.rrep_da), 244127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rrep6.rrep_ds), 245127668Sbms ip6addr_string(&ap->rrep6.rrep_oa), 246127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rrep6.rrep_life)); 247127668Sbms if (i >= sizeof(struct aodv_ext)) 248127668Sbms aodv_extension((void *)(&ap->rrep6 + 1), i); 249127668Sbms#else 250127668Sbms printf(" rrep %u", length); 251127668Sbms#endif 252127668Sbms} 253127668Sbms 254127668Sbmsstatic void 255127668Sbms#ifdef INET6 256127668Sbmsaodv_v6_rerr(const union aodv *ap, u_int length) 257127668Sbms#else 258127668Sbmsaodv_v6_rerr(const union aodv *ap _U_, u_int length) 259127668Sbms#endif 260127668Sbms{ 261127668Sbms#ifdef INET6 262127668Sbms const struct rerr_unreach6 *dp6 = NULL; 263127668Sbms int i, j, n, trunc; 264127668Sbms 265127668Sbms i = length - offsetof(struct aodv_rerr, r); 266127668Sbms j = sizeof(ap->rerr.r.dest6[0]); 267127668Sbms dp6 = &ap->rerr.r.dest6[0]; 268127668Sbms n = ap->rerr.rerr_dc * j; 269127668Sbms printf(" rerr %s [items %u] [%u]:", 270127668Sbms ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "", 271127668Sbms ap->rerr.rerr_dc, length); 272127668Sbms trunc = n - (i/j); 273127668Sbms for (; i -= j >= 0; ++dp6) { 274127668Sbms printf(" {%s}(%ld)", ip6addr_string(&dp6->u_da), 275127668Sbms (unsigned long)EXTRACT_32BITS(&dp6->u_ds)); 276127668Sbms } 277127668Sbms if (trunc) 278127668Sbms printf("[|rerr]"); 279127668Sbms#else 280127668Sbms printf(" rerr %u", length); 281127668Sbms#endif 282127668Sbms} 283127668Sbms 284127668Sbmsstatic void 285127668Sbms#ifdef INET6 286127668Sbmsaodv_v6_draft_01_rreq(const union aodv *ap, const u_char *dat, u_int length) 287127668Sbms#else 288127668Sbmsaodv_v6_draft_01_rreq(const union aodv *ap _U_, const u_char *dat _U_, 289127668Sbms u_int length) 290127668Sbms#endif 291127668Sbms{ 292127668Sbms#ifdef INET6 293127668Sbms u_int i; 294127668Sbms 295127668Sbms if (snapend < dat) { 296127668Sbms printf(" [|aodv]"); 297127668Sbms return; 298127668Sbms } 299127668Sbms i = min(length, (u_int)(snapend - dat)); 300127668Sbms if (i < sizeof(ap->rreq6_draft_01)) { 301127668Sbms printf(" [|rreq6]"); 302127668Sbms return; 303127668Sbms } 304127668Sbms i -= sizeof(ap->rreq6_draft_01); 305127668Sbms printf(" rreq %u %s%s%s%s%shops %u id 0x%08lx\n" 306127668Sbms "\tdst %s seq %lu src %s seq %lu", length, 307127668Sbms ap->rreq6_draft_01.rreq_type & RREQ_JOIN ? "[J]" : "", 308127668Sbms ap->rreq6_draft_01.rreq_type & RREQ_REPAIR ? "[R]" : "", 309127668Sbms ap->rreq6_draft_01.rreq_type & RREQ_GRAT ? "[G]" : "", 310127668Sbms ap->rreq6_draft_01.rreq_type & RREQ_DEST ? "[D]" : "", 311127668Sbms ap->rreq6_draft_01.rreq_type & RREQ_UNKNOWN ? "[U] " : " ", 312127668Sbms ap->rreq6_draft_01.rreq_hops, 313127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_id), 314127668Sbms ip6addr_string(&ap->rreq6_draft_01.rreq_da), 315127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_ds), 316127668Sbms ip6addr_string(&ap->rreq6_draft_01.rreq_oa), 317127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rreq6_draft_01.rreq_os)); 318127668Sbms if (i >= sizeof(struct aodv_ext)) 319127668Sbms aodv_extension((void *)(&ap->rreq6_draft_01 + 1), i); 320127668Sbms#else 321127668Sbms printf(" rreq %u", length); 322127668Sbms#endif 323127668Sbms} 324127668Sbms 325127668Sbmsstatic void 326127668Sbms#ifdef INET6 327127668Sbmsaodv_v6_draft_01_rrep(const union aodv *ap, const u_char *dat, u_int length) 328127668Sbms#else 329127668Sbmsaodv_v6_draft_01_rrep(const union aodv *ap _U_, const u_char *dat _U_, 330127668Sbms u_int length) 331127668Sbms#endif 332127668Sbms{ 333127668Sbms#ifdef INET6 334127668Sbms u_int i; 335127668Sbms 336127668Sbms if (snapend < dat) { 337127668Sbms printf(" [|aodv]"); 338127668Sbms return; 339127668Sbms } 340127668Sbms i = min(length, (u_int)(snapend - dat)); 341127668Sbms if (i < sizeof(ap->rrep6_draft_01)) { 342127668Sbms printf(" [|rrep6]"); 343127668Sbms return; 344127668Sbms } 345127668Sbms i -= sizeof(ap->rrep6_draft_01); 346127668Sbms printf(" rrep %u %s%sprefix %u hops %u\n" 347127668Sbms "\tdst %s dseq %lu src %s %lu ms", length, 348127668Sbms ap->rrep6_draft_01.rrep_type & RREP_REPAIR ? "[R]" : "", 349127668Sbms ap->rrep6_draft_01.rrep_type & RREP_ACK ? "[A] " : " ", 350127668Sbms ap->rrep6_draft_01.rrep_ps & RREP_PREFIX_MASK, 351127668Sbms ap->rrep6_draft_01.rrep_hops, 352127668Sbms ip6addr_string(&ap->rrep6_draft_01.rrep_da), 353127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rrep6_draft_01.rrep_ds), 354127668Sbms ip6addr_string(&ap->rrep6_draft_01.rrep_oa), 355127668Sbms (unsigned long)EXTRACT_32BITS(&ap->rrep6_draft_01.rrep_life)); 356127668Sbms if (i >= sizeof(struct aodv_ext)) 357127668Sbms aodv_extension((void *)(&ap->rrep6_draft_01 + 1), i); 358127668Sbms#else 359127668Sbms printf(" rrep %u", length); 360127668Sbms#endif 361127668Sbms} 362127668Sbms 363127668Sbmsstatic void 364127668Sbms#ifdef INET6 365127668Sbmsaodv_v6_draft_01_rerr(const union aodv *ap, u_int length) 366127668Sbms#else 367127668Sbmsaodv_v6_draft_01_rerr(const union aodv *ap _U_, u_int length) 368127668Sbms#endif 369127668Sbms{ 370127668Sbms#ifdef INET6 371127668Sbms const struct rerr_unreach6_draft_01 *dp6 = NULL; 372127668Sbms int i, j, n, trunc; 373127668Sbms 374127668Sbms i = length - offsetof(struct aodv_rerr, r); 375127668Sbms j = sizeof(ap->rerr.r.dest6_draft_01[0]); 376127668Sbms dp6 = &ap->rerr.r.dest6_draft_01[0]; 377127668Sbms n = ap->rerr.rerr_dc * j; 378127668Sbms printf(" rerr %s [items %u] [%u]:", 379127668Sbms ap->rerr.rerr_flags & RERR_NODELETE ? "[D]" : "", 380127668Sbms ap->rerr.rerr_dc, length); 381127668Sbms trunc = n - (i/j); 382127668Sbms for (; i -= j >= 0; ++dp6) { 383127668Sbms printf(" {%s}(%ld)", ip6addr_string(&dp6->u_da), 384127668Sbms (unsigned long)EXTRACT_32BITS(&dp6->u_ds)); 385127668Sbms } 386127668Sbms if (trunc) 387127668Sbms printf("[|rerr]"); 388127668Sbms#else 389127668Sbms printf(" rerr %u", length); 390127668Sbms#endif 391127668Sbms} 392127668Sbms 393127668Sbmsvoid 394127668Sbmsaodv_print(const u_char *dat, u_int length, int is_ip6) 395127668Sbms{ 396127668Sbms const union aodv *ap; 397127668Sbms 398127668Sbms ap = (union aodv *)dat; 399127668Sbms if (snapend < dat) { 400127668Sbms printf(" [|aodv]"); 401127668Sbms return; 402127668Sbms } 403127668Sbms if (min(length, (u_int)(snapend - dat)) < sizeof(ap->rrep_ack)) { 404127668Sbms printf(" [|aodv]"); 405127668Sbms return; 406127668Sbms } 407127668Sbms printf(" aodv"); 408127668Sbms 409127668Sbms switch (ap->rerr.rerr_type) { 410127668Sbms 411127668Sbms case AODV_RREQ: 412127668Sbms if (is_ip6) 413127668Sbms aodv_v6_rreq(ap, dat, length); 414127668Sbms else 415127668Sbms aodv_rreq(ap, dat, length); 416127668Sbms break; 417127668Sbms 418127668Sbms case AODV_RREP: 419127668Sbms if (is_ip6) 420127668Sbms aodv_v6_rrep(ap, dat, length); 421127668Sbms else 422127668Sbms aodv_rrep(ap, dat, length); 423127668Sbms break; 424127668Sbms 425127668Sbms case AODV_RERR: 426127668Sbms if (is_ip6) 427127668Sbms aodv_v6_rerr(ap, length); 428127668Sbms else 429127668Sbms aodv_rerr(ap, dat, length); 430127668Sbms break; 431127668Sbms 432127668Sbms case AODV_RREP_ACK: 433127668Sbms printf(" rrep-ack %u", length); 434127668Sbms break; 435127668Sbms 436127668Sbms case AODV_V6_DRAFT_01_RREQ: 437127668Sbms aodv_v6_draft_01_rreq(ap, dat, length); 438127668Sbms break; 439127668Sbms 440127668Sbms case AODV_V6_DRAFT_01_RREP: 441127668Sbms aodv_v6_draft_01_rrep(ap, dat, length); 442127668Sbms break; 443127668Sbms 444127668Sbms case AODV_V6_DRAFT_01_RERR: 445127668Sbms aodv_v6_draft_01_rerr(ap, length); 446127668Sbms break; 447127668Sbms 448127668Sbms case AODV_V6_DRAFT_01_RREP_ACK: 449127668Sbms printf(" rrep-ack %u", length); 450127668Sbms break; 451127668Sbms 452127668Sbms default: 453127668Sbms printf(" %u %u", ap->rreq.rreq_type, length); 454127668Sbms } 455127668Sbms} 456