pila Linux de subsistema de vecindario (cuatro procesos relacionados)

  

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"]]]

Copyright © Conocimiento de Windows All Rights Reserved