static struct icmp_control icmp_pointers[NR_ICMP_TYPES+1]; 
static const struct icmp_control icmp_pointers[NR_ICMP_TYPES+1]; 
DEFINE_SNMP_STAT(struct icmp_mib, icmp_statistics) __read_mostly;/* An array of errno for error messages from dest unreach. *//* RFC 1122: 3.2.2.1 States that NET_UNREACH, HOST_UNREACH and SR_FAILED MUST be considered 'transient errs'. */struct icmp_err icmp_err_convert[] = {	{		.errno = ENETUNREACH,	/* ICMP_NET_UNREACH */		.fatal = 0,	},	{		.errno = EHOSTUNREACH,	/* ICMP_HOST_UNREACH */		.fatal = 0,	},	{		.errno = ENOPROTOOPT	/* ICMP_PROT_UNREACH */,		.fatal = 1,	},	{		.errno = ECONNREFUSED,	/* ICMP_PORT_UNREACH */		.fatal = 1,	},	{		.errno = EMSGSIZE,	/* ICMP_FRAG_NEEDED */		.fatal = 0,	},	{		.errno = EOPNOTSUPP,	/* ICMP_SR_FAILED */		.fatal = 0,	},	{		.errno = ENETUNREACH,	/* ICMP_NET_UNKNOWN */		.fatal = 1,	},	{		.errno = EHOSTDOWN,	/* ICMP_HOST_UNKNOWN */		.fatal = 1,	},	{		.errno = ENONET,	/* ICMP_HOST_ISOLATED */		.fatal = 1,	},	{		.errno = ENETUNREACH,	/* ICMP_NET_ANO	*/		.fatal = 1,	},	{		.errno = EHOSTUNREACH,	/* ICMP_HOST_ANO */		.fatal = 1,	},	{		.errno = ENETUNREACH,	/* ICMP_NET_UNR_TOS */		.fatal = 0,	},	{		.errno = EHOSTUNREACH,	/* ICMP_HOST_UNR_TOS */		.fatal = 0,	},	{		.errno = EHOSTUNREACH,	/* ICMP_PKT_FILTERED */		.fatal = 1,	},	{		.errno = EHOSTUNREACH,	/* ICMP_PREC_VIOLATION */		.fatal = 1,	},	{		.errno = EHOSTUNREACH,	/* ICMP_PREC_CUTOFF */		.fatal = 1,	},};/* Control parameters for ECHO replies. */int sysctl_icmp_echo_ignore_all;int sysctl_icmp_echo_ignore_broadcasts = 1;/* Control parameter - ignore bogus broadcast responses? */int sysctl_icmp_ignore_bogus_error_responses;/* * 	Configurable global rate limit. * *	ratelimit defines tokens/packet consumed for dst->rate_token bucket *	ratemask defines which icmp types are ratelimited by setting * 	it's bit position. * *	default: *	dest unreachable (3), source quench (4), *	time exceeded (11), parameter problem (12) */int sysctl_icmp_ratelimit = 1 * HZ;int sysctl_icmp_ratemask = 0x1818;int sysctl_icmp_errors_use_inbound_ifaddr;/* *	ICMP control array. This specifies what to do with each ICMP. */struct icmp_control {	int output_entry;	/* Field for increment on output */	int input_entry;	/* Field for increment on input */	void (*handler)(struct sk_buff *skb);	short   error;		/* This ICMP is classed as an error message */};static struct icmp_control icmp_pointers[NR_ICMP_TYPES+1];/* *	The ICMP socket(s). 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. * *	On SMP we have one ICMP socket per-cpu. */static DEFINE_PER_CPU(struct socket *, __icmp_socket) = NULL;#define icmp_socket	__get_cpu_var(__icmp_socket)static __inline__ int icmp_xmit_lock(void){	local_bh_disable();	if (unlikely(!spin_trylock(&icmp_socket->sk->sk_lock.slock))) {		/* This can happen if the output path signals a		 * dst_link_failure() for an outgoing ICMP packet.		 */		local_bh_enable();		return 1;	}	return 0;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/9b5b5cff9a6655dbb6d2e2be365bb95eec3950eb/icmp.c/clean/net/ipv4/icmp.c