⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icmp.c

📁 GNU Hurd 源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/* *	NET3:	Implementation of the ICMP protocol layer.  *	 *		Alan Cox, <alan@redhat.com> * *	Version: $Id: icmp.c,v 1.52.2.4 1999/11/16 02:28:40 davem Exp $ * *	This program is free software; you can redistribute it and/or *	modify it under the terms of the GNU General Public License *	as published by the Free Software Foundation; either version *	2 of the License, or (at your option) any later version. * *	Some of the function names and the icmp unreach table for this *	module were derived from [icmp.c 1.0.11 06/02/93] by *	Ross Biro, Fred N. van Kempen, Mark Evans, Alan Cox, Gerhard Koerting. *	Other than that this module is a complete rewrite. * *	Fixes: *		Mike Shaver	:	RFC1122 checks. *		Alan Cox	:	Multicast ping reply as self. *		Alan Cox	:	Fix atomicity lockup in ip_build_xmit  *					call. *		Alan Cox	:	Added 216,128 byte paths to the MTU  *					code. *		Martin Mares	:	RFC1812 checks. *		Martin Mares	:	Can be configured to follow redirects  *					if acting as a router _without_ a *					routing protocol (RFC 1812). *		Martin Mares	:	Echo requests may be configured to  *					be ignored (RFC 1812). *		Martin Mares	:	Limitation of ICMP error message  *					transmit rate (RFC 1812). *		Martin Mares	:	TOS and Precedence set correctly  *					(RFC 1812). *		Martin Mares	:	Now copying as much data from the  *					original packet as we can without *					exceeding 576 bytes (RFC 1812). *	Willy Konynenberg	:	Transparent proxying support. *		Keith Owens	:	RFC1191 correction for 4.2BSD based  *					path MTU bug. *		Thomas Quinot	:	ICMP Dest Unreach codes up to 15 are *					valid (RFC 1812). *		Andi Kleen	:	Check all packet lengths properly *					and moved all kfree_skb() up to *					icmp_rcv. *		Andi Kleen	:	Move the rate limit bookkeeping *					into the dest entry and use a token *					bucket filter (thanks to ANK). Make *					the rates sysctl configurable. *		Yu Tianli	:	Fixed two ugly bugs in icmp_send *					- IP option length was accounted wrongly *					- ICMP header length was not accounted at all. *              Tristan Greaves :       Added sysctl option to ignore bogus broadcast *                                      responses from broken routers. * * To Fix: * *	- Should use skb_pull() instead of all the manual checking. *	  This would also greatly simply some upper layer error handlers. --AK * * RFC1122 (Host Requirements -- Comm. Layer) Status: * (boy, are there a lot of rules for ICMP) *  3.2.2 (Generic ICMP stuff) *   MUST discard messages of unknown type. (OK) *   MUST copy at least the first 8 bytes from the offending packet *     when sending ICMP errors. (OBSOLETE -- see RFC1812) *   MUST pass received ICMP errors up to protocol level. (OK) *   SHOULD send ICMP errors with TOS == 0. (OBSOLETE -- see RFC1812) *   MUST NOT send ICMP errors in reply to: *     ICMP errors (OK) *     Broadcast/multicast datagrams (OK) *     MAC broadcasts (OK) *     Non-initial fragments (OK) *     Datagram with a source address that isn't a single host. (OK) *  3.2.2.1 (Destination Unreachable) *   All the rules govern the IP layer, and are dealt with in ip.c, not here. *  3.2.2.2 (Redirect) *   Host SHOULD NOT send ICMP_REDIRECTs.  (OK) *   MUST update routing table in response to host or network redirects. *     (host OK, network OBSOLETE) *   SHOULD drop redirects if they're not from directly connected gateway *     (OK -- we drop it if it's not from our old gateway, which is close *      enough) * 3.2.2.3 (Source Quench) *   MUST pass incoming SOURCE_QUENCHs to transport layer (OK) *   Other requirements are dealt with at the transport layer. * 3.2.2.4 (Time Exceeded) *   MUST pass TIME_EXCEEDED to transport layer (OK) *   Other requirements dealt with at IP (generating TIME_EXCEEDED). * 3.2.2.5 (Parameter Problem) *   SHOULD generate these (OK) *   MUST pass received PARAMPROBLEM to transport layer (NOT YET) *   	[Solaris 2.X seems to assert EPROTO when this occurs] -- AC * 3.2.2.6 (Echo Request/Reply) *   MUST reply to ECHO_REQUEST, and give app to do ECHO stuff (OK, OK) *   MAY discard broadcast ECHO_REQUESTs. (Configurable with a sysctl.) *   MUST reply using same source address as the request was sent to. *     We're OK for unicast ECHOs, and it doesn't say anything about *     how to handle broadcast ones, since it's optional. *   MUST copy data from REQUEST to REPLY (OK) *     unless it would require illegal fragmentation (OK) *   MUST pass REPLYs to transport/user layer (OK) *   MUST use any provided source route (reversed) for REPLY. (NOT YET) * 3.2.2.7 (Information Request/Reply) *   MUST NOT implement this. (I guess that means silently discard...?) (OK) * 3.2.2.8 (Timestamp Request/Reply) *   MAY implement (OK) *   SHOULD be in-kernel for "minimum variability" (OK) *   MAY discard broadcast REQUESTs.  (OK, but see source for inconsistency) *   MUST reply using same source address as the request was sent to. (OK) *   MUST reverse source route, as per ECHO (NOT YET) *   MUST pass REPLYs to transport/user layer (requires RAW, just like  *	ECHO) (OK) *   MUST update clock for timestamp at least 15 times/sec (OK) *   MUST be "correct within a few minutes" (OK) * 3.2.2.9 (Address Mask Request/Reply) *   MAY implement (OK) *   MUST send a broadcast REQUEST if using this system to set netmask *     (OK... we don't use it) *   MUST discard received REPLYs if not using this system (OK) *   MUST NOT send replies unless specifically made agent for this sort *     of thing. (OK) * * * RFC 1812 (IPv4 Router Requirements) Status (even longer): *  4.3.2.1 (Unknown Message Types) *   MUST pass messages of unknown type to ICMP user iface or silently discard *     them (OK) *  4.3.2.2 (ICMP Message TTL) *   MUST initialize TTL when originating an ICMP message (OK) *  4.3.2.3 (Original Message Header) *   SHOULD copy as much data from the offending packet as possible without *     the length of the ICMP datagram exceeding 576 bytes (OK) *   MUST leave original IP header of the offending packet, but we're not *     required to undo modifications made (OK) *  4.3.2.4 (Original Message Source Address) *   MUST use one of addresses for the interface the orig. packet arrived as *     source address (OK) *  4.3.2.5 (TOS and Precedence) *   SHOULD leave TOS set to the same value unless the packet would be  *     discarded for that reason (OK) *   MUST use TOS=0 if not possible to leave original value (OK) *   MUST leave IP Precedence for Source Quench messages (OK -- not sent  *	at all) *   SHOULD use IP Precedence = 6 (Internetwork Control) or 7 (Network Control) *     for all other error messages (OK, we use 6) *   MAY allow configuration of IP Precedence (OK -- not done) *   MUST leave IP Precedence and TOS for reply messages (OK) *  4.3.2.6 (Source Route) *   SHOULD use reverse source route UNLESS sending Parameter Problem on source *     routing and UNLESS the packet would be immediately discarded (NOT YET) *  4.3.2.7 (When Not to Send ICMP Errors) *   MUST NOT send ICMP errors in reply to: *     ICMP errors (OK) *     Packets failing IP header validation tests unless otherwise noted (OK) *     Broadcast/multicast datagrams (OK) *     MAC broadcasts (OK) *     Non-initial fragments (OK) *     Datagram with a source address that isn't a single host. (OK) *  4.3.2.8 (Rate Limiting) *   SHOULD be able to limit error message rate (OK) *   SHOULD allow setting of rate limits (OK, in the source) *  4.3.3.1 (Destination Unreachable) *   All the rules govern the IP layer, and are dealt with in ip.c, not here. *  4.3.3.2 (Redirect) *   MAY ignore ICMP Redirects if running a routing protocol or if forwarding *     is enabled on the interface (OK -- ignores) *  4.3.3.3 (Source Quench) *   SHOULD NOT originate SQ messages (OK) *   MUST be able to limit SQ rate if originates them (OK as we don't  *	send them) *   MAY ignore SQ messages it receives (OK -- we don't) *  4.3.3.4 (Time Exceeded) *   Requirements dealt with at IP (generating TIME_EXCEEDED). *  4.3.3.5 (Parameter Problem) *   MUST generate these for all errors not covered by other messages (OK) *   MUST include original value of the value pointed by (OK) *  4.3.3.6 (Echo Request) *   MUST implement echo server function (OK) *   MUST process at ER of at least max(576, MTU) (OK) *   MAY reject broadcast/multicast ER's (We don't, but that's OK) *   SHOULD have a config option for silently ignoring ER's (OK) *   MUST have a default value for the above switch = NO (OK) *   MUST have application layer interface for Echo Request/Reply (OK) *   MUST reply using same source address as the request was sent to. *     We're OK for unicast ECHOs, and it doesn't say anything about *     how to handle broadcast ones, since it's optional. *   MUST copy data from Request to Reply (OK) *   SHOULD update Record Route / Timestamp options (??) *   MUST use reversed Source Route for Reply if possible (NOT YET) *  4.3.3.7 (Information Request/Reply) *   SHOULD NOT originate or respond to these (OK) *  4.3.3.8 (Timestamp / Timestamp Reply) *   MAY implement (OK) *   MUST reply to every Timestamp message received (OK) *   MAY discard broadcast REQUESTs.  (OK, but see source for inconsistency) *   MUST reply using same source address as the request was sent to. (OK) *   MUST use reversed Source Route if possible (NOT YET) *   SHOULD update Record Route / Timestamp options (??) *   MUST pass REPLYs to transport/user layer (requires RAW, just like  *	ECHO) (OK) *   MUST update clock for timestamp at least 16 times/sec (OK) *   MUST be "correct within a few minutes" (OK) * 4.3.3.9 (Address Mask Request/Reply) *   MUST have support for receiving AMRq and responding with AMRe (OK,  *	but only as a compile-time option) *   SHOULD have option for each interface for AMRe's, MUST default to  *	NO (NOT YET) *   MUST NOT reply to AMRq before knows the correct AM (OK) *   MUST NOT respond to AMRq with source address 0.0.0.0 on physical *    	interfaces having multiple logical i-faces with different masks *	(NOT YET) *   SHOULD examine all AMRe's it receives and check them (NOT YET) *   SHOULD log invalid AMRe's (AM+sender) (NOT YET) *   MUST NOT use contents of AMRe to determine correct AM (OK) *   MAY broadcast AMRe's after having configured address masks (OK -- doesn't) *   MUST NOT do broadcast AMRe's if not set by extra option (OK, no option) *   MUST use the { <NetPrefix>, -1 } form of broadcast addresses (OK) * 4.3.3.10 (Router Advertisement and Solicitations) *   MUST support router part of Router Discovery Protocol on all networks we *     support broadcast or multicast addressing. (OK -- done by gated) *   MUST have all config parameters with the respective defaults (OK) * 5.2.7.1 (Destination Unreachable) *   MUST generate DU's (OK) *   SHOULD choose a best-match response code (OK) *   SHOULD NOT generate Host Isolated codes (OK) *   SHOULD use Communication Administratively Prohibited when administratively *     filtering packets (NOT YET -- bug-to-bug compatibility) *   MAY include config option for not generating the above and silently *	discard the packets instead (OK) *   MAY include config option for not generating Precedence Violation and *     Precedence Cutoff messages (OK as we don't generate them at all) *   MUST use Host Unreachable or Dest. Host Unknown codes whenever other hosts *     on the same network might be reachable (OK -- no net unreach's at all) *   MUST use new form of Fragmentation Needed and DF Set messages (OK) * 5.2.7.2 (Redirect) *   MUST NOT generate network redirects (OK) *   MUST be able to generate host redirects (OK) *   SHOULD be able to generate Host+TOS redirects (NO as we don't use TOS) *   MUST have an option to use Host redirects instead of Host+TOS ones (OK as *     no Host+TOS Redirects are used) *   MUST NOT generate redirects unless forwarding to the same i-face and the *     dest. address is on the same subnet as the src. address and no source *     routing is in use. (OK) *   MUST NOT follow redirects when using a routing protocol (OK) *   MAY use redirects if not using a routing protocol (OK, compile-time option) *   MUST comply to Host Requirements when not acting as a router (OK) *  5.2.7.3 (Time Exceeded) *   MUST generate Time Exceeded Code 0 when discarding packet due to TTL=0 (OK) *   MAY have a per-interface option to disable origination of TE messages, but *     it MUST default to "originate" (OK -- we don't support it) */#include <linux/config.h>#include <linux/types.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/fcntl.h>#include <linux/socket.h>#include <linux/in.h>#include <linux/inet.h>#include <linux/netdevice.h>#include <linux/string.h>#include <net/snmp.h>#include <net/ip.h>#include <net/route.h>#include <net/protocol.h>#include <net/icmp.h>#include <net/tcp.h>#include <net/udp.h>#include <net/raw.h>#include <net/snmp.h>#include <linux/skbuff.h>#include <net/sock.h>#include <linux/errno.h>#include <linux/timer.h>#include <linux/init.h>#include <asm/system.h>#include <asm/uaccess.h>#include <net/checksum.h>#ifdef CONFIG_IP_MASQUERADE#include <net/ip_masq.h>#endif#define min(a,b)	((a)<(b)?(a):(b))/* *	Statistics */ struct icmp_mib icmp_statistics;/* An array of errno for error messages from dest unreach. *//* RFC 1122: 3.2.2.1 States that NET_UNREACH, HOS_UNREACH and SR_FAIELD MUST be considered 'transient errs'. */struct icmp_err icmp_err_convert[] = {  { ENETUNREACH,	0 },	/*	ICMP_NET_UNREACH	*/  { EHOSTUNREACH,	0 },	/*	ICMP_HOST_UNREACH	*/  { ENOPROTOOPT,	1 },	/*	ICMP_PROT_UNREACH	*/  { ECONNREFUSED,	1 },	/*	ICMP_PORT_UNREACH	*/  { EMSGSIZE,		0 },	/*	ICMP_FRAG_NEEDED	*/  { EOPNOTSUPP,		0 },	/*	ICMP_SR_FAILED		*/  { ENETUNREACH,	1 },	/* 	ICMP_NET_UNKNOWN	*/  { EHOSTDOWN,		1 },	/*	ICMP_HOST_UNKNOWN	*/  { ENONET,		1 },	/*	ICMP_HOST_ISOLATED	*/  { ENETUNREACH,	1 },	/*	ICMP_NET_ANO		*/  { EHOSTUNREACH,	1 },	/*	ICMP_HOST_ANO		*/  { ENETUNREACH,	0 },	/*	ICMP_NET_UNR_TOS	*/  { EHOSTUNREACH,	0 },	/*	ICMP_HOST_UNR_TOS	*/  { EHOSTUNREACH,	1 },	/*	ICMP_PKT_FILTERED	*/  { EHOSTUNREACH,	1 },	/*	ICMP_PREC_VIOLATION	*/  { EHOSTUNREACH,	1 }	/*	ICMP_PREC_CUTOFF	*/};/* Control parameters for ECHO relies. */int sysctl_icmp_echo_ignore_all = 0;int sysctl_icmp_echo_ignore_broadcasts = 0;/* Control parameter - ignore bogus broadcast responses? */int sysctl_icmp_ignore_bogus_error_responses =0;extern int sysctl_ip_always_defrag;/* *	ICMP control array. This specifies what to do with each ICMP. */struct icmp_control{	unsigned long *output;		/* Address to increment on output */	unsigned long *input;		/* Address to increment on input */	void (*handler)(struct icmphdr *icmph, struct sk_buff *skb, int len);	short	error;		/* This ICMP is classed as an error message */	int *timeout; /* Rate limit */};static struct icmp_control icmp_pointers[NR_ICMP_TYPES+1];/* *	Build xmit assembly blocks */struct icmp_bxm{	void *data_ptr;	int data_len;	struct icmphdr icmph;	unsigned long csum;	struct ip_options replyopts;	unsigned char  optbuf[40];};/* *	The ICMP socket. This is the most convenient way to flow control *	our ICMP output as well as maintain a clean interface throughout *	all layers. All Socketless IP sends will soon be gone. */	struct inode icmp_inode;struct socket *icmp_socket=&icmp_inode.u.socket_i;/* *	Send an ICMP frame. *//* *	Check transmit rate limitation for given message. *	The rate information is held in the destination cache now. *	This function is generic and could be used for other purposes *	too. It uses a Token bucket filter as suggested by Alexey Kuznetsov. * *	Note that the same dst_entry fields are modified by functions in  *	route.c too, but these work for packet destinations while xrlim_allow *	works for icmp destinations. This means the rate limiting information *	for one "ip object" is shared. * *	Note that the same dst_entry fields are modified by functions in  *	route.c too, but these work for packet destinations while xrlim_allow *	works for icmp destinations. This means the rate limiting information *	for one "ip object" is shared - and these ICMPs are twice limited: *	by source and by destination. * *	RFC 1812: 4.3.2.8 SHOULD be able to limit error message rate *			  SHOULD allow setting of rate limits  *

⌨️ 快捷键说明

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