rward_finish
ip_rcv net/ipv4/ip_input.c головна функція отримання ip пакета
перевіряємо помилки
погана довжина
версія
чексумма
викликаємо pskb_trim
викликаємо ip_route_input
Процес маршрутизації
Як вже говорилося є тоюліца сусідів, FIB, routing cache Таблиця сусідів містить адреси (mac) комп'ютерів які фізично з'єднані з нами. Linux використовує АRP для визначення адрес ета таблиця динамічна хоча адміністратори можуть задати статичні записи. Стуктури пов'язані з етой таблицею описані в include/net/neighbour.h основні структури. struct neigh_table-їх цілий пов'язаний список struct neigh_parms-список містить різноманітну статистику struct neighbour-hash таблиця сусідів асоційованих з даною таблицею struct pneig_entry-hash всіх девайсів
поля struct neighbour
struct net_device-девайс
hh_cache -Вказівник на апаратний кеш
sk_buff_head arp_queuq-чергу arp пакетів
є local-в ній знаходяться свої інтерфейси
і main в ній напевно все інше
Forwarding Information Database
struct fib_table в include/net/ip_fib.h
містить покажчики на різні функції
tb_stamp
tb_id -255 Для local і 254 для main
td_data-hash fib таблиця
struct fn_hash -net/ipv4/fib_hash.c
struct fn_zone * fn_zones [33] - покажчики на зони
struct fn_zone * fn_zone_list покажчик на першу не пустити зону
struct fn_zone містить інформацію про зону і маршрути для неї
struct fib_node ** fz_hash-вказує на кеш записів цієї зони
int fz_nent кількість записів
int fx_divisor числа Бакета для зони (в основному 16 крім зони 0000
loopback девайса)
int fz_order індекс зони в батьківській fn_hash
struct fib_node-містить інформацію з девайсу в fib_info (include/net/ip_fib.h)
метрику , Протокол і т.д
Routing Cache
Це найбільш швидкий спосіб знаходження маршруту Коли ip потрібен маршрут, то він визначає клітинку в хеше, яка вказує на ланцюжок маршрутів і йде по цій ланцюжку поки не знайде потрібний маршрути мають таймери і частоту використання , Найбільш часті переміщуються в початок. p> struct rtable-ланка в ланцюжку
містить адреси відправника і одержувача
входить інтерфейс
адресу сусіда чи шлюзу
struct dst_entry
містить спецефические для даного маршруту дані і функції
struct dev-зрозуміло
pmtu максимальна довжина пакета для даного маршруту
int (* Input) (struct sk_buff)-вказівник на функцію прийому для даного маршруту
часто ето tcp_rcv
int (* Output) (struct sk_buff) покажчик на функцію відсилання (dev_queue_xmit)
також різноманітні статистичні дані та опції
Таким чином нами було проведено дослідження мережевої архітектури операційної системи Линух на прикладі реалізації стека протоколів t...