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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 内核空间 sy,在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysf...

發(fā)布時間:2023/12/10 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 内核空间 sy,在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysf... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

級別: 初級

燚 楊 (), 計算機科學(xué)碩士

2006 年 2 月 16 日

本系列文章包括兩篇,它們文詳細地介紹了 Linux 系統(tǒng)下用戶空間與內(nèi)核空間數(shù)據(jù)交換的九種方式,包括內(nèi)核啟動參數(shù)、模塊參數(shù)與 sysfs、sysctl、系統(tǒng)調(diào)用、netlink、procfs、seq_file、debugfs和relayfs,并給出具體的例子幫助讀者掌握這些技術(shù)的使用。

本文是該系列文章的第一篇,它介紹了內(nèi)核啟動參數(shù)、模塊參數(shù)與sysfs、sysctl、系統(tǒng)調(diào)用和netlink,并結(jié)合給出的例子程序詳細地說明了它們?nèi)绾问褂谩?/p>

一般地,在使用虛擬內(nèi)存技術(shù)的多任務(wù)系統(tǒng)上,內(nèi)核和應(yīng)用有不同的地址空間,因此,在內(nèi)核和應(yīng)用之間以及在應(yīng)用與應(yīng)用之間進行數(shù)據(jù)交換需要專門的機制來實現(xiàn),眾所周知,進程間通信(IPC)機制就是為實現(xiàn)應(yīng)用與應(yīng)用之間的數(shù)據(jù)交換而專門實現(xiàn)的,大部分讀者可能對進程間通信比較了解,但對應(yīng)用與內(nèi)核之間的數(shù)據(jù)交換機制可能了解甚少,本文將詳細介紹 Linux 系統(tǒng)下內(nèi)核與應(yīng)用進行數(shù)據(jù)交換的各種方式,包括內(nèi)核啟動參數(shù)、模塊參數(shù)與 sysfs、sysctl、系統(tǒng)調(diào)用、netlink、procfs、seq_file、debugfs 和 relayfs。

Linux 提供了一種通過 bootloader 向其傳輸啟動參數(shù)的功能,內(nèi)核開發(fā)者可以通過這種方式來向內(nèi)核傳輸數(shù)據(jù),從而控制內(nèi)核啟動行為。

通常的使用方式是,定義一個分析參數(shù)的函數(shù),而后使用內(nèi)核提供的宏 __setup把它注冊到內(nèi)核中,該宏定義在 linux/init.h 中,因此要使用它必須包含該頭文件:

__setup("para_name=", parse_func)

para_name 為參數(shù)名,parse_func 為分析參數(shù)值的函數(shù),它負責(zé)把該參數(shù)的值轉(zhuǎn)換成相應(yīng)的內(nèi)核變量的值并設(shè)置那個內(nèi)核變量。內(nèi)核為整數(shù)參數(shù)值的分析提供了函數(shù) get_option 和 get_options,前者用于分析參數(shù)值為一個整數(shù)的情況,而后者用于分析參數(shù)值為逗號分割的一系列整數(shù)的情況,對于參數(shù)值為字符串的情況,需要開發(fā)者自定義相應(yīng)的分析函數(shù)。在源代碼包中的內(nèi)核程序kern-boot-params.c 說明了三種情況的使用。該程序列舉了參數(shù)為一個整數(shù)、逗號分割的整數(shù)串以及字符串三種情況,讀者要想測試該程序,需要把該程序拷貝到要使用的內(nèi)核的源碼目錄樹的一個目錄下,為了避免與內(nèi)核其他部分混淆,作者建議在內(nèi)核源碼樹的根目錄下創(chuàng)建一個新目錄,如 examples,然后把該程序拷貝到 examples 目錄下并重新命名為 setup_example.c,并且為該目錄創(chuàng)建一個 Makefile 文件:

obj-y = setup_example.o

Makefile 僅許這一行就足夠了,然后需要修改源碼樹的根目錄下的 Makefile文件的一行,把下面行

core-y := usr/

修改為

core-y := usr/ examples/

注意:如果讀者創(chuàng)建的新目錄和重新命名的文件名與上面不同,需要修改上面所說 Makefile 文件相應(yīng)的位置。做完以上工作就可以按照內(nèi)核構(gòu)建步驟去構(gòu)建新的內(nèi)核,在構(gòu)建好內(nèi)核并設(shè)置好lilo或grub為該內(nèi)核的啟動條目后,就可以啟動該內(nèi)核,然后使用lilo或grub的編輯功能為該內(nèi)核的啟動參數(shù)行增加如下參數(shù)串:

setup_example_int=1234 setup_example_int_array=100,200,300,400 setup_example_string=Thisisatest

當(dāng)然,該參數(shù)串也可以直接寫入到lilo或grub的配置文件中對應(yīng)于該新內(nèi)核的內(nèi)核命令行參數(shù)串中。讀者可以使用其它參數(shù)值來測試該功能。

下面是作者系統(tǒng)上使用上面參數(shù)行的輸出:

setup_example_int=1234

setup_example_int_array=100,200,300,400

setup_example_int_array includes 4 intergers

setup_example_string=Thisisatest

讀者可以使用

dmesg | grep setup

來查看該程序的輸出。

內(nèi)核子系統(tǒng)或設(shè)備驅(qū)動可以直接編譯到內(nèi)核,也可以編譯成模塊,如果編譯到內(nèi)核,可以使用前一節(jié)介紹的方法通過內(nèi)核啟動參數(shù)來向它們傳遞參數(shù),如果編譯成模塊,則可以通過命令行在插入模塊時傳遞參數(shù),或者在運行時,通過sysfs來設(shè)置或讀取模塊數(shù)據(jù)。

Sysfs是一個基于內(nèi)存的文件系統(tǒng),實際上它基于ramfs,sysfs提供了一種把內(nèi)核數(shù)據(jù)結(jié)構(gòu),它們的屬性以及屬性與數(shù)據(jù)結(jié)構(gòu)的聯(lián)系開放給用戶態(tài)的方式,它與kobject子系統(tǒng)緊密地結(jié)合在一起,因此內(nèi)核開發(fā)者不需要直接使用它,而是內(nèi)核的各個子系統(tǒng)使用它。用戶要想使用 sysfs 讀取和設(shè)置內(nèi)核參數(shù),僅需裝載 sysfs 就可以通過文件操作應(yīng)用來讀取和設(shè)置內(nèi)核通過 sysfs 開放給用戶的各個參數(shù):

$ mkdir -p /sysfs

$ mount -t sysfs sysfs /sysfs

注意,不要把 sysfs 和 sysctl 混淆,sysctl 是內(nèi)核的一些控制參數(shù),其目的是方便用戶對內(nèi)核的行為進行控制,而 sysfs 僅僅是把內(nèi)核的 kobject 對象的層次關(guān)系與屬性開放給用戶查看,因此 sysfs 的絕大部分是只讀的,模塊作為一個 kobject 也被出口到 sysfs,模塊參數(shù)則是作為模塊屬性出口的,內(nèi)核實現(xiàn)者為模塊的使用提供了更靈活的方式,允許用戶設(shè)置模塊參數(shù)在 sysfs 的可見性并允許用戶在編寫模塊時設(shè)置這些參數(shù)在 sysfs 下的訪問權(quán)限,然后用戶就可以通過sysfs 來查看和設(shè)置模塊參數(shù),從而使得用戶能在模塊運行時控制模塊行為。

對于模塊而言,聲明為 static 的變量都可以通過命令行來設(shè)置,但要想在 sysfs下可見,必須通過宏 module_param 來顯式聲明,該宏有三個參數(shù),第一個為參數(shù)名,即已經(jīng)定義的變量名,第二個參數(shù)則為變量類型,可用的類型有 byte, short, ushort, int, uint, long, ulong, charp 和 bool 或 invbool,分別對應(yīng)于 c 類型 char, short, unsigned short, int, unsigned int, long, unsigned long, char * 和 int,用戶也可以自定義類型 XXX(如果用戶自己定義了 param_get_XXX,param_set_XXX 和 param_check_XXX)。該宏的第三個參數(shù)用于指定訪問權(quán)限,如果為 0,該參數(shù)將不出現(xiàn)在 sysfs 文件系統(tǒng)中,允許的訪問權(quán)限為 S_IRUSR, S_IWUSR,S_IRGRP,S_IWGRP,S_IROTH 和 S_IWOTH 的組合,它們分別對應(yīng)于用戶讀,用戶寫,用戶組讀,用戶組寫,其他用戶讀和其他用戶寫,因此用文件的訪問權(quán)限設(shè)置是一致的。

在源代碼包中的內(nèi)核模塊 module-param-exam.c 是一個利用模塊參數(shù)和sysfs來進行用戶態(tài)與內(nèi)核態(tài)數(shù)據(jù)交互的例子。該模塊有三個參數(shù)可以通過命令行設(shè)置,下面是作者系統(tǒng)上的運行結(jié)果示例:

$ insmod ./module-param-exam.ko my_invisible_int=10 my_visible_int=20 mystring="Hello,World"

my_invisible_int = 10

my_visible_int = 20

mystring = 'Hello,World'

$ ls /sys/module/module_param_exam/parameters/

mystring my_visible_int

$ cat /sys/module/module_param_exam/parameters/mystring

Hello,World

$ cat /sys/module/module_param_exam/parameters/my_visible_int

20

$ echo 2000 > /sys/module/module_param_exam/parameters/my_visible_int

$ cat /sys/module/module_param_exam/parameters/my_visible_int

2000

$ echo "abc" > /sys/module/module_param_exam/parameters/mystring

$ cat /sys/module/module_param_exam/parameters/mystring

abc

$ rmmod module_param_exam

my_invisible_int = 10

my_visible_int = 2000

mystring = 'abc'

Sysctl是一種用戶應(yīng)用來設(shè)置和獲得運行時內(nèi)核的配置參數(shù)的一種有效方式,通過這種方式,用戶應(yīng)用可以在內(nèi)核運行的任何時刻來改變內(nèi)核的配置參數(shù),也可以在任何時候獲得內(nèi)核的配置參數(shù),通常,內(nèi)核的這些配置參數(shù)也出現(xiàn)在proc文件系統(tǒng)的/proc/sys目錄下,用戶應(yīng)用可以直接通過這個目錄下的文件來實現(xiàn)內(nèi)核配置的讀寫操作,例如,用戶可以通過

Cat /proc/sys/net/ipv4/ip_forward

來得知內(nèi)核IP層是否允許轉(zhuǎn)發(fā)IP包,用戶可以通過

echo 1 > /proc/sys/net/ipv4/ip_forward

把內(nèi)核 IP 層設(shè)置為允許轉(zhuǎn)發(fā) IP 包,即把該機器配置成一個路由器或網(wǎng)關(guān)。一般地,所有的 Linux 發(fā)布也提供了一個系統(tǒng)工具 sysctl,它可以設(shè)置和讀取內(nèi)核的配置參數(shù),但是該工具依賴于 proc 文件系統(tǒng),為了使用該工具,內(nèi)核必須支持 proc 文件系統(tǒng)。下面是使用 sysctl 工具來獲取和設(shè)置內(nèi)核配置參數(shù)的例子:

$ sysctl net.ipv4.ip_forward

net.ipv4.ip_forward = 0

$ sysctl -w net.ipv4.ip_forward=1

net.ipv4.ip_forward = 1

$ sysctl net.ipv4.ip_forward

net.ipv4.ip_forward = 1

注意,參數(shù) net.ipv4.ip_forward 實際被轉(zhuǎn)換到對應(yīng)的 proc 文件/proc/sys/net/ipv4/ip_forward,選項 -w 表示設(shè)置該內(nèi)核配置參數(shù),沒有選項表示讀內(nèi)核配置參數(shù),用戶可以使用 sysctl -a 來讀取所有的內(nèi)核配置參數(shù),對應(yīng)更多的 sysctl 工具的信息,請參考手冊頁 sysctl(8)。

但是 proc 文件系統(tǒng)對 sysctl 不是必須的,在沒有 proc 文件系統(tǒng)的情況下,仍然可以,這時需要使用內(nèi)核提供的系統(tǒng)調(diào)用 sysctl 來實現(xiàn)對內(nèi)核配置參數(shù)的設(shè)置和讀取。

在源代碼包中給出了一個實際例子程序,它說明了如何在內(nèi)核和用戶態(tài)使用sysctl。頭文件 sysctl-exam.h 定義了 sysctl 條目 ID,用戶態(tài)應(yīng)用和內(nèi)核模塊需要這些 ID 來操作和注冊 sysctl 條目。內(nèi)核模塊在文件 sysctl-exam-kern.c 中實現(xiàn),在該內(nèi)核模塊中,每一個 sysctl 條目對應(yīng)一個 struct ctl_table 結(jié)構(gòu),該結(jié)構(gòu)定義了要注冊的 sysctl 條目的 ID(字段 ctl_name),在 proc 下的名稱(字段procname),對應(yīng)的內(nèi)核變量(字段data,注意該該字段的賦值必須是指針),條目允許的最大長度(字段maxlen,它主要用于字符串內(nèi)核變量,以便在對該條目設(shè)置時,對超過該最大長度的字符串截掉后面超長的部分),條目在proc文件系統(tǒng)下的訪問權(quán)限(字段mode),在通過proc設(shè)置時的處理函數(shù)(字段proc_handler,對于整型內(nèi)核變量,應(yīng)當(dāng)設(shè)置為&proc_dointvec,而對于字符串內(nèi)核變量,則設(shè)置為 &proc_dostring),字符串處理策略(字段strategy,一般這是為&sysctl_string)。

Sysctl 條目可以是目錄,此時 mode 字段應(yīng)當(dāng)設(shè)置為 0555,否則通過 sysctl 系統(tǒng)調(diào)用將無法訪問它下面的 sysctl 條目,child 則指向該目錄條目下面的所有條目,對于在同一目錄下的多個條目,不必一一注冊,用戶可以把它們組織成一個 struct ctl_table 類型的數(shù)組,然后一次注冊就可以,但此時必須把數(shù)組的最后一個結(jié)構(gòu)設(shè)置為NULL,即

{

.ctl_name = 0

}

注冊sysctl條目使用函數(shù)register_sysctl_table(struct ctl_table *, int),第一個參數(shù)為定義的struct ctl_table結(jié)構(gòu)的sysctl條目或條目數(shù)組指針,第二個參數(shù)為插入到sysctl條目表中的位置,如果插入到末尾,應(yīng)當(dāng)為0,如果插入到開頭,則為非0。內(nèi)核把所有的sysctl條目都組織成sysctl表。

當(dāng)模塊卸載時,需要使用函數(shù)unregister_sysctl_table(struct ctl_table_header *)解注冊通過函數(shù)register_sysctl_table注冊的sysctl條目,函數(shù)register_sysctl_table在調(diào)用成功時返回結(jié)構(gòu)struct ctl_table_header,它就是sysctl表的表頭,解注冊函數(shù)使用它來卸載相應(yīng)的sysctl條目。用戶態(tài)應(yīng)用sysctl-exam-user.c通過sysctl系統(tǒng)調(diào)用來查看和設(shè)置前面內(nèi)核模塊注冊的sysctl條目(當(dāng)然如果用戶的系統(tǒng)內(nèi)核已經(jīng)支持proc文件系統(tǒng),可以直接使用文件操作應(yīng)用如cat, echo等直接查看和設(shè)置這些sysctl條目)。

下面是作者運行該模塊與應(yīng)用的輸出結(jié)果示例:

$ insmod ./sysctl-exam-kern.ko

$ cat /proc/sys/mysysctl/myint

0

$ cat /proc/sys/mysysctl/mystring

$ ./sysctl-exam-user

mysysctl.myint = 0

mysysctl.mystring = ""

$ ./sysctl-exam-user 100 "Hello, World"

old value: mysysctl.myint = 0

new value: mysysctl.myint = 100

old vale: mysysctl.mystring = ""

new value: mysysctl.mystring = "Hello, World"

$ cat /proc/sys/mysysctl/myint

100

$ cat /proc/sys/mysysctl/mystring

Hello, World

$

系統(tǒng)調(diào)用是內(nèi)核提供給應(yīng)用程序的接口,應(yīng)用對底層硬件的操作大部分都是通過調(diào)用系統(tǒng)調(diào)用來完成的,例如得到和設(shè)置系統(tǒng)時間,就需要分別調(diào)用 gettimeofday 和 settimeofday 來實現(xiàn)。事實上,所有的系統(tǒng)調(diào)用都涉及到內(nèi)核與應(yīng)用之間的數(shù)據(jù)交換,如文件系統(tǒng)操作函數(shù) read 和 write,設(shè)置和讀取網(wǎng)絡(luò)協(xié)議棧的 setsockopt 和 getsockopt。本節(jié)并不是講解如何增加新的系統(tǒng)調(diào)用,而是講解如何利用現(xiàn)有系統(tǒng)調(diào)用來實現(xiàn)用戶的數(shù)據(jù)傳輸需求。

一般地,用戶可以建立一個偽設(shè)備來作為應(yīng)用與內(nèi)核之間進行數(shù)據(jù)交換的渠道,最通常的做法是使用偽字符設(shè)備,具體實現(xiàn)方法是:

1.定義對字符設(shè)備進行操作的必要函數(shù)并設(shè)置結(jié)構(gòu) struct file_operations

結(jié)構(gòu) struct file_operations 非常大,對于一般的數(shù)據(jù)交換需求,只定義 open, read, write, ioctl, mmap 和 release 函數(shù)就足夠了,它們實際上對應(yīng)于用戶態(tài)的文件系統(tǒng)操作函數(shù) open, read, write, ioctl, mmap 和 close。這些函數(shù)的原型示例如下:

ssize_t exam_read (struct file * file, char __user * buf, size_t count, loff_t * ppos)

{

}

ssize_t exam_write(struct file * file, const char __user * buf, size_t count, loff_t * ppos)

{

}

int exam_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long argv)

{

}

int exam_mmap(struct file *, struct vm_area_struct *)

{

}

int exam_open(struct inode * inode, struct file * file)

{

}

int exam_release(struct inode * inode, struct file * file)

{

}

在定義了這些操作函數(shù)后需要定義并設(shè)置結(jié)構(gòu)struct file_operations

struct file_operations exam_file_ops = {

.owner = THIS_MODULE,

.read = exam_read,

.write = exam_write,

.ioctl = exam_ioctl,

.mmap = exam_mmap,

.open = exam_open,

.release = exam_release,

};

2. 注冊定義的偽字符設(shè)備并把它和上面的 struct file_operations 關(guān)聯(lián)起來:

int exam_char_dev_major;

exam_char_dev_major = register_chrdev(0, "exam_char_dev", &exam_file_ops);

注意,函數(shù) register_chrdev 的第一個參數(shù)如果為 0,表示由內(nèi)核來確定該注冊偽字符設(shè)備的主設(shè)備號,這是該函數(shù)的返回為實際分配的主設(shè)備號,如果返回小于 0,表示注冊失敗。因此,用戶在使用該函數(shù)時必須判斷返回值以便處理失敗情況。為了使用該函數(shù)必須包含頭文件 linux/fs.h。

在源代碼包中給出了一個使用這種方式實現(xiàn)用戶態(tài)與內(nèi)核態(tài)數(shù)據(jù)交換的典型例子,它包含了三個文件:頭文件 syscall-exam.h 定義了 ioctl 命令,.c 文件 syscall-exam-user.c為用戶態(tài)應(yīng)用,它通過文件系統(tǒng)操作函數(shù) mmap 和 ioctl 來與內(nèi)核態(tài)模塊交換數(shù)據(jù),.c 文件 syscall-exam-kern.c 為內(nèi)核模塊,它實現(xiàn)了一個偽字符設(shè)備,以便與用戶態(tài)應(yīng)用進行數(shù)據(jù)交換。為了正確運行應(yīng)用程序 syscall-exam-user,需要在插入模塊 syscall-exam-kern 后創(chuàng)建該實現(xiàn)的偽字符設(shè)備,用戶可以使用下面命令來正確創(chuàng)建設(shè)備:

$ mknod /dev/mychrdev c `dmesg | grep "char device mychrdev" | sed 's/.*major is //g'` 0

然后用戶可以通過 cat 來讀寫 /dev/mychrdev,應(yīng)用程序 syscall-exam-user則使用 mmap 來讀數(shù)據(jù)并使用 ioctl 來得到該字符設(shè)備的信息以及裁減數(shù)據(jù)內(nèi)容,它只是示例如何使用現(xiàn)有的系統(tǒng)調(diào)用來實現(xiàn)用戶需要的數(shù)據(jù)交互操作。

下面是作者運行該模塊的結(jié)果示例:

$ insmod ./syscall-exam-kern.ko

char device mychrdev is registered, major is 254

$ mknod /dev/mychrdev c `dmesg | grep "char device mychrdev" | sed 's/.*major is //g'` 0

$ cat /dev/mychrdev

$ echo "abcdefghijklmnopqrstuvwxyz" > /dev/mychrdev

$ cat /dev/mychrdev

abcdefghijklmnopqrstuvwxyz

$ ./syscall-exam-user

User process: syscall-exam-us(1433)

Available space: 65509 bytes

Data len: 27 bytes

Offset in physical: cc0 bytes

mychrdev content by mmap:

abcdefghijklmnopqrstuvwxyz

$ cat /dev/mychrdev

abcde

$

Netlink 是一種特殊的 socket,它是 Linux 所特有的,類似于 BSD 中的AF_ROUTE 但又遠比它的功能強大,目前在最新的 Linux 內(nèi)核(2.6.14)中使用netlink 進行應(yīng)用與內(nèi)核通信的應(yīng)用很多,包括:路由 daemon(NETLINK_ROUTE),1-wire 子系統(tǒng)(NETLINK_W1),用戶態(tài) socket 協(xié)議(NETLINK_USERSOCK),防火墻(NETLINK_FIREWALL),socket 監(jiān)視(NETLINK_INET_DIAG),netfilter 日志(NETLINK_NFLOG),ipsec 安全策略(NETLINK_XFRM),SELinux 事件通知(NETLINK_SELINUX),iSCSI 子系統(tǒng)(NETLINK_ISCSI),進程審計(NETLINK_AUDIT),轉(zhuǎn)發(fā)信息表查詢(NETLINK_FIB_LOOKUP),netlink connector(NETLINK_CONNECTOR),netfilter 子系統(tǒng)(NETLINK_NETFILTER),IPv6 防火墻(NETLINK_IP6_FW),DECnet 路由信息(NETLINK_DNRTMSG),內(nèi)核事件向用戶態(tài)通知(NETLINK_KOBJECT_UEVENT),通用 netlink(NETLINK_GENERIC)。

Netlink 是一種在內(nèi)核與用戶應(yīng)用間進行雙向數(shù)據(jù)傳輸?shù)姆浅:玫姆绞?#xff0c;用戶態(tài)應(yīng)用使用標準的 socket API 就可以使用 netlink 提供的強大功能,內(nèi)核態(tài)需要使用專門的內(nèi)核 API 來使用 netlink。

Netlink 相對于系統(tǒng)調(diào)用,ioctl 以及 /proc 文件系統(tǒng)而言具有以下優(yōu)點:

1,為了使用 netlink,用戶僅需要在 include/linux/netlink.h 中增加一個新類型的 netlink 協(xié)議定義即可, 如 #define NETLINK_MYTEST 17 然后,內(nèi)核和用戶態(tài)應(yīng)用就可以立即通過 socket API 使用該 netlink 協(xié)議類型進行數(shù)據(jù)交換。但系統(tǒng)調(diào)用需要增加新的系統(tǒng)調(diào)用,ioctl 則需要增加設(shè)備或文件, 那需要不少代碼,proc 文件系統(tǒng)則需要在 /proc 下添加新的文件或目錄,那將使本來就混亂的 /proc 更加混亂。

2. netlink是一種異步通信機制,在內(nèi)核與用戶態(tài)應(yīng)用之間傳遞的消息保存在socket緩存隊列中,發(fā)送消息只是把消息保存在接收者的socket的接收隊列,而不需要等待接收者收到消息,但系統(tǒng)調(diào)用與 ioctl 則是同步通信機制,如果傳遞的數(shù)據(jù)太長,將影響調(diào)度粒度。

3.使用 netlink 的內(nèi)核部分可以采用模塊的方式實現(xiàn),使用 netlink 的應(yīng)用部分和內(nèi)核部分沒有編譯時依賴,但系統(tǒng)調(diào)用就有依賴,而且新的系統(tǒng)調(diào)用的實現(xiàn)必須靜態(tài)地連接到內(nèi)核中,它無法在模塊中實現(xiàn),使用新系統(tǒng)調(diào)用的應(yīng)用在編譯時需要依賴內(nèi)核。

4.netlink 支持多播,內(nèi)核模塊或應(yīng)用可以把消息多播給一個netlink組,屬于該neilink 組的任何內(nèi)核模塊或應(yīng)用都能接收到該消息,內(nèi)核事件向用戶態(tài)的通知機制就使用了這一特性,任何對內(nèi)核事件感興趣的應(yīng)用都能收到該子系統(tǒng)發(fā)送的內(nèi)核事件,在后面的文章中將介紹這一機制的使用。

5.內(nèi)核可以使用 netlink 首先發(fā)起會話,但系統(tǒng)調(diào)用和 ioctl 只能由用戶應(yīng)用發(fā)起調(diào)用。

6.netlink 使用標準的 socket API,因此很容易使用,但系統(tǒng)調(diào)用和 ioctl則需要專門的培訓(xùn)才能使用。

用戶態(tài)應(yīng)用使用標準的socket APIs, socket(), bind(), sendmsg(), recvmsg() 和 close() 就能很容易地使用 netlink socket,查詢手冊頁可以了解這些函數(shù)的使用細節(jié),本文只是講解使用 netlink 的用戶應(yīng)該如何使用這些函數(shù)。注意,使用 netlink 的應(yīng)用必須包含頭文件 linux/netlink.h。當(dāng)然 socket 需要的頭文件也必不可少,sys/socket.h。

為了創(chuàng)建一個 netlink socket,用戶需要使用如下參數(shù)調(diào)用 socket():

socket(AF_NETLINK, SOCK_RAW, netlink_type)

第一個參數(shù)必須是 AF_NETLINK 或 PF_NETLINK,在 Linux 中,它們倆實際為一個東西,它表示要使用netlink,第二個參數(shù)必須是SOCK_RAW或SOCK_DGRAM, 第三個參數(shù)指定netlink協(xié)議類型,如前面講的用戶自定義協(xié)議類型NETLINK_MYTEST, NETLINK_GENERIC是一個通用的協(xié)議類型,它是專門為用戶使用的,因此,用戶可以直接使用它,而不必再添加新的協(xié)議類型。內(nèi)核預(yù)定義的協(xié)議類型有:

#define NETLINK_ROUTE 0 /* Routing/device hook */

#define NETLINK_W1 1 /* 1-wire subsystem */

#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */

#define NETLINK_FIREWALL 3 /* Firewalling hook */

#define NETLINK_INET_DIAG 4 /* INET socket monitoring */

#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */

#define NETLINK_XFRM 6 /* ipsec */

#define NETLINK_SELINUX 7 /* SELinux event notifications */

#define NETLINK_ISCSI 8 /* Open-iSCSI */

#define NETLINK_AUDIT 9 /* auditing */

#define NETLINK_FIB_LOOKUP 10

#define NETLINK_CONNECTOR 11

#define NETLINK_NETFILTER 12 /* netfilter subsystem */

#define NETLINK_IP6_FW 13

#define NETLINK_DNRTMSG 14 /* DECnet routing messages */

#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */

#define NETLINK_GENERIC 16

對于每一個netlink協(xié)議類型,可以有多達 32多播組,每一個多播組用一個位表示,netlink 的多播特性使得發(fā)送消息給同一個組僅需要一次系統(tǒng)調(diào)用,因而對于需要多撥消息的應(yīng)用而言,大大地降低了系統(tǒng)調(diào)用的次數(shù)。

函數(shù) bind() 用于把一個打開的 netlink socket 與 netlink 源 socket 地址綁定在一起。netlink socket 的地址結(jié)構(gòu)如下:

struct sockaddr_nl

{

sa_family_t nl_family;

unsigned short nl_pad;

__u32 nl_pid;

__u32 nl_groups;

};

字段 nl_family 必須設(shè)置為 AF_NETLINK 或著 PF_NETLINK,字段 nl_pad 當(dāng)前沒有使用,因此要總是設(shè)置為 0,字段 nl_pid 為接收或發(fā)送消息的進程的 ID,如果希望內(nèi)核處理消息或多播消息,就把該字段設(shè)置為 0,否則設(shè)置為處理消息的進程 ID。字段 nl_groups 用于指定多播組,bind 函數(shù)用于把調(diào)用進程加入到該字段指定的多播組,如果設(shè)置為 0,表示調(diào)用者不加入任何多播組。

傳遞給 bind 函數(shù)的地址的 nl_pid 字段應(yīng)當(dāng)設(shè)置為本進程的進程 ID,這相當(dāng)于 netlink socket 的本地地址。但是,對于一個進程的多個線程使用 netlink socket 的情況,字段 nl_pid 則可以設(shè)置為其它的值,如:

pthread_self() << 16 | getpid();

因此字段 nl_pid 實際上未必是進程 ID,它只是用于區(qū)分不同的接收者或發(fā)送者的一個標識,用戶可以根據(jù)自己需要設(shè)置該字段。函數(shù) bind 的調(diào)用方式如下:

bind(fd, (struct sockaddr*)&nladdr, sizeof(struct sockaddr_nl));

fd為前面的 socket 調(diào)用返回的文件描述符,參數(shù) nladdr 為 struct sockaddr_nl 類型的地址。為了發(fā)送一個 netlink 消息給內(nèi)核或其他用戶態(tài)應(yīng)用,需要填充目標 netlink socket 地址,此時,字段 nl_pid 和 nl_groups 分別表示接收消息者的進程 ID 與多播組。如果字段 nl_pid 設(shè)置為 0,表示消息接收者為內(nèi)核或多播組,如果 nl_groups為 0,表示該消息為單播消息,否則表示多播消息。使用函數(shù) sendmsg 發(fā)送 netlink 消息時還需要引用結(jié)構(gòu) struct msghdr、struct nlmsghdr 和 struct iovec,結(jié)構(gòu) struct msghdr 需如下設(shè)置:

struct msghdr msg;

memset(&msg, 0, sizeof(msg));

msg.msg_name = (void *)&(nladdr);

msg.msg_namelen = sizeof(nladdr);

其中 nladdr 為消息接收者的 netlink 地址。

struct nlmsghdr 為 netlink socket 自己的消息頭,這用于多路復(fù)用和多路分解 netlink 定義的所有協(xié)議類型以及其它一些控制,netlink 的內(nèi)核實現(xiàn)將利用這個消息頭來多路復(fù)用和多路分解已經(jīng)其它的一些控制,因此它也被稱為netlink 控制塊。因此,應(yīng)用在發(fā)送 netlink 消息時必須提供該消息頭。

struct nlmsghdr

{

__u32 nlmsg_len; /* Length of message */

__u16 nlmsg_type; /* Message type*/

__u16 nlmsg_flags; /* Additional flags */

__u32 nlmsg_seq; /* Sequence number */

__u32 nlmsg_pid; /* Sending process PID */

};

字段 nlmsg_len 指定消息的總長度,包括緊跟該結(jié)構(gòu)的數(shù)據(jù)部分長度以及該結(jié)構(gòu)的大小,字段 nlmsg_type 用于應(yīng)用內(nèi)部定義消息的類型,它對 netlink 內(nèi)核實現(xiàn)是透明的,因此大部分情況下設(shè)置為 0,字段 nlmsg_flags 用于設(shè)置消息標志,可用的標志包括:

/* Flags values */

#define NLM_F_REQUEST 1 /* It is request message. */

#define NLM_F_MULTI 2 /* Multipart message, terminated by NLMSG_DONE */

#define NLM_F_ACK 4 /* Reply with ack, with zero or error code */

#define NLM_F_ECHO 8 /* Echo this request */

/* Modifiers to GET request */

#define NLM_F_ROOT 0x100 /* specify tree root */

#define NLM_F_MATCH 0x200 /* return all matching */

#define NLM_F_ATOMIC 0x400 /* atomic GET */

#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH)

/* Modifiers to NEW request */

#define NLM_F_REPLACE 0x100 /* Override existing */

#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */

#define NLM_F_CREATE 0x400 /* Create, if it does not exist */

#define NLM_F_APPEND 0x800 /* Add to end of list */

標志NLM_F_REQUEST用于表示消息是一個請求,所有應(yīng)用首先發(fā)起的消息都應(yīng)設(shè)置該標志。

標志NLM_F_MULTI 用于指示該消息是一個多部分消息的一部分,后續(xù)的消息可以通過宏NLMSG_NEXT來獲得。

宏NLM_F_ACK表示該消息是前一個請求消息的響應(yīng),順序號與進程ID可以把請求與響應(yīng)關(guān)聯(lián)起來。

標志NLM_F_ECHO表示該消息是相關(guān)的一個包的回傳。

標志NLM_F_ROOT 被許多 netlink 協(xié)議的各種數(shù)據(jù)獲取操作使用,該標志指示被請求的數(shù)據(jù)表應(yīng)當(dāng)整體返回用戶應(yīng)用,而不是一個條目一個條目地返回。有該標志的請求通常導(dǎo)致響應(yīng)消息設(shè)置NLM_F_MULTI標志。注意,當(dāng)設(shè)置了該標志時,請求是協(xié)議特定的,因此,需要在字段 nlmsg_type 中指定協(xié)議類型。

標志 NLM_F_MATCH 表示該協(xié)議特定的請求只需要一個數(shù)據(jù)子集,數(shù)據(jù)子集由指定的協(xié)議特定的過濾器來匹配。

標志 NLM_F_ATOMIC 指示請求返回的數(shù)據(jù)應(yīng)當(dāng)原子地收集,這預(yù)防數(shù)據(jù)在獲取期間被修改。

標志 NLM_F_DUMP 未實現(xiàn)。

標志 NLM_F_REPLACE 用于取代在數(shù)據(jù)表中的現(xiàn)有條目。

標志 NLM_F_EXCL_ 用于和 CREATE 和 APPEND 配合使用,如果條目已經(jīng)存在,將失敗。

標志 NLM_F_CREATE 指示應(yīng)當(dāng)在指定的表中創(chuàng)建一個條目。

標志 NLM_F_APPEND 指示在表末尾添加新的條目。

內(nèi)核需要讀取和修改這些標志,對于一般的使用,用戶把它設(shè)置為 0 就可以,只是一些高級應(yīng)用(如 netfilter 和路由 daemon 需要它進行一些復(fù)雜的操作),字段 nlmsg_seq 和 nlmsg_pid 用于應(yīng)用追蹤消息,前者表示順序號,后者為消息來源進程 ID。下面是一個示例:

#define MAX_MSGSIZE 1024

char buffer[] = "An example message";

struct nlmsghdr nlhdr;

nlhdr = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_MSGSIZE));

strcpy(NLMSG_DATA(nlhdr),buffer);

nlhdr->nlmsg_len = NLMSG_LENGTH(strlen(buffer));

nlhdr->nlmsg_pid = getpid(); /* self pid */

nlhdr->nlmsg_flags = 0;

結(jié)構(gòu) struct iovec 用于把多個消息通過一次系統(tǒng)調(diào)用來發(fā)送,下面是該結(jié)構(gòu)使用示例:

struct iovec iov;

iov.iov_base = (void *)nlhdr;

iov.iov_len = nlh->nlmsg_len;

msg.msg_iov = &iov;

msg.msg_iovlen = 1;

在完成以上步驟后,消息就可以通過下面語句直接發(fā)送:

sendmsg(fd, &msg, 0);

應(yīng)用接收消息時需要首先分配一個足夠大的緩存來保存消息頭以及消息的數(shù)據(jù)部分,然后填充消息頭,添完后就可以直接調(diào)用函數(shù) recvmsg() 來接收。

#define MAX_NL_MSG_LEN 1024

struct sockaddr_nl nladdr;

struct msghdr msg;

struct iovec iov;

struct nlmsghdr * nlhdr;

nlhdr = (struct nlmsghdr *)malloc(MAX_NL_MSG_LEN);

iov.iov_base = (void *)nlhdr;

iov.iov_len = MAX_NL_MSG_LEN;

msg.msg_name = (void *)&(nladdr);

msg.msg_namelen = sizeof(nladdr);

msg.msg_iov = &iov;

msg.msg_iovlen = 1;

recvmsg(fd, &msg, 0);

注意:fd為socket調(diào)用打開的netlink socket描述符。

在消息接收后,nlhdr指向接收到的消息的消息頭,nladdr保存了接收到的消息的目標地址,宏NLMSG_DATA(nlhdr)返回指向消息的數(shù)據(jù)部分的指針。

在linux/netlink.h中定義了一些方便對消息進行處理的宏,這些宏包括:

#define NLMSG_ALIGNTO 4

#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )

宏NLMSG_ALIGN(len)用于得到不小于len且字節(jié)對齊的最小數(shù)值。

#define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(sizeof(struct nlmsghdr)))

宏NLMSG_LENGTH(len)用于計算數(shù)據(jù)部分長度為len時實際的消息長度。它一般用于分配消息緩存。

#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))

宏NLMSG_SPACE(len)返回不小于NLMSG_LENGTH(len)且字節(jié)對齊的最小數(shù)值,它也用于分配消息緩存。

#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))

宏NLMSG_DATA(nlh)用于取得消息的數(shù)據(jù)部分的首地址,設(shè)置和讀取消息數(shù)據(jù)部分時需要使用該宏。

#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \

(struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))

宏NLMSG_NEXT(nlh,len)用于得到下一個消息的首地址,同時len也減少為剩余消息的總長度,該宏一般在一個消息被分成幾個部分發(fā)送或接收時使用。

#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \

(nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \

(nlh)->nlmsg_len <= (len))

宏NLMSG_OK(nlh,len)用于判斷消息是否有l(wèi)en這么長。

#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))

宏NLMSG_PAYLOAD(nlh,len)用于返回payload的長度。

函數(shù)close用于關(guān)閉打開的netlink socket。

netlink的內(nèi)核實現(xiàn)在.c文件net/core/af_netlink.c中,內(nèi)核模塊要想使用netlink,也必須包含頭文件linux/netlink.h。內(nèi)核使用netlink需要專門的API,這完全不同于用戶態(tài)應(yīng)用對netlink的使用。如果用戶需要增加新的netlink協(xié)議類型,必須通過修改linux/netlink.h來實現(xiàn),當(dāng)然,目前的netlink實現(xiàn)已經(jīng)包含了一個通用的協(xié)議類型NETLINK_GENERIC以方便用戶使用,用戶可以直接使用它而不必增加新的協(xié)議類型。前面講到,為了增加新的netlink協(xié)議類型,用戶僅需增加如下定義到linux/netlink.h就可以:

#define NETLINK_MYTEST 17

只要增加這個定義之后,用戶就可以在內(nèi)核的任何地方引用該協(xié)議。

在內(nèi)核中,為了創(chuàng)建一個netlink socket用戶需要調(diào)用如下函數(shù):

struct sock *

netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len));

參數(shù)unit表示netlink協(xié)議類型,如NETLINK_MYTEST,參數(shù)input則為內(nèi)核模塊定義的netlink消息處理函數(shù),當(dāng)有消息到達這個netlink socket時,該input函數(shù)指針就會被引用。函數(shù)指針input的參數(shù)sk實際上就是函數(shù)netlink_kernel_create返回的struct sock指針,sock實際是socket的一個內(nèi)核表示數(shù)據(jù)結(jié)構(gòu),用戶態(tài)應(yīng)用創(chuàng)建的socket在內(nèi)核中也會有一個struct sock結(jié)構(gòu)來表示。下面是一個input函數(shù)的示例:

void input (struct sock *sk, int len)

{

struct sk_buff *skb;

struct nlmsghdr *nlh = NULL;

u8 *data = NULL;

while ((skb = skb_dequeue(&sk->receive_queue))

!= NULL) {

/* process netlink message pointed by skb->data */

nlh = (struct nlmsghdr *)skb->data;

data = NLMSG_DATA(nlh);

/* process netlink message with header pointed by

* nlh and data pointed by data

*/

}

}

函數(shù)input()會在發(fā)送進程執(zhí)行sendmsg()時被調(diào)用,這樣處理消息比較及時,但是,如果消息特別長時,這樣處理將增加系統(tǒng)調(diào)用sendmsg()的執(zhí)行時間,對于這種情況,可以定義一個內(nèi)核線程專門負責(zé)消息接收,而函數(shù)input的工作只是喚醒該內(nèi)核線程,這樣sendmsg將很快返回。

函數(shù)skb = skb_dequeue(&sk->receive_queue)用于取得socket sk的接收隊列上的消息,返回為一個struct sk_buff的結(jié)構(gòu),skb->data指向?qū)嶋H的netlink消息。

函數(shù)skb_recv_datagram(nl_sk)也用于在netlink socket nl_sk上接收消息,與skb_dequeue的不同指出是,如果socket的接收隊列上沒有消息,它將導(dǎo)致調(diào)用進程睡眠在等待隊列nl_sk->sk_sleep,因此它必須在進程上下文使用,剛才講的內(nèi)核線程就可以采用這種方式來接收消息。

下面的函數(shù)input就是這種使用的示例:

void input (struct sock *sk, int len)

{

wake_up_interruptible(sk->sk_sleep);

}

當(dāng)內(nèi)核中發(fā)送netlink消息時,也需要設(shè)置目標地址與源地址,而且內(nèi)核中消息是通過struct sk_buff來管理的, linux/netlink.h中定義了一個宏:

#define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb))

來方便消息的地址設(shè)置。下面是一個消息地址設(shè)置的例子:

NETLINK_CB(skb).pid = 0;

NETLINK_CB(skb).dst_pid = 0;

NETLINK_CB(skb).dst_group = 1;

字段pid表示消息發(fā)送者進程ID,也即源地址,對于內(nèi)核,它為 0, dst_pid 表示消息接收者進程 ID,也即目標地址,如果目標為組或內(nèi)核,它設(shè)置為 0,否則 dst_group 表示目標組地址,如果它目標為某一進程或內(nèi)核,dst_group 應(yīng)當(dāng)設(shè)置為 0。

在內(nèi)核中,模塊調(diào)用函數(shù) netlink_unicast 來發(fā)送單播消息:

int netlink_unicast(struct sock *sk, struct sk_buff *skb, u32 pid, int nonblock);

參數(shù)sk為函數(shù)netlink_kernel_create()返回的socket,參數(shù)skb存放消息,它的data字段指向要發(fā)送的netlink消息結(jié)構(gòu),而skb的控制塊保存了消息的地址信息,前面的宏NETLINK_CB(skb)就用于方便設(shè)置該控制塊, 參數(shù)pid為接收消息進程的pid,參數(shù)nonblock表示該函數(shù)是否為非阻塞,如果為1,該函數(shù)將在沒有接收緩存可利用時立即返回,而如果為0,該函數(shù)在沒有接收緩存可利用時睡眠。

內(nèi)核模塊或子系統(tǒng)也可以使用函數(shù)netlink_broadcast來發(fā)送廣播消息:

void netlink_broadcast(struct sock *sk, struct sk_buff *skb, u32 pid, u32 group, int allocation);

前面的三個參數(shù)與netlink_unicast相同,參數(shù)group為接收消息的多播組,該參數(shù)的每一個代表一個多播組,因此如果發(fā)送給多個多播組,就把該參數(shù)設(shè)置為多個多播組組ID的位或。參數(shù)allocation為內(nèi)核內(nèi)存分配類型,一般地為GFP_ATOMIC或GFP_KERNEL,GFP_ATOMIC用于原子的上下文(即不可以睡眠),而GFP_KERNEL用于非原子上下文。

在內(nèi)核中使用函數(shù)sock_release來釋放函數(shù)netlink_kernel_create()創(chuàng)建的netlink socket:

void sock_release(struct socket * sock);

注意函數(shù)netlink_kernel_create()返回的類型為struct sock,因此函數(shù)sock_release應(yīng)該這種調(diào)用:

sock_release(sk->sk_socket);

sk為函數(shù)netlink_kernel_create()的返回值。

在源代碼包中給出了一個使用 netlink 的示例,它包括一個內(nèi)核模塊 netlink-exam-kern.c 和兩個應(yīng)用程序 netlink-exam-user-recv.c, netlink-exam-user-send.c。內(nèi)核模塊必須先插入到內(nèi)核,然后在一個終端上運行用戶態(tài)接收程序,在另一個終端上運行用戶態(tài)發(fā)送程序,發(fā)送程序讀取參數(shù)指定的文本文件并把它作為 netlink 消息的內(nèi)容發(fā)送給內(nèi)核模塊,內(nèi)核模塊接受該消息保存到內(nèi)核緩存中,它也通過proc接口出口到 procfs,因此用戶也能夠通過 /proc/netlink_exam_buffer 看到全部的內(nèi)容,同時內(nèi)核也把該消息發(fā)送給用戶態(tài)接收程序,用戶態(tài)接收程序?qū)呀邮盏降膬?nèi)容輸出到屏幕上。

本文是系列文章的第一篇,它詳細介紹了五種用戶空間與內(nèi)核空間的數(shù)據(jù)交換方式,并通過實際例子程序向讀者講解了如何在內(nèi)核開發(fā)中使用這些技術(shù),其中內(nèi)核啟動參數(shù)方式是單向的,即只能向內(nèi)核傳遞,而不能從內(nèi)核獲取,其余的均可以進行雙向數(shù)據(jù)交換,即既可以從用戶應(yīng)用傳遞給內(nèi)核,有可以從內(nèi)核傳遞給應(yīng)用態(tài)應(yīng)用。netlink 是一種雙向的數(shù)據(jù)交換方式,它使用起來非常簡單高效,特別是它的廣播特性在一些應(yīng)用中非常方便。作者認為,它是所有這些用戶態(tài)與內(nèi)核態(tài)數(shù)據(jù)交換方式中最有效的最強大的方式。

該系列文章的第二篇將詳細地講解另外三種用戶態(tài)與內(nèi)核態(tài)的數(shù)據(jù)交換方式,包括 procfs、seq_file、debugfs 和 relayfs,有興趣的讀者請參看該系列文章第二篇。

Linux 2.6.13的內(nèi)核源碼,。

內(nèi)核文檔,Documentation/filesystems/sysfs.txt。

Linux Device Drivers, Third Edition, 。

內(nèi)核文檔,Documentation/sysctl/*。

Linux Kernel Module Programming Guide, 。

[6] Linux 2.6.14的內(nèi)核源碼,。

Linux Device Drivers, Third Edition, Kernel Korner - Why and How to Use Netlink Socket, 。

netlink手冊, netlink(7)。

Extending netlink, 。

楊燚,計算機科學(xué)碩士,畢業(yè)于中科院計算技術(shù)研究所,有4年的Linux內(nèi)核編程經(jīng)驗,目前從事嵌入式實時Linux的開發(fā)與性能測試。您可以通過 與作者聯(lián)系。

總結(jié)

以上是生活随笔為你收集整理的linux 内核空间 sy,在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysf...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

黄污网站在线观看 | 激情黄色一级片 | 成人av免费在线播放 | 天天爽天天射 | 欧美日韩国产在线观看 | 中文字幕在线不卡国产视频 | 久久婷婷色综合 | 国产在线播放观看 | 日韩中文字幕免费看 | 婷婷六月综合网 | 99久久精品日本一区二区免费 | 色婷婷婷 | 国产美女精品视频 | 91精品啪啪 | 97看片网 | 免费在线观看视频一区 | 岛国av在线免费 | 久久99久久99精品免视看婷婷 | 国产色啪| 婷婷色在线播放 | 日本黄色一级电影 | 国产精品av在线免费观看 | 国产精品影音先锋 | 日韩免费观看一区二区三区 | 免费高清在线观看电视网站 | 五月天综合在线 | 午夜美女wwww | av丁香花| 久草爱| 成人久久视频 | 人人射av| 色综合天天色综合 | 中文资源在线官网 | 在线99| 97视频免费在线 | av免费网页 | 亚洲男女精品 | 亚洲更新最快 | 又黄又爽又刺激的视频 | 天天操天天舔天天干 | 99精品免费久久久久久久久日本 | 亚欧洲精品视频在线观看 | 欧美一级黄色视屏 | 天天操综合网 | 看片黄网站 | 伊人网av| 91精品一区二区三区蜜桃 | 人人插人人搞 | 中文字幕资源网 | 最近中文字幕完整视频高清1 | 黄色片软件网站 | 日韩成人中文字幕 | 永久免费毛片在线观看 | 91精品国产三级a在线观看 | 天天操天天操天天操天天操天天操天天操 | 狠狠色狠狠色综合日日小说 | 最近中文字幕完整高清 | 久久免费电影网 | 国产视频欧美视频 | 黄色免费av | 香蕉视频网址 | 亚洲精品裸体 | 日韩欧美综合 | 久久免费99精品久久久久久 | 国产精品午夜在线 | 青青久草在线 | 国产成人在线精品 | av成人在线观看 | 天天干夜夜爽 | 97精品国产 | 亚洲91视频| 黄色网址国产 | 久久精品视频免费观看 | 日本激情视频中文字幕 | www.99热精品 | 国产精品久久久久久久久久新婚 | 在线观看中文字幕网站 | 国产精品高潮在线观看 | 天天操夜夜操天天射 | 日本在线观看视频一区 | 国产精品一区免费观看 | 在线看v片成人 | 久草免费电影 | 国产精品久久久久久久毛片 | 免费看毛片网站 | 午夜精品久久久久久久久久 | 999久久a精品合区久久久 | 国产一区自拍视频 | 天天干天天摸 | 久久人人爽人人 | 五月激情av | 国产精品久久久久久久久久久杏吧 | 色www永久免费 | 天天艹天天干天天 | 国产精品人成电影在线观看 | 超碰在线免费97 | 国产精品免费高清 | 日日爽天天 | 精品国产一区二区三区蜜臀 | 久草视频中文在线 | 国产精品视频不卡 | 中文字幕一区二区三区乱码不卡 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 青青草国产在线 | 91在线看视频 | 狠狠干天天 | 国产又粗又长又硬免费视频 | 国产精品黄色在线观看 | 久久理论视频 | 欧美最爽乱淫视频播放 | 五月婷婷视频 | 91欧美日韩国产 | 久久久久亚洲精品 | 免费观看xxxx9999片 | 97国产大学生情侣酒店的特点 | 综合色在线 | 波多野结衣综合网 | 国产黄色精品在线 | 国产 在线 日韩 | 性色va| 日韩精品网址 | www.久久色 | 亚洲成av人电影 | 99视频在线免费观看 | 超黄视频网站 | 精品视频专区 | 久久黄色片子 | 日韩黄色一区 | 午夜12点 | 亚洲精品午夜久久久久久久 | 日韩视频一区二区在线观看 | 亚洲欧美成人在线 | 亚洲涩涩网站 | 91九色视频 | 草久久影院 | 亚洲亚洲精品在线观看 | 国产亚洲精品av | 免费在线观看黄网站 | 成人国产精品久久久春色 | 国产91精品在线播放 | 又黄又爽又无遮挡免费的网站 | 成人黄色在线 | 国产精品一区二区免费看 | 天天摸天天操天天爽 | 久久精品国产v日韩v亚洲 | 亚洲少妇自拍 | 中文字幕二区在线观看 | 国产一区二区综合 | 午夜国产福利在线 | 韩国av免费观看 | 欧美日韩免费观看一区=区三区 | 最新国产视频 | 日韩成人精品一区二区三区 | 国产精品久久久久久久久免费看 | 国产日韩高清在线 | 美女久久网站 | 国产91免费在线 | 欧美五月婷婷 | 最近免费观看的电影完整版 | 97免费在线观看 | 天天爽天天爽天天爽 | 日韩欧美在线观看一区二区 | 亚洲伊人第一页 | 久久婷综合 | 国产成人久久精品77777综合 | 国产一二区精品 | 夜色在线资源 | 国产黄在线播放 | 久久国产一二区 | 国产亚洲午夜高清国产拍精品 | 国产精品一区二区av影院萌芽 | 人人干在线观看 | 五月色丁香 | 久久久久久久影院 | 国产精品淫 | 又粗又长又大又爽又黄少妇毛片 | 99re热精品视频 | 久久久久久久久久福利 | 亚洲国产电影在线观看 | 麻豆视频国产精品 | 天天综合色 | 国产99re| 99r在线观看 | 国产精品久久久久久久免费观看 | 综合网成人 | 久99久精品| 成人网在线免费视频 | 丁香五月亚洲综合在线 | 看毛片网站 | 日韩二三区 | 天天爽天天射 | 在线你懂 | 久草视频在线播放 | 国产高清视频在线观看 | 久久九九视频 | 一区二区精品久久 | 免费在线观看视频一区 | 天天天插 | 91九色蝌蚪视频在线 | 免费观看午夜视频 | 日日操夜| 免费看日韩 | 婷婷丁香国产 | 欧美日韩一区二区三区不卡 | 97超碰在线久草超碰在线观看 | 久久激情小说 | 一本—道久久a久久精品蜜桃 | 日本韩国在线不卡 | 亚洲欧美视频在线播放 | 国产免费观看av | 亚洲九九精品 | 97视频在线观看成人 | 草久在线观看视频 | 久久美女高清视频 | 日韩av电影网站在线观看 | 亚洲性xxxx| 久久网站最新地址 | 亚洲成人免费在线观看 | 91精品久久久久久综合乱菊 | 最近能播放的中文字幕 | 婷婷av网站 | www夜夜操com| 69视频国产 | 亚洲成 人精品 | 午夜精品久久久久久久99热影院 | 国产综合福利在线 | 久久亚洲私人国产精品va | 国产护士hd高朝护士1 | 欧美在线a视频 | 亚洲成av人电影 | 日韩免费三区 | 国产一级黄色电影 | 久久一区二区三区超碰国产精品 | 久久久久婷| 91自拍视频在线观看 | 国产成人亚洲在线电影 | 免费观看性生交大片3 | 成人教育av | 成人啪啪18免费游戏链接 | 国产正在播放 | 黄在线免费观看 | 日韩黄色大片在线观看 | 91视频国产高清 | 国产精品综合久久 | 欧美日韩二三区 | 最近中文字幕国语免费高清6 | 九月婷婷人人澡人人添人人爽 | 中文字幕精品一区二区三区电影 | 香蕉国产91| 天天碰天天操 | 亚洲专区在线视频 | 九九热在线视频免费观看 | 日韩精品视频网站 | 91精品国产91热久久久做人人 | 一级免费片 | 成人影音av | 国产在线观看午夜 | 丁香午夜婷婷 | 日本黄色一级电影 | 亚洲精品在线观看免费 | 日本大片免费观看在线 | 91成版人在线观看入口 | 成年人三级网站 | 日本深夜福利视频 | 日韩视频在线观看免费 | 色婷婷导航| 国产精品11 | 五月天网页 | 中文av在线天堂 | 免费日韩视 | 国产精品999久久久 久产久精国产品 | 国产成人精品女人久久久 | 国产一区二区三区免费在线 | 99久久99热这里只有精品 | 国产夫妻性生活自拍 | 成人黄色在线视频 | 免费观看mv大片高清 | 四虎影视成人精品国库在线观看 | 成人在线免费看视频 | 99九九视频 | 色永久免费视频 | 欧美精品国产综合久久 | 国产精品久久久精品 | 日日躁你夜夜躁你av蜜 | 狠狠狠色丁香综合久久天下网 | 日韩精品无码一区二区三区 | 91喷水 | 免费三级黄色 | 99精品小视频 | 毛片888| 国产亚洲一区二区在线观看 | 国产乱视频| 黄色av网站在线观看免费 | 黄色毛片在线看 | 色综合久久88色综合天天人守婷 | 日本久久久久久久久 | 国产在线精品一区二区 | 欧美午夜视频在线 | 日韩资源视频 | 在线免费中文字幕 | 又湿又紧又大又爽a视频国产 | 久久成人国产精品入口 | 久久久久中文字幕 | 久久高清国产视频 | 免费看的毛片 | 97视频久久久 | 人人操日日干 | 99色在线 | 亚洲成a人片在线观看网站口工 | 国产精品精品国产婷婷这里av | 一区二区伦理电影 | 欧美在线视频a | 亚洲妇女av | 国产一区二区三区四区大秀 | 国产黄a三级三级三级三级三级 | 一区二区三区韩国免费中文网站 | 精一区二区 | 日韩精品第1页 | 午夜精品久久久久久久99婷婷 | 91亚洲在线 | 国产黄色视 | 午夜的福利| 黄色网中文字幕 | 久久久国产精品视频 | aa一级片 | 久草在线观看 | 天天天天爽 | 国产一区二区久久精品 | 狠狠干天天射 | 久久人人爽人人爽人人片av软件 | 国产中文伊人 | 99热精品在线观看 | 天天做天天射 | 国产三级午夜理伦三级 | 98超碰在线| 国产一卡二卡四卡国 | 91精品国产福利在线观看 | 精品一区精品二区高清 | 国产日韩精品在线观看 | 久久久久久久久精 | 在线高清av | 一级片黄色片网站 | av中文天堂在线 | 中文字幕在线视频免费播放 | 成人97视频一区二区 | 免费视频黄色 | 久久视频一区 | 亚洲精区二区三区四区麻豆 | 亚洲精品美女久久久久 | 一级片免费视频 | 亚洲成人免费观看 | 日批视频在线观看免费 | 毛片网站观看 | 99精品欧美一区二区 | 91日韩精品 | 玖玖色在线观看 | 456成人精品影院 | 精品国产乱码久久久久久浪潮 | 久久精品网站免费观看 | 成人免费xxxxxx视频 | 国产精品一区二区三区在线免费观看 | 欧美一二在线 | 青青草国产成人99久久 | 久久国产美女视频 | 欧美日韩1区| 婷婷激情欧美 | 国产精品白虎 | 亚洲最大免费成人网 | 国产色视频123区 | 久久亚洲婷婷 | 久久综合久久伊人 | 国产精品视频99 | 天天射,天天干 | 99热9| 国产婷婷视频在线 | 麻豆传媒一区二区 | 亚洲欧美日本国产 | 91热这里只有精品 | 久久精品国产精品亚洲 | 国产欧美精品一区二区三区 | 久久亚洲美女 | 国产精品丝袜在线 | 亚洲欧美在线综合 | 国产啊v在线观看 | 伊人天堂av| 四虎8848免费高清在线观看 | 欧美日韩一区二区在线 | 久久精品视频在线免费观看 | 91在线免费播放视频 | 欧美日韩久久 | 日本激情动作片免费看 | 欧美少妇影院 | av噜噜噜在线播放 | 在线观看精品一区 | 在线导航av| 国产精品嫩草影视久久久 | 国产一级黄色电影 | 中文字幕一区二区三区久久蜜桃 | 亚洲国产一区二区精品专区 | aa级黄色大片 | 欧美在线观看小视频 | 久久精品香蕉视频 | 久久综合狠狠综合久久激情 | 黄色成年片 | 国产亚洲人成网站在线观看 | 久久天天躁夜夜躁狠狠85麻豆 | 黄毛片在线观看 | 2019中文字幕第一页 | 久久成人在线视频 | 在线不卡视频 | 黄色avwww| 最新日韩中文字幕 | 亚洲国产中文字幕在线观看 | 一区二区欧美日韩 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 久久午夜精品视频 | 在线观看mv的中文字幕网站 | 中文字幕 第二区 | 国产精品免费在线 | 亚洲精品视频在线看 | 日韩成人免费在线电影 | 网站在线观看日韩 | 国产精品亚洲精品 | 日韩欧美黄色网址 | 日韩色区 | 黄网在线免费观看 | 五月天综合在线 | 久草精品视频 | 国产剧情一区二区在线观看 | 狠狠色香婷婷久久亚洲精品 | 97久久久免费福利网址 | 一区二区精品 | 午夜精品视频在线 | 国产日韩中文在线 | 国产99中文字幕 | 亚洲精品字幕在线观看 | 热久久精品在线 | www.亚洲黄色 | 久久免费精品一区二区三区 | 国产精品成人一区二区 | 玖玖在线视频观看 | a国产精品 | 午夜久久久久久久久久久 | 探花在线观看 | 一区二区精品视频 | 在线视频免费观看 | 三级黄色片在线观看 | 国产精品精品视频 | 亚洲精品自在在线观看 | 成人av免费在线看 | 欧美日韩在线网站 | 狠狠操综合 | 亚洲成人国产精品 | 一区二区精品在线 | 欧美天天综合 | 国产亚洲人成网站在线观看 | 亚洲国产中文字幕在线观看 | 五月婷婷久久丁香 | 园产精品久久久久久久7电影 | 91亚洲在线观看 | 中文字幕在线观看第二页 | 91在线91拍拍在线91 | 高清av中文字幕 | 日本中文字幕在线一区 | 精品国产乱码一区二区三区在线 | 超碰97免费| 免费看污在线观看 | 日韩伦理片hd | 国产高潮久久 | 免费在线黄色av | 五月天网页 | 久久a视频 | 久久av免费 | 亚洲激情在线观看 | 免费男女羞羞的视频网站中文字幕 | 亚洲成a人片在线www | 日韩视频免费看 | 黄色三级在线 | 亚洲 综合 激情 | 久久a v电影| 激情丁香综合 | 欧美激情xxxx | 久草在线免费看视频 | 亚洲永久av | 国产精品综合久久久 | www.久久久.com| 国产视频亚洲精品 | 午夜10000| 国产精品丝袜久久久久久久不卡 | 成人免费观看完整版电影 | 欧美成人一区二区 | 黄色软件在线看 | 蜜桃av久久久亚洲精品 | 精品主播网红福利资源观看 | 西西444www大胆高清视频 | 在线观看黄色的网站 | 在线国产片 | 日韩在线视| 午夜国产在线观看 | www好男人| a成人在线| 久久美女电影 | 日本精品久久久久久 | 在线成人中文字幕 | 香蕉精品在线观看 | 日日夜夜艹 | 精品久久一区二区三区 | 国产亚洲精品久久久久久久久久久久 | 一区二区三区在线视频111 | a视频在线观看免费 | 天天色草 | 日日干天天插 | 亚洲综合欧美日韩狠狠色 | 午夜视频黄 | 久久精品99国产精品亚洲最刺激 | 九九精品视频在线观看 | 国产成人黄色在线 | 999国内精品永久免费视频 | 天天做天天爱天天综合网 | 国产精品久久久久永久免费看 | 超碰人人做| 国产午夜精品在线 | 久久综合久久综合久久综合 | 91自拍成人 | 丁香色综合 | www.狠狠色.com | 2017狠狠干 | 欧美资源在线观看 | 在线观看国产区 | 91在线观 | 成人av一区二区三区 | 亚洲精品tv久久久久久久久久 | 久久99久久久久久 | 在线观看av免费观看 | 免费看成人片 | 日韩精品免费在线 | 亚洲天堂网在线视频观看 | 欧美日韩在线精品一区二区 | 亚洲一级二级 | 国产精品一区二区av日韩在线 | 天天综合狠狠精品 | www.久久色 | 久久伊人综合 | 国产成人高清 | 91探花在线| 正在播放国产91 | 久久久久成人精品免费播放动漫 | 又色又爽又激情的59视频 | 国产露脸91国语对白 | 国精产品一二三线999 | 国产综合激情 | 中文字幕视频 | 97精品国产97久久久久久春色 | 五月婷婷丁香网 | 中文字幕亚洲国产 | 在线视频中文字幕一区 | 超碰国产97 | av成人在线看 | 日本大片免费观看在线 | 欧美一级裸体视频 | 国产成人性色生活片 | 国产日韩欧美视频 | 国产精品18久久久久久久久 | 天天干天天碰 | 久久久综合| 亚洲成a人片在线观看网站口工 | 久草精品电影 | 久久久久久久久久久久久久电影 | 亚洲精品久久久久中文字幕m男 | 天天天色| 超碰国产在线播放 | 高清一区二区三区 | 97国产大学生情侣白嫩酒店 | 五月婷亚洲| 亚洲成人av一区 | 波多野结衣在线观看一区 | 五月天激情综合 | 成人精品视频久久久久 | 9幺看片 | 国产精品永久在线观看 | 国产日产亚洲精华av | 亚洲成熟女人毛片在线 | 国产精品免费观看网站 | 四虎永久免费在线观看 | 天天玩天天操天天射 | 日韩精品一区二区免费 | 欧美性生活大片 | 成年人视频免费在线播放 | 天天干天天干天天 | 99视频在线观看视频 | 久久成人国产精品入口 | av不卡免费看 | 日韩成人免费在线 | 天天综合色 | 久久国产高清 | 天天躁天天操 | 国产亚洲精品精品精品 | 一区二区三区中文字幕在线 | 国产日韩欧美在线观看 | 婷婷精品视频 | 丁香影院在线 | 成人久久毛片 | 一区二区三区日韩在线观看 | 成年人在线免费视频观看 | 日本一区二区高清不卡 | 日韩av看片 | 亚洲黄色免费在线看 | 亚洲精品66 | 九九九热精品免费视频观看 | 亚洲高清不卡av | 国产精品av在线免费观看 | 日韩在线电影观看 | 91麻豆精品国产91久久久使用方法 | 91九色网址 | 免费高清国产 | 美女久久久久久 | 精品国产免费一区二区三区五区 | 久久任你操 | 99视频精品免费视频 | 成人av在线直播 | 中文字幕有码在线观看 | 天天综合导航 | 欧洲亚洲精品 | 黄色av电影一级片 | 久草视频在线播放 | 国产欧美中文字幕 | 激情视频区 | 午夜精品久久久久久99热明星 | 国产精品视频99 | 久久在线免费观看 | 日日夜夜人人天天 | 国产精品mv在线观看 | 国产九九精品 | 亚洲艳情 | 91成人精品国产刺激国语对白 | 97视频人人免费看 | 成人免费视频网站 | 婷婷久久丁香 | 精品国产伦一区二区三区免费 | 亚洲欧美日本一区二区三区 | 深夜免费网站 | 99精品国产亚洲 | 911香蕉| 国产视频一区精品 | 在线视频观看亚洲 | 亚洲女在线 | 国产亚洲成人精品 | 欧美极品少妇xxxx | 91九色综合 | 国产麻豆剧果冻传媒视频播放量 | 中文字幕在线观看av | 麻豆传媒电影在线观看 | 欧美在线1区 | 成人av片免费观看app下载 | 成人一级片免费看 | 久久伦理电影 | 成人av中文字幕在线观看 | 中文字幕在线观看网址 | 一区二区三区电影大全 | 中文字幕韩在线第一页 | 91免费在线看片 | 综合色亚洲 | 人人超在线公开视频 | 在线黄色国产 | 国产成人精品午夜在线播放 | 国产亚洲精品福利 | 99九九热只有国产精品 | 久久在线影院 | 久久久综合九色合综国产精品 | 在线你懂 | 免费看的国产视频网站 | 国产一区二区高清不卡 | 久久国产精品99久久久久久老狼 | 99精品黄色片免费大全 | 天天干天天射天天爽 | 欧美激情综合五月色丁香小说 | 日本福利视频在线 | 伊人电影天堂 | 国产视频每日更新 | 2019久久精品 | 香蕉久久久久久av成人 | 亚州精品在线视频 | 手机av资源 | 又黄又爽免费视频 | 中文字幕高清视频 | 麻豆成人在线观看 | 国产精品久久久久久久久久妇女 | 五月开心婷婷 | 亚洲综合成人在线 | 在线亚洲小视频 | 欧美一级大片在线观看 | 狠狠操狠狠操 | 91热| 午夜美女影院 | 欧美 亚洲 另类 激情 另类 | 欧美国产91 | 草久视频在线观看 | 亚洲精品视频免费看 | 一区二区精品视频 | 国产成人一区二区精品非洲 | 99久久精品国产一区 | 在线视频91 | 国产成年免费视频 | 精品久久久久久久久亚洲 | 91黄色视屏 | 色综合天天综合 | 久久国产精品久久精品国产演员表 | 日韩av免费观看网站 | 日韩a欧美| 国产拍揄自揄精品视频麻豆 | 亚洲成人资源在线 | 国产在线传媒 | 黄网站免费看 | 在线日韩精品视频 | 午夜精品福利一区二区三区蜜桃 | 欧美日韩不卡在线观看 | 欧美久久久久久久久久久 | 免费久久网 | 中文字幕日韩高清 | 天天操天天射天天舔 | 日韩av中文在线 | 婷婷五综合 | 人人爽人人爽人人片av免 | 亚洲乱码精品久久久 | 国产特级毛片aaaaaa | 亚洲精品综合一二三区在线观看 | 一色av| 首页国产精品 | 永久免费的啪啪网站免费观看浪潮 | 免费在线电影网址大全 | 欧美精品视 | 中文字幕在线播放第一页 | 天天在线免费视频 | 天天操天天操天天操天天 | 国产99精品| 久久久麻豆 | 91av国产视频 | 国产精品久久久久久久99 | 亚洲无吗视频在线 | 久久毛片网站 | 日韩免费一级a毛片在线播放一级 | 亚洲国产av精品毛片鲁大师 | 免费中午字幕无吗 | 亚洲第一成网站 | 日韩欧美视频一区 | 国产精品第 | 久久久久免费 | 超碰电影在线观看 | 免费在线色视频 | 99精品视频网站 | 欧美色图另类 | 国产麻豆精品免费视频 | 国产黄色精品 | 久久高清免费 | 久久久久久久久黄色 | 操操操人人人 | 高清av在线 | 成人在线视频论坛 | 国产一级性生活视频 | 国产传媒一区在线 | av 一区 二区 久久 | 日韩欧美网址 | 久久艹精品| 国产精品国产三级国产aⅴ入口 | а中文在线天堂 | 丁香花在线观看免费完整版视频 | 国产一级精品在线观看 | www.在线观看视频 | av在线中文 | 欧美一二三区播放 | 中文国产在线观看 | 国产不卡在线观看 | japanesexxxxfreehd乱熟 | 久久精品99久久 | 亚洲精品视频在线播放 | 久久久亚洲麻豆日韩精品一区三区 | 激情在线免费视频 | 91手机电视 | 国产成人av在线影院 | 欧美二区三区91 | 天天五月天色 | 人人爽人人干 | 激情中文字幕 | 人交video另类hd | 草久在线视频 | 国产成人精品国内自产拍免费看 | 黄污网| 黄色三级久久 | 久久avav | a天堂在线看 | 国产一区精品在线观看 | 99精品热视频只有精品10 | 天天艹天天爽 | 中文av网 | 欧美一级片在线免费观看 | 欧美一级电影在线观看 | 日韩av电影中文字幕在线观看 | 成人资源网 | 91精品啪| 亚洲精品国 | 国产麻豆精品久久 | 五月婷婷久| 97精品国产aⅴ | 91一区二区三区久久久久国产乱 | 成人小视频在线 | 日韩在线电影一区二区 | 国产精品1区2区3区在线观看 | av在线不卡观看 | 涩涩成人在线 | 国产婷婷在线观看 | 91视频啪 | 国产 在线 日韩 | 国产亚洲精品成人av久久ww | 国产精国产精品 | 久久艹国产视频 | 黄色小说视频在线 | 丁香综合五月 | 国内综合精品午夜久久资源 | 在线高清一区 | 美女视频久久久 | 国产亚洲精品av | 国产一级a毛片视频爆浆 | 天天操 夜夜操 | 91激情| 色诱亚洲精品久久久久久 | 国产综合精品久久 | 久久国产亚洲精品 | 91视频免费播放 | 国产日韩视频在线 | 美国三级黄色大片 | 五月天综合激情网 | 久久99国产视频 | 国产伦理久久精品久久久久_ | 亚洲精品视频第一页 | 精品国产乱码久久久久 | 麻豆91精品91久久久 | 久操伊人| 日韩欧美视频免费看 | 午夜在线观看一区 | 国产成人一区二区三区在线观看 | 精品国产1区2区3区 国产欧美精品在线观看 | 国产精品不卡视频 | 久久人操 | 精品欧美一区二区精品久久 | 精品久久久久一区二区国产 | 久久久久成人精品 | 99久久精品久久久久久清纯 | 国产精品久久久久久一二三四五 | 国产丝袜高跟 | 91成人亚洲 | 天天爱天天操天天干 | 天天鲁天天干天天射 | 99视频在线观看一区三区 | 中文字幕在线看视频国产 | 97av影院 | 九九免费精品 | 日韩一区二区三 | 98久9在线 | 免费 | 亚洲日本va午夜在线电影 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲精品国产综合99久久夜夜嗨 | 欧美日韩久久一区 | 国产黄色片在线免费观看 | 久久久高清免费视频 | 日韩视频三区 | 久久久久免费观看 | 青青网视频 | 四虎影视成人永久免费观看亚洲欧美 | 91香蕉视频黄 | 天天摸天天弄 | 尤物九九久久国产精品的分类 | 欧美日韩高清不卡 | 免费在线精品视频 | 五月激情视频 | 又色又爽又黄高潮的免费视频 | 午夜黄网 | 极品国产91在线网站 | 激情五月综合 | 伊人六月 | 婷婷综合久久 | 欧美性性网 | 天天操网 | 永久中文字幕 | 欧美日韩免费一区二区 | 久久天天躁 | 国产不卡一区二区视频 | 欧美一二三视频 | 91九色丨porny丨丰满6 | 狠狠色伊人亚洲综合网站色 | 夜夜操网站 | 欧美午夜精品久久久久久浪潮 | 看全黄大色黄大片 | 欧美伦理电影一区二区 | av免费在线观 | 国产精品四虎 | 久久精品一区二区三 | 日韩黄色av网站 | 久久久久综合网 | 三级黄色免费片 | 亚洲精品免费在线播放 | 精品国产aⅴ麻豆 | 国产精品理论片在线播放 | 99精品区| 91资源在线 | 天天操天天操天天 | 亚洲永久精品在线观看 | 久久爽久久爽久久av东京爽 | 国产五月色婷婷六月丁香视频 | 成人福利在线 | 婷婷在线综合 | 精品在线不卡 | 久久免费黄色 | 日韩成人精品在线观看 | 国产精品 日韩 欧美 | 中文字幕精品一区久久久久 | 久久久精品欧美 | 亚洲mv大片欧洲mv大片免费 | 天天爱天天插 | 五月综合色 | 国产精品美女久久久久久久网站 | 最新中文字幕在线播放 | a级片久久久 | 毛片激情永久免费 | 黄色官网在线观看 | 欧洲精品视频一区二区 | 精品亚洲男同gayvideo网站 | 国产亚洲精品久久久久久久久久久久 | 国产精品手机播放 | 日韩av一区二区三区四区 | 91视频久久 | 色国产在线 | 免费网站在线观看人 | 免费91麻豆精品国产自产在线观看 | 国产精品一区二区免费看 | 97网站| 久久免费视频在线 | 国产精品久久久久久一区二区 | 国产一区影院 | 91日韩精品 | 日韩专区在线播放 | 国产精品区一区 | 国产精品免费看久久久8精臀av | 精品久久久久亚洲 | 婷婷色吧| 天天干天天操天天 | 人人草人| 亚洲精品美女久久 | 精品在线不卡 | 国产精品综合在线 | www.激情五月.com | 免费在线观看成人小视频 | 欧美日韩国产精品一区二区 | 黄色毛片视频免费 | 久久久wwww| 国产一区在线不卡 | 免费的成人av | 久久成电影 | 国产精品久久久久久久午夜片 | 中文字幕电影一区 | 久久精品精品 | 在线电影 你懂得 | 日韩视频在线播放 | 欧美黄网站 | 成人a毛片 | 中文字幕电影在线 | 六月婷婷久香在线视频 | 日韩亚洲在线观看 | 欧美a级在线 | 中文字幕乱在线伦视频中文字幕乱码在线 | 日韩激情在线视频 | 国产黄色免费 | 亚洲性xxxx| 国产一线二线三线在线观看 | 黄av免费在线观看 | 91亚洲精品乱码久久久久久蜜桃 | 日韩色爱 | av中文字幕不卡 | 亚洲精选在线观看 | 精品久久免费 | 久久不卡视频 | 91麻豆精品91久久久久同性 | 亚洲国产精品va在线看 | 色偷偷中文字幕 | 国产精品日韩在线观看 | 人操人 | 国产精品va在线播放 | 久久精品成人热国产成 | 国产精品一区一区三区 | 最近高清中文字幕 | 婷婷伊人五月 | 日韩视频中文字幕在线观看 | 免费视频在线观看网站 | 深爱五月激情五月 | 91福利区一区二区三区 | 香蕉视频色 | 久久夜夜爽| 国产一区二区久久久久 | 97电影手机 |