овий буфер і звільнення старого Установка потрібних ip опцій фрагменторованіе якщо необхідно відправка пакету на потрібний девайс
DEVICE_rx () девайсно залежна функція,
приклад drivers/net/de600.c
тут я спробую перевести чудові коментарі автора
Linux driver for the D-Link DE-600 Ethernet pocket adapter. p> *
* Portions (C) Copyright 1993, 1994 by Bjorn Ekwall
* The Author may be reached as bj0rn@blox.se
/*
* Якщо у нас хороший пакет то забираємо його з адаптера
*/
static void
de600_rx_intr (struct net_device * Dev)
{
struct sk_buff * skb;
unsigned long flags;
int i;
int read_from;
int size;
register unsigned char * buffer;
save_flags (flags);
cli ();
/* Визначаємо розмір пакету */
size = de600_read_byte (RX_LEN, dev);/* Нижнього байт */
size + = (de600_read_byte (RX_LEN, dev) 1535)) {
printk ("% s: Bogus packet size % D.n ", dev-> name, size);
if (size> 10000)
adapter_init (dev);
return;
}
skb = dev_alloc_skb (size +2);
if (skb == NULL) {
printk ("% s: Couldn't allocate a sk_buff of size% d.n ",
dev-> name, size);
return;
}
/* Інакше */
skb-> dev = dev;
skb_reserve (skb, 2);/* Align */
/* 'Skb-> data' указивет на початок буфера даних. */p> buffer = skb_put (skb, size);
/* копіюємо пакет у буфер */
de600_setup_address (read_from, RW_ADDR);
for (i = size; i> 0; - i, + + Buffer)
* buffer = de600_read_byte (READ_DATA, dev);
/* Визначаємо тип протоколу
skb-> protocol = eth_type_trans (skb, dev);
/* Передаємо на верхній рівень см net/core/dev.c
netif_rx (skb);
/* оновлюємо статистику */
dev-> last_rx = jiffies;
((struct net_device_stats *) (Dev-> priv)) -> rx_packets + +;/* кількість отримань */
((struct net_device_stats *) (Dev-> priv)) -> rx_bytes + = size;/* кількість отриманих байт */
/*
* Якщо трапиться щось погане під час доставки, netif_rx ()
* зробило a mark_bh (INET_BH) для нас і буде працювати
* коли ми увійдемо в bottom-halv.
*/
}
ip_finish_output () net/ipv4/ip_output
визначає девайс для даного маршруту
викликає функцію девайса [= dev_queue_xmit]
ip_forward -net/ipv4/ip_forward
в цьому файлі хороші коментарі
перевіряємо роутер
якщо пакет нікому не призначений то Дропана
якщо поганий TTL аналогічно
якщо неможуть пакет отфорвардітся то відправляємо icmp пакет ICMP_DEST_UNREACH
якщо необхідно шолом пакет ICMP HOST REDIRECT
копіюємо і знищуємо старий пакет
зменшуємо TTL
якщо необхідно встановлюємо потрібні опції ip_forward_options в
ip_fo...