La transmisión de datos (el puente de procesamiento de datos (v))

  

Hasta este punto en la capa de enlace de la Linux pila de protocolos, configuración de puente se ha hecho sobre. Observamos es cómo salvar el proceso de paquetes puente del procesamiento de datos recibidos: de nuevo al principio de esta función handle_bridge capítulo, las llamadas br_handle_frame_hook para procesar los datos recibidos en el código de inicialización del puente, la asignación br_handle_frame_hook Para que br_handle_frame sea correcto, esta es la función de procesamiento del puente. funciones de seguimiento nt br_handle_frame (struct net_bridge_port * p, struct sk_buff ** pskb) {struct sk_buff * skb = * pskb; //objeto mac dirección const unsigned char * dest = eth_hdr (SKB) - > h_dest; //puerto desactivada si (p- > estado == BR_STATE_DISABLED) Goto err; //fuente mac multidifusión o forma //FF.XX.XX.XX.XX.XX desechado de emisión si (eth_hdr (SKB) - > h_source [0] &1) Goto err; //si el estado de aprendizaje o hacia adelante, la tabla CAM aprende la actualización MAC de origen si (p > estado == BR_STATE_LEARNING | | p- > estado == BR_STATE_FORWARDING) //función br_fdb_insert ya hemos analizado la br_fdb_insert (p- > br, p, eth_hdr (SKB) - > h_source, 0); //stp de tratamiento, STP- permitido está habilitado el protocolo STP //dirección MAC de multidifusión si (p- > bridge_ula stp utiliza; BR > stp_enabled &&! memcmp (dest, bridge_ula, 5) & y;! (dest [5] &0xF0)) {if (dest [5]) {NF_HOOK (PF_BRIDGE, NF_BR_LOCAL_IN, SKB, skb- >! dev,

NULL, br_stp_handle_bpdu); return 1;}} else if (p- > , el estado == BR_STATE_FORWARDING) {//en la inicialización, y el final de la br_should_route_hook asignación de modo br_should_route_hook //false si (br_should_route_hook) {if (br_should_route_hook (pskb))

return 0; skb = * pskb; dest = eth_hdr (SKB) - > h_dest;} //misma dirección de destino y la dirección de puente. //pasar el procesamiento de la capa superior establecido skb- > pkt_type = PACKET_HOSTif (memcmp (p- >! Br- > dev- > dev_addr, dest, ETH_ALEN)) skb- > pkt_type = PACKET_HOST; //puente NF_HOOK proceso netfiter en punto NF_BR_PRE_ROUTING (PF_BRIDGE, NF_BR_PRE_ROUTING, SKB, skb- > dev, NULL, br_handle_frame_finish); return 1;} err: kfree_skb (SKB); return 1;} en esta función, la entrada relacionada después de la sentencia, la fuente de corriente será de paquetes MAC correspondiente a la interfaz a las actualizaciones de la tabla CAM, la función de actualización br_fdb_insert () en el analizado anteriormente, no puede entender el mirar hacia abajo en el pasado, pero la atención, esto no se hace Insertado para elementos estáticos. Luego determina el paquete no se pasa a la máquina, si es así, establecer el paquete es PACKET_HOST pkt_type en NF_HOOK () macro, hemos analizado el tema de la futura netfiter. Esto es tan larga como la conocemos, el paquete de datos normal fluirá en br_handle_frame_finish () para el procesamiento /* Nota: ya se llama con rcu_read_lock (preempt_disabled) * /int br_handle_frame_finish (struct sk_buff * SKB) {//obtener la dirección MAC de destino unsigned char const * dest = eth_hdr (SKB) - > h_dest; struct net_bridge_port * p = skb- > dev- > br_port; struct net_bridge * br = p- > br; struct net_bridge_fdb_entry * dst; int passedup = 0; //híbrido modo /* Si el NIC virtual puente en modo promiscuo, cada uno de los paquete de datos recibido a la necesidad de clonar un (función ptype_all suave red de procesamiento de interrupción de net_rx_action cadena) de procesamiento de protocolo AF_PACKET de los mismos. * /If (BR > dev- > banderas &IFF_PROMISC) {struct sk_buff * skb2; skb2 = skb_clone (SKB, GFP_ATOMIC), si (skb2! = Null) {Passedup = 1; br_pass_frame_up (ancho, skb2);}} //objeto MAC de multidifusión o de difusión, el proceso necesita ser transmitida a la capa superior //passedup para transmitir una bandera que indica ya cargado si (dest [0] &1) es 1 {br_flood_forward (br, ! SKB, passedup), si (passedup) br_pass_frame_up (ancho, SKB);! Goto cabo;} //consulta de tabla CAM dst = __br_fdb_get (ancho, dest); //para esta máquina? Transmitida al procesamiento de protocolo de capa superior si (dst = NULL &! &Amp; DST- > is_local) {if br_pass_frame_up (br, SKB) (passedup!); Elsekfree_skb (SKB); goto fuera;}

//datos no se presente máquina se reenvía si (dst = NULL) {br_forward (DST- > dst, SKB); Goto fuera;} //Si no la consulta, envía esta br_flood_forward paquete (br otros puertos en , skb, 0);

Copyright © Conocimiento de Windows All Rights Reserved