print-ip.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 242 行

C
242
字号
/* * Copyright (c) 1988-1990 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * SCCSID: @(#)print-ip.c	4.1	ULTRIX	1/25/91 * Based on: *rcsid[] = "@(#) $Header: print-ip.c,v 1.20 90/12/04 17:11:33 mccanne Exp $ (LBL)" */#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netinet/in_systm.h>#include <netinet/ip.h>#include <netinet/ip_var.h>#include <netinet/udp.h>#include <netinet/udp_var.h>#include <netinet/tcp.h>#include <netinet/tcpip.h>#include "interface.h"#include "addrtoname.h"/* * print the recorded route in an IP RR, LSRR or SSRR option. */static voidip_printroute(type, cp, length)	char *type;	register u_char *cp;	int length;{	int ptr = cp[2] - 1;	int len;	printf(" %s{", type);	if ((length + 1) & 3)		printf(" [bad length %d]", length);	if (ptr < 3 || ((ptr + 1) & 3) || ptr > length + 1)		printf(" [bad ptr %d]", cp[2]);	type = "";	for (len = 3; len < length; len += 4) {		if (ptr == len)			type = "#";#ifdef ALIGN		{		struct in_addr addr;		bcopy((char *)&cp[len], (char *)&addr, sizeof(addr));		printf("%s%s", type, ipaddr_string(&addr));		}#else		printf("%s%s", type, ipaddr_string(&cp[len]));#endif		type = " ";	}	printf("%s}", ptr == len? "#" : "");}/* * print IP options. */static voidip_optprint(cp, length)	register u_char *cp;	int length;{	int len;	for (; length > 0; cp += len, length -= len) {		switch (*cp) {		case IPOPT_EOL:			printf(" EOL");			if (++len < length)				printf("-%d", length - len);			length = 0;			break;		case IPOPT_NOP:			printf(" NOP");			len = 1;			break;		case IPOPT_TS:			len = cp[1];			printf(" TS{%d}", len);			break;		case IPOPT_SECURITY:			len = cp[1];			printf(" SECURITY{%d}", len);			break;		case IPOPT_RR:			len = cp[1];			printf(" RR{%d}=", len);			ip_printroute("RR", cp, len);			break;		case IPOPT_SSRR:			len = cp[1];			ip_printroute("SSRR", cp, len);			break;		case IPOPT_LSRR:			len = cp[1];			ip_printroute("LSRR", cp, len);			break;		default:			len = cp[1];			printf(" IPOPT-%d{%d}", cp[0], len);			break;		}	}}/* * print an IP datagram. */voidip_print(ip, length)	register struct ip *ip;	register int length;{	register int hlen;	register int len;	register unsigned char *cp;#ifdef ALIGN	static u_char *abuf;	/*	 * The IP header is not word aligned, so copy into abuf.	 * This will never happen with BPF.  Maybe with should #ifdef	 * on that too. XXX	 */	if ((int)ip & (sizeof(long)-1)) {		if (abuf == 0)			abuf = (u_char *)malloc(snaplen);		bcopy((char *)ip, (char *)abuf, min(length, snaplen));		snapend += abuf - (u_char *)ip;		packetp = abuf;		ip = (struct ip *)abuf;	}#endif	if (length < sizeof (struct ip)) {		(void)printf("truncated-ip %d", length);		return;	}	hlen = ip->ip_hl * 4;	NTOHS(ip->ip_len);	NTOHS(ip->ip_off);	NTOHS(ip->ip_id);	len = ip->ip_len - hlen;	if (length < ip->ip_len)		(void)printf("truncated-ip - %d bytes missing!",			ip->ip_len - length);	/*	 * If this is fragment zero, hand it to the next higher	 * level protocol.	 */	if ((ip->ip_off & 0x1fff) == 0) {		cp = (unsigned char *)ip + hlen;		switch (ip->ip_p) {		case IPPROTO_TCP:			tcp_print((struct tcphdr *)cp, len, ip);			break;		case IPPROTO_UDP:			udp_print((struct udphdr *)cp, len, ip);			break;		case IPPROTO_ICMP:			icmp_print((struct icmp *)cp, ip);			break;		case IPPROTO_ND:			(void)printf("%s > %s:", ipaddr_string(&ip->ip_src),				ipaddr_string(&ip->ip_dst));			(void)printf(" nd %d", len);			break;		default:			(void)printf("%s > %s:", ipaddr_string(&ip->ip_src),				ipaddr_string(&ip->ip_dst));			(void)printf(" ip-proto-%d %d", ip->ip_p, len);			break;		}	}	/*	 * for fragmented datagrams, print id:size@offset.  On all	 * but the last stick a "+".  For unfragmented datagrams, note	 * the don't fragment flag.	 */	if (ip->ip_off & 0x3fff) {		/*		 * if this isn't the first frag, we're missing the		 * next level protocol header.  print the ip addr.		 */		if (ip->ip_off & 0x1fff)			(void)printf("%s > %s:", ipaddr_string(&ip->ip_src),				      ipaddr_string(&ip->ip_dst));		(void)printf(" (frag %x:%d@%d%s)", ip->ip_id, len,			(ip->ip_off & 0x1fff) * 8,			(ip->ip_off & IP_MF)? "+" : "");	} else if (ip->ip_off & IP_DF)		(void)printf(" (DF)");	if (ip->ip_tos)		(void)printf(" [tos 0x%x]", (int)ip->ip_tos);	if (ip->ip_ttl <= 1)		(void)printf(" [ttl %d]", (int)ip->ip_ttl);	if (vflag) {		char *sep = "";		printf("(");		if (ip->ip_ttl > 1) {			(void)printf("%sttl %d", sep, (int)ip->ip_ttl);			sep = ", ";		}		if ((ip->ip_off & 0x3fff) == 0) {			(void)printf("%sid %d", sep, (int)ip->ip_id);			sep = ", ";		}		if ((hlen -= sizeof(struct ip)) > 0) {			(void)printf("%soptlen=%d", sep, hlen);			ip_optprint((u_char *)(ip + 1), hlen);		}		printf(")");	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?