Home | History | Annotate | Download | only in snoop
      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