1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 0 stevel * Common Development and Distribution License, Version 1.0 only 6 0 stevel * (the "License"). You may not use this file except in compliance 7 0 stevel * with the License. 8 0 stevel * 9 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 0 stevel * or http://www.opensolaris.org/os/licensing. 11 0 stevel * See the License for the specific language governing permissions 12 0 stevel * and limitations under the License. 13 0 stevel * 14 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 15 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 0 stevel * If applicable, add the following below this CDDL HEADER, with the 17 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 18 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 19 0 stevel * 20 0 stevel * CDDL HEADER END 21 0 stevel */ 22 0 stevel /* 23 410 kcpoon * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 410 kcpoon * Use is subject to license terms. 25 0 stevel */ 26 0 stevel 27 410 kcpoon #pragma ident "%Z%%M% %I% %E% SMI" 28 0 stevel 29 0 stevel #include <stdio.h> 30 0 stevel #include <ctype.h> 31 0 stevel #include <string.h> 32 0 stevel #include <fcntl.h> 33 0 stevel #include <string.h> 34 0 stevel #include <sys/types.h> 35 0 stevel #include <sys/time.h> 36 0 stevel 37 0 stevel #include <sys/socket.h> 38 0 stevel #include <sys/sockio.h> 39 0 stevel #include <net/if.h> 40 0 stevel #include <netinet/in_systm.h> 41 0 stevel #include <netinet/in.h> 42 0 stevel #include <netinet/ip.h> 43 0 stevel #include <netinet/if_ether.h> 44 0 stevel #include <netinet/udp.h> 45 0 stevel #include "snoop.h" 46 0 stevel 47 0 stevel extern char *dlc_header; 48 0 stevel 49 410 kcpoon int 50 410 kcpoon interpret_udp(int flags, struct udphdr *udp, int iplen, int fraglen) 51 0 stevel { 52 0 stevel char *data; 53 0 stevel int udplen; 54 0 stevel int sunrpc; 55 0 stevel char *pname; 56 0 stevel char buff [32]; 57 0 stevel 58 0 stevel if (fraglen < sizeof (struct udphdr)) 59 0 stevel return (fraglen); /* incomplete header */ 60 0 stevel 61 0 stevel data = (char *)udp + sizeof (struct udphdr); 62 410 kcpoon udplen = ntohs((ushort_t)udp->uh_ulen) - sizeof (struct udphdr); 63 0 stevel fraglen -= sizeof (struct udphdr); 64 0 stevel if (fraglen > udplen) 65 0 stevel fraglen = udplen; 66 0 stevel 67 0 stevel if (flags & F_SUM) { 68 0 stevel (void) sprintf(get_sum_line(), 69 0 stevel "UDP D=%d S=%d LEN=%d", 70 0 stevel ntohs(udp->uh_dport), 71 0 stevel ntohs(udp->uh_sport), 72 410 kcpoon ntohs((ushort_t)udp->uh_ulen)); 73 0 stevel } 74 0 stevel 75 0 stevel sunrpc = !reservedport(IPPROTO_UDP, ntohs(udp->uh_dport)) && 76 0 stevel !reservedport(IPPROTO_UDP, ntohs(udp->uh_sport)) && 77 0 stevel valid_rpc(data, udplen); 78 0 stevel 79 0 stevel if (flags & F_DTAIL) { 80 0 stevel show_header("UDP: ", "UDP Header", udplen); 81 0 stevel show_space(); 82 410 kcpoon (void) sprintf(get_line((char *)(uintptr_t)udp->uh_sport - 83 410 kcpoon dlc_header, 1), "Source port = %d", ntohs(udp->uh_sport)); 84 0 stevel 85 0 stevel if (sunrpc) { 86 0 stevel pname = "(Sun RPC)"; 87 0 stevel } else { 88 0 stevel pname = getportname(IPPROTO_UDP, ntohs(udp->uh_dport)); 89 0 stevel if (pname == NULL) { 90 0 stevel pname = ""; 91 0 stevel } else { 92 0 stevel (void) sprintf(buff, "(%s)", pname); 93 0 stevel pname = buff; 94 0 stevel } 95 0 stevel } 96 410 kcpoon (void) sprintf(get_line((char *)(uintptr_t)udp->uh_dport - 97 410 kcpoon dlc_header, 1), "Destination port = %d %s", 98 410 kcpoon ntohs(udp->uh_dport), pname); 99 410 kcpoon (void) sprintf(get_line((char *)(uintptr_t)udp->uh_ulen - 100 410 kcpoon dlc_header, 1), "Length = %d %s", 101 410 kcpoon ntohs((ushort_t)udp->uh_ulen), 102 410 kcpoon udplen > fraglen ? 103 410 kcpoon "(Not all data contained in this fragment)" 104 410 kcpoon : ""); 105 410 kcpoon (void) sprintf(get_line((char *)(uintptr_t)udp->uh_sum - 106 410 kcpoon dlc_header, 1), "Checksum = %04X %s", 107 410 kcpoon ntohs(udp->uh_sum), 108 410 kcpoon udp->uh_sum == 0 ? "(no checksum)" : ""); 109 0 stevel show_space(); 110 0 stevel } 111 0 stevel 112 0 stevel 113 0 stevel /* go to the next protocol layer */ 114 0 stevel 115 0 stevel if (!interpret_reserved(flags, IPPROTO_UDP, 116 0 stevel ntohs(udp->uh_sport), 117 0 stevel ntohs(udp->uh_dport), 118 0 stevel data, fraglen)) { 119 0 stevel if (fraglen > 0 && sunrpc) 120 0 stevel interpret_rpc(flags, data, fraglen, IPPROTO_UDP); 121 0 stevel } 122 0 stevel 123 0 stevel return (fraglen); 124 0 stevel } 125