12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions retain the above copyright notice and this paragraph 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in its entirety, and (2) distributions including binary code include 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the above copyright notice and this paragraph in its entirety in 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the documentation or other materials provided with the distribution. 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR A PARTICULAR PURPOSE. 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Original code by Andy Heffernan (ahh@juniper.net) 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "@(#) $Header: /tcpdump/master/tcpdump/print-pgm.c,v 1.1.2.5 2005/06/07 22:06:16 guy Exp $"; 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h> 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h" 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h" 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipproto.h" 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * PGM header (RFC 3208) 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct pgm_header { 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgm_sport; 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgm_dport; 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t pgm_type; 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t pgm_options; 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgm_sum; 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t pgm_gsid[6]; 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgm_length; 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct pgm_spm { 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t pgms_seq; 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t pgms_trailseq; 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t pgms_leadseq; 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgms_nla_afi; 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgms_reserved; 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... u_int8_t pgms_nla[0]; */ 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... options */ 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct pgm_nak { 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t pgmn_seq; 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgmn_source_afi; 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgmn_reserved; 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... u_int8_t pgmn_source[0]; */ 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... u_int16_t pgmn_group_afi */ 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... u_int16_t pgmn_reserved2; */ 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... u_int8_t pgmn_group[0]; */ 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... options */ 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct pgm_poll { 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t pgmp_seq; 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgmp_round; 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgmp_reserved; 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... options */ 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct pgm_polr { 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t pgmp_seq; 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgmp_round; 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgmp_subtype; 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgmp_nla_afi; 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pgmp_reserved; 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... u_int8_t pgmp_nla[0]; */ 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... options */ 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct pgm_data { 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t pgmd_seq; 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t pgmd_trailseq; 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ... options */ 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef enum _pgm_type { 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_SPM = 0, /* source path message */ 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_POLL = 1, /* POLL Request */ 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_POLR = 2, /* POLL Response */ 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_ODATA = 4, /* original data */ 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_RDATA = 5, /* repair data */ 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_NAK = 8, /* NAK */ 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_NULLNAK = 9, /* Null NAK */ 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_NCF = 10, /* NAK Confirmation */ 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_ACK = 11, /* ACK for congestion control */ 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_SPMR = 12, /* SPM request */ 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_MAX = 255 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} pgm_type; 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_BIT_PRESENT 0x01 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_BIT_NETWORK 0x02 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_BIT_VAR_PKTLEN 0x40 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_BIT_PARITY 0x80 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_LENGTH 0x00 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_FRAGMENT 0x01 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_NAK_LIST 0x02 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_JOIN 0x03 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_NAK_BO_IVL 0x04 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_NAK_BO_RNG 0x05 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_REDIRECT 0x07 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_PARITY_PRM 0x08 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_PARITY_GRP 0x09 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_CURR_TGSIZE 0x0A 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_NBR_UNREACH 0x0B 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_PATH_NLA 0x0C 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_SYN 0x0D 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_FIN 0x0E 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_RST 0x0F 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_CR 0x10 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_CRQST 0x11 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_MASK 0x7f 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_OPT_END 0x80 /* end of options marker */ 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PGM_MIN_OPT_LEN 4 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef AFI_IP 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define AFI_IP 1 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define AFI_IP6 2 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpgm_print(register const u_char *bp, register u_int length, 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *bp2) 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct pgm_header *pgm; 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct ip *ip; 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char ch; 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t sport, dport; 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int addr_size; 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const void *nla; 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int nla_af; 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char nla_buf[INET6_ADDRSTRLEN]; 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct ip6_hdr *ip6; 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char nla_buf[INET_ADDRSTRLEN]; 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t opt_type, opt_len, flags1, flags2; 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t seq, opts_len, len, offset; 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pgm = (struct pgm_header *)bp; 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip = (struct ip *)bp2; 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IP_V(ip) == 6) 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6 = (struct ip6_hdr *)bp2; 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6 = NULL; 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* INET6 */ 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IP_V(ip) == 6) { 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("Can't handle IPv6"); 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* INET6 */ 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ch = '\0'; 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST(pgm->pgm_dport)) { 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ip6) { 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s > %s: [|pgm]", 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6addr_string(&ip6->ip6_src), 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6addr_string(&ip6->ip6_dst)); 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* INET6 */ 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s > %s: [|pgm]", 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&ip->ip_src), 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&ip->ip_dst)); 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sport = EXTRACT_16BITS(&pgm->pgm_sport); 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dport = EXTRACT_16BITS(&pgm->pgm_dport); 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ip6) { 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ip6->ip6_nxt == IPPROTO_PGM) { 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s.%s > %s.%s: ", 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6addr_string(&ip6->ip6_src), 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(sport), 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6addr_string(&ip6->ip6_dst), 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(dport)); 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s > %s: ", 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(sport), tcpport_string(dport)); 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/ 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ip->ip_p == IPPROTO_PGM) { 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s.%s > %s.%s: ", 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&ip->ip_src), 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(sport), 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&ip->ip_dst), 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(dport)); 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s > %s: ", 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(sport), tcpport_string(dport)); 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*pgm); 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("PGM, length %u", pgm->pgm_length); 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!vflag) 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length > pgm->pgm_length) 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length = pgm->pgm_length; 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" 0x%02x%02x%02x%02x%02x%02x ", 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pgm->pgm_gsid[0], 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pgm->pgm_gsid[1], 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pgm->pgm_gsid[2], 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pgm->pgm_gsid[3], 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pgm->pgm_gsid[4], 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pgm->pgm_gsid[5]); 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (pgm->pgm_type) { 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_SPM: { 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct pgm_spm *spm; 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project spm = (struct pgm_spm *)(pgm + 1); 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*spm); 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_16BITS(&spm->pgms_nla_afi)) { 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AFI_IP: 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr_size = sizeof(struct in_addr); 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nla_af = AF_INET; 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AFI_IP6: 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr_size = sizeof(struct in6_addr); 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nla_af = AF_INET6; 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp = (u_char *) (spm + 1); 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*bp, addr_size); 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nla = bp; 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += addr_size; 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("SPM seq %u trail %u lead %u nla %s", 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&spm->pgms_seq), 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&spm->pgms_trailseq), 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&spm->pgms_leadseq), 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nla_buf); 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_POLL: { 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct pgm_poll *poll; 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project poll = (struct pgm_poll *)(pgm + 1); 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*poll); 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("POLL seq %u round %u", 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&poll->pgmp_seq), 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&poll->pgmp_round)); 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp = (u_char *) (poll + 1); 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_POLR: { 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct pgm_polr *polr; 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t ivl, rnd, mask; 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project polr = (struct pgm_polr *)(pgm + 1); 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*polr); 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_16BITS(&polr->pgmp_nla_afi)) { 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AFI_IP: 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr_size = sizeof(struct in_addr); 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nla_af = AF_INET; 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AFI_IP6: 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr_size = sizeof(struct in6_addr); 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nla_af = AF_INET6; 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp = (u_char *) (polr + 1); 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*bp, addr_size); 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nla = bp; 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += addr_size; 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*bp, sizeof(u_int32_t)); 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ivl = EXTRACT_32BITS(bp); 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*bp, sizeof(u_int32_t)); 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rnd = EXTRACT_32BITS(bp); 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*bp, sizeof(u_int32_t)); 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mask = EXTRACT_32BITS(bp); 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("POLR seq %u round %u nla %s ivl %u rnd 0x%08x " 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "mask 0x%08x", EXTRACT_32BITS(&polr->pgmp_seq), 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&polr->pgmp_round), nla_buf, ivl, rnd, mask); 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_ODATA: { 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct pgm_data *odata; 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project odata = (struct pgm_data *)(pgm + 1); 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*odata); 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("ODATA trail %u seq %u", 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&odata->pgmd_trailseq), 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&odata->pgmd_seq)); 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp = (u_char *) (odata + 1); 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_RDATA: { 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct pgm_data *rdata; 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rdata = (struct pgm_data *)(pgm + 1); 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*rdata); 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("RDATA trail %u seq %u", 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&rdata->pgmd_trailseq), 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&rdata->pgmd_seq)); 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp = (u_char *) (rdata + 1); 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_NAK: 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_NULLNAK: 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_NCF: { 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct pgm_nak *nak; 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const void *source, *group; 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int source_af, group_af; 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char source_buf[INET6_ADDRSTRLEN], group_buf[INET6_ADDRSTRLEN]; 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char source_buf[INET_ADDRSTRLEN], group_buf[INET_ADDRSTRLEN]; 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nak = (struct pgm_nak *)(pgm + 1); 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*nak); 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Skip past the source, saving info along the way 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * and stopping if we don't have enough. 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_16BITS(&nak->pgmn_source_afi)) { 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AFI_IP: 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr_size = sizeof(struct in_addr); 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project source_af = AF_INET; 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AFI_IP6: 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr_size = sizeof(struct in6_addr); 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project source_af = AF_INET6; 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp = (u_char *) (nak + 1); 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*bp, addr_size); 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project source = bp; 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += addr_size; 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Skip past the group, saving info along the way 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * and stopping if we don't have enough. 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_16BITS(bp)) { 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AFI_IP: 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr_size = sizeof(struct in_addr); 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project group_af = AF_INET; 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AFI_IP6: 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr_size = sizeof(struct in6_addr); 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project group_af = AF_INET6; 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += (2 * sizeof(u_int16_t)); 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*bp, addr_size); 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project group = bp; 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += addr_size; 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Options decoding can go here. 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project inet_ntop(source_af, source, source_buf, sizeof(source_buf)); 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project inet_ntop(group_af, group, group_buf, sizeof(group_buf)); 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (pgm->pgm_type) { 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_NAK: 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("NAK "); 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_NULLNAK: 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("NNAK "); 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_NCF: 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("NCF "); 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("(%s -> %s), seq %u", 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project source_buf, group_buf, EXTRACT_32BITS(&nak->pgmn_seq)); 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_SPMR: 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("SPMR"); 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("UNKNOWN type %0x02x", pgm->pgm_type); 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pgm->pgm_options & PGM_OPT_BIT_PRESENT) { 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * make sure there's enough for the first option header 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*bp, PGM_MIN_OPT_LEN)) { 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[|OPT]"); 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * That option header MUST be an OPT_LENGTH option 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * (see the first paragraph of section 9.1 in RFC 3208). 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt_type = *bp++; 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((opt_type & PGM_OPT_MASK) != PGM_OPT_LENGTH) { 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[First option bad, should be PGM_OPT_LENGTH, is %u]", opt_type & PGM_OPT_MASK); 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt_len = *bp++; 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 4) { 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_LENGTH option, length %u != 4]", opt_len); 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len = EXTRACT_16BITS(bp); 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opts_len < 4) { 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad total option length %u < 4]", opts_len); 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int16_t); 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" OPTS LEN %d", opts_len); 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 4; 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (opts_len) { 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opts_len < PGM_MIN_OPT_LEN) { 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Total option length leaves no room for final option]"); 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt_type = *bp++; 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt_len = *bp++; 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len < PGM_MIN_OPT_LEN) { 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad option, length %u < %u]", opt_len, 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PGM_MIN_OPT_LEN); 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opts_len < opt_len) { 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Total option length leaves no room for final option]"); 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*bp, opt_len - 2)) { 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [|OPT]"); 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (opt_type & PGM_OPT_MASK) { 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_LENGTH: 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 4) { 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_LENGTH option, length %u != 4]", opt_len); 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" OPTS LEN (extra?) %d", EXTRACT_16BITS(bp)); 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int16_t); 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 4; 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_FRAGMENT: 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 16) { 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_FRAGMENT option, length %u != 16]", opt_len); 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project seq = EXTRACT_32BITS(bp); 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset = EXTRACT_32BITS(bp); 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = EXTRACT_32BITS(bp); 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" FRAG seq %u off %u len %u", seq, offset, len); 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 16; 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_NAK_LIST: 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt_len -= sizeof(u_int32_t); /* option header */ 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" NAK LIST"); 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (opt_len) { 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len < sizeof(u_int32_t)) { 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Option length not a multiple of 4]"); 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*bp, sizeof(u_int32_t)); 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u", EXTRACT_32BITS(bp)); 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt_len -= sizeof(u_int32_t); 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= sizeof(u_int32_t); 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_JOIN: 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 8) { 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_JOIN option, length %u != 8]", opt_len); 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project seq = EXTRACT_32BITS(bp); 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" JOIN %u", seq); 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 8; 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_NAK_BO_IVL: 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 12) { 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_NAK_BO_IVL option, length %u != 12]", opt_len); 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset = EXTRACT_32BITS(bp); 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project seq = EXTRACT_32BITS(bp); 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" BACKOFF ivl %u ivlseq %u", offset, seq); 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 12; 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_NAK_BO_RNG: 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 12) { 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_NAK_BO_RNG option, length %u != 12]", opt_len); 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset = EXTRACT_32BITS(bp); 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project seq = EXTRACT_32BITS(bp); 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" BACKOFF max %u min %u", offset, seq); 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 12; 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_REDIRECT: 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (EXTRACT_16BITS(bp)) { 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AFI_IP: 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr_size = sizeof(struct in_addr); 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nla_af = AF_INET; 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case AFI_IP6: 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr_size = sizeof(struct in6_addr); 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nla_af = AF_INET6; 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += (2 * sizeof(u_int16_t)); 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 4 + addr_size) { 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_REDIRECT option, length %u != 4 + address size]", opt_len); 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*bp, addr_size); 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nla = bp; 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += addr_size; 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf)); 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" REDIRECT %s", (char *)nla); 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 4 + addr_size; 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_PARITY_PRM: 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 8) { 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_PARITY_PRM option, length %u != 8]", opt_len); 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = EXTRACT_32BITS(bp); 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" PARITY MAXTGS %u", len); 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 8; 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_PARITY_GRP: 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 8) { 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_PARITY_GRP option, length %u != 8]", opt_len); 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project seq = EXTRACT_32BITS(bp); 6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" PARITY GROUP %u", seq); 6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 8; 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_CURR_TGSIZE: 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 8) { 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_CURR_TGSIZE option, length %u != 8]", opt_len); 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = EXTRACT_32BITS(bp); 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += sizeof(u_int32_t); 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" PARITY ATGS %u", len); 6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 8; 6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_NBR_UNREACH: 6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 4) { 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_NBR_UNREACH option, length %u != 4]", opt_len); 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" NBR_UNREACH"); 6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 4; 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_PATH_NLA: 6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" PATH_NLA [%d]", opt_len); 6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += opt_len; 6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= opt_len; 6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_SYN: 6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 4) { 6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_SYN option, length %u != 4]", opt_len); 6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" SYN"); 6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 4; 6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_FIN: 7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 4) { 7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_FIN option, length %u != 4]", opt_len); 7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" FIN"); 7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 4; 7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_RST: 7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 4) { 7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_RST option, length %u != 4]", opt_len); 7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" RST"); 7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 4; 7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_CR: 7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" CR"); 7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += opt_len; 7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= opt_len; 7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PGM_OPT_CRQST: 7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_len != 4) { 7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[Bad OPT_CRQST option, length %u != 4]", opt_len); 7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags1 = *bp++; 7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags2 = *bp++; 7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" CRQST"); 7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= 4; 7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" OPT_%02X [%d] ", opt_type, opt_len); 7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += opt_len; 7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opts_len -= opt_len; 7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt_type & PGM_OPT_END) 7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [%u]", EXTRACT_16BITS(&pgm->pgm_length)); 7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("[|pgm]", stdout); 7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ch != '\0') 7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('>'); 7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 760