int neigh_resolve_output (struct sk_buff * SKB) {struct dst_entry * dst = skb- > dst; struct vecino * neigh; int rc = 0; //eficacia Si el juicio (DST! | | ! (Neigh = DST- > vecino)) Goto descarte; __ skb_pull (SKB, skb- > nh.raw - skb- > de datos); //vecino de determinar si existe un estado de disponibilidad, en su caso, poner el paquete (! neigh_event_send (relincho, SKB)) enviado si {int err; struct net_device * dev = neigh- > dev; si (dev- > hard_header_cache &&! DST- > hh) {write_lock_bh (&neigh- > de bloqueo), si (DST- >! hh) neigh_hh_init (neigh, dst, DST- > ops- > protocolo); err = dev- > hard_header (SKB, dev, ntohs (skb- > protocolo), neigh- > ha, NULL, skb- > len); write_unlock_bh (&neigh- > de bloqueo);} else {read_lock_bh (&neigh- > de bloqueo); err = dev- > hard_header (SKB, dev, ntohs (skb- > protocolo), neigh- > ha, NULL, skb- > len); read_unlock_bh (&neigh- > de bloqueo);} if (err > = 0) rc = neigh- > ops- > queue_xmit (SKB); elsegoto out_kfree_skb;} Salida: retorno rc; descartar: NEIGH_PRINTK1 (" neigh_resolve_output: dst =% p neigh =% p \\ n ", dst, dst DST-? > vecino: NULL); out_kfree_skb: rc = -EINVAL; kfree_skb (SKB); valla a cabo;} neigh_event_send de dirección (); stat ic línea int neigh_event_send (vecino struct * relincho, struct sk_buff * SKB) {neigh- > = usado jiffies; //aquí excluido estado NUD_STALE, ya que, en este estado, cuando hay información de transmisión, que será transferida a la demora estado, y establece un temporizador, que se puede ver si el __neigh_event_send () de ((neigh- > nud_state &(NUD_CONNECTED |! NUD_DELAY | NUD_PROBE))) __neigh_event_send retorno (relincho, SKB); return 0;} Suponemos que la entrada correspondiente es un nuevo vecino de entrada, las condiciones iniciales no se cumplen, el proceso avanza __neigh_event_send () int __neigh_event_send (vecino struct * relincho, struct sk_buff SKB *) {int rc; unsigned long ahora; write_lock_bh (&neigh- > de bloqueo); rc = 0; //detección de parámetros de entrada si (neigh- > nud_state &(NUD_CONNECTED | NUD_DELAY | NUD_PROBE)) Goto out_unlock_bh; ahora = unidades de tiempo; //si el estado no se NUD_STALE y NUD_INCOMPLETEif ((neigh- > nud_state &(NUD_STALE |! NUD_INCOMPLETE))) {if (neigh- > parms- > mcast_probes + neigh- > parms- > app_probes) {//establecer estado NUD_INCOMPLETE, y establece un atomic_set temporizador (&neigh- > sondas, neigh - > parms- > ucast_probes); neigh- > nud_state = NUD_INCOMPLETE; neigh_hold (neigh); neigh- > timer.expires = ahora + 1; add_timer (&neigh- > timer);} else {//Si el final del parámetro de retardo está configurado, establecer el vecino no disponible neigh- > nud_state = NUD_FAILED; write_unlock_bh (&neigh- > de bloqueo), si (SKB) kfree_skb (SKB); return 1;}} else if (neigh - > nud_state &NUD_STALE) {//Si el estado es NUD_STALE, a continuación, el estado a NUD_DELAY, //devuelve cero y establece un contador de tiempo, en neigh_resolve_output, el paquete enviado NEIGH_PRINTK2 (" neigh% p se retrasa \\. n ", neigh); neigh_hold (neigh); neigh- > nud_state = NUD_DELAY; neigh- > timer.expires = jiffies + neigh- > parms- > delay_probe_time; add_timer (&neigh- > temporizador); } if (neigh- > nud_state == NUD_INCOMPLETE) {//añadir el paquete a la neigh, arp_queue, SKB la cola si (SKB) {//si la cola larga, entonces arp_queue un paquete todo descartado si (skb_queue_len (&neigh- > arp_queue) > = neigh- > parms- > queue_len) {struct sk_buff * buff; buff = neigh- > arp_queue.next; __ skb_unlink ( piel de ante, &neigh- > arp_queue); kfree_skb (piel de ante);} //paquete se añade a la __skb_queue_tail cola (&neigh- > arp_queue, SKB);} rc = 1;} out_unlock_bh: write_unlock_bh (&neigh- > de bloqueo); rc retorno;} por encima de proceso, dst correspondiente entrada del estado vecino principalmente determinada, si el estado está disponible, el paquete se envía directamente. Si no está disponible, el estado se establece en NUD_INCOMPLETE, y ajustar el temporizador. Correspondiente al controlador de temporización es:zh-CN"],null,[0.86750525],zh-CN"]]]
Para garantizar el funcionamiento normal del sistema Linux y resolver con precisión los diversos pro
ACL es una abreviatura de la Lista de Control de Acceso, el propósito principal es proporcionar al p
Un administrador del sistema Linux solicitó ayuda al autor recientemente. Dijo que desplegaron un si
(1) Comando ifconfig El primer tipo usa el comando ifconfig para configurar la dir
Cómo configurar la instalación de vino bajo centos
Cómo instalar Go language en Linux
Cómo desinstalar la partición del sistema Linux
Conceptos básicos de NFS en Linux
Preguntas frecuentes sobre Linux
Linux y los archivos del sistema ventanas de sincronización en tiempo real
Preguntas frecuentes sobre la solución de escritorio virtual VMware View4.5
Estudio en profundidad de la estrategia de programación de Lvs
Sistema Linux para actualizar la placa base BIOS
La computadora del sistema Linux bloquea la causa del fallo
10 preguntas y respuestas útiles para la entrevista del comando de Linux
Borrar acceso a Windows nombre de usuario y contraseña de caché LAN
Deje que Windows 8 ingrese automáticamente a la pantalla de inicio
Quitar botón de encendido interfaz de inicio de sesión Win8
Win10 establece el tipo de archivo asociado con el navegador IE
8.1 última versión de Build 9428 exposición