精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

午夜影院在线看| 亚洲三级视频网站| 亚洲国产精品久久久久久久 | 黄色精品免费| 欧美大片一区二区| 久久男人资源站| 亚洲天堂视频网| 欧美一区91| 日韩精品视频在线免费观看| 爱情岛论坛成人| 亚洲综合影视| 久久这里都是精品| 国产女人18毛片水18精品| 亚洲 欧美 变态 另类 综合| 丁香久久综合| 亚洲一区二区高清| 蜜桃导航-精品导航| 一级成人免费视频| 亚洲一级电影| 亚洲欧美激情另类校园| 国产精品久久久久久久av福利| 丝袜在线观看| 久久久久综合网| 国产精品网红福利| av资源在线免费观看| 99re8这里有精品热视频免费 | 国产一级一片免费播放| 狠狠色丁香婷婷综合影院| 91精品视频网| 中文字幕无码精品亚洲35| 国产成人高清精品| 国产亚洲精品bt天堂精选| 国产精品精品软件视频| 亚洲一区二区影视| 日韩经典中文字幕一区| 91高清视频在线免费观看| 欧美视频www| 日韩一区电影| 一区二区三区四区精品| 国产国语性生话播放| 成人资源在线| 欧美成人一区二区三区在线观看| 天堂一区在线观看| yw.尤物在线精品视频| 欧美日韩在线免费观看| r级无码视频在线观看| 在线中文字幕视频观看| 综合网在线视频| 中文字幕一区二区三区精彩视频| 成人动漫在线播放| 国产日韩欧美激情| 欧美日韩国产三区| 日本天堂影院在线视频| 99国产精品久久久久久久久久| 99re国产在线播放| 国产成人三级在线播放| 国产呦精品一区二区三区网站| 国产视频999| 91久久精品无码一区二区| 日韩不卡免费视频| 国产精品免费看久久久香蕉| 波多野结衣毛片| 蜜臀av一区二区在线免费观看 | 色噜噜久久综合伊人一本| 亚洲色图 激情小说| 日韩成人综合| 精品激情国产视频| 在线免费观看亚洲视频| 欧美视频亚洲视频| 午夜精品一区二区三区在线播放 | 91视频九色网站| 国产精品区在线观看| 黄页网站大全一区二区| 99在线观看视频| 台湾av在线二三区观看| 国产日本欧美一区二区| 亚洲自拍三区| 色呦呦在线视频| 精品福利在线视频| 熟妇人妻无乱码中文字幕真矢织江| gogo亚洲高清大胆美女人体| 欧美日韩不卡视频| 国产老头和老头xxxx×| 中文一区二区三区四区| 亚洲精品成a人在线观看| 免费一级做a爰片久久毛片潮| 欧美日韩在线观看视频小说| 欧美精品午夜视频| 可以在线观看av的网站| 免费成人在线影院| 国产精品日韩一区二区三区| 国产视频二区在线观看| 亚洲特黄一级片| 免费看一级大黄情大片| 国产成人亚洲一区二区三区| 日韩一级视频免费观看在线| 亚洲男人在线天堂| 外国成人激情视频| 97欧美精品一区二区三区| 小泽玛利亚一区二区三区视频| 国产精品一区二区三区网站| 欧美精品一区在线发布| 国产福利视频在线观看| 色视频成人在线观看免| 色欲欲www成人网站| 久久成人高清| 欧美精品aaa| 一级黄色片在线| 91一区二区三区在线观看| 咪咪色在线视频| 欧美18av| 亚洲国产中文字幕在线观看| 国产福利在线导航| 久久一二三区| 国产在线资源一区| 99自拍视频在线观看| 欧洲生活片亚洲生活在线观看| 亚洲精品一区二区18漫画 | 国产婷婷97碰碰久久人人蜜臀| av最新在线观看| 久久久夜精品| 激情一区二区三区| 国产高清一区二区三区视频| 欧美亚洲高清一区| 中文字幕在线免费看线人 | aaa毛片在线观看| 综合激情久久| 久久在线观看视频| 亚洲熟妇av乱码在线观看| 久久免费精品国产久精品久久久久| 欧美日韩福利在线| 色悠久久久久综合先锋影音下载| 中文在线不卡视频| 最近免费中文字幕大全免费版视频| 国产98色在线|日韩| 精品国产无码在线| 91麻豆精品国产综合久久久 | 可以免费看av的网址| 久久久久国内| 精品国产一二| 国产拍在线视频| 337p日本欧洲亚洲大胆精品| 欧美人妻一区二区| 国产精品中文字幕欧美| 7777在线视频| 国产在线一区不卡| 欧美成人精品h版在线观看| 一级片免费观看视频| 国产精品美女www爽爽爽| 一区二区三区免费播放| 青青草国产免费一区二区下载 | 国产欧美视频一区二区| 黄色av免费在线播放| 九九热爱视频精品视频| 国产精品第8页| www.黄在线观看| 欧美三级在线播放| 国产男女猛烈无遮挡在线喷水| 卡一卡二国产精品 | 日韩一区二区三区精品视频| 欧美一级片在线视频| 韩国成人在线视频| 欧美这里只有精品| 欧美亚视频在线中文字幕免费| 97超级碰碰碰| 免费在线观看污视频| 欧美综合天天夜夜久久| 99国产精品无码| 国产在线国偷精品免费看| 欧美日韩dvd| 国产成人tv| 日本亚洲欧美成人| av在线播放网站| 欧美精品日日鲁夜夜添| 欧美国产日韩在线观看成人| 成人午夜激情片| www.中文字幕在线| 日本在线电影一区二区三区| 亚洲最大的成人网| 福利网站在线观看| 亚洲精品视频播放| 一区二区视频免费| 亚洲最新视频在线播放| 欧美 日本 国产| 久久福利视频一区二区| 黄色特一级视频| 亚洲尤物av| 亚洲在线视频福利| 亚洲插插视频| 日韩一区二区三区xxxx| 欧美自拍第一页| 欧美这里有精品| 久久久www成人免费毛片| 91小视频免费观看| 婷婷中文字幕在线观看| 99在线|亚洲一区二区| 先锋影音一区二区三区| jazzjazz国产精品久久| 国产成人综合亚洲| 国产经典三级在线| 在线观看91久久久久久| 亚洲精品一区二区口爆| 欧美这里有精品| 久久国产精品系列| 自拍偷拍欧美精品| 亚洲精品乱码久久久久久久久久久久 | 两根大肉大捧一进一出好爽视频| 青青草综合网| 欧美人与性禽动交精品| 中文字幕av一区二区三区四区| 国产成人在线视频| av日韩中文| 欧美成人午夜免费视在线看片| 韩国中文免费在线视频| 精品久久国产字幕高潮| 91久久精品无码一区二区| 欧美午夜激情在线| 日本天堂网在线观看| ●精品国产综合乱码久久久久| 国产女主播喷水高潮网红在线| 成人一区二区三区中文字幕| 亚洲欧美日本一区二区| 日韩经典一区二区| 久久久免费视频网站| 影音先锋一区| 996这里只有精品| 欧美成人自拍| 色就是色欧美| 国产亚洲电影| 精品免费视频123区| 日本免费一区二区视频| 国产欧美最新羞羞视频在线观看| 人人鲁人人莫人人爱精品| 98精品在线视频| 九色porny视频在线观看| 久久久久久久久久久人体| 亚洲夜夜综合| 久久亚洲精品一区二区| 午夜视频在线观看免费视频| 少妇精69xxtheporn| 国产精品影院在线| 夜夜嗨av一区二区三区免费区 | 97se亚洲| 高清视频一区| 超碰在线亚洲| 国产在线一区二区三区欧美| 欧美交a欧美精品喷水| 国模精品娜娜一二三区| 卡通动漫国产精品| 久久riav二区三区| 九热爱视频精品视频| 日本一区二区三区www| 精品久久久久久久| 一区二区三区免费看| 天堂网在线观看国产精品| 久久最新免费视频| 欧美日韩国产亚洲一区| 日韩国产成人无码av毛片| 亚洲第一伊人| 美女福利视频在线| 日韩av网站免费在线| 亚洲欧洲日本精品| 国产精品一区二区男女羞羞无遮挡| 在线视频观看一区二区| 成人黄色大片在线观看 | 色wwwwww| 亚洲欧美激情精品一区二区| av电影在线网| 久久视频在线免费观看| 日本色护士高潮视频在线观看 | 日韩三区在线| 成人国产精品久久久久久亚洲| 欧美a级大片在线| 精品国产乱码久久久久久108| 精品国产一区二区三区香蕉沈先生| 少妇免费毛片久久久久久久久| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 国产精品1luya在线播放| 久久久婷婷一区二区三区不卡| 成人在线视频免费观看| 青草全福视在线| 亚洲专区在线| 中文字幕第22页| 97久久精品人人爽人人爽蜜臀 | 欧美丝袜丝交足nylons172| 亚洲成年人专区| 99视频精品免费观看| 亚洲性图一区二区| 成人福利视频网站| 欧美激情久久久久久久| 亚洲综合一区二区精品导航| 加勒比在线一区| 日韩欧美国产综合在线一区二区三区| 婷婷亚洲一区二区三区| 久久精品亚洲一区| 超碰一区二区| av蓝导航精品导航| jlzzjlzz亚洲女人| 国产九色porny| 久久精品国产秦先生| 国产精品无码电影| 亚洲三级在线免费| 日本中文字幕在线观看视频| 日韩精品一区二区三区视频在线观看 | 成人国产在线| 国内精品视频在线播放| 国产国产精品| 国产综合免费视频| 东方欧美亚洲色图在线| 麻豆视频免费在线播放| 欧美日韩另类在线| a毛片在线免费观看| 伊人激情综合网| 美女91在线看| 5g影院天天爽成人免费下载| 青青草91久久久久久久久| 一区二区传媒有限公司| 高潮精品一区videoshd| www深夜成人a√在线| 欧美在线高清视频| 先锋av资源站| 久久久伊人欧美| 国产中文欧美日韩在线| 宅男一区二区三区| 日韩精品91亚洲二区在线观看| v天堂中文在线| 一区二区三区四区在线免费观看 | 在线天堂资源| 成人欧美一区二区三区黑人免费| 97人人精品| 污视频网站观看| 国产精品国产三级国产普通话99| 中文字幕第四页| 亚洲精品久久久久久久久久久久久| 色yeye免费人成网站在线观看| 国产综合在线观看视频| 精品一区二区三| 国产l精品国产亚洲区久久| 97久久精品人人澡人人爽| 欧美bbbbbbbbbbbb精品| 日韩成人中文电影| av手机在线观看| 久久精品国产精品青草色艺| 亚洲精选一区| 极品人妻一区二区三区| 色综合色狠狠综合色| 裸体xxxx视频在线| 国产精品电影观看| 日韩大片在线播放| 亚洲va综合va国产va中文| ...xxx性欧美| 成人av手机在线| 久久免费福利视频| 日韩精品欧美大片| 国产v亚洲v天堂无码久久久| 国产欧美日韩不卡免费| 中文字幕在线视频第一页| 久久伊人精品天天| 99精品在免费线中文字幕网站一区 | 日本伦理一区二区| 国产一区二区在线网站| 亚洲女人av| 奇米网一区二区| 欧美一区二区三区视频在线| 亚洲国产精品精华素| 国产精品对白刺激久久久| 国产精品日本| 久久精品成人av| 欧美日本在线一区| 婷婷丁香在线| 久久99九九| 免费高清在线一区| 欧美黄色免费在线观看| 亚洲精品国产suv| 成人爽a毛片免费啪啪| 亚洲精品高清国产一线久久| 国产精品一区二区果冻传媒| 日韩三级av在线| 在线观看精品国产视频| 欧美区一区二区| 日本一本二本在线观看| 中文字幕日韩欧美一区二区三区| 国产av精国产传媒| 欧美一区二区视频97| 欧美oldwomenvideos| 国产污在线观看| 在线看一区二区| 午夜av在线免费观看| 美女精品国产| 国产在线视视频有精品| 国产成人无码一区二区三区在线 | 久久久福利视频| 麻豆视频观看网址久久| 国产精品18p| 日韩在线资源网| 老牛国内精品亚洲成av人片| www.天天射.com| 亚洲高清免费一级二级三级| 成年人视频网站在线| 国产精品一区二|