日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

sockert组成部分_Linux TCP/IP 协议栈的关键数据结构Socket Buffer(sk_buff )

發(fā)布時間:2024/9/27 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sockert组成部分_Linux TCP/IP 协议栈的关键数据结构Socket Buffer(sk_buff ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

sk_buff結(jié)構(gòu)可能是linux網(wǎng)絡(luò)代碼中最重要的數(shù)據(jù)結(jié)構(gòu),它表示接收或發(fā)送數(shù)據(jù)包的包頭信息。它在skbuff.h中定義,并包含很多成員變量供網(wǎng)絡(luò)代碼中的各子系統(tǒng)使用。 這個結(jié)構(gòu)在linux內(nèi)核的發(fā)展過程中改動過很多次,或者是增加新的選項,或者是重新組織已存在的成員變量以使得成員變量的布局更加清晰。它的成員變量可以大致分為以下幾類:

Layout 布局

General 通用

Feature-specific功能相關(guān)

Management functions管理函數(shù)

這個結(jié)構(gòu)被不同的網(wǎng)絡(luò)層(MAC或者其他二層鏈路協(xié)議,三層的IP,四層的TCP或UDP等)使用,并且其中的成員變量

在結(jié)構(gòu)從一層向另一層傳遞時改變。L4向L3傳遞前會添加一個L4的頭部,同樣,L3向L2傳遞前,會添加一個L3的頭部。添加頭部比在不同層之間拷貝數(shù)

據(jù)的效率更高。由于在緩沖區(qū)的頭部添加數(shù)據(jù)意味著要修改指向緩沖區(qū)的指針,這是個復(fù)雜的操作,所以內(nèi)核提供了一個函數(shù)skb_reserve(在后面的章

節(jié)中描述)來完成這個功能。協(xié)議棧中的每一層在往下一層傳遞緩沖區(qū)前,第一件事就是調(diào)用skb_reserve在緩沖區(qū)的頭部給協(xié)議頭預(yù)留一定的空間。

skb_reserve同樣被設(shè)備驅(qū)動使用來對齊接收到包的包頭。如果緩沖區(qū)向上層協(xié)議傳遞,舊的協(xié)

議層的頭部信息就沒什么用了。例如,L2的頭部只有在網(wǎng)絡(luò)驅(qū)動處理L2的協(xié)議時有用,L3是不會關(guān)心它的信息的。但是,內(nèi)核并沒有把L2的頭部從緩沖區(qū)中

刪除,而是把有效荷載的指針指向L3的頭部,這樣做,可以節(jié)省CPU時間。

1. 網(wǎng)絡(luò)參數(shù)和內(nèi)核數(shù)據(jù)結(jié)構(gòu)

就像你在瀏覽TCP/IP規(guī)范或者配置內(nèi)核時所看到的一樣,網(wǎng)絡(luò)代碼提供了很多有用的功能,但是這些功能并不是必須的,

比如說,防火墻,多播,還有其他一些功能。大部分的功能都需要在內(nèi)核數(shù)據(jù)結(jié)構(gòu)中添加自己的成員變量。因此,sk_buff里面包含了很多像#ifdef這

樣的預(yù)編譯指令。例如,在sk_buff結(jié)構(gòu)的最后,你可以找到:

struct sk_buff {

... ... ...

#ifdef CONFIG_NET_SCHED

_ _u32? ???tc_index;

#ifdef CONFIG_NET_CLS_ACT

_ _u32? ???tc_verd;

_ _u32? ???tc_classid;

#endif

#endif

}

它表明,tc_index只有在編譯時定義了CONFIG_NET_SCHED符號才有效。這個符號可以通過選擇特定的

編譯選項來定義(例如:"Device Drivers Networking supportNetworking options QoS

and/or fair queueing")。這些編譯選項可以由管理員通過make config來選擇,或者通過一些自動安裝工具來選擇。

前面的例子有兩個嵌套的選項:CONFIG_NET_CLS_ACT(包分類器)只有在選擇支持“QoS and/or fair queueing”時才能生效。

順便提一下,QoS選項不能被編譯成內(nèi)核模塊。原因就是,內(nèi)核編譯之后,由某個選項所控制的數(shù)據(jù)結(jié)構(gòu)是不能動態(tài)變化的。一般來說,如果某個選項會修改內(nèi)核數(shù)據(jù)結(jié)構(gòu)(比如說,在sk_buff

里面增加一個項tc_index),那么,包含這個選項的組件就不能被編譯成內(nèi)核模塊。

你可能經(jīng)常需要查找是哪個make

config編譯選項或者變種定義了某個#ifdef標記,以便理解內(nèi)核中包含的某段代碼。在2.6內(nèi)核中,最快的,查找它們之間關(guān)聯(lián)關(guān)系的方法,

就是查找分布在內(nèi)核源代碼樹中的kconfig文件中是否定義了相應(yīng)的符號(每個目錄都有一個這樣的文件)。在

2.4內(nèi)核中,你需要查看Documentation/Configure.help文件。

2. Layout Fields

有些sk_buff成員變量的作用是方便查找或者是連接數(shù)據(jù)結(jié)構(gòu)本身。內(nèi)核可以把sk_buff組織成一個雙向鏈表。當然,這個鏈表的結(jié)構(gòu)要比常見的雙向鏈表的結(jié)構(gòu)復(fù)雜一點。

就像任何一個雙向鏈表一樣,sk_buff中有兩個指針next和prev,其中,next指向下一個節(jié)點,而

prev指向上一個節(jié)點。但是,這個鏈表還有另一個需求:每個sk_buff結(jié)構(gòu)都必須能夠很快找到鏈表頭節(jié)點。為了滿足這個需求,在第一個節(jié)點前面會插入另一個結(jié)構(gòu)sk_buff_head,這是一個輔助節(jié)點,它的定義如下:

struct sk_buff_head {

/* These two members must be first. */? ? struct sk_buff? ???* next;

struct sk_buff? ???* prev;

_ _u32? ?? ?? ?qlen;

spinlock_t? ???lock;

};

qlen代表鏈表元素的個數(shù)。lock用于防止對鏈表的并發(fā)訪問。

sk_buff和sk_buff_head的前兩個元素是一樣的:next和prev指針。這使得它們可以放到同一個鏈表中,盡管sk_buff_head要比sk_buff小得多。另外,相同的函數(shù)可以同樣應(yīng)用于sk_buff和sk_buff_head。

為了使這個數(shù)據(jù)結(jié)構(gòu)更靈活,每個sk_buff結(jié)構(gòu)都包含一個指向sk_buff_head的指針。這個指針的名字是list。圖1會幫助你理解它們之間的關(guān)系。

Figure 1. List of sk_buff elements

其他有趣的成員變量如下:

struct sock *sk

是一個指向擁有這個sk_buff的sock結(jié)構(gòu)的指針。這個指針在網(wǎng)絡(luò)包由本機發(fā)出或者由本機進程接收時有效,因為插口相關(guān)的信息被L4(TCP或

UDP)或者用戶空間程序使用。如果sk_buff只在轉(zhuǎn)發(fā)中使用(這意味著,源地址和目的地址都不是本機地址),這個指針是NULL。

unsigned int len

這是緩沖區(qū)中數(shù)據(jù)部分的長度。它包括主緩沖區(qū)中的數(shù)據(jù)長度(data指針指向它)和分片中的數(shù)據(jù)長度。它的值在緩沖區(qū)從一個層向另一個層傳遞時改變,因為往上層傳遞,舊的頭部就沒有用了,而往下層傳遞,需要添加本層的頭部。len同樣包含了協(xié)議頭的長度。

unsigned int data_len

和len不同,data_len只計算分片中數(shù)據(jù)的長度。

unsigned int mac_len

這是mac頭的長度。

atomic_t users

是一個引用計數(shù),用于計算有多少實體引用了這個sk_buff緩沖區(qū)。它的主要用途是防止釋放sk_buff后,還有其他實體引用這個sk_buff。因

此,每個引用這個緩沖區(qū)的實體都必須在適當?shù)臅r候增加或減小這個變量。這個計數(shù)器只保護sk_buff結(jié)構(gòu)本身,而緩沖區(qū)的數(shù)據(jù)部分由類似的計數(shù)器

(dataref)來保護.

有時可以用atomic_inc和atomic_dec函數(shù)來直接增加或減小users,但是,通常還是使用函數(shù)skb_get和kfree_skb來操作這個變量。

unsigned int truesize

這是緩沖區(qū)的總長度,包括sk_buff結(jié)構(gòu)和數(shù)據(jù)部分。如果申請一個len字節(jié)的緩沖區(qū),alloc_skb函數(shù)會把它初始化成len+sizeof(sk_buff)。

struct sk_buff *alloc_skb(unsigned int size,int gfp_mask)

{

... ... ...

skb->truesize = size + sizeof(struct sk_buff);

... ... ...

}當skb->len變化時,這個變量也會變化。

unsigned char *head

unsigned char *end

unsigned char *data

unsigned char *tail

們表示緩沖區(qū)和數(shù)據(jù)部分的邊界。在每一層申請緩沖區(qū)時,它會分配比協(xié)議頭或協(xié)議數(shù)據(jù)大的空間。head和end指向緩沖區(qū)的頭部和尾部,而data和

tail指向?qū)嶋H數(shù)據(jù)的頭部和尾部,參見圖2。每一層會在head和data之間填充協(xié)議頭,或者在tail和end之間添加新的協(xié)議數(shù)據(jù)。圖2中右邊數(shù)

據(jù)部分會在尾部包含一個附加的頭部。

Figure 2. head/end versus data/tail pointers

void (*destructor)(...)

個函數(shù)指針可以初始化成一個在緩沖區(qū)釋放時完成某些動作的函數(shù)。如果緩沖區(qū)不屬于一個socket,這個函數(shù)指針通常是不會被賦值的。如果緩沖區(qū)屬于一個

socket,

這個函數(shù)指針會被賦值為sock_rfree或sock_wfree(分別由skb_set_owner_r或skb_set_owner_w函數(shù)初始

化)。這兩個sock_xxx函數(shù)用于更新socket的隊列中的內(nèi)存容量。

3. General Fields

本節(jié)描述sk_buff的主要成員變量,這些成員變量與特定的內(nèi)核功能無關(guān):

struct timeval stamp

這個變量只對接收到的包有意義。它代表包接收時的時間戳,或者有時代表包準備發(fā)出時的時間戳。它在netif_rx里面由函數(shù)net_timestamp設(shè)置,而netif_rx是設(shè)備驅(qū)動收到一個包后調(diào)用的函數(shù)。

struct net_device *dev

個變量的類型是net_device,net_device它代表一個網(wǎng)絡(luò)設(shè)備。dev的作用與這個包是準備發(fā)出的包還是剛接收的包有關(guān)。當收到一個包

時,設(shè)備驅(qū)動會把sk_buff的dev指針指向收到這個包的設(shè)備的數(shù)據(jù)結(jié)構(gòu),就像下面的vortex_rx里的一段代碼所做的一樣,這個函數(shù)屬于

3c59x系列以太網(wǎng)卡驅(qū)動,用于接收一個幀。(drivers/net/3c59x.c):

static int vortex_rx(struct net_device *dev)

{

... ... ...

skb->dev = dev;

... ... ...

skb->protocol = eth_type_trans(skb, dev);

netif_rx(skb); /* Pass the packet to the higher layer */

... ... ...

}

當一個包被發(fā)送時,這個變量代表將要發(fā)送這個包的設(shè)備。在發(fā)送網(wǎng)絡(luò)包時設(shè)置這個值的代碼要比接收網(wǎng)絡(luò)包時設(shè)置這個值的代

碼復(fù)雜。有些網(wǎng)絡(luò)功能可以把多個網(wǎng)絡(luò)設(shè)備組成一個虛擬的網(wǎng)絡(luò)設(shè)備(也就是說,這些設(shè)備沒有和物理設(shè)備直接關(guān)聯(lián)),并由一個虛擬網(wǎng)絡(luò)設(shè)備驅(qū)動管理。當虛擬設(shè)

備被使用時,dev指針指向虛擬設(shè)備的net_device結(jié)構(gòu)。而虛擬設(shè)備驅(qū)動會在一組設(shè)備中選擇一個設(shè)備并把dev指針修改為這個設(shè)備的

net_device結(jié)構(gòu)。因此,在某些情況下, 指向傳輸設(shè)備的指針會在包處理過程中被改變。

struct net_device *input_dev

這是收到包的網(wǎng)絡(luò)設(shè)備的指針。如果包是本地生成的,這個值為NULL。對以太網(wǎng)設(shè)備來說,這個值由eth_type_trans初始化,它主要被流量控制代碼使用。

struct net_device *real_dev

這個變量只對虛擬設(shè)備有意義,它代表與虛擬設(shè)備關(guān)聯(lián)的真實設(shè)備。例如,Bonding和VLAN設(shè)備都使用它來指向收到包的真實設(shè)備。

union {...} h

union {...} nh

union {...} mac

這些是指向TCP/IP各層協(xié)議頭的指針:h指向L4,nh指向L3,mac指向L2。每個指針的類型都是一個聯(lián)合,包

含多個數(shù)據(jù)結(jié)構(gòu),每一個數(shù)據(jù)結(jié)構(gòu)都表示內(nèi)核在這一層可以解析的協(xié)議。例如,h是一個包含內(nèi)核所能解析的L4協(xié)議的數(shù)據(jù)結(jié)構(gòu)的聯(lián)合。每一個聯(lián)合都有一個

raw變量用于初始化,后續(xù)的訪問都是通過協(xié)議相關(guān)的變量進行的。

當接收一個包時,處理n層協(xié)議頭的函數(shù)從n-1層收到一個緩沖區(qū),它的skb->data指向n層協(xié)議的頭。處理

n層協(xié)議的函數(shù)把本層的指針(例如,L3對應(yīng)的是skb->nh指針)初始化為skb->data,因為這個指針的值會在處理下一層協(xié)議時改

變(skb->data將被初始化成緩沖區(qū)里的其他地址)。在處理n層協(xié)議的函數(shù)結(jié)束時,在把包傳遞給n+1層的處理函數(shù)前,它會把skb-

>data指針指向n層協(xié)議頭的末尾,這正好是n+1層協(xié)議的協(xié)議頭(參見圖3)。

發(fā)送包的過程與此相反,但是由于要為每一層添加新的協(xié)議頭,這個過程要比接收包的過程復(fù)雜。

Figure 3. Header's pointer initializations while moving from layer two to layer three

struct dst_entry dst

這個變量在路由子系統(tǒng)中使用。

char cb[40]

是一個“control

buffer”,或者說是一個私有信息的存儲空間,由每一層自己維護并使用。它在分配sk_buff結(jié)構(gòu)時分配(它目前的大小是40字節(jié),已經(jīng)足夠為每一

層存儲必要的私有信息了)。在每一層中,訪問這個變量的代碼通常用宏實現(xiàn)以增強代碼的可讀性。例如,TCP用這個變量存儲tcp_skb_cb結(jié)構(gòu),這個

結(jié)構(gòu)在include/net/tcp.h中定義:

struct tcp_skb_cb {

... ... ...

_ _u32? ?? ?? ?seq;? ?? ?? ?/* Starting sequence number */

_ _u32? ?? ?? ?end_seq;? ???/* SEQ + FIN + SYN + datalen*/

_ _u32? ?? ?? ?when;? ?? ???/* used to compute rtt's? ???*/

_ _u8? ?? ?? ? flags;? ?? ? /* TCP header flags.? ?? ?? ?*/

... ... ...

};

下面這個宏被TCP代碼用來訪問cb變量。在這個宏里面,有一個簡單的類型轉(zhuǎn)換:

#define TCP_SKB_CB(_ _skb)? ???((struct tcp_skb_cb *)&((_ _skb)->cb[0]))

下面的例子是TCP子系統(tǒng)在收到一個分段時填充相關(guān)數(shù)據(jù)結(jié)構(gòu)的代碼:

int tcp_v4_rcv(struct sk_buff *skb)

{

... ... ...

th = skb->h.th;

TCP_SKB_CB(skb)->seq = ntohl(th->seq);

TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +

skb->len - th->doff * 4);

TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);

TCP_SKB_CB(skb)->when = 0;

TCP_SKB_CB(skb)->flags = skb->nh.iph->tos;

TCP_SKB_CB(skb)->sacked = 0;

... ... ...

}

如果想要了解cb中的參數(shù)是如何被取出的,可以查看net/ipv4/tcp_output.c中的tcp_transmit_skb函數(shù)。這個函數(shù)被TCP用于向IP層發(fā)送一個分段。

unsigned int csum

unsigned char ip_summed

表示校驗和以及相關(guān)狀態(tài)標記。

unsigned char cloned

一個布爾標記,當被設(shè)置時,表示這個結(jié)構(gòu)是另一個sk_buff的克隆。在“克隆和拷貝緩沖區(qū)”一節(jié)中有描述。

unsigned char pkt_type

這個變量表示幀的類型,分類是由L2的目的地址來決定的。可能的取值都在include/linux/if_packet.h中定義。對以太網(wǎng)設(shè)備來說,這個變量由eth_type_trans函數(shù)初始化。

類型的可能取值如下:

PACKET_HOST

包的目的地址與收到它的網(wǎng)絡(luò)設(shè)備的L2地址相等。換句話說,這個包是發(fā)給本機的。

.PACKET_MULTICAST

包的目的地址是一個多播地址,而這個多播地址是收到這個包的網(wǎng)絡(luò)設(shè)備所注冊的多播地址。

PACKET_BROADCAST

包的目的地址是一個廣播地址,而這個廣播地址也是收到這個包的網(wǎng)絡(luò)設(shè)備的廣播地址。

PACKET_OTHERHOST

包的目的地址與收到它的網(wǎng)絡(luò)設(shè)備的地址完全不同(不管是單播,多播還是廣播),因此,如果本機的轉(zhuǎn)發(fā)功能沒有啟用,這個包會被丟棄。

PACKET_OUTGOING

這個包將被發(fā)出。用到這個標記的功能包括Decnet協(xié)議,或者是為每個網(wǎng)絡(luò)tap都復(fù)制一份發(fā)出包的函數(shù)。

PACKET_LOOPBACK

這個包發(fā)向loopback設(shè)備。由于有這個標記,在處理loopback設(shè)備時,內(nèi)核可以跳過一些真實設(shè)備才需要的操作。

PACKET_FASTROUTE

這個包由快速路由代碼查找路由。快速路由功能在2.6內(nèi)核中已經(jīng)去掉了。

_ _u32 priority

個變量描述發(fā)送或轉(zhuǎn)發(fā)包的QoS類別。如果包是本地生成的,socket層會設(shè)置priority變量。如果包是將要被轉(zhuǎn)發(fā)的,

rt_tos2priority函數(shù)會根據(jù)ip頭中的Tos域來計算賦給這個變量的值。這個變量的值與DSCP(DiffServ

CodePoint)沒有任何關(guān)系。

unsigned short protocol

個變量是高層協(xié)議從二層設(shè)備的角度所看到的協(xié)議。典型的協(xié)議包括IP,IPV6和ARP。完整的列表在include/linux/if_ether.h

中。由于每個協(xié)議都有自己的協(xié)議處理函數(shù)來處理接收到的包,因此,這個域被設(shè)備驅(qū)動用于通知上層調(diào)用哪個協(xié)議處理函數(shù)。每個網(wǎng)絡(luò)驅(qū)動都調(diào)用

netif_rx來通知上層網(wǎng)絡(luò)協(xié)議的協(xié)議處理函數(shù),因此protocol變量必須在這些協(xié)議處理函數(shù)調(diào)用之前初始化。

unsigned short security

這是包的安全級別。這個變量最初由IPSec子系統(tǒng)使用,但現(xiàn)在已經(jīng)作廢了。

4. Feature-Specific Fields

linux內(nèi)核是模塊化的,你可以選擇包含或者刪除某些功能。因此,sk_buff結(jié)構(gòu)里面的一些成員變量只有在內(nèi)核選擇支持某些功能時才有效,比如防火墻(netfilter)或者qos:

unsigned long nfmark

_ _u32 nfcache

_ _u32 nfctinfo

struct nf_conntrack *nfct

unsigned int nfdebug

struct nf_bridge_info *nf_bridge

些變量被netfilter使用(防火墻代碼),內(nèi)核編譯選項是“Device Drivers->Networking

support-> Networking options-> Network packet

filtering”和兩個子選項“Network packet filtering debugging”和“Bridged IP/ARP

packets filtering”

union {...} private

個聯(lián)合結(jié)構(gòu)被高性能并行接口(HIPPI)使用。相應(yīng)的內(nèi)核編譯選項是“Device->Drivers ->Networking

support ->Network device support ->HIPPI driver support”

_ _u32 tc_index

_ _u32 tc_verd

_ _u32 tc_classid

些變量被流量控制代碼使用,內(nèi)核編譯選項是“Device Drivers ->Networking->support

->Networking options ->QoS and/or fair

queueing”和它的子選項“Packetclassifier API”

struct sec_path *sp

這個變量被IPSec協(xié)議用于跟蹤傳輸?shù)男畔ⅰ?/p>

5. Management Functions

有很多函數(shù),通常都比較短小而且簡單,內(nèi)核用這些函數(shù)操作sk_buff的成員變量或者sk_buff

鏈表。圖4會幫助我們理解其中幾個重要的函數(shù)。我們首先來看分配和釋放緩沖區(qū)的函數(shù),然后是一些通過移動指針在緩沖區(qū)的頭部或尾部預(yù)留空間的函數(shù)。

如果你看過include/linux/skbuff.h和net/core/skbuff.c中的函數(shù),你會發(fā)現(xiàn),基

本上每個函數(shù)都有兩個版本,名字分別是do_something和__do_something。通常第一種函數(shù)是一個包裝函數(shù),它會在第二種函數(shù)的基礎(chǔ)

上增加合法性檢查或者鎖。一般來說,類似__do_something的函數(shù)不能被直接調(diào)用(除非滿足特定的條件,比如說鎖)。那些違反這條規(guī)則而直接引

用這些函數(shù)的不良代碼會最終被更正。

Figure 4. Before and after: (a)skb_put, (b)skb_push, (c)skb_pull, and (d)skb_reserve

5.1. Allocating memory: alloc_skb and dev_alloc_skb

alloc_skb是net/core/skbuff.c里面定義的,用于分配緩沖區(qū)的函數(shù)。我們已經(jīng)知道,數(shù)據(jù)緩沖區(qū)

和緩沖區(qū)的描述結(jié)構(gòu)(sk_buff結(jié)構(gòu))是兩種不同的實體,這就意味著,在分配一個緩沖區(qū)時,需要分配兩塊內(nèi)存(一個是緩沖區(qū),一個是緩沖區(qū)的描述結(jié)構(gòu)

sk_buff)。

alloc_skb調(diào)用函數(shù)kmem_cache_alloc從緩存中獲取一個sk_buff結(jié)構(gòu),并調(diào)用kmalloc分配緩沖區(qū)(如果有緩存的話,它同樣從緩存中獲取內(nèi)存)。簡化后的代碼如下:

skb = kmem_cache_alloc(skbuff_head_cache, gfp_mask & ~_ _GFP_DMA);

... ... ...

size = SKB_DATA_ALIGN(size);

data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);

在調(diào)用kmalloc前,size參數(shù)通過SKB_DATA_ALIGN宏強制對齊。在函數(shù)返回前,它會初始化結(jié)構(gòu)中的一些變量,最后的結(jié)構(gòu)如圖5所示。在圖5右邊所示的內(nèi)存塊的底部,你能看到對齊操作所帶來的填充區(qū)域。

Figure 5. alloc_skb function

dev_alloc_skb也是一個緩沖區(qū)分配函數(shù),它主要被設(shè)備驅(qū)動使用,通常用在中斷上下文中。這是一個

alloc_skb函數(shù)的包裝函數(shù),它會在請求分配的大小上增加16字節(jié)的空間以優(yōu)化緩沖區(qū)的讀寫效率,它的分配要求使用原子操作

(GFP_ATOMIC),這是因為它是在中斷處理函數(shù)中被調(diào)用的。

static inline struct sk_buff *dev_alloc_skb(unsigned int length)

{

return _ _dev_alloc_skb(length, GFP_ATOMIC);

}

static inline

struct sk_buff *_ _dev_alloc_skb(unsigned int length, int gfp_mask)

{

struct sk_buff *skb = alloc_skb(length + 16, gfp_mask);

if (likely(skb))

skb_reserve(skb, 16);

return skb;

}

如果沒有體系架構(gòu)相關(guān)的實現(xiàn),缺省使用__dev_alloc_skb的實現(xiàn)。

5.2. Freeing memory: kfree_skb and dev_kfree_skb

這兩個函數(shù)釋放緩沖區(qū),并把它返回給緩沖池(緩存)。kfree_skb可以直接調(diào)用,也可以通過包裝函數(shù)

dev_kfree_skb調(diào)用。后面這個函數(shù)一般被設(shè)備驅(qū)動使用,與之功能相反的函數(shù)是dev_alloc_skb。dev_kfree_skb僅是一

個簡單的宏,它什么都不做,只簡單地調(diào)用kfree_skb。這些函數(shù)只有在skb->users為1地情況下才釋放內(nèi)存(沒有人引用這個結(jié)構(gòu))。

否則,它只是簡單地減小

skb->users。如果緩沖區(qū)有三個引用者,那么只有第三次調(diào)用dev_kfree_skb或kfree_skb時才釋放內(nèi)存。

圖6中的流程圖顯示了分配一個緩沖區(qū)所需要的步驟。當sk_buff釋放后,dst_release同樣會被調(diào)用以減小相關(guān)dst_entry數(shù)據(jù)結(jié)構(gòu)的引用計數(shù)。

如果destructor被初始化過,相應(yīng)的函數(shù)會在此時被調(diào)用.

在圖5中,我們看到,一個簡單的場景是:一個sk_buff結(jié)構(gòu)與另一個內(nèi)存塊相關(guān),這個內(nèi)存塊里存儲的是真正的數(shù)據(jù)。

當然,內(nèi)存塊底部的skb_shared_info數(shù)據(jù)結(jié)構(gòu)可以包含指向其他分片的指針(參見圖5)。如果存在分片,kfree_skb同樣會釋放這些分

片所占用的內(nèi)存。最后,kfree_skb 把sk_buff結(jié)構(gòu)返回給skbuff_head_cache緩存。

5.3. Data reservation and alignment: skb_reserve, skb_put, skb_push, and skb_pull

skb_reserve可以在緩沖區(qū)的頭部預(yù)留一定的空間,它通常被用來在緩沖區(qū)中插入?yún)f(xié)議頭或者在某個邊界上對齊。這

個函數(shù)改變data和tail指針,而data和tail指針分別指向負載的開頭和結(jié)尾,圖4(d)展示了調(diào)用skb_reserve(skb,n)的結(jié)

果。這個函數(shù)通常在分配緩沖區(qū)之后就調(diào)用,此時的

data和tail指針還是指向同一個地方。

如果你查看某個以太網(wǎng)設(shè)備驅(qū)動的收包函數(shù)(例如,drivers/net/3c59x.c中的vortex_rx), 你就會發(fā)現(xiàn)它在分配緩沖區(qū)之后,在向緩沖區(qū)中填充數(shù)據(jù)之前,會調(diào)用下面的函數(shù):

skb_reserve(skb, 2);? ???/* Align IP on 16 byte boundaries */

Figure 6. kfree_skb function

由于以太網(wǎng)幀的頭部長度是14個八位組,這個函數(shù)把緩沖區(qū)的頭部指針向后移動了2個字節(jié)。這樣,緊跟在以太網(wǎng)頭部之后的IP頭部在緩沖區(qū)中存儲時就可以在16字節(jié)的邊界上對齊。如圖7所示。

Figure 7. (a) before skb_reserve, (b) after skb_reserve, and (c) after copying the frame on the buffer

圖8展示了一個在發(fā)送過程中使用skb_reserve的例子。

Figure 8. Buffer that is filled in while traversing the stack from the TCP layer down to the link layer

當TCP發(fā)送數(shù)據(jù)時,它根據(jù)一些條件分配一個緩沖區(qū)(比如,TCP的最大分段長度(mss),是否支持散讀散寫I/O等

TCP在緩沖區(qū)的頭部預(yù)留足夠的空間(用skb_reserve)用于填充各層的頭部(如TCP,IP,鏈路層

等)。MAX_TCP_HEADER參數(shù)是各層頭部長度的總和,它考慮了最壞的情況:由于tcp層不知道將要用哪個接口發(fā)送包,它為每一層預(yù)留了最大的頭

部長度。它甚至考慮了出現(xiàn)多個IP頭的可能性(如果內(nèi)核編譯支持IP over IP, 我們就會遇到多個IP頭的情況)。

把TCP的負載拷貝到緩沖區(qū)。需要注意的是:圖8只是一個例子。TCP的負載可能會被組織成其他形式。例如它可以存儲到分片中。

TCP層添加自己的頭部。

TCP層把緩沖區(qū)傳遞給IP層,IP層同樣添加自己的頭部。

IP層把緩沖區(qū)傳遞給鄰居層,鄰居層添加鏈路層頭部。

當緩沖區(qū)在協(xié)議棧中向下層傳遞時,每一層都把skb->data指針向下移動,然后拷貝自己的頭部,同時更新skb->len。這些操作都使用圖4中所展示的函數(shù)完成。

skb_reserve函數(shù)并沒有把數(shù)據(jù)移出或移入緩沖區(qū),它只是簡單地更新了緩沖區(qū)的兩個指針,這兩個指針在圖4(d)中有描述。

static inline void skb_reserve(struct sk_buff *skb, unsigned int len)

{

skb->data+=len;

skb->tail+=len;

}

skb_push在緩沖區(qū)的開頭加入一塊數(shù)據(jù),而skb_put在緩沖區(qū)的末尾加入一塊數(shù)據(jù)。與skb_reserve

類似,這些函數(shù)都不會真的往緩沖區(qū)中添加數(shù)據(jù),相反,它們只是移動緩沖區(qū)的頭指針和尾指針。數(shù)據(jù)由其他函數(shù)拷貝到緩沖區(qū)中。skb_pull通過把head指針往前移來在緩沖區(qū)的頭部刪除一塊數(shù)據(jù)。圖4展示了這些函數(shù)是如何工作的。

2.1.5.4. The skb_shared_info structure and the skb_shinfo function

如圖5所示,在緩沖區(qū)數(shù)據(jù)的末尾,有一個數(shù)據(jù)結(jié)構(gòu)skb_shared_info,它保存了數(shù)據(jù)塊的附加信息。這個數(shù)據(jù)結(jié)構(gòu)緊跟在end指針所指的地址之后(end指針指示數(shù)據(jù)的末尾)。下面是這個結(jié)構(gòu)的定義:

struct skb_shared_info {

atomic_t? ?? ?? ?dataref;

unsigned int? ???nr_frags;

unsigned short? ?tso_size;

unsigned short? ?tso_seqs;

struct sk_buff? ?*frag_list;

skb_frag_t? ?? ? frags[MAX_SKB_FRAGS];

};

dataref表示數(shù)據(jù)塊的“用戶”數(shù),這個值在下一節(jié)(克隆和拷貝緩沖區(qū))中有描述。nf_frags,

frag_list和frags用于存儲IP分片。skb_is_nonlinear函數(shù)用于測試一個緩沖區(qū)是否是分片的,而skb_linearize

可以把分片組合成一個單一的緩沖區(qū)。組合分片涉及到數(shù)據(jù)拷貝,它將嚴重影響系統(tǒng)性能。

有些網(wǎng)卡硬件可以完成一些傳統(tǒng)上由CPU完成的任務(wù)。最常見的例子就是計算L3和L4校驗和。有些網(wǎng)卡甚至可以維護L4

協(xié)議的狀態(tài)機。在下面的例子中,我們主要討論TCP段卸載TCP segmentation

offload,這些網(wǎng)卡實現(xiàn)了TCP層的一部分功能。tso_size和tso_seqs就在這種情況下使用。

需要注意的是:sk_buff中沒有指向skb_shared_info結(jié)構(gòu)的指針。如果要訪問這個結(jié)構(gòu), 就需要使用skb_info宏,這個宏簡單地返回end指針:

#define skb_shinfo(SKB)? ???((struct skb_shared_info *)((SKB)->end))

下面的語句展示了如何使用這個宏來增加結(jié)構(gòu)中的某個成員變量的值:

skb_shinfo(skb)->dataref++;

2.1.5.5. Cloning and copying buffers

如果一個緩沖區(qū)需要被不同的用戶獨立地操作,而這些用戶可能會修改sk_buff中某些變量的值(比如h和nh值),內(nèi)

核沒有必要為每個用戶復(fù)制一份完整的sk_buff以及相應(yīng)的緩沖區(qū)。相反,為提高性能,內(nèi)核克隆一個緩沖區(qū)。克隆過程只復(fù)制sk_buff結(jié)構(gòu),

同時修改緩沖區(qū)的引用計數(shù)以避免共享的數(shù)據(jù)被提前釋放。克隆緩沖區(qū)使用skb_clone函數(shù)。

一個使用包克隆的場景是:一個接收包的過程需要把這個包傳遞給多個接收者,例如包處理函數(shù)或者一個或多個網(wǎng)絡(luò)模塊。

被克隆的sk_buff不會放在任何鏈表中,同時也不會有到socket的引用。原始的和克隆的sk_buff中的

skb->cloned值都被置為1。克隆包的skb->users值被置為1,這樣,在釋放時,可以先釋放sk_buff結(jié)構(gòu)。同時,緩沖

區(qū)的引用計數(shù)(dataref)增加1(因為有多個sk_buff結(jié)構(gòu)指向它)。圖9展示了克隆緩沖區(qū)的例子。

Figure 9. skb_clone function

skb_cloned函數(shù)可以用來測試skb的克隆狀態(tài)。

圖9展示了一個分片緩沖區(qū)的例子,這個緩沖區(qū)的一些數(shù)據(jù)保存在分片結(jié)構(gòu)數(shù)組frags中。

skb_share_check用于檢查引用計數(shù)skb->users,如果users變量表明skb是被共享的, 則克隆一個新的sk_buff。

如果一個緩沖區(qū)被克隆了,這個緩沖區(qū)的內(nèi)容就不能被修改。這就意味著,訪問數(shù)據(jù)的函數(shù)沒有必要加鎖。因此,當一個函數(shù)不

僅要修改sk_buff,而且要修改緩沖區(qū)內(nèi)容時,

就需要同時復(fù)制緩沖區(qū)。在這種情況下,程序員有兩個選擇。如果他知道所修改的數(shù)據(jù)在skb->start和skb->end

之間,他可以使用pskb_copy來復(fù)制這部分數(shù)據(jù)。如果他同時需要修改分片中的數(shù)據(jù),他就必須使用skb_copy。圖10展示了pskb_copy和skb_copy的結(jié)果。skb_shared_info結(jié)構(gòu)也可以包含一個

sk_buff的鏈表(鏈表名稱是frag_list)。這個鏈表在pskb_copy和skb_copy中的處理方式與frags數(shù)組的處理方式相同(圖10忽略了frag_list)。

Figure 10. (a) pskb_copy function and (b) skb_copy function

在決定克隆或復(fù)制一個緩沖區(qū)時,子系統(tǒng)的程序員不能預(yù)測其他內(nèi)核組件(其他子系統(tǒng))是否需要使用緩沖區(qū)里的原始數(shù)據(jù)。內(nèi)

核是模塊化的,它的狀態(tài)變化是不可預(yù)測的,因此,每個子系統(tǒng)都不知道其他子系統(tǒng)是如何操作緩沖區(qū)的。因此,內(nèi)核程序員需要記錄它們對緩沖區(qū)的修改,并且在

修改緩沖區(qū)前,復(fù)制一個新的緩沖區(qū),以避免其他子系統(tǒng)在使用緩沖區(qū)的原始數(shù)據(jù)時出現(xiàn)錯誤。

2.1.5.6. List management functions

這些函數(shù)管理sk_buff的鏈表(也被稱作隊列)。在和中有函數(shù)完整列表。以下是一些經(jīng)常使用的函數(shù):

skb_queue_head_init

初始化sk_buff_head結(jié)構(gòu),創(chuàng)建一個空隊列。

skb_queue_head, skb_queue_tail

把一個緩沖區(qū)加入隊列的頭部或尾部。

skb_dequeue, skb_dequeue_tail

從隊列的頭部或尾部取下一個緩沖區(qū)。第一個函數(shù)的名字應(yīng)該是skb_dequeue_head,以保持和其他函數(shù)的名字風(fēng)格一致。

skb_queue_purge

清空一個隊列。

skb_queue_walk

Runs a loop on each element of a queue in turn.

這些函數(shù)都是原子操作,它們必須先獲取sk_buff_head中的自旋鎖,然后才能訪問隊列中的元素。否則,它們有可能被其他異步的添加或刪除操作打斷,比如在定時器中調(diào)用的函數(shù),這將導(dǎo)致鏈表出現(xiàn)錯誤而使得系統(tǒng)崩潰。

因此,每個函數(shù)的實現(xiàn)都采用下面這種形式:

static inline function_name ( parameter_list )

{

unsigned long flags;

spin_lock_irqsave(...);

_ _ _function_name ( parameter_list )

spin_unlock_irqrestore(...);

}

這些函數(shù)先獲取鎖,然后調(diào)用一個以兩個下劃線開頭的同名函數(shù)(這個函數(shù)做具體的操作,而且不需要鎖),然后釋放鎖。

總結(jié)

以上是生活随笔為你收集整理的sockert组成部分_Linux TCP/IP 协议栈的关键数据结构Socket Buffer(sk_buff )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

日韩黄在线观看 | 欧美精品一区二区蜜臀亚洲 | 午夜婷婷在线播放 | 91在线视频免费91 | 免费国产一区二区视频 | 91香蕉视频 mp4 | 国产精品麻豆免费版 | 精品在线小视频 | 天堂素人在线 | 国产精品久久久久久久久久三级 | 最近的中文字幕大全免费版 | av播放在线 | 91香蕉国产在线观看软件 | 在线国产高清 | 91香蕉视频好色先生 | 天天操夜夜爱 | 国产人成精品一区二区三 | 中文字幕色综合网 | 日韩免费不卡av | 国产精品原创视频 | 最新日韩精品 | 色亚洲激情 | 国产91九色蝌蚪 | 精品国产自 | 麻豆视频入口 | 久草久热 | 国产涩涩在线观看 | 久久综合福利 | 国产精品毛片一区二区在线看 | 亚洲做受高潮欧美裸体 | 中文资源在线播放 | 日p在线观看| 亚洲成人中文在线 | 国产清纯在线 | 国产午夜麻豆影院在线观看 | 免费a视频 | 99免费看片 | 最新中文字幕在线资源 | 免费在线一区二区三区 | 免费合欢视频成人app | 天天爽天天射 | 天天插综合网 | 久久伊人热 | 97成人在线视频 | 亚洲成熟女人毛片在线 | 粉嫩av一区二区三区四区五区 | 国产高清在线免费观看 | 久久久久久久久久久久99 | 久久综合久久综合这里只有精品 | www.午夜| 国产亚洲精品久久 | 国产伦理精品一区二区 | 亚洲伦理中文字幕 | 中文在线a天堂 | 日日干 天天干 | 国外成人在线视频网站 | 激情五月五月婷婷 | 日日干综合 | 97人人超| 麻豆系列在线观看 | 婷婷色综合色 | 九九九在线观看 | 国产视频一区二区在线播放 | 国产精品久久久久久久久久妇女 | 国产精品资源在线 | 99精品视频免费在线观看 | 91久久久久久久一区二区 | 欧美成人精品欧美一级乱 | 欧美一级在线 | 免费在线黄色av | 亚洲成人麻豆 | 在线观看一区视频 | 国产精品青草综合久久久久99 | 在线视频福利 | 国产精品99久久免费黑人 | 午夜电影 电影 | av线上看 | 黄色软件大全网站 | 国产美腿白丝袜足在线av | 欧美国产精品一区二区 | 国产亚洲精品久久久久久无几年桃 | 亚洲精品乱码久久久久久写真 | 国产91免费观看 | 99视频在线精品国自产拍免费观看 | 国产精品一区久久久久 | 日韩精品视频免费 | 9999精品| 毛片在线播放网址 | 天天干,夜夜操 | 操老逼免费视频 | 欧美在线观看视频一区二区 | 天天爽天天爽 | 99久热在线精品视频成人一区 | 一区二区中文字幕在线播放 | 国产va在线观看免费 | 不卡的一区二区三区 | 免费亚洲视频在线观看 | 午夜黄色大片 | 久久手机免费视频 | 新版资源中文在线观看 | 亚洲精品国精品久久99热 | avhd高清在线谜片 | 久久毛片高清国产 | 成人中文字幕在线 | 欧美人人 | 久久成人国产精品免费软件 | 亚洲免费av在线 | 国产精品12345| 玖玖爱免费视频 | 免费看三级 | 久久99国产精品免费网站 | 最新av电影网站 | 四虎影视精品成人 | 香蕉色综合 | 国产美女免费视频 | 在线99热 | 日韩精品一区不卡 | 激情在线五月天 | 国模视频一区二区三区 | 91九色网址| 99精品国产在热久久 | 操操操av| 欧美日韩1区 | av高清在线观看 | 国产一区二区三区 在线 | 亚洲欧美国产日韩在线观看 | 色噜噜狠狠色综合中国 | 日p视频在线观看 | 亚洲视频中文 | 精品麻豆 | 日本黄色免费网站 | 亚洲日本国产精品 | 日韩激情视频在线 | 97视频在线观看成人 | 高清久久久久久 | 日本成人免费在线观看 | 久久99精品视频 | 国产精品久久中文字幕 | 中文字幕二区三区 | 激情导航| 天天爽综合网 | 综合av在线 | 亚州精品在线视频 | 免费在线观看av不卡 | 亚洲,国产成人av | 中文字幕丝袜制服 | 99这里都是精品 | 米奇四色影视 | 奇米影视在线99精品 | 97超碰总站 | 国产一级高清 | 九九综合久久 | 亚洲一区 影院 | 91精品国产综合久久婷婷香蕉 | 青青草视频精品 | 国产成人精品午夜在线播放 | 国产精品青草综合久久久久99 | 亚洲在线网址 | 免费久久精品视频 | 中文字幕在线观看视频网站 | 欧美精品一区二区蜜臀亚洲 | 亚洲少妇影院 | 97精品国产97久久久久久久久久久久 | 国产91国语对白在线 | 久久综合狠狠综合 | www.色在线| 国产资源av| 在线观看视频你懂得 | 久精品视频免费观看2 | 在线日韩三级 | 欧美无极色 | 一区二区三区免费在线 | 国产精品高清一区二区三区 | 日b视频国产 | 最新国产精品拍自在线播放 | 波多野结衣网址 | 欧美精品久久久久久久免费 | 国产高清在线免费观看 | 久久国色夜色精品国产 | 亚洲视频一区二区三区在线观看 | 国产专区视频在线 | 国产视频在线观看一区 | 伊人亚洲精品 | 激情五月婷婷激情 | 欧美视频日韩视频 | 久久久久久久久久久免费视频 | 欧美91在线 | 国产精品福利在线 | 国产美女无遮挡永久免费 | 碰超人人 | 91免费看片黄 | 黄色软件在线观看视频 | 久久久受www免费人成 | 欧美一区二区三区在线观看 | 午夜神马福利 | 天天干人人 | 国产精品成人久久久 | av电影一区二区 | 蜜臀精品久久久久久蜜臀 | 中文字幕精 | 亚洲综合欧美精品电影 | 欧美色图88 | 在线国产精品视频 | 手机看片久久 | 国产精品一区二区av影院萌芽 | 夜夜骑日日| 国产91粉嫩白浆在线观看 | 欧美日韩裸体免费视频 | 欧洲精品视频一区二区 | 在线观看免费黄视频 | 91大神电影 | 久艹在线免费观看 | 国产 日韩 在线 亚洲 字幕 中文 | 夜夜夜影院| 狠狠狠狠狠狠狠狠 | 国产一区二区不卡视频 | 色播激情五月 | 亚洲欧洲av在线 | 三级黄色在线 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 探花视频网站 | 欧美另类xxx | 日韩特级黄色片 | 国产精品美女久久久久久久久 | 国产一级一级国产 | 在线观看黄色av | 久久精品人人做人人综合老师 | 国产午夜精品一区二区三区四区 | 99性视频| 成人免费一区二区三区在线观看 | 久久福利在线 | 日韩欧美在线一区 | 久久精品在线 | 天天摸天天舔 | 亚洲精品国产高清 | 亚洲综合色视频在线观看 | 九九99| 中文字幕在线高清 | 深夜福利视频在线观看 | 日韩精品一区二区三区水蜜桃 | 久草在线免费电影 | 久久九精品 | 99中文字幕在线观看 | 久久99这里只有精品 | 成人国产精品久久久久久亚洲 | 亚洲免费激情 | 亚洲综合网站在线观看 | 久精品视频在线观看 | 欧美中文字幕久久 | 超碰97人人爱 | 最新国产在线观看 | 亚洲激情p | 99久久er热在这里只有精品66 | 欧美在线观看禁18 | 欧美少妇xx | 天天干,天天射,天天操,天天摸 | 在线成人av| 99热这里只有精品在线观看 | 国产精品成人在线观看 | 国产免费观看视频 | av在线直接看 | 91精品一区二区在线观看 | 成人小视频在线播放 | 国产三级在线播放 | 国产精品乱码高清在线看 | 久久怡红院 | 69视频在线播放 | 精品91| 欧美俄罗斯性视频 | 天天爱天天操天天爽 | 天天伊人网 | 四虎永久免费网站 | 亚洲国产日韩一区 | 日韩在线观看小视频 | 不卡的av电影 | 亚洲精品一区二区三区四区高清 | 成人免费一级片 | 一区二区三区av在线 | 91成人免费视频 | 91亚洲在线| 黄色免费在线视频 | 国产精品久久久久毛片大屁完整版 | 日韩精品在线视频 | 国内视频在线观看 | 日韩av视屏在线观看 | www.香蕉| 91精品国产92久久久久 | 国产高清视频网 | 久99久中文字幕在线 | 婷婷精品在线视频 | 日韩成人xxxx | 人人狠狠综合久久亚洲婷 | av中文字幕剧情 | 精品国产成人在线 | 亚洲精品视频在线 | 不卡av在线免费观看 | 天天干 夜夜操 | 日韩中文字幕免费在线播放 | 911亚洲精品第一 | 江苏妇搡bbbb搡bbbb | av一区二区三区在线 | 日韩毛片在线播放 | 夜夜嗨av色一区二区不卡 | 91精品国产高清自在线观看 | av中文字幕不卡 | 97视频资源 | 97超碰人人澡人人爱学生 | 九九视频免费在线观看 | 国产盗摄精品一区二区 | 国产色在线视频 | 天天天在线综合网 | av大全在线看 | 日韩乱色精品一区二区 | h网站免费在线观看 | 天天操操操操操 | 久久免费公开视频 | 国产黄色大片免费看 | 在线看片中文字幕 | 久久草草热国产精品直播 | 九九热精品视频在线观看 | 久草精品资源 | 久久亚洲免费 | 手机在线看a | 久久成电影 | 国产精品第52页 | 2022久久国产露脸精品国产 | 天天干夜夜爱 | av免费线看 | 国产黄影院色大全免费 | 亚洲一级在线观看 | 成人国产精品一区 | 免费看污片| 国产亚洲精品电影 | 久久久久久久久影院 | 成人97人人超碰人人99 | 久久综合九色综合久99 | 免费日韩电影 | 久久99九九99精品 | 91在线免费视频观看 | 国产精品一区在线观看你懂的 | 香蕉国产91 | 91精品国产91久久久久久三级 | 国产中文字幕在线视频 | 香蕉视频网站在线观看 | av免费电影网站 | 精品久久久久久久久久久久久久久久 | 久久影院中文字幕 | 国产69精品久久久久久久久久 | 国产精品国产三级国产aⅴ入口 | 亚洲精品美女在线观看播放 | h视频在线看 | 99精品视频在线播放免费 | 久久久久久毛片精品免费不卡 | 中文国产字幕在线观看 | 日韩欧美精品在线 | 成年人视频免费在线播放 | 97视频在线观看免费 | 日本成人中文字幕在线观看 | 一区二区三区四区五区在线 | 国产 日韩 欧美 中文 在线播放 | 99日精品 | 久久人人爽人人爽人人片av免费 | 色综合久久中文综合久久牛 | 五月天久久婷 | 亚洲视频1区2区 | 激情网色 | 中文字幕亚洲精品在线观看 | 久久久亚洲成人 | 日韩中文字幕第一页 | 国产成人精品免费在线观看 | 在线观看第一页 | 亚洲精选99 | 成年人在线观看网站 | 日韩在线影视 | 久久国产精彩视频 | 久久综合射 | 国产精品白浆视频 | 久久成人在线 | 亚洲精品久久久久久久不卡四虎 | 成人免费视频免费观看 | avove黑丝| 欧美一级性生活片 | 欧美视频日韩 | 91黄色免费网站 | 国产在线视频资源 | 免费成人av在线看 | 中文字幕在线免费观看视频 | 国内99视频 | 天天干天天拍 | 久久免费99精品久久久久久 | 人人射人人| 亚洲人成在线电影 | 毛片网站在线观看 | 狠色狠色综合久久 | 最近乱久中文字幕 | 亚洲精品午夜久久久久久久 | 国产精品完整版 | 久久精彩视频 | 欧美91成人网 | 国产一区在线免费观看视频 | 日韩在线视频国产 | 国产欧美精品xxxx另类 | 亚洲理论电影网 | 成年人电影免费在线观看 | 色婷婷六月 | 人人讲| 色综合天天色 | 国产精品久久电影网 | 日韩在线视频二区 | 国产日韩欧美在线看 | 99精品久久精品一区二区 | 激情av网| 久久精品91久久久久久再现 | 最新日韩精品 | 亚洲激情影院 | 96超碰在线 | 国产日产亚洲精华av | 欧美坐爱视频 | 久久久久久久久久久成人 | 欧美精品第一 | 久久精品久久99 | 在线观看亚洲国产精品 | 天天搞天天干天天色 | 99热亚洲精品 | 黄色在线免费观看网址 | 国产黄a三级三级三级三级三级 | 精品国产三级 | 免费一级片在线观看 | 天天艹日日干 | 久久香蕉国产精品麻豆粉嫩av | 超碰人人舔 | 黄色avwww| 日韩精品久久久免费观看夜色 | 久爱综合 | 久久99精品久久久久蜜臀 | 国产精品婷婷 | 91av在线免费播放 | 日韩亚洲精品电影 | 天天曰夜夜操 | 色婷婷激婷婷情综天天 | 亚洲欧美日本国产 | 色噜噜日韩精品欧美一区二区 | 中文字幕av在线不卡 | 亚洲永久精品在线观看 | 国产精品一区在线观看 | 国产v欧美 | 国产精品免费久久久久久久久久中文 | wwwwww色| 国产精品一区二区久久精品爱微奶 | 国语精品久久 | 国产高清区 | 久久三级视频 | 中文字幕不卡在线88 | 国产精品久久久久久久免费观看 | 国产精品男女视频 | 国产自产在线视频 | 成人在线观看你懂的 | 欧美日韩精品二区第二页 | 亚洲 欧美 91| 亚洲精品国产视频 | 亚洲精品一区中文字幕乱码 | 国产区久久 | 国产香蕉97碰碰碰视频在线观看 | 色就是色综合 | 91久久黄色 | 久久综合九色综合97_ 久久久 | 久久免费视频一区 | 午夜性生活| 91传媒在线| 麻豆国产精品一区二区三区 | av千婊在线免费观看 | 亚洲精品18p | 在线你懂的视频 | 国产精品亚洲综合久久 | 精品国产一区二区三区日日嗨 | 国产精品美女在线 | 在线视频91 | 欧美怡红院 | av在线网站免费观看 | 欧美精品久久久久久 | 亚洲精品视频在线观看网站 | 天天色天天上天天操 | 97成人精品视频在线播放 | 欧美色图亚洲图片 | 国产成人精品一区二区三区福利 | 99精品在线免费在线观看 | 在线视频你懂 | 狠狠操影视 | 在线一区电影 | 99久久精品午夜一区二区小说 | 久久国产麻豆 | 国产在线高清精品 | 国产午夜精品一区二区三区 | 国产精品免费看久久久8精臀av | 五月婷婷爱 | 九九九在线观看视频 | 99欧美| 欧美孕妇与黑人孕交 | 亚洲精品国产综合久久 | 久久精精品视频 | 99视频国产精品免费观看 | 日韩大片免费在线观看 | 欧美成人999 | 久久成人国产精品 | 久一久久 | 波多野结衣在线视频免费观看 | 毛片的网址 | 国产不卡av在线播放 | 在线观看91视频 | 大荫蒂欧美视频另类xxxx | 亚洲欧美视屏 | 久久综合久久伊人 | 91麻豆精品国产自产 | 91人人澡人人爽人人精品 | 国产一级片免费观看 | 国产精品24小时在线观看 | 97在线播放视频 | 亚洲视频在线观看免费 | 精品毛片久久久久久 | 久久人人爽 | 在线观看黄色大片 | 一级一级一片免费 | 97超碰国产精品 | 日韩免费高清在线观看 | 久久精品视频免费播放 | 91在线日韩| 亚洲成人av在线播放 | 久久久久久福利 | 韩国一区二区在线观看 | 精品99999 | 亚洲激情六月 | 久久久精品视频成人 | 免费看黄色小说的网站 | 国产成人久久精品77777综合 | 久久久久久高潮国产精品视 | 免费高清无人区完整版 | 成人国产精品一区二区 | 91精品在线视频观看 | 日本中文一级片 | 一区二区三区高清在线 | 91桃色视频 | 亚洲精色| 高清免费av在线 | 日韩电影一区二区三区在线观看 | 97在线视频免费播放 | 日韩综合视频在线观看 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 97精品国产97久久久久久久久久久久 | 黄色的视频网站 | 欧美国产日韩一区 | 亚洲精品欧美专区 | 久久视讯 | 国产v在线| 岛国精品一区二区 | japanese黑人亚洲人4k | 乱子伦av| 日日操网站 | 日韩欧美99 | 日韩sese| 亚洲一区二区三区精品在线观看 | 国产又粗又猛又黄 | 久久免费视频这里只有精品 | 免费在线观看av网站 | 国产日韩精品在线观看 | 人人盈棋牌 | 韩国精品福利一区二区三区 | 色综合色综合久久综合频道88 | 在线视频 一区二区 | 久久久免费视频播放 | 成片视频在线观看 | 国产免费高清视频 | 久久影院中文字幕 | 国产在线播放一区 | 免费激情网 | 国内成人精品2018免费看 | 在线观看国产亚洲 | 亚洲精品国产精品国自产 | 天天拍夜夜拍 | 亚洲区精品视频 | 久久久久9999亚洲精品 | 亚洲免费观看在线视频 | 中文字幕在线视频免费播放 | 午夜精品一区二区三区视频免费看 | 天天操夜夜操天天射 | 99久久国产免费免费 | 99久久久久久久久 | 久久99精品久久只有精品 | 又长又大又黑又粗欧美 | 欧美精品资源 | 日本中文字幕电影在线免费观看 | 国产精品热 | 国产一级性生活视频 | 久久精品视频观看 | 久久久69| 国产精品午夜久久 | 成人黄色在线电影 | 日韩在线视频二区 | 色视频在线观看免费 | 国产va在线| 国产欧美在线一区 | 69国产成人综合久久精品欧美 | 久久久国产在线视频 | 美女黄色网在线播放 | 久久在草 | 五月婷婷丁香综合 | 欧美另类老妇 | 激情久久综合网 | 午夜久久久精品 | 人人干人人添 | 久久国产免费视频 | 久久亚洲成人网 | 亚洲婷久久 | 天天操天天摸天天射 | 日韩免费电影网 | 日韩av中文在线观看 | 国产精品激情在线观看 | 亚洲午夜精 | 免费在线观看午夜视频 | 国产.精品.日韩.另类.中文.在线.播放 | 婷婷亚洲综合 | 国产在线高清精品 | 久草资源在线观看 | 国产永久免费 | 久久国产影院 | 超碰人人射 | 99久高清在线观看视频99精品热在线观看视频 | av噜噜噜在线播放 | 国产精品一区久久久久 | 国产最新在线观看 | 久久不射电影院 | 日韩激情精品 | 国产精品男女视频 | av日韩在线网站 | 在线看国产一区 | 97在线播放| 国产999精品久久久影片官网 | 日韩精品最新在线观看 | 九九视频免费观看视频精品 | 97av影院| 亚洲精品国产成人av在线 | 九九九九热精品免费视频点播观看 | 亚洲最新av在线网址 | 色综合天天色综合 | 中字幕视频在线永久在线观看免费 | 亚洲综合一区二区精品导航 | 久草影视在线 | 国产黄a三级三级三级三级三级 | 激情影院在线 | 成人黄色电影免费观看 | av网站在线免费观看 | 二区三区中文字幕 | www.五月婷婷.com| 麻花天美星空视频 | 免费成人av在线看 | 欧美精品久久久久久久久老牛影院 | 久久精品看片 | 欧美伦理一区 | 国产专区精品 | av资源免费观看 | 天堂av免费观看 | 国内成人精品视频 | 天天操天天能 | 日日摸日日添夜夜爽97 | 久久精品网站视频 | 在线免费观看黄色 | 天天干夜夜擦 | 成人综合日日夜夜 | 久久99久久99精品中文字幕 | 麻豆一区在线观看 | 天天操夜夜操天天射 | 日韩一区二区久久 | 91丨九色丨91啦蝌蚪老版 | 在线看黄色av | 日韩久久久久久久 | 久久视频免费在线 | 国产成人精品一区二区三区福利 | 人人澡人人舔 | 日韩亚洲在线视频 | 色永久免费视频 | 亚洲在线精品视频 | 亚洲激情在线观看 | 在线电影日韩 | 亚洲黄色av网址 | 久草久热| 日韩a在线看 | 国产色一区 | 欧美精品在线视频 | 久久久久视| 97色综合| av福利第一导航 | 亚洲在线黄色 | 五月婷婷在线播放 | 免费av在线播放 | 日本黄色免费在线观看 | 五月开心网 | 日韩av电影免费观看 | 亚洲人成人在线 | 99r在线视频 | 久久久久久毛片精品免费不卡 | 国产精品丝袜久久久久久久不卡 | 国产麻豆电影 | 成人在线一区二区 | 一区二区三区四区久久 | 国产在线视频不卡 | 久久成| 91完整版| 欧美中文字幕第一页 | 最近中文字幕国语免费高清6 | 亚洲黄色免费网站 | 成人在线观看网址 | 欧美一区二区三区在线视频观看 | 国产在线观 | 夜夜操天天操 | 亚洲午夜精品一区二区三区电影院 | 国产一级淫片免费看 | 成人在线免费看 | 欧美性另类 | 亚洲四虎 | 亚洲精品短视频 | 亚洲国产中文字幕在线视频综合 | 人人插人人舔 | 国产91区 | 黄色1级毛片 | ,午夜性刺激免费看视频 | 国产一级a毛片视频爆浆 | 色婷婷精品大在线视频 | 97伊人网| 中文字幕在线观看日本 | 亚洲国产精品久久久久 | 人人澡澡人人 | 四虎成人精品永久免费av | 六月丁香六月婷婷 | 免费久久99精品国产 | 男女日麻批 | 国产精品免费久久久久 | 在线观看日韩av | 亚洲精品国偷拍自产在线观看蜜桃 | 91爱看片 | 国产精品久久久久久久久搜平片 | 国产 欧美 日产久久 | 久草综合视频 | 手机色站 | 五月激情六月丁香 | 久久久久国产一区二区三区 | 欧美日韩在线看 | 国产日韩中文在线 | 中文国产成人精品久久一 | www在线观看国产 | 婷婷日日| 91插插插网站 | 中文字幕在线观看第二页 | 免费在线观看视频一区 | 丁香五月亚洲综合在线 | 国产精品久久一区二区三区不卡 | aaa免费毛片| 久久成人资源 | 中文字幕丰满人伦在线 | 九色视频网址 | 国产免费看 | 中文字幕在线观看资源 | 欧美一级专区免费大片 | 97在线视频免费播放 | zzijzzij日本成熟少妇 | 天天色天天爱天天射综合 | 久久国产乱 | 日韩在线一二三区 | 国产亚洲免费观看 | 欧美在线1区 | 精品无人国产偷自产在线 | 五月婷婷久久综合 | 在线观看你懂的网站 | 999久久久免费精品国产 | 狠狠躁日日躁狂躁夜夜躁av | 欧美日韩国产综合网 | 91av视频免费观看 | 丁香激情综合国产 | 91av视频观看 | 2019中文在线观看 | 17婷婷久久www | 中文字幕在线播放日韩 | 成人h视频在线 | 中文字幕婷婷 | 在线 国产 亚洲 欧美 | 一区二区精品在线视频 | 亚洲精品综合一区二区 | 国产精品一区二区久久 | 在线看国产日韩 | 99国产精品久久久久老师 | 成人99免费视频 | 婷婷视频在线观看 | 日韩精品一区二区不卡 | 丁香激情五月 | 久热av在线 | 久久综合网色—综合色88 | 永久免费视频国产 | 久久精品亚洲综合专区 | 五月婷婷影视 | 五月综合激情婷婷 | 久久久午夜精品福利内容 | 国产成人精品久久亚洲高清不卡 | 亚洲欧美日韩一区二区三区在线观看 | 青春草视频在线播放 | 色综合天天在线 | 国产在线va | 久久久.com| 天天色天天操天天爽 | 亚洲欧美成人综合 | 色综合久久久久综合99 | 日韩高清一区 | 国产一二三精品 | 亚洲精品小区久久久久久 | 96国产在线| 天天拍天天爽 | 久久精品视频免费播放 | 欧美有色| 国产黄色大片 | 色视频网址 | 久久久久中文字幕 | 丁香久久五月 | 久久免费毛片视频 | 9999在线观看| 亚洲国产黄色 | 中文字幕av全部资源www中文字幕在线观看 | 免费在线观看不卡av | 亚洲影视九九影院在线观看 | 亚洲在线综合 | 日韩精品一区二 | 国产精品美女久久久免费 | 精品久久久久久久久久久院品网 | 欧美日韩一区二区在线观看 | 91色九色 | 一区二区三区观看 | 国产一级片网站 | 黄色一级影院 | 久久国产精品色av免费看 | 91尤物国产尤物福利在线播放 | 99热只有精品在线观看 | 成人在线一区二区三区 | 国产视频欧美视频 | 久久久久久久久久电影 | 四虎视频| 久久婷婷开心 | 一级黄色大片在线观看 | 国产99久久精品一区二区永久免费 | 亚洲影视资源 | 久久久久欠精品国产毛片国产毛生 | 一级做a视频 | 91x色| 日韩亚洲精品电影 | 在线观看av麻豆 | 免费看一级特黄a大片 | 日日夜夜免费精品视频 | 99久久夜色精品国产亚洲96 | 最近中文字幕免费av | 成人h电影在线观看 | 成人免费一区二区三区在线观看 | 久久免费成人精品视频 | freejavvideo日本免费 | 九九久久久 | 日韩视 | 丁香六月婷婷激情 | 欧亚久久 | 一区二区三区手机在线观看 | 天天做天天看 | 久久免费视频这里只有精品 | 黄色小说视频网站 | 欧美一区二视频在线免费观看 | 精品国产视频在线观看 | 天天色综合三 | 91香蕉久久 | 欧美影院久久 | 9在线观看免费高清完整版在线观看明 | 国产成人精品一区二区三区福利 | 深爱婷婷激情 | 四虎最新域名 | av在线最新 | 成人在线播放免费观看 | 日本韩国精品在线 | 欧美一级片在线免费观看 | 91成版人在线观看入口 | 免费看毛片网站 | 少妇bbw撒尿 | 日韩免费视频线观看 | 久久久久久久久久久久亚洲 | 国产精品福利一区 | 国产伦理剧 | 国产精品黄色 | 免费看国产视频 | 亚洲成人av在线 | 亚洲人av免费网站 | 国产精品自在欧美一区 | 日韩欧美在线影院 | 欧美性生活久久 | 中文字幕 91 | 成 人 黄 色 免费播放 | 在线国产日韩 | 97精品国自产拍在线观看 | 久久久五月婷婷 | 精品在线观看一区二区 | 亚州精品天堂中文字幕 | 久久99国产综合精品 | 四虎影视成人永久免费观看亚洲欧美 | 91精品色 | 久久精品九色 | 91人人插 | 久久久国产毛片 | 97av免费视频 | 六月丁香六月婷婷 | 午夜国产在线 | 国产一区黄色 | 91精品一区二区三区久久久久久 | 91新人在线观看 | 亚洲不卡在线 | 亚洲日韩精品欧美一区二区 | 精品五月天 | 精品国模一区二区 | 亚洲无吗视频在线 | 欧美少妇xxxxxx | 国产97在线播放 | 成人黄色电影在线观看 | 成 人 黄 色 免费播放 | 国产美女精品在线 | 六月色婷婷| 成年人在线免费看视频 | av中文字幕在线观看网站 | 91禁在线观看 | 国产精品成人a免费观看 | 色av资源网 | 国产美女精彩久久 | 国产精品免费观看在线 | 色综合久久中文综合久久牛 | 国产精品免费一区二区三区 | 在线中文字幕观看 | 中文字幕免费久久 | 亚洲国内精品在线 | 国产精品久久一区二区无卡 | 欧美一级视频在线观看 | 天堂网av 在线 | 日本精品va在线观看 | 又黄又爽的免费高潮视频 | 国产日韩在线观看一区 | av高清在线 | 91在线观看视频 | 久久蜜臀一区二区三区av | 色爽网站| 九九精品久久 | 国产精品高清一区二区三区 | 日韩精品免费一区 | 九草在线观看 | 久久九九影院 | 久久伦理影院 | 99视频在线观看免费 | 天天操婷婷 | 人人草在线视频 | 久久免费视频在线 | 91精品啪在线观看国产81旧版 | 亚洲爱av| 午夜国产一区二区三区四区 | 美女久久精品 | 摸阴视频| 亚洲精选视频在线 | 麻豆国产电影 | 欧美精品国产综合久久 | 色先锋资源网 | 在线黄色国产 | 日本不卡123区 | 婷婷久久一区 | 成人免费视频观看 | 日韩欧美在线影院 | 中文在线最新版天堂 | 五月婷婷激情网 | 黄色小说免费观看 | 国产最新在线 | 三级免费黄色 | 就要干b | 超碰伊人网 | 在线观看中文字幕 | 91av在线免费视频 | av千婊在线免费观看 | 九草在线视频 | 全久久久久久久久久久电影 | 国产一级不卡视频 | 欧美激情亚洲综合 | 国产男女爽爽爽免费视频 | 欧美二区在线播放 | 97精品国产一二三产区 | 97国产一区二区 | 岛国av在线 | 久久久久久免费毛片精品 | 成人久久 | 亚洲jizzjizz日本少妇 | 亚洲四虎在线 | 久久久99国产精品免费 | 国产一区二区免费看 | 精品国产伦一区二区三区 | 国产精品入口久久 | 国产在线a | 天天操天天操天天操天天操 |