1*d881c474Schristos /* 2*d881c474Schristos * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 3*d881c474Schristos * The Regents of the University of California. All rights reserved. 4*d881c474Schristos * 5*d881c474Schristos * Redistribution and use in source and binary forms, with or without 6*d881c474Schristos * modification, are permitted provided that: (1) source code distributions 7*d881c474Schristos * retain the above copyright notice and this paragraph in its entirety, (2) 8*d881c474Schristos * distributions including binary code include the above copyright notice and 9*d881c474Schristos * this paragraph in its entirety in the documentation or other materials 10*d881c474Schristos * provided with the distribution, and (3) all advertising materials mentioning 11*d881c474Schristos * features or use of this software display the following acknowledgement: 12*d881c474Schristos * ``This product includes software developed by the University of California, 13*d881c474Schristos * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14*d881c474Schristos * the University nor the names of its contributors may be used to endorse 15*d881c474Schristos * or promote products derived from this software without specific prior 16*d881c474Schristos * written permission. 17*d881c474Schristos * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18*d881c474Schristos * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19*d881c474Schristos * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20*d881c474Schristos */ 21*d881c474Schristos 22*d881c474Schristos /* \summary: IPv4/IPv6 payload printer */ 23*d881c474Schristos 24*d881c474Schristos #include <config.h> 25*d881c474Schristos 26*d881c474Schristos #include "netdissect-stdinc.h" 27*d881c474Schristos 28*d881c474Schristos #include "netdissect.h" 29*d881c474Schristos #include "addrtoname.h" 30*d881c474Schristos #include "extract.h" 31*d881c474Schristos 32*d881c474Schristos #include "ip.h" 33*d881c474Schristos #include "ipproto.h" 34*d881c474Schristos 35*d881c474Schristos void 36*d881c474Schristos ip_demux_print(netdissect_options *ndo, 37*d881c474Schristos const u_char *bp, 38*d881c474Schristos u_int length, u_int ver, int fragmented, u_int ttl_hl, 39*d881c474Schristos uint8_t nh, const u_char *iph) 40*d881c474Schristos { 41*d881c474Schristos int advance; 42*d881c474Schristos const char *p_name; 43*d881c474Schristos 44*d881c474Schristos advance = 0; 45*d881c474Schristos 46*d881c474Schristos again: 47*d881c474Schristos switch (nh) { 48*d881c474Schristos 49*d881c474Schristos case IPPROTO_AH: 50*d881c474Schristos if (!ND_TTEST_1(bp)) { 51*d881c474Schristos ndo->ndo_protocol = "ah"; 52*d881c474Schristos nd_print_trunc(ndo); 53*d881c474Schristos break; 54*d881c474Schristos } 55*d881c474Schristos nh = GET_U_1(bp); 56*d881c474Schristos advance = ah_print(ndo, bp); 57*d881c474Schristos if (advance <= 0) 58*d881c474Schristos break; 59*d881c474Schristos bp += advance; 60*d881c474Schristos length -= advance; 61*d881c474Schristos goto again; 62*d881c474Schristos 63*d881c474Schristos case IPPROTO_ESP: 64*d881c474Schristos { 65*d881c474Schristos esp_print(ndo, bp, length, iph, ver, fragmented, ttl_hl); 66*d881c474Schristos /* 67*d881c474Schristos * Either this has decrypted the payload and 68*d881c474Schristos * printed it, in which case there's nothing more 69*d881c474Schristos * to do, or it hasn't, in which case there's 70*d881c474Schristos * nothing more to do. 71*d881c474Schristos */ 72*d881c474Schristos break; 73*d881c474Schristos } 74*d881c474Schristos 75*d881c474Schristos case IPPROTO_IPCOMP: 76*d881c474Schristos { 77*d881c474Schristos ipcomp_print(ndo, bp); 78*d881c474Schristos /* 79*d881c474Schristos * Either this has decompressed the payload and 80*d881c474Schristos * printed it, in which case there's nothing more 81*d881c474Schristos * to do, or it hasn't, in which case there's 82*d881c474Schristos * nothing more to do. 83*d881c474Schristos */ 84*d881c474Schristos break; 85*d881c474Schristos } 86*d881c474Schristos 87*d881c474Schristos case IPPROTO_SCTP: 88*d881c474Schristos sctp_print(ndo, bp, iph, length); 89*d881c474Schristos break; 90*d881c474Schristos 91*d881c474Schristos case IPPROTO_DCCP: 92*d881c474Schristos dccp_print(ndo, bp, iph, length); 93*d881c474Schristos break; 94*d881c474Schristos 95*d881c474Schristos case IPPROTO_TCP: 96*d881c474Schristos tcp_print(ndo, bp, length, iph, fragmented); 97*d881c474Schristos break; 98*d881c474Schristos 99*d881c474Schristos case IPPROTO_UDP: 100*d881c474Schristos udp_print(ndo, bp, length, iph, fragmented, ttl_hl); 101*d881c474Schristos break; 102*d881c474Schristos 103*d881c474Schristos case IPPROTO_ICMP: 104*d881c474Schristos if (ver == 4) 105*d881c474Schristos icmp_print(ndo, bp, length, iph, fragmented); 106*d881c474Schristos else { 107*d881c474Schristos ND_PRINT("[%s requires IPv4]", 108*d881c474Schristos tok2str(ipproto_values,"unknown",nh)); 109*d881c474Schristos nd_print_invalid(ndo); 110*d881c474Schristos } 111*d881c474Schristos break; 112*d881c474Schristos 113*d881c474Schristos case IPPROTO_ICMPV6: 114*d881c474Schristos if (ver == 6) 115*d881c474Schristos icmp6_print(ndo, bp, length, iph, fragmented); 116*d881c474Schristos else { 117*d881c474Schristos ND_PRINT("[%s requires IPv6]", 118*d881c474Schristos tok2str(ipproto_values,"unknown",nh)); 119*d881c474Schristos nd_print_invalid(ndo); 120*d881c474Schristos } 121*d881c474Schristos break; 122*d881c474Schristos 123*d881c474Schristos case IPPROTO_PIGP: 124*d881c474Schristos /* 125*d881c474Schristos * XXX - the current IANA protocol number assignments 126*d881c474Schristos * page lists 9 as "any private interior gateway 127*d881c474Schristos * (used by Cisco for their IGRP)" and 88 as 128*d881c474Schristos * "EIGRP" from Cisco. 129*d881c474Schristos * 130*d881c474Schristos * Recent BSD <netinet/in.h> headers define 131*d881c474Schristos * IP_PROTO_PIGP as 9 and IP_PROTO_IGRP as 88. 132*d881c474Schristos * We define IP_PROTO_PIGP as 9 and 133*d881c474Schristos * IP_PROTO_EIGRP as 88; those names better 134*d881c474Schristos * match was the current protocol number 135*d881c474Schristos * assignments say. 136*d881c474Schristos */ 137*d881c474Schristos igrp_print(ndo, bp, length); 138*d881c474Schristos break; 139*d881c474Schristos 140*d881c474Schristos case IPPROTO_EIGRP: 141*d881c474Schristos eigrp_print(ndo, bp, length); 142*d881c474Schristos break; 143*d881c474Schristos 144*d881c474Schristos case IPPROTO_ND: 145*d881c474Schristos ND_PRINT(" nd %u", length); 146*d881c474Schristos break; 147*d881c474Schristos 148*d881c474Schristos case IPPROTO_EGP: 149*d881c474Schristos egp_print(ndo, bp, length); 150*d881c474Schristos break; 151*d881c474Schristos 152*d881c474Schristos case IPPROTO_OSPF: 153*d881c474Schristos if (ver == 6) 154*d881c474Schristos ospf6_print(ndo, bp, length); 155*d881c474Schristos else 156*d881c474Schristos ospf_print(ndo, bp, length, iph); 157*d881c474Schristos break; 158*d881c474Schristos 159*d881c474Schristos case IPPROTO_IGMP: 160*d881c474Schristos if (ver == 4) 161*d881c474Schristos igmp_print(ndo, bp, length); 162*d881c474Schristos else { 163*d881c474Schristos ND_PRINT("[%s requires IPv4]", 164*d881c474Schristos tok2str(ipproto_values,"unknown",nh)); 165*d881c474Schristos nd_print_invalid(ndo); 166*d881c474Schristos } 167*d881c474Schristos break; 168*d881c474Schristos 169*d881c474Schristos case IPPROTO_IPV4: 170*d881c474Schristos /* ipv4-in-ip encapsulation */ 171*d881c474Schristos ip_print(ndo, bp, length); 172*d881c474Schristos break; 173*d881c474Schristos 174*d881c474Schristos case IPPROTO_IPV6: 175*d881c474Schristos /* ip6-in-ip encapsulation */ 176*d881c474Schristos ip6_print(ndo, bp, length); 177*d881c474Schristos break; 178*d881c474Schristos 179*d881c474Schristos case IPPROTO_RSVP: 180*d881c474Schristos rsvp_print(ndo, bp, length); 181*d881c474Schristos break; 182*d881c474Schristos 183*d881c474Schristos case IPPROTO_GRE: 184*d881c474Schristos gre_print(ndo, bp, length); 185*d881c474Schristos break; 186*d881c474Schristos 187*d881c474Schristos case IPPROTO_MOBILE: 188*d881c474Schristos mobile_print(ndo, bp, length); 189*d881c474Schristos break; 190*d881c474Schristos 191*d881c474Schristos case IPPROTO_PIM: 192*d881c474Schristos pim_print(ndo, bp, length, iph); 193*d881c474Schristos break; 194*d881c474Schristos 195*d881c474Schristos case IPPROTO_VRRP: 196*d881c474Schristos if (ndo->ndo_packettype == PT_CARP) { 197*d881c474Schristos carp_print(ndo, bp, length, ttl_hl); 198*d881c474Schristos } else { 199*d881c474Schristos vrrp_print(ndo, bp, length, iph, ttl_hl, ver); 200*d881c474Schristos } 201*d881c474Schristos break; 202*d881c474Schristos 203*d881c474Schristos case IPPROTO_PGM: 204*d881c474Schristos pgm_print(ndo, bp, length, iph); 205*d881c474Schristos break; 206*d881c474Schristos 207*d881c474Schristos case IPPROTO_ETHERNET: 208*d881c474Schristos if (ver == 6) 209*d881c474Schristos ether_print(ndo, bp, length, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL); 210*d881c474Schristos else { 211*d881c474Schristos ND_PRINT("[%s requires IPv6]", 212*d881c474Schristos tok2str(ipproto_values,"unknown",nh)); 213*d881c474Schristos nd_print_invalid(ndo); 214*d881c474Schristos } 215*d881c474Schristos break; 216*d881c474Schristos 217*d881c474Schristos case IPPROTO_NONE: 218*d881c474Schristos ND_PRINT("no next header"); 219*d881c474Schristos break; 220*d881c474Schristos 221*d881c474Schristos default: 222*d881c474Schristos if (ndo->ndo_nflag==0 && (p_name = netdb_protoname(nh)) != NULL) 223*d881c474Schristos ND_PRINT(" %s", p_name); 224*d881c474Schristos else 225*d881c474Schristos ND_PRINT(" ip-proto-%u", nh); 226*d881c474Schristos ND_PRINT(" %u", length); 227*d881c474Schristos break; 228*d881c474Schristos } 229*d881c474Schristos } 230