Linux pila del subsistema de barrio (procesos relacionados seis)

  

estática vecino en línea struct * __ neigh_lookup (struct neigh_table * TBL, const void * p, y struct net_device * dev, int creat) {struct vecino * n = neigh_lookup (TBL , p, y dev), si (n | |  ! Creat) de retorno n;

//añadir interés se añadirá a la tabla de vecinos n = neigh_create (TBL, p, y dev); return IS_ERR (n) NULL :? N;} int neigh_update (vecino struct * neigh , U8 const * lladdr, U8 nueva, banderas U32) {U8 de edad; int err; #ifdef CONFIG_ARPDint notificar = 0; #endifstruct net_device * dev; int update_isrouter = 0; write_lock_bh (&neigh- > cerradura); dev = neigh- > dev; edad = neigh- > nud_state; err = -EPERM; if ((banderas &NEIGH_UPDATE_F_ADMIN) &&

(antiguo &(NUD_NOARP |!  NUD_PERMANENT))) goto a cabo; //si se cambia a un estado activo si ((nueva &! NUD_VALID)) {//eliminar el neigh_del_timer temporizador (neigh); //si el estado anterior se NUD_CONNECTED //ajustar vecinos correspondiente a la entrada a cabo puntero de función si (antiguo &NUD_CONNECTED) neigh_suspect (neigh); neigh- > nud_state = nuevo; err = 0; #ifdef CONFIG_ARPDnotify = edad &NUD_VALID; #endifgoto a cabo;} /* comparación de nuevo lladdr con caché uno * /if (dev- > addr_len!) {/* primer caso :. dispositivo necesita ninguna dirección * /lladdr = neigh- > ha;} else if (lladdr) {/* El segundo caso: si algo se ya cachedand se propone una nueva dirección: - comparar nueva &Antiguo- si son diferentes, echa un indicador de anulación * /if ((antiguo & y;; NUD_VALID) &

memcmp (lladdr, neigh-! > ha, dev- > addr_len)) = lladdr neigh- > ha;} else {/* No se suministra dirección; si sabemos algo, utilizar, de lo contrario desechar la petición * /err = -EINVAL;. si ((antiguo &! NUD_VALID)) Goto fuera; lladdr = neigh- > ha;} //si se convierte en el estado conectado, el tiempo se pone a cero se confirma si (a new &pf; NUD_CONNECTED) neigh- > = confirmó jiffies; actualizada //restablecimiento neigh- > actualizada = unidades de tiempo; /* Si la entrada es válida y dirección no se cambia, no cambie el estado de entrada, si es nuevo es rancio. * /err = 0; update_isrouter = banderas &NEIGH_UPDATE_F_OVERRIDE_ISROUTER; //actualizar vecino de la dirección de L2 vecino correspondiente si (antiguo &NUD_VALID) {if (lladdr = neigh- >! hA &&! (banderas &NEIGH_UPDATE_F_OVERRIDE)) {update_isrouter = 0; if ((banderas &NEIGH_UPDATE_F_WEAK_OVERRIDE) y amp; &(antiguo &NUD_CONNECTED)) {lladdr = neigh- > ha; nueva = NUD_STALE;} elsegoto a cabo;} else {if (lladdr == neigh- > & hectáreas; &NUD_STALE nueva == &&((banderas &NEIGH_UPDATE_F_WEAK_OVERRIDE) | | (Antiguo &NUD_CONNECTED))) = nueva edad;}} if (= nueva edad) {neigh_del_timer (neigh);! Si (nueva &NUD_IN_TIMER) {neigh_hold (neigh); neigh- > = timer.expires jiffies +

((nueva &NUD_REACHABLE)

neigh- > > parms-; reachable_time :? 0); add_timer (&neigh- > temporizador);} neigh- > nud_state = nuevo;} //establecer ja artículo si (lladdr = neigh- >! ha) {memcpy (&neigh- > ha, lladdr, dev- > addr_len); //hh artículos de actualización neigh_update_hhs (neigh); if (! (new &NUD_CONNECTED)) neigh- > confirmó = jiffies - (neigh- > parms- > base_reachable_time y lt; < 1); #ifdef CONFIG_ARPDnotify = 1; #endif} if (nuevos == edad ) Goto cabo; //Si el estado de la conexión se transfiere, se establece (nueva & a connect_outpif; NUD_CONNECTED) neigh_connect (neigh); elseneigh_suspect (neigh); //si la entrada es válida, vaya vecino del inactiva, puesto en arp_queue transmisión correspondiente //skbzh-CN"],null,[0.9693771],zh-CN"]]]

Copyright © Conocimiento de Windows All Rights Reserved