Драйвер сетевого устройства при формировании структуры sk_buff
устанавливает ее поле protocol
. Функция netif_rx(), как уже было сказано, передает пакет «наверх», затем функция net_bh() использует значение поля protocol
, установленное драйвером, для вызова соответствующей протоколу программы и передает этой программе пакет. Для протокола ICMP такой программой является функция icmp_rcv(), описанная в файле /usr/src/linux/net/ipv4/icmp.с
.
int icmp_rcv(struct sk_buff *skb);
Функция icmp_rcv выполняет следующие действия:
1. Увеличивает значение счетчика входящих пакетов ICMP_INC_STATS_BH(IcmpInMsgs).
2. Удаляет пакет, если его размер слишком мал.
3. Проверяет контрольную сумму: если она ошибочна, увеличивает счетчик некорректных пакетов.
4. Проверяет тип ICMP-пакета. Если тип пакета превышает максимальное значение 18, то пакет удаляется. При этом увеличивается счетчик некорректных пакетов.
5. Вызывает функцию-обработчик ICMP-сообщения в зависимости от значения типа сообщения.
Соответствие номеров типа служебным функциям (описаны в файле icmp.c) Таблица 27.9
Тип | Функция | Описание |
---|---|---|
0, 1, 2, 6, 7, 9, 10, 12, 14-16, 18 | void icmp_discard(struct sk_buff *skb) | Удаляет пакет |
3, 4, 11 | void icmp_unreach(struct sk_buff *skb) | Данная функция определяет максимальный размер модуля передачи (MTU, Maximum Transmission Unit), а также передает информацию об ошибке любому модулю, которому нужна эта информация |
5 | void icmp_redirect(struct sk_buff *skb) | Пакет переадресации, который означает примерно следующее: «Не посылайте мне пакет по адресу xxx.xxx.ххх.xxx, потому что он будет отправлен обратно» |
8 | void icmp_echo(struct sk_buff *skb) | Функция для отправки эхо-запроса. Эхо-ответ (тип 0) отправляется ядром автоматически (если вы не отключили эту возможность) |
13 | void icmp_timestamp(struct sk_buff *skb) | Запрос о времени создания пакета — один из самых эффективных методов измерения производительности глобальных сетей в реальном времени. Метод заключается в следующем: на тестируемый узел посылаются небольшие пакеты, которые сразу же удаляются. Информация из последнего пакета копируется в пакет эхо-ответа, в этот пакет также вставляется информация о текущем времени. После этого пакет ставится в очередь как обычно |
17 | void icmp_address (struct sk_buff *skb) | Отправка ответа на запрос о маске адреса |
Рассмотренные выше функции обрабатывают входящие ICMP-пакеты, Но мы ведь можем не только принимать ICMP-пакеты, но и передавать, поэтому есть также и «исходящие» функции.
Для отправки ICMP-сообщений используется функция
void icmp_send(struct sk_buff *skb_in, int type, int code,
u32 info);
Данная функция отправляет сообщения типа type, с кодом code и телом info.
После отправки пакета неплохо бы проверить, будет ли он реально отправлен. Это можно сделать с помощью функции
int xrlim_allow(struct dst_entry *dst, int timeout);
Эта функция определяет, отправлять или нет текущий пакет из очереди. Если пакет должен быть удален, функция возвращает 0, иначе — 1.
После отправки ICMP-пакета нужно увеличить счетчик отправленных пакетов. Это можно сделать с помощью функции icmp_out_count():
void icmp_out_count(int type);
Данная функция увеличивает счетчик оправленных пакетов типа type.
На этом обзор протокола ICMP в Linux заканчивается и мы переходим к рассмотрению механизма гнезда (сокета), с помощью которого можно реализовать двунаправленный обмен данными между двумя компьютерами.
27.3. Программирование сокетов
27.3.1. Что такое сокет?
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии