La implementación del puente de la pila de protocolo de Linux

  

describe el procesamiento de datos en el controlador NIC y luego el flujo del paquete continúa hacia abajo. La última función del controlador NIC es netif_receive_skb. Vamos a empezar con él. Por simplicidad, que eliminó el código precompilado int netif_receive_skb (struct sk_buff * SKB) (net /core /dev.c) {packet_type struct * de tipo p, * pt_prev; int ret = NET_RX_DROP; unsigned tipo corto; //recibidas marcados marca de tiempo si (skb- >! stamp.tv_sec) net_timestamp (&skb- > sello); //si hay dev- > maestro. Entonces actualiza el skb_bond puntero correspondiente (SKB); //actualizar la CPU recibe estadísticas __get_cpu_var (netdev_rx_stat) .total ++; skb- > h.raw = skb- > nh.raw = skb- > datos; skb- > mac_len = skb- > nh.raw - skb- >! mac.raw; pt_prev = NULL; rcu_read_lock (); //un módulo de procesamiento list_for_each_entry_rcu todos los protocolos (de tipo p, &ptype_all, lista) {if (ptype- > dev | |  ptype- > dev == skb- > dev) {if (pt_prev)

ret = deliver_skb (SKB, pt_prev); pt_prev = tipo p;}} //procesamiento fragmento handle_diverter (SKB); //procesamiento de puente si (handle_bridge (&skb, &pt_prev, &ret)) valla a cabo; type = skb- > protocolo; //llaman el módulo apropiado para procesar el protocolo. list_for_each_entry_rcu (PTYPE, &Amp; ptype_base [ntohs (tipo) y amp; 15], lista) {if (ptype- > == Tipo Tipo &&(ptype- > dev |! |  ptype- > dev == skb- > dev)) {if (pt_prev)

ret = deliver_skb (SKB, pt_prev); pt_prev = tipo p;}} if (pt_prev) {ret = pt_prev- > func (SKB, skb- > dev, pt_prev);} else {kfree_skb (SKB); /* Jamal, ahora usted no será capaz de escapar de explicar * me cómo se va a utilizar esto: -) * /ret. = NET_RX_DROP;} Salida: rcu_read_unlock (); retorno ret;} esta función es reensamblaje principalmente fragmento completado, el procesamiento del puente, del módulo de procesamiento de llamadas diferentes capas de transporte de acuerdo con diferentes protocolos. El enfoque de esta sección es describir la implementación y el procesamiento de los puentes de Linux. La capa de protocolo de la capa de transporte se dará en los capítulos siguientes. Ingrese el código de procesamiento del puente: # si está definido (CONFIG_BRIDGE) | |  definido (CONFIG_BRIDGE_MODULE) (/core /dev.c neto) int (* br_handle_frame_hook) (struct net_bridge_port * p, struct sk_buff ** pskb); estática __inline__ int handle_bridge (struct sk_buff ** pskb, struct packet_type ** pt_prev, int * Ret) {struct net_bridge_port * port; //loopback interface? ¿Interfaz no Ethernet? Si ((* pskb) - > pkt_type == PACKET_LOOPBACK | | (Puerto = rcu_dereference ((* pskb) - > dev- > br_port)) == NULL) return 0; si (* pt_prev) {* ret = deliver_skb (* pskb, * pt_prev); * pt_prev = NULL;}

//br_handle_frame_hook es un puntero de función de retorno br_handle_frame_hook mundial (puerto, pskb);} else # # define handle_bridge (SKB, pt_prev, RET) (0) #endif se puede ver en. Si se selecciona el modo puente durante la compilación, entrará en el módulo de procesamiento del puente. De lo contrario, es solo una función vacía y regresa directamente. ¿Cuál es la función representada por br_handle_frame_hook? ¿Cuál es el marco de procesamiento de datos del puente? Jeje Este es el problema que estamos analizando hoy.

Copyright © Conocimiento de Windows All Rights Reserved