精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

內核通信之 Netlink 源碼分析和實例分析

系統 Linux
這幾天在看 ipvs 相關代碼的時候又遇到了 netlink 的事情,所以這兩天花了點時間重新把 netlink 的事情梳理了一下。

 

[[335268]]

本文轉載自微信公眾號「黑光技術」,作者helight 。轉載本文請聯系黑光技術公眾號。

前言

這幾天在看 ipvs 相關代碼的時候又遇到了 netlink 的事情,所以這兩天花了點時間重新把 netlink 的事情梳理了一下。

什么是 netlink

linux 內核一直存在的一個嚴重問題就是內核態和用戶態的交互的問題,對于這個問題內核大佬們一直在研究各種方法,想讓內核和用戶態交互能夠安全高效的進行。如系統調用,proc,sysfs等內存文件系統,但是這些方式一般都比較簡單,只能在用戶空間輪詢訪問內核的變化,內核的變化無法主動的推送出來。

而 netlink 的出現比較好的解決了這個問題,而且 netlink 還有以下一些優勢:

  1. 可以直接使用 socket 套接字的 API 進行內核和用戶態的通信,開發使用上相對簡單了很多。
  2. 利用內核協議棧有了緩沖隊列,是一種異步通信機制。
  3. 可以是內核和用戶態的雙向通信,內核可以主動向用戶態進程發送消息。這個是以往通信方式不具備的。
  4. 針對同一個協議類型的所有用戶進程,內核可以廣播消息給所有的進程,也可以指定進程 pid 進行消息發送。

目前 netlink 的這種機制被廣泛使用在各種場景中,在 Linux 內核中使用 netlink 進行應用與內核通信的應用很多; 包括:路由 daemon(NETLINK_ROUTE),用戶態 socket 協議(NETLINK_USERSOCK),防火墻(NETLINK_FIREWALL),netfilter 子系統(NETLINK_NETFILTER),內核事件向用戶態通知(NETLINK_KOBJECT_UEVENT)等。具體支持的類型可以查看這個文件 include/uapi/linux/netlink.h。

netlink 內核代碼走讀

netlink 內核相關文件介紹

netlink 的內核代碼在內核代碼的 net/netlink/ 目錄下,我目前看的是 5.7.10 的內核版本,netlink 內核相關的文件不多,還是比較清晰的:

  1. helightxu@  ~/open_code/linux-5.7.10  ls net/netlink 
  2. config      Makefile     af_netlink.c af_netlink.h diag.c       genetlink.c 
  3. helightxu@  ~/open_code/linux-5.7.10  
文件 描述
af_netlink.c 和 af_netlink.h: 是 netlink 的核心文件,這個也是下面詳細走讀的內容。
diag.c 對 netlink sock 進行監控,可以插入到內核或者從內核中卸載
genetlink.c 這個可以看作是 netlink 的升級版本,或者說是一種高層封裝。

注:

  1. genetlink.c 額外說明:netlink 默認支持了 30 多種的場景,但是對于其它場景并沒有具體定義,這個時候這種通用封裝就有了很大的好處,可以在不改動內核的前提下進行應用場景擴展,這部分內容可以看這個 wiki:https://wiki.linuxfoundation.org/networking/generic_netlink_howto 

還有一個頭文件是在 include 目錄,如下所示,這個頭文件是一些輔助函數、宏定義和相關數據結構,大家學習的同學一定要看這個文件,它里面的注釋非常詳細。這些注釋對理解 netlink 的消息結構非常有用,建議可以詳細看看。

  1. helightxu@  ~/open_code/linux-5.7.10  ls include/net/netlink.h 

af_netlink.c 代碼走讀

在 af_netlink.c 這個文件的最下面有一行代碼:

  1. core_initcall(netlink_proto_init); 

這段代碼的意思是什么呢?通過看這個代碼最終的實現可以看出,就是告訴編譯器把 netlink_proto_init 這個函數放入到最終編譯出來二進制文件的 .init 段中,內核在啟動的時候會從這個端里面的函數挨個的執行。這里也就是說 netlink 是內核默認就直接支持的,是原生內核的一部分(這里其實想和內核的動態插拔模塊區別)。

在 netlink_proto_init 函數中最關鍵的一行代碼就是下面最后一行,把 netlink 的協議族注冊到網絡協議棧中去。

  1. static const struct net_proto_family netlink_family_ops = { 
  2.     .family = PF_NETLINK, 
  3.     .create = netlink_create, 
  4.     .owner  = THIS_MODULE,  /* for consistency 8) */ 
  5. }; 
  6. ... 
  7. sock_register(&netlink_family_ops); 

PF_NETLINK 是表示 netlink 的協議族,在后面我們在客戶端創建 netlink socket 的時候就要用到這個東東。如下面的代碼,代碼來自我的測試代碼 https://github.com/helight/kernel_modules/tree/master/netlink_test 中的客戶端代碼,可以看出:PF_NETLINK 表示我們所用的就是 netlink 的協議,SOCK_RAW 表示我們使用的是原始協議包,NETLINK_USER 這個我們自己定義的一個協議字段。netlink 我們前面說了有 30 多種應用場景,這些都已經在內核代碼中固定了,所以在客戶端使用的時候會指定這個字段來表示和內核中的那個應用場景的函數模塊進行交互。

  1. //int socket(int domain, int type, int protocol); 
  2.     sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_USER); 

sock_register 這個函數的作用主要就是注冊 PF_NETLINK 這個協議類型到內核中,讓內核認識這個協議,在內核網絡協議中建立 socket 的時候知道該使用那個協議為它提供操作支持。

注冊了之后內核就支持了 netlink 協議了,接下來就是內核中創建監聽 socket,用戶態創建鏈接 socket 了。

netlink 用戶態和內核交互過程

這里我簡單畫一個圖來表示一下,socket 通信主要有 2 個操作對象:server 端和 client 端。netlink 的操作原理是這樣的:

對象 所處位置 -
server 端 內核中 -
client 端 用戶態進程 -

netlink 關鍵數據結構和函數

sockaddr_nl 協議套接字

netlink 的地址表示由 sockaddr_nl 負責

  1. struct sockaddr_nl { 
  2.     __kernel_sa_family_t    nl_family;    /* AF_NETLINK    */ 
  3.     unsigned short          nl_pad;        /* zero        */ 
  4.     __u32                   nl_pid;        /* port ID 這個一般是進程id */ 
  5.     __u32                   nl_groups;    /* multicast groups mask */ 
  6. }; 

nl_family 制定了協議族,netlink 有自己獨立的值:AF_NETLINK,nl_pid 一般取為進程 pid。nl_groups 用以多播,當不需要多播時,該字段為 0。

nlmsghdr 消息體

netlink 消息是作為套接字緩沖區 sk_buff 的數據部分傳遞的,其消息本身又分為頭部和數據。頭部為:

  1. struct nlmsghdr { 
  2.     __u32        nlmsg_len;    /* Length of message including header */ 
  3.     __u16        nlmsg_type;    /* Message content */ 
  4.     __u16        nlmsg_flags;    /* Additional flags */ 
  5.     __u32        nlmsg_seq;    /* Sequence number */ 
  6.     __u32        nlmsg_pid;    /* Sending process port ID */ 
  7. }; 

nlmsg_len 為消息的長度,包含該頭部在內。nlmsg_pid 為發送進程的端口 ID,這個用戶可以自定義,一般也是使用進程 pid。

msghdr 用戶態系發送消息體

使用 sendmsg 和 recvmsg 函數進行發送和接收消息,使用的消息體是這個樣子的。

  1. struct iovec {                    /* Scatter/gather array items */ 
  2.     void  *iov_base;              /* Starting address */ 
  3.     size_t iov_len;               /* Number of bytes to transfer */ 
  4. }; 
  5. /* 
  6. iov_base: iov_base 指向數據包緩沖區,即參數 buff,iov_len 是 buff 的長度。 
  7. msghdr 中允許一次傳遞多個 buff,以數組的形式組織在 msg_iov 中,msg_iovlen 就記錄數組的長度 (即有多少個buff) 
  8. */ 
  9. struct msghdr { 
  10.     void    *    msg_name;    /* Socket name            */ 
  11.     int          msg_namelen;    /* Length of name        */ 
  12.     struct iovec *    msg_iov;    /* Data blocks            */ 
  13.     __kernel_size_t   msg_iovlen;    /* Number of blocks        */ 
  14.     void     *         msg_control;    /* Per protocol magic (eg BSD file descriptor passing) */ 
  15.     __kernel_size_t    msg_controllen;    /* Length of cmsg list */ 
  16.     unsigned int      msg_flags; 
  17. }; 
  18. /* 
  19.    msg_name:數據的目的地址,網絡包指向 sockaddr_in, netlink 則指向 sockaddr_nl; 
  20.    msg_namelen: msg_name 所代表的地址長度 
  21.    msg_iov: 指向的是緩沖區數組 
  22.    msg_iovlen: 緩沖區數組長度 
  23.    msg_control: 輔助數據,控制信息(發送任何的控制信息) 
  24.    msg_controllen: 輔助信息長度 
  25.    msg_flags: 消息標識 
  26. */ 

邏輯結構如下:

socket 也是一種特殊的文件,通過 VFS 的接口同樣可以對其進行使用管理。socket 本身就需要實現文件系統的相應接口,有自己的操作方法集。

netlink 常用宏

  1. #define NLMSG_ALIGNTO   4U/* 宏 NLMSG_ALIGN(len) 用于得到不小于len且字節對齊的最小數值 */ 
  2. #define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) 
  3. /* Netlink 頭部長度 */ 
  4. #define NLMSG_HDRLEN     ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) 
  5. /* 計算消息數據 len 的真實消息長度(消息體 + 消息頭)*/ 
  6. #define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN) 
  7. /* 宏 NLMSG_SPACE(len) 返回不小于 NLMSG_LENGTH(len) 且字節對齊的最小數值 */ 
  8. #define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) 
  9. /* 宏 NLMSG_DATA(nlh) 用于取得消息的數據部分的首地址,設置和讀取消息數據部分時需要使用該宏 */ 
  10. #define NLMSG_DATA(nlh)  ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) 
  11. /* 宏 NLMSG_NEXT(nlh,len) 用于得到下一個消息的首地址, 同時 len 變為剩余消息的長度 */ 
  12. #define NLMSG_NEXT(nlh,len)  ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \                  (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) 
  13. /* 判斷消息是否 >len */ 
  14. #define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \               (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \               (nlh)->nlmsg_len <= (len)) 
  15. /* NLMSG_PAYLOAD(nlh,len) 用于返回 payload 的長度*/ 
  16. #define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) 

netlink 內核常用函數

netlink_kernel_create

這個內核函數用于創建內核 socket,以提供和用戶態通信

  1. static inline struct sock * 
  2. netlink_kernel_create(struct net *net, int unit, struct netlink_kernel_cfg *cfg) 
  3. /* 
  4.     net: 指向所在的網絡命名空間, 默認傳入的是 &init_net (不需要定義);  定義在 net_namespace.c(extern struct net init_net); 
  5.     unit: netlink 協議類型 
  6.     cfg:  cfg 存放的是 netlink 內核配置參數(如下) 
  7. */ 
  8.  
  9. /* optional Netlink kernel configuration parameters */ 
  10. struct netlink_kernel_cfg { 
  11.     unsigned int    groups; 
  12.     unsigned int    flags; 
  13.     void        (*input)(struct sk_buff *skb); /* input 回調函數 */ 
  14.     struct mutex    *cb_mutex; 
  15.     void        (*bind)(int group); 
  16.     bool        (*compare)(struct net *net, struct sock *sk); 
  17. }; 

單播函數 netlink_unicast() 和多播函數 netlink_broadcast()

  1. /* 來發送單播消息 */ 
  2. extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 portid, int nonblock); 
  3. /* ssk: netlink socket 
  4.    skb: skb buff 指針 
  5.    portid:通信的端口號 
  6.    nonblock:表示該函數是否為非阻塞,如果為1,該函數將在沒有接收緩存可利用時立即返回,而如果為 0,該函數在沒有接收緩存可利用 定時睡眠 
  7. */ 
  8.  
  9. /* 用來發送多播消息 */ 
  10. extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 portid, 
  11.                  __u32 group, gfp_t allocation); 
  12. /* ssk: 同上(對應 netlink_kernel_create 返回值)、 
  13.    skb: 內核 skb buff 
  14.    portid:端口id 
  15.    group: 是所有目標多播組對應掩碼的"OR"操作的。 
  16.    allocation: 指定內核內存分配方式,通常 GFP_ATOMIC 用于中斷上下文,而 GFP_KERNEL 用于其他場合。 
  17.                 這個參數的存在是因為該 API 可能需要分配一個或多個緩沖區來對多播消息進行 clone。 
  18. */ 

測試例子代碼

netlink 內核建立 socket 過程

內核的代碼非常簡單,這里給出了核心代碼,就這么多,接收函數中直接打印了接收到的消息。

  1. #include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <net/sock.h>#include <asm/types.h>#include <linux/netlink.h>#include <linux/skbuff.h> 
  2. #define NETLINK_XUX           31       /* testing */   
  3. static struct sock *xux_sock = NULL
  4.  
  5. // 接收消息的回調函數,接收參數是 sk_buff 
  6. static void recv_netlink(struct sk_buff *skb) 
  7.     struct nlmsghdr *nlh; 
  8.     nlh = nlmsg_hdr(skb); // 取得消息體 
  9.     printk("receive data from user process: %s", (char *)NLMSG_DATA(nlh)); // 打印接收的數據內容 
  10.  
  11.     ... 
  12.  
  13. int __init init_link(void) 
  14.     struct netlink_kernel_cfg cfg = { 
  15.         .input = recv_netlink, 
  16.     }; 
  17.     xux_sock = netlink_kernel_create(&init_net, NETLINK_XUX, &cfg); // 創建內核 socket 
  18.     if (!xux_sock){ 
  19.         printk("cannot initialize netlink socket"); 
  20.         return -1; 
  21.     } 
  22.      
  23.     printk("Init OK!\n"); 
  24.     return 0; 

netlink 用戶態建立鏈接和收發信息

  1. ... // 上面的就省了 
  2. #define NETLINK_USER 31  //self defined 
  3. #define MAX_PAYLOAD 1024 /* maximum payload size*/ 
  4. struct sockaddr_nl src_addr, dest_addr; 
  5. struct nlmsghdr *nlh = NULL
  6. struct msghdr msg; 
  7. struct iovec iov; 
  8. int sock_fd; 
  9.  
  10. int main(int args, char *argv[]) 
  11.     sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_USER); // 建立 socket 
  12.  
  13.     if(sock_fd < 0) 
  14.         return -1; 
  15.  
  16.     memset(&src_addr, 0, sizeof(src_addr)); 
  17.     src_addr.nl_family = AF_NETLINK; 
  18.     src_addr.nl_pid = getpid(); /* 當前進程的 pid */ 
  19.  
  20.     if(bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr))){ // 和指定協議進行 socket 綁定 
  21.         perror("bind() error\n"); 
  22.         close(skfd); 
  23.         return -1; 
  24.     } 
  25.  
  26.     memset(&dest_addr, 0, sizeof(dest_addr)); 
  27.     dest_addr.nl_family = AF_NETLINK; 
  28.     dest_addr.nl_pid = 0;       /* For Linux Kernel */ 
  29.     dest_addr.nl_groups = 0;    /* unicast */ 
  30.  
  31.     nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD)); 
  32.     memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD)); 
  33.     nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD); 
  34.     nlh->nlmsg_pid = getpid();  //self pid 
  35.     nlh->nlmsg_flags = 0; 
  36.     // 拷貝信息到發送緩沖中 
  37.     strcpy(NLMSG_DATA(nlh), "Hello this is a msg from userspace"); 
  38.     // 構造發送消息體 
  39.     iov.iov_base = (void *)nlh;         //iov -> nlh 
  40.     iov.iov_len = nlh->nlmsg_len; 
  41.     msg.msg_name = (void *)&dest_addr; 
  42.     msg.msg_namelen = sizeof(dest_addr); 
  43.     msg.msg_iov = &iov;  // iov 中存放 netlink 消息頭和消息數據 
  44.     msg.msg_iovlen = 1; 
  45.  
  46.     printf("Sending message to kernel\n"); 
  47.  
  48.     int ret = sendmsg(sock_fd, &msg, 0);  // 發送消息到內核 
  49.     printf("send ret: %d\n", ret); 
  50.  
  51.     printf("Waiting for message from kernel\n"); 
  52.  
  53.     /* 從內核接收消息 */ 
  54.     recvmsg(sock_fd, &msg, 0); 
  55.     printf("Received message payload: %s\n", NLMSG_DATA(nlh));  // 打印接收到的消息 
  56.  
  57.     close(sock_fd); 
  58.     return 0; 

以上代碼在我的個人倉庫中都有,如果有興趣可以 clone 下來自己測試玩耍一遍。代碼倉庫:https://github.com/helight/kernel_modules/tree/master/netlink_test 。

總結

netlink 目前感覺還是一個比較好用的內核和用戶空間的交互方式,但是也是有他的使用場景,適合用戶空間和內核空間主動交互的場景。

但是在單機場景下,大多數的主動權在用戶進程,用戶進程寫數據到內核,用戶進程主動讀取內核數據。這兩種場景覆蓋了內核的絕大多數場景。

在內核要主動的場景下,netlink 就比較適合。我能想到的就是內核數據審計,安全觸發等,這類場景下內核可以實時的告知用戶進程內核發生的情況。

我是在看 ipvs 的代碼時候看到了里面有 netlink 的使用,發現早期 iptables 就是使用 netlink 來下發配置指令的,內核中 netfilter 和 iptables 中還有這部分的代碼,今天也順便下載大致走讀了一遍,大家可以搜索 NETLINK 這個關鍵字來看。但是 iptables 后來的代碼中沒有使用這樣的方式,而是采用了一個叫做 iptc 的庫,其核心思路還是使用 setsockops 的方式,最終還是 copy_from_user。不過這種方式對于 iptables 這種配置下發的場景來說還是非常實用的。

最后大家如果對這方面有興趣的可以找我一起再研究研究,我也想繼續在深入看看,但是目前沒有太好的場景。

明天開始走讀 kubernetes 的代碼,大家有興趣的也可以一起來交流。

參考

https://www.cnblogs.com/x_wukong/p/5920437.html

 

 

責任編輯:武曉燕 來源: 黑光技術
相關推薦

2010-06-11 14:31:08

通信協議

2011-05-26 10:05:48

MongoDB

2015-08-10 15:12:27

Java實例源碼分析

2021-12-15 15:03:51

Linux內核調度

2022-03-11 20:23:14

鴻蒙源碼分析進程管理

2022-01-06 07:06:52

KubernetesResourceAPI

2011-05-26 16:18:51

Mongodb

2022-01-12 10:50:23

鴻蒙HarmonyOS應用

2022-01-10 15:31:44

鴻蒙HarmonyOS應用

2017-03-17 15:05:05

Linux內核源碼do_fork

2025-10-31 01:22:00

2021-07-06 09:29:38

Cobar源碼AST

2024-06-13 07:55:19

2021-03-23 09:17:58

SpringMVCHttpServletJavaEE

2023-02-26 08:42:10

源碼demouseEffect

2012-09-20 10:07:29

Nginx源碼分析Web服務器

2010-09-03 10:33:38

ppp內核

2010-03-22 09:52:30

Server Sock

2023-04-28 08:42:08

Linux內核SPI驅動

2020-10-30 08:35:23

Java Virtua
點贊
收藏

51CTO技術棧公眾號

欧美日韩高清一区二区不卡| 69精品久久久| 国产免费av电影| 国产精品视屏| 日本成人在线电影网| 天天操天天干天天综合网| 国产精品久久婷婷六月丁香| 2一3sex性hd| 日本xxxx人| 91久久电影| 亚洲男同性视频| 日本aⅴ大伊香蕉精品视频| 四虎永久在线精品无码视频| 国产成人精品无码高潮| 波多野结衣在线播放一区| 亚洲线精品一区二区三区| 国产免费一区视频观看免费 | 阿v天堂2017| www.av视频在线观看| 色狼人综合干| 亚洲自拍偷拍欧美| 2020国产精品久久精品不卡| 9.1片黄在线观看| 欧美日韩免费看片| 91麻豆视频网站| 欧美性受xxxx黑人xyx性爽| 制服丝袜日韩国产| 日本在线观看一区| 久久久免费高清视频| 国内露脸中年夫妇交换精品| 欧美午夜在线一二页| 国产精品久久久久9999爆乳| www.黄色av| 亚洲国产一区二区三区在线播放| 亚洲免费观看高清完整版在线观看| 国产成人一区二区在线| 成人影视免费观看| 偷拍自拍在线看| 97se亚洲国产综合自在线不卡 | 欧美一区二区三区免费观看| 美女被艹视频网站| 18视频在线观看| 欧美一区影院| 精品人伦一区二区色婷婷| 97久久国产亚洲精品超碰热| 性色av蜜臀av| 亚洲高清影视| 欲色天天网综合久久| 中文字幕av不卡在线| 免费av不卡| 国产成人精品一区二| 久久理论片午夜琪琪电影网| 美国黄色a级片| 国产香蕉久久| 亚洲黄色av一区| 蜜桃999成人看片在线观看| 久久国产精品系列| 欧美日韩有码| 91精品国产黑色紧身裤美女| 日本一区二区在线| 97超碰人人模人人人爽人人爱| 同性恋视频一区| 亚洲白拍色综合图区| 无码无遮挡又大又爽又黄的视频| 97电影在线| 国产精品1区2区3区| 成人免费淫片视频软件| 日韩毛片无码永久免费看| 91高清视频在线观看| 久久九九99视频| 91系列在线观看| 黄色片免费观看视频| 日韩欧美高清在线播放| 欧美精品一区二区三区高清aⅴ | 国产精品手机在线| 亚洲天堂视频网站| 天堂va蜜桃一区二区三区漫画版| 亚洲精品国产suv| 在线视频日韩一区 | 日韩制服诱惑| 亚洲激情一二三区| 91亚洲精品国产| 国产乱子伦三级在线播放| 国产高清不卡二三区| 成人午夜一级二级三级| 亚洲精品国产av| 经典一区二区三区| 欧美性受xxxx白人性爽| caoporn国产| 久久99国产成人小视频| 日韩欧美123| 国产一区二区三区小说| 成人bbav| 一区二区三区免费网站| 亚洲一区二区三区精品在线观看| 欧美日韩 一区二区三区| 精品国产视频| 久久精品人人做人人爽| 干b视频在线观看| 日韩大片在线免费观看| 最近中文字幕mv在线一区二区三区四区 | 国产噜噜噜噜久久久久久久久| 亚洲不卡视频在线观看| 久久99国产精品久久99| 88国产精品欧美一区二区三区| 久久精品老司机| 欧美激情成人| 色系列之999| 国产精彩视频在线观看| 日韩成人免费电影| 久久亚洲精品一区| 国产+高潮+白浆+无码| 国产影视一区| 欧美不卡一区二区三区四区| 自拍偷拍中文字幕| 亚洲国产欧美日韩在线观看第一区| 欧美日韩国产色站一区二区三区| 看欧美ab黄色大片视频免费| 视频成人永久免费视频| 欧美色图在线视频| 日韩国产精品一区二区| 欧美大片黄色| 亚洲色图.com| 亚洲欧洲一二三| 韩国免费在线视频| 91丨porny丨蝌蚪视频| 在线视频精品一区| 国产偷拍一区二区| 26uuu精品一区二区在线观看| 国产伦精品一区二区三区视频免费| 国产xxxx在线观看| 久久综合色综合88| 亚洲自拍偷拍视频| 国产黄色片网站| 国产尤物一区二区在线| 国产精品国语对白| 天堂网中文字幕| 国产福利一区在线| 亚洲韩国在线| 国产www视频在线观看| 伊人一区二区三区| 国产传媒久久久| 农村妇女一区二区| 日韩av在线免费播放| 国产精品久久久久久亚洲色| 国产精品福利在线观看播放| 日韩免费在线播放| 国产精品久久久久久久久毛片| 欧美激情亚洲| 久久视频在线看| 日批视频免费在线观看| 日韩精品乱码免费| 国产一区福利视频| 男人的天堂在线免费视频| 国产乱码精品一区二区三区五月婷 | 亚洲国产精品二区| 国产精品午夜久久| 伊人久久青草| 色猫猫成人app| 亚洲图片在线综合| 国产精品20p| 国产情侣久久| 国产一区视频在线播放| av免费在线不卡| 中文欧美字幕免费| 日韩无套无码精品| 日本黄色一区| 中文国产成人精品久久一| 可以看的av网址| 热色播在线视频| 亚洲成av人**亚洲成av**| 国产精品免费成人| 精品国产91| 久久99久久99精品免观看粉嫩| 亚洲不卡的av| 影音先锋亚洲电影| 在线a欧美视频| 黄色在线视频网址| 不卡一区二区中文字幕| 日韩资源av在线| 国产一区久久精品| 欧美美女视频在线观看| 国产乱女淫av麻豆国产| 欧美freesex8一10精品| 亚洲男人的天堂网站| 欧美福利在线视频| 日本欧美一区二区三区乱码| 中文字幕第一页亚洲| 免费国产在线观看| 91久久线看在观草草青青| www.com毛片| 韩国三级成人在线| 日韩av综合中文字幕| 亚洲日本视频在线观看| 成人黄色网址在线观看| 三上悠亚久久精品| 亚洲aaa级| 国产精品国产三级国产aⅴ9色| 无码精品视频一区二区三区 | 国内av在线播放| 国产精品中文字幕日韩精品 | 日韩精彩视频在线观看| 亚洲精品中文字幕乱码三区不卡| 亚洲精品一区| 中文字幕视频在线免费欧美日韩综合在线看 | 亚洲伦理久久| 亚洲精品国产电影| 日韩久久久久久久久久| 中文字幕一区二区视频| 久久精品一二三四| 夜久久久久久| 91免费看网站| 26uuu亚洲电影| 亚洲成人av中文字幕| 日韩欧美123区| 青青草精品视频| 爱爱爱视频网站| 网红女主播少妇精品视频| 国产精品美乳在线观看| 国产在线观看网站| 日韩一区二区三区av| 青青操在线播放| 欧美激情五月| 国产精品一区二区三区不卡 | 日韩脚交footjobhd| 国产午夜精品全部视频在线播放 | 亚洲激情欧美激情| 精品国产成人亚洲午夜福利| 久久精品一区二区国产| 91嫩草在线| 日本在线精品| 日本免费一区二区三区视频观看| 青青青草网站免费视频在线观看| 国产精品视频免费| 簧片在线免费看| 亚洲电影成人| 久久久一二三四| 亚洲婷婷伊人| 成人av男人的天堂| 黄色成人在线网| 久久精品成人一区二区三区| 青青操在线视频| 精品99999| 国产成人三级一区二区在线观看一 | 欧美视频免费在线| 日本熟伦人妇xxxx| 麻豆精品一区二区三区| 亚洲综合成人婷婷小说| 亚洲精品国产嫩草在线观看| 在线看国产精品| 深夜福利在线观看直播| 欧美性开放视频| 免费观看一级视频| 一区二区三区欧美视频| 一色道久久88加勒比一| www.欧美.com| 日韩综合第一页| 日本视频一区二区三区| 99热成人精品热久久66| 女人av一区| 狠狠色伊人亚洲综合网站色| 欧美大胆性生话| 国产91精品高潮白浆喷水| av黄色在线观看| 在线观看国产成人av片| 中文字幕1区2区3区| 亚洲精品久久久蜜桃| 91传媒免费观看| 成人黄色小视频在线观看| 性色av浪潮av| 国产美女久久久久| 一区二区三区免费播放| 久久99国产精品麻豆| 制服丝袜中文字幕第一页| 精品亚洲欧美一区| 九九热视频免费| 国产一区二区在线看| 99久久久无码国产精品性波多 | 在线亚洲a色| 欧美在线一二三区| 国产精品一区2区3区| 欧美日韩一区二区三| 亚洲澳门在线| 日本精品国语自产拍在线观看| 欧美二区观看| 国产精品一区二| 国产一区二区三区四区大秀| 国产一区二区三区黄| 国产精品高清一区二区| 成人亚洲欧美一区二区三区| av日韩在线播放| 青青草成人在线| 暖暖在线中文免费日本| 久久久噜噜噜久噜久久| 久久一卡二卡| 国产精品入口日韩视频大尺度| 国产无遮挡裸体视频在线观看| 久久久精品美女| 春色校园综合激情亚洲| 97国产精品人人爽人人做| 男人亚洲天堂| 国产精品麻豆免费版| 久久99国产精品视频| 久久一区免费| 日韩精品水蜜桃| 欧美亚洲一二三区| 国产精品久久久久蜜臀| 亚洲乱码日产精品bd在线观看| 希岛爱理av一区二区三区| 日韩欧美一区二区三区四区五区| 美女呻吟一区| 97神马电影| 欧美久久香蕉| 国产在线无码精品| 亚洲免费综合| 国产原创popny丨九色| 久久精品一区二区国产| 色戒在线免费观看| 久久精品视频免费观看| 亚洲一级二级片| 一本大道久久a久久综合| 国产精品1000部啪视频| 97精品超碰一区二区三区| 丰满少妇高潮一区二区| 亚洲精选视频免费看| 9i看片成人免费看片| 日韩一级二级三级精品视频| 国产小视频免费在线网址| 亚洲免费av片| 阿v视频在线观看| 亚洲xxxxx电影| 国产探花在线精品一区二区| 国产成人永久免费视频| 日韩精品电影一区亚洲| 香蕉网在线视频| 欧美激情综合在线| 肉色超薄丝袜脚交69xx图片| 成人欧美一区二区三区在线播放| 在线免费观看亚洲视频| www日韩大片| 久久综合综合久久| 欧美日韩午夜在线| 久青草国产在线| 2020国产精品视频| 欧美.com| 亚洲 欧美 综合 另类 中字| 激情五月婷婷综合| 91精产国品一二三| 亚洲欧洲精品一区二区三区| 91久久久久国产一区二区| 在线日韩精品视频| av高清不卡| 免费毛片一区二区三区久久久| 久久中文字幕二区| 黄色一级免费大片| 久久久国产精品午夜一区ai换脸| 老司机福利在线观看| 91激情在线视频| 天堂在线中文资源| 51色欧美片视频在线观看| 欧美日韩导航| 自慰无码一区二区三区| 91亚洲男人天堂| 久久艹精品视频| 亚洲国产精品嫩草影院| 国产精品久久久久久99| 欧美成人高清电影在线| 天堂av网在线| 4438全国成人免费| 国产在线播放精品| 亚洲春色综合另类校园电影| 日韩制服丝袜av| 亚洲黄色小说在线观看| 亚洲第一激情av| 亚洲 欧美 激情 另类| 2018中文字幕一区二区三区| 亚洲亚洲免费| 久久无码高潮喷水| 9l国产精品久久久久麻豆| 中国一级免费毛片| 一区二区三区日韩在线| 欧美一区=区三区| 一本色道久久88亚洲精品综合| 久久在线精品| 偷偷色噜狠狠狠狠的777米奇| 久久蜜臀中文字幕| 国产精品毛片一区二区在线看舒淇| 亚洲摸下面视频| 精品视频一区二区三区四区五区| 成人xxxxx色| 久热综合在线亚洲精品| 天堂网中文在线观看| 日韩一区二区不卡| 春色校园综合激情亚洲| 一区二区欧美日韩| 成人午夜视频网站| 在线观看日本中文字幕| 欧美精品v国产精品v日韩精品 | 五月天综合在线| 一区二区亚洲精品国产|