Linux pila del subsistema de barrio (dos procesos relacionados)

  

como antes de la inicialización del subsistema barrio, versión del código fuente de Linux 2.6.21void __init arp_init (void) (net /ipv4 /arp.c) {//vecino neigh_table_init mesa de inicialización (&arp_tbl); //Registrar protocolo ARP dev_add_pack (&​​amp; arp_packet_type); //establecen objetos proc arp_proc_init (); #ifdef CONFIG_SYSCTLneigh_sysctl_register (NULL, &arp_tbl.parms, NET_IPV4, NET_IPV4_NEIGH, " IPv4 " , NULL); #endif //lista de notificación de eventos register_netdevice_notifier (&arp_netdev_notifier);} en neigh_table_init (&arp_tbl);, la tabla de vecinos para la inicialización correspondiente, en particular, para inicializar un temporizador de recolección de basura. discutirá más adelante viene dada RESUMEN arp_packet_type: static arp_packet_type struct packet_type = {.type = __constant_htons (ETH_P_ARP), (correspondiente a enlace del número de protocolo de capa) .FUNC = arp_rcv, "manipulador de paquetes"} se puede ver de lo anterior fuera, al recibir el paquete ARP de datos, () tratados con cinco arp_rcv: vecino análisis de la estructura de datos del sistema estructura neigh_table: struct neigh_table {//un vecino de struct neigh_table * siguiente; //pila de protocolos de la familia int; //entrada longitud, es decir, el tamaño de una estructura de vecino se inicializa a sizeof (vecino) 4 (4 para la longitud de una dirección IP) int entry_size; //valor hash de clave de una longitud que es la longitud de una dirección IP para 4int key_len; //Ha función de valor de cómputo Xi (valor hash se calcula por el objeto correspondiente dispositivo y net_device Ip) __ U32 (* hash) (const void * p, y const struct net_device *); //función de inicialización vecino int (* constructor) (struct vecino *); int (* pconstructor) (struct pneigh_entry *); void (* pdestructor) (struct pneigh_entry *); void (* proxy_redo) (struct sk_buff * SKB); //tabla de vecinos nombre char * Identificación; struct neigh_parms parms; /* * HACK gc_ shoul sigue parms sin una brecha * ///recolección de basura regular cuando int gc_interval;.! int gc_thresh1; //segundo umbral, si el vecino es superior a este valor cuando se crea un nuevo vecino //si hay más de cinco segundos cuando no hay actualización, debe actualizar de inmediato, la recolección de basura obligatoria int gc_thresh2; //permitir int techo gc_thresh3 del vecino; //reciente tiempo de refresco last_flush largo sin signo; //regular de recolección de basura temporizador estructura timer_list gc_timer; struct timer_list proxy_timer; struct sk_buff_head proxy_queue; //número de vecinos de mesa enteros int entradas; cerradura rwlock_t; last_rand largo sin signo; struct neigh_parms * parms_list; kmem_cache_t * kmem_cachep; struct neigh_statistics * estadísticas; //gama de hash, que almacena vecinos struct vecino ** hash_buckets; //tamaño de la matriz de la máscara de hash unsigned int hash_mask; __ u32 hash_rnd; unsigned int hash_chain_gc; //asociados con el proxy ARP pneigh_entry estructura ** phash_buckets; #ifdef CONFIG_PROC_FSstruct proc_dir_entry * PDE; #endif} vecino estructura: struct {//vecino de un vecino de sus barrios struct r * siguiente; //donde el vecino de mesa estructura neigh_table * TBL; //parámetros de transmisión arp neigh_parms struct * parms; //elemento correspondiente a la red vecino dispositivo estructura net_device * dev; //La última vez sin signo utilizado durante mucho tiempo; sin firmar larga confirmó; __ banderas U8;; siempre actualizados sin firmar ////tiempo de actualización vecino de la correspondiente __u8 estado nud_state; __ tipo U8; //bandera de sobrevivir es 1 si muerto, entonces la función de recolección de basura se eliminará este __u8 muertos; //el número de solicitud de sondas de prueba atomic_t arp re-transmisión; cerradura rwlock_t; //cabeza correspondiente a la caché de vecino unsigned char ha [(MAX_ADDR_LEN + sizeof (unsigned long) -1) &~ (sizeof (unsigned long) -1) ]; struct hh_cache * hh; //referencia recuento atomic_t refcnt; //entrada vecino correspondiente a la int función de transmisión (* salida) (struct sk_buff * SKB); //skb transmisión cola struct sk_buff_head arp_queue correspondiente; //temporizador struct timer_list temporizador; struct neigh_ops * ops; //clave hash U8 primary_key [0];};

Copyright © Conocimiento de Windows All Rights Reserved