♦ icmp_redirect — отправка сообщения переадресации;
♦ icmp_send — отправка ICMP-сообщения;
♦ icmp_timestamp — ответ на запрос о времени создания;
♦ icmp_unreach — отправляет сообщение об ошибке;
♦ xrlim_allow — решает, отправлять ли ICMP-пакет или нет;
♦ xrlim_init — ограничение скорости передачи ICMP-пакетов (в версии ядра 2.0).
27.2.4.1. Технические подробности
Прежде чем перейти к рассмотрению функций ICMP, разберемся, как же ICMP-пакеты принимаются операционной системой. Собственно, ICMP-пакет принимается операционной системой Linux так же, как и любой другой пакет. Драйвер сетевой платы (или другого сетевого устройства) собирает полный пакет данных, затем он строит структуру sk_buff.
Листинг 27.1. Структура sk_buff
struct sk_buff {
/*
Эти два члена должны быть первыми */
struct sk_buff* next; /* Следующий буфер в списке*/
struct sk_buff* prev;/* Предыдущий буфер в списке*/
struct sk_buff_head * list; /* "Голова" списка */
struct sock *sk; /* Сокет */
struct timeval stamp; /* Время прибытия пакета */
struct net_device *dev; /* Сетевое устройство */
/* Заголовок транспортного уровня */
union {
struct tcphdr *th;
struct udphdr *uh;
struct icmphdr *icmph;
struct igmphdr* igmph;
struct iphdr *ipiph;
struct spxhdr *spxh;
unsigned char *raw;
} h;
/* Заголовок сетевого уровня */
union {
struct iphdr *iph;
struct ipv6hdr* ipv6h;
struct arphdr *arph;
struct ipxhdr *ipxh;
unsigned char *raw;
} nh;
union {
struct ethhdr *ethernet;
unsigned char *raw;
} mac;
struct dst_entry *dst;
char cb[48];
unsigned int len; /* Длина данных */
unsigned int data_len;
unsigned int csum; /* Контрольная сумма */
unsigned char __unused, /* He используется */
cloned, /* Заголовок должен клонироваться */
pkt_type, /* Класс пакета */
ip_summed; /* контрольная сумма IP */
__u32 priority; /* Приоритет пакета */
atomic_t users; /* Счетчик пользователей — см.
datagram.c, tcp.c */
unsigned short protocol; /* Протокол пакета */
unsigned short security; /* Уровень безопасности */
unsigned int truesize; /* Размер буфера */
unsigned char *head; /* Заголовок буфера */
unsigned char *data; /* Указатель заголовка данных */