📄 skbuff.h
字号:
/** Definitions for the 'struct sk_buff' memory handlers.** Authors:* Alan Cox, <gw4pts@gw4pts.ampr.org>* Florian La Roche, <rzsfl@rz.uni-sb.de>** This program is free software; you can redistribute it and/or* modify it under the terms of the GNU General Public License* as published by the Free Software Foundation; either version* 2 of the License, or (at your option) any later version.*/#ifndef SKBUFF_H#define SKBUFF_H#include <sys/time.h>#include <malloc.h>#include <string.h>#include <time.h>#include "irda.h"#include "../../public/pub_emmi.h"#include "types.h"#define HAVE_ALLOC_SKB /* For the drivers to know */#define HAVE_ALIGNABLE_SKB /* Ditto 8) *//* Don't change this without changing skb_csum_unnecessary! */#define CHECKSUM_NONE 0#define CHECKSUM_UNNECESSARY 1#define CHECKSUM_COMPLETE 2#define CHECKSUM_PARTIAL 3#define kfree_skb(a) skb_free(a)#define dev_kfree_skb(a) skb_free(a)/* A. Checksumming of received packets by device.** NONE: device failed to checksum this packet.* skb->csum is undefined.** UNNECESSARY: device parsed packet and wouldbe verified checksum.* skb->csum is undefined.* It is bad option, but, unfortunately, many of vendors do this.* Apparently with secret goal to sell you new device, when you* will add new protocol to your host. F.e. IPv6. 8)** COMPLETE: the most generic way. Device supplied checksum of _all_* the packet as seen by netif_rx in skb->csum.* NOTE: Even if device supports only some protocols, but* is able to produce some skb->csum, it MUST use COMPLETE,* not UNNECESSARY.** PARTIAL: identical to the case for output below. This may occur* on a packet received directly from another Linux OS, e.g.,* a virtualised Linux kernel on the same host. The packet can* be treated in the same way as UNNECESSARY except that on* output (i.e., forwarding) the checksum must be filled in* by the OS or the hardware.** B. Checksumming on output.** NONE: skb is checksummed by protocol or csum is not required.** PARTIAL: device is required to csum packet as seen by hard_start_xmit* from skb->csum_start to the end and to record the checksum* at skb->csum_start + skb->csum_offset.** Device must show its capabilities in dev->features, set* at device setup time.* NETIF_F_HW_CSUM - it is clever device, it is able to checksum* everything.* NETIF_F_NO_CSUM - loopback or reliable single hop media.* NETIF_F_IP_CSUM - device is dumb. It is able to csum only* TCP/UDP over IPv4. Sigh. Vendors like this* way by an unknown reason. Though, see comment above* about CHECKSUM_UNNECESSARY. 8)* NETIF_F_IPV6_CSUM about as dumb as the last one but does IPv6 instead.** Any questions? No questions, good. --ANK*/struct sk_buff_head { /* These two members must be first. */ struct sk_buff *next; struct sk_buff *prev; D_UINT32 qlen; };struct sk_buff;/* We divide dataref into two halves. The higher 16 bits hold references* to the payload part of skb->data. The lower 16 bits hold references to* the entire skb->data. A clone of a headerless skb holds the length of* the header in skb->hdr_len.** All users must obey the rule that the skb->data reference count must be* greater than or equal to the payload reference count.** Holding a reference to the payload part means that the user does not* care about modifications to the header part of skb->data.*/#define SKB_DATAREF_SHIFT 16#define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1)enum { SKB_FCLONE_UNAVAILABLE, SKB_FCLONE_ORIG, SKB_FCLONE_CLONE,};enum { SKB_GSO_TCPV4 = 1 << 0, SKB_GSO_UDP = 1 << 1, /* This indicates the skb is from an untrusted source. */ SKB_GSO_DODGY = 1 << 2, /* This indicates the tcp segment has CWR set. */ SKB_GSO_TCP_ECN = 1 << 3, SKB_GSO_TCPV6 = 1 << 4,};//#define NET_SKBUFF_DATA_USES_OFFSET 1typedef unsigned char *sk_buff_data_t;/** * struct sk_buff - socket buffer* @next: Next buffer in list* @prev: Previous buffer in list* @sk: Socket we are owned by* @tstamp: Time we arrived* @dev: Device we arrived on/are leaving by* @transport_header: Transport layer header* @network_header: Network layer header* @mac_header: Link layer header* @dst: destination entry* @sp: the security path, used for xfrm* @cb: Control buffer. Free for use by every layer. Put private vars here* @len: Length of actual data* @data_len: Data length* @mac_len: Length of link layer header* @hdr_len: writable header length of cloned skb* @csum: Checksum (must include start/offset pair)* @csum_start: Offset from skb->head where checksumming should start* @csum_offset: Offset from csum_start where checksum should be stored* @local_df: allow local fragmentation* @cloned: Head may be cloned (check refcnt to be sure)* @nohdr: Payload reference only, must not modify header* @pkt_type: Packet class* @fclone: skbuff clone status* @ip_summed: Driver fed us an IP checksum* @priority: Packet queueing priority* @users: User count - see {datagram,tcp}.c* @protocol: Packet protocol from driver* @truesize: Buffer size * @head: Head of buffer* @data: Data head pointer* @tail: Tail pointer* @end: End pointer* @destructor: Destruct function* @mark: Generic packet mark* @nfct: Associated connection, if any* @ipvs_property: skbuff is owned by ipvs* @nf_trace: netfilter packet trace flag* @nfctinfo: Relationship of this skb to the connection* @nfct_reasm: netfilter conntrack re-assembly pointer* @nf_bridge: Saved data about a bridged frame - see br_netfilter.c* @iif: ifindex of device we arrived on* @queue_mapping: Queue mapping for multiqueue devices* @tc_index: Traffic control index* @tc_verd: traffic control verdict* @dma_cookie: a cookie to one of several possible DMA operations* done by skb DMA functions* @secmark: security marking*/struct sk_buff { /* These two members must be first. */ struct sk_buff *next; struct sk_buff *prev; struct net_device *dev; /* * This is the control buffer. It is free to use for every * layer. Please put your private variables there. If you * want to keep them across layers you have to do a skb_clone() * first. This is owned by whoever has the skb queued ATM. */ char cb[48];//此数组作为 SKB 的控制块,具体的协议可用它来存储与每个包相关的私有数据 unsigned int len,////真实数据区的长度,即整个packet的大小 data_len;//当SKB是由多个页面缓冲组成的时候,表示分片大小// //以下都是作为flag用,只用了一个byte的8个bit// D_UINT8 local_df:1,//允许local分片标志// /*为四苎杆俚囊
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -