la transmisión de datos -sk en la capa de enlace de la pila de protocolos Linux

  
 

análisis estructural sk_buff sk_buff es la segunda skb estructural que nos encontramos en el kernel se abrevia a menudo importante que se define en el Linux 2.6.21 a :. Struct sk_buff {//punto al siguiente sk_buff skbstruct * siguiente; //un skbstruct sk_buff * prev; struct sk_buf0f_head * lista; //calcetín correspondiente. También es una estructura importante, cuando la capa de transporte es analicemos calcetín struct * sk; //recibir o transmitir marca de tiempo sello estructura timeval; //recibir o enviar net_device net_devicestruct * dev correspondiente; net_device net_devicestruct //recibidos * input_dev;. @ el paquete de bienes net_device en el dispositivo virtual correspondiente net_device struct * real_dev se discutirá en el modo de análisis de puente posterior; //capa de información ip union {struct tcphdr * º; struct udphdr * uh; struct icmphdr * icmph; struct igmphdr * igmph; struct iphdr * ipiph; struct ipv6hdr * ipv6h; unsigned char * prima; h}; información de capa de protocolo de unión //{struct iphdr * IPH; struct ipv6hdr * ipv6h; struct arphdr * ARPH; unsigned char * prima;} NH; información de capa de enlace de unión //{unsigned char * prima;} mac; //esta estructura se analiza de nuevo struct dst_entry * dst subsistema de encaminamiento; struct sec_path * sp; /** Este es el tampón de control. es libre de utilizar para cada capa *. por favor, ponga sus variables privadas allí. * Si desea mantenerlos a través de capas que tiene que hacer un skb_clone () * primero . Esta es propiedad de quien tiene la skb cola ATM * /char cb [40];. //longitud de datos de cada capa unsigned int len, DATA_LEN, mac_len, CSUM; unsigned char local_df, clonado, pkt_type, ip_summed; __ prioridad u32; protocolo de unsigned short, la seguridad; void (* destructor) (struct sk_buff * SKB); #ifdef CONFIG_NETFILTERunsigned largo nfmark; __ u32 nfcache; __ u32 nfctinfo; struct nf_conntrack * nfct; #ifdef CONFIG_NETFILTER_DEBUGunsigned int nf_debug; #endif #ifdef CONFIG_BRIDGE_NETFILTERstruct nf_bridge_info * nf_bridge; #endif #endif /* CONFIG_NETFILTER * /# si está definido (CONFIG_HIPPI) union {__u32 IFIELD;} privada; #endif #ifdef CONFIG_NET_SCHED__u32 tc_index; /* El índice de control de tráfico * /#ifdef CONFIG_NET_CLS_ACT__u32 tc_verd; /* control de tráfico veredicto * /__ u32 tc_classid; /* control de tráfico classid * /#endif #endif /* Estos elementos deben estar al final, ver alloc_skb () para obtener más información * /unsigned int truesize;. //contador de referencia atomic_t usuarios; //inicio del almacenamiento abordar unsigned char * cabeza, //a partir de la dirección de red de datos * de datos, los datos //red de tiendas * Dirección final de la cola, la dirección final de la memoria del espacio //* Final;} correspondiente al controlador de la NIC en nuestro análisis. Los datos recibidos se encuentra en la región entre los datos a la cola. SKB por lo general hay varias funciones de uso común, enumerar de la siguiente manera: struct sk_buff * alloc_skb (tamaño unsigned int, int gfp_mask) asigna almacenamiento para sixe de SKB, la asignación de memoria atención a nivel gfp_mask el significado de este espacio de almacenamiento. a saber skb- > datos para skb- > cola sk_buff región struct * skb_clone (sk_buff struct * skb, prioridad int) clonado punto skb a la misma estructura, también aumentará la referencia recuento skb struct sk_buff * skb_copy (const struct sk_buff * skb, prioridad int) para copiar un nuevo kfree_skb skbvoid (struct sk_buff * SKB) cuando se hace referencia skb cuenta como una vez, liberar el Char skbunsigned * skb_put (struct sk_buff * skb, unsigned int len), de modo skb almacenamiento len agranda el espacio. incluso si el puntero de cola hacia abajo unsigned char * skb_push (struct sk_buff * skb, unsigned int len) de empuje, es decir, la introducción de una pieza de información, de modo que el puntero de datos subyacente. void skb_reserve (struct sk_buff * skb, unsigned int len) Esta operación hace que el puntero de datos con el puntero de cola hacia abajo simultáneamente, es decir, antes de la zona de almacenamiento ampliada espacio int skb_headroom (const struct sk_buff * SKB) antes de volver a la cantidad de espacio disponible para int datos skb_tailroom ( const struct sk_buff * SKB) búfer de retorno espacio disponible

Copyright © Conocimiento de Windows All Rights Reserved