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

從內核看文件描述符傳遞的實現

系統
文件描述符是內核提供的一個非常有用的技術,典型的在服務器中,主進程負責接收請求,然后把請求傳遞給子進程處理。本文分析在內核中,文件描述符傳遞是如何實現的。

[[406240]]

文件描述符是內核提供的一個非常有用的技術,典型的在服務器中,主進程負責接收請求,然后把請求傳遞給子進程處理。本文分析在內核中,文件描述符傳遞是如何實現的。

我們先看一下文件描述符傳遞到底是什么概念。假設主進程打開了一個文件,我們看看進程和文件系統的關系。

如果這時候主進程fork出一個子進程,那么架構如下。

我們看到主進程和子進程都指向同一個文件。那么如果這時候住進程又打開了一個文件。架構如下。

我們看到新打開的文件,子進程是不會再指向了的。假設文件底層的資源是TCP連接,而主進程想把這個關系同步到子進程中,即交給子進程處理,那怎么辦呢?這時候就需要用到文件描述符傳遞。下面是我們期待的架構。

通常主進程會close掉對應的文件描述符,即解除引用關系。不過這里我們可以不關注這個。文件描述符這種能力不是天然,需要內核支持,如果我們單純把fd(文件描述符)當作數據傳給子進程,子進程無法指向對應的文件的。下面我們如何使用這個技術并通過內核來看看如何實現這個技術。下面使用代碼摘自Libuv。

  1. int fd_to_send; 
  2.     // 核心數據結構 
  3.     struct msghdr msg; 
  4.     struct cmsghdr *cmsg; 
  5.     union { 
  6.       char data[64]; 
  7.       struct cmsghdr alias; 
  8.     } scratch; 
  9.     // 獲取需要發送的文件描述符 
  10.     fd_to_send = uv__handle_fd((uv_handle_t*) req->send_handle); 
  11.  
  12.     memset(&scratch, 0, sizeof(scratch)); 
  13.  
  14.     msg.msg_name = NULL
  15.     msg.msg_namelen = 0; 
  16.     msg.msg_iov = iov; 
  17.     msg.msg_iovlen = iovcnt; 
  18.     msg.msg_flags = 0; 
  19.  
  20.     msg.msg_control = &scratch.alias; 
  21.     msg.msg_controllen = CMSG_SPACE(sizeof(fd_to_send)); 
  22.  
  23.     cmsg = CMSG_FIRSTHDR(&msg); 
  24.     cmsg->cmsg_level = SOL_SOCKET; 
  25.     cmsg->cmsg_type = SCM_RIGHTS; 
  26.     cmsg->cmsg_len = CMSG_LEN(sizeof(fd_to_send)); 
  27.  
  28.     /* silence aliasing warning */ 
  29.     { 
  30.       void* pv = CMSG_DATA(cmsg); 
  31.       int* pi = pv; 
  32.       *pi = fd_to_send; 
  33.     } 
  34.     // fd是Unix域對應的文件描述符 
  35.     int fd = uv__stream_fd(stream); 
  36.     // 發送文件描述符 
  37.     sendmsg(fd, &msg, 0); 

我們看到發送文件描述符是比較復雜的,使用的主要數據結構是msghdr。把需要發送的文件描述符保存到msghdr中,并設置一些標記。然后通過Unix域發送(Unix是唯一一種支持文件描述符傳遞的進程間通信方式)。我們下來主要來分析內核對sendmsg的實現。

  1. case SYS_SENDMSG: 
  2.         err = __sys_sendmsg(a0, (struct user_msghdr __user *)a1, 
  3.                     a[2], true); 

該系統調用對應的是__sys_sendmsg。

  1. long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned int flags, 
  2.            bool forbid_cmsg_compat){ 
  3.     int fput_needed, err; 
  4.     struct msghdr msg_sys; 
  5.     struct socket *sock; 
  6.     // 根據fd找到socket 
  7.     sock = sockfd_lookup_light(fd, &err, &fput_needed); 
  8.     ___sys_sendmsg(sock, msg, &msg_sys, flags, NULL, 0); 

后面的鏈路很長syssendmsg->__sys_sendmsg->sock_sendmsg->sock_sendmsg_nosec。

  1. static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg){ 
  2.     int ret = INDIRECT_CALL_INET(sock->ops->sendmsg, inet6_sendmsg, 
  3.                      inet_sendmsg, sock, msg, 
  4.                      msg_data_left(msg)); 
  5.     BUG_ON(ret == -EIOCBQUEUED); 
  6.     return ret; 

我們看到最后調用sock->ops->sendmsg,我們看看Unix域對sendmsg的實現。Unix域有SOCK_STREAM和SOCK_DGRAM兩種模式,我們選第一個分析就可以。

  1. static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg, 
  2.                    size_t len){ 
  3.     struct sock *sk = sock->sk; 
  4.     struct sock *other = NULL
  5.     int err, size
  6.     struct sk_buff *skb; 
  7.     int sent = 0; 
  8.     struct scm_cookie scm; 
  9.     bool fds_sent = false
  10.     int data_len; 
  11.     // 把文件描述符信息復制到scm 
  12.     scm_send(sock, msg, &scm, false); 
  13.     // 通信的對端 
  14.     other = unix_peer(sk); 
  15.     // 不斷構建數據包skbuff發送,直到發送完畢 
  16.     while (sent < len) { 
  17.         // 分配一個sdk承載消息 
  18.         skb = sock_alloc_send_pskb(sk, size - data_len, data_len, 
  19.                        msg->msg_flags & MSG_DONTWAIT, &err, 
  20.                        get_order(UNIX_SKB_FRAGS_SZ)); 
  21.         // 把scm復制到skb               
  22.         err = unix_scm_to_skb(&scm, skb, !fds_sent); 
  23.         // 把數據寫到skb 
  24.         err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, size); 
  25.         // 插入對端的消息隊列 
  26.         skb_queue_tail(&other->sk_receive_queue, skb); 
  27.         // 通知對端有數據可讀 
  28.         other->sk_data_ready(other); 
  29.         sent += size
  30.     } 
  31.     // ... 

我們看到,整體的邏輯不負責,主要是根據數據構造skb結構體,然后插入對端消息隊列,最后通知對端有消息可讀,我們這里只關注文件描述符的處理。首先我們看看scm_send。

  1. static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, 
  2.                    struct scm_cookie *scm, bool forcecreds){ 
  3.     memset(scm, 0, sizeof(*scm)); 
  4.     scm->creds.uid = INVALID_UID; 
  5.     scm->creds.gid = INVALID_GID; 
  6.     unix_get_peersec_dgram(sock, scm); 
  7.     if (msg->msg_controllen <= 0) 
  8.         return 0; 
  9.     return __scm_send(sock, msg, scm);}int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p){ 
  10.     struct cmsghdr *cmsg; 
  11.     int err; 
  12.  
  13.     for_each_cmsghdr(cmsg, msg) { 
  14.         switch (cmsg->cmsg_type) 
  15.         { 
  16.         case SCM_RIGHTS: 
  17.             err=scm_fp_copy(cmsg, &p->fp); 
  18.             if (err<0) 
  19.                 goto error; 
  20.             break; 
  21.         } 
  22.     } 

我們看到__scm_send遍歷待發送的數據,然后判斷cmsg->cmsg_type的值,我們這里是SCM_RIGHTS(見最開始的使用代碼),接著調用scm_fp_copy。

  1. static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp){ 
  2.     int *fdp = (int*)CMSG_DATA(cmsg); 
  3.     struct scm_fp_list *fpl = *fplp; 
  4.     struct file **fpp; 
  5.     int i, num; 
  6.  
  7.     num = (cmsg->cmsg_len - sizeof(struct cmsghdr))/sizeof(int); 
  8.     if (!fpl) 
  9.     { 
  10.         fpl = kmalloc(sizeof(struct scm_fp_list), GFP_KERNEL); 
  11.         *fplp = fpl; 
  12.         fpl->count = 0; 
  13.         fpl->max = SCM_MAX_FD; 
  14.         fpl->user = NULL
  15.     } 
  16.     fpp = &fpl->fp[fpl->count]; 
  17.     // 遍歷然后把fd對應的file保存到fpp中。 
  18.     for (i=0; i< num; i++) 
  19.     { 
  20.         int fd = fdp[i]; 
  21.         struct file *file; 
  22.  
  23.         if (fd < 0 || !(file = fget_raw(fd))) 
  24.             return -EBADF; 
  25.         *fpp++ = file; 
  26.         fpl->count++; 
  27.     } 
  28.  
  29.     if (!fpl->user
  30.         fpl->user = get_uid(current_user()); 
  31.  
  32.     return num; 

我們看到scm_fp_copy遍歷然后把fd對應的file保存到fpp中。而fpp屬于fpl屬于fplp屬于最開始的struct scm_cookie scm(unix_stream_sendmsg函數),即最后把fd對應的file保存到了scm中。接著我們回到unix_stream_sendmsg看unix_scm_to_skb。

  1. static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds){ 
  2.     int err = 0; 
  3.  
  4.     UNIXCB(skb).pid  = get_pid(scm->pid); 
  5.     UNIXCB(skb).uid = scm->creds.uid; 
  6.     UNIXCB(skb).gid = scm->creds.gid; 
  7.     UNIXCB(skb).fp = NULL
  8.     unix_get_secdata(scm, skb); 
  9.     if (scm->fp && send_fds) 
  10.         // 寫到skb 
  11.         err = unix_attach_fds(scm, skb); 
  12.  
  13.     skb->destructor = unix_destruct_scm; 
  14.     return err; 

接著看unix_attach_fds。

  1. int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb){ 
  2.     int i; 
  3.     // 復制到skb 
  4.     UNIXCB(skb).fp = scm_fp_dup(scm->fp); 
  5.     return 0;}struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl){ 
  6.     struct scm_fp_list *new_fpl; 
  7.     int i; 
  8.  
  9.     new_fpl = kmemdup(fpl, offsetof(struct scm_fp_list, fp[fpl->count]), 
  10.               GFP_KERNEL); 
  11.     if (new_fpl) { 
  12.         for (i = 0; i < fpl->count; i++) 
  13.             get_file(fpl->fp[i]); 
  14.         new_fpl->max = new_fpl->count
  15.         new_fpl->user = get_uid(fpl->user); 
  16.     } 
  17.     return new_fpl; 

至此我們看到數據和文件描述符都寫到了skb中,并插入了對端的消息隊列。我們接著分析對端時如何處理的。我們從recvmsg函數開始,對應Uinix域的實現時unix_stream_recvmsg。

  1. static int unix_stream_recvmsg(struct socket *sock, struct msghdr *msg, 
  2.                    size_t sizeint flags){ 
  3.     struct unix_stream_read_state state = { 
  4.         .recv_actor = unix_stream_read_actor, 
  5.         .socket = sock, 
  6.         .msg = msg, 
  7.         .size = size
  8.         .flags = flags 
  9.     }; 
  10.  
  11.     return unix_stream_read_generic(&state, true); 

接著看

  1. static int unix_stream_read_generic(struct unix_stream_read_state *state, 
  2.                     bool freezable){ 
  3.     struct scm_cookie scm; 
  4.     struct socket *sock = state->socket; 
  5.     struct sock *sk = sock->sk; 
  6.     struct unix_sock *u = unix_sk(sk); 
  7.  
  8.     // 拿到一個skb 
  9.     skb = skb_peek(&sk->sk_receive_queue); 
  10.     // 出隊 
  11.     skb_unlink(skb, &sk->sk_receive_queue); 
  12.     // 復制skb數據到state->msg 
  13.     state->recv_actor(skb, skip, chunk, state); 
  14.     // 處理文件描述符 
  15.     if (UNIXCB(skb).fp) { 
  16.         scm_stat_del(sk, skb); 
  17.         // 復制skb的文件描述符信息到scm 
  18.         unix_detach_fds(&scm, skb); 
  19.     } 
  20.     if (state->msg) 
  21.         scm_recv(sock, state->msg, &scm, flags); 

內核首先通過鉤子函數recv_actor把skb數據數據復制到state->msg,recv_actor對應函數是unix_stream_read_actor。

  1. static int unix_stream_read_actor(struct sk_buff *skb, 
  2.                   int skip, int chunk, 
  3.                   struct unix_stream_read_state *state){ 
  4.     int ret; 
  5.  
  6.     ret = skb_copy_datagram_msg(skb, UNIXCB(skb).consumed + skip, 
  7.                     state->msg, chunk); 
  8.     return ret ?: chunk; 

接著看unix_detach_fds。

  1. void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb){ 
  2.     int i; 
  3.     // 寫到scm中 
  4.     scm->fp = UNIXCB(skb).fp; 
  5.     UNIXCB(skb).fp = NULL

unix_detach_fds把文件描述符信息寫到scm。最后調用scm_recv處理文件描述符。

  1. static __inline__ void scm_recv(struct socket *sock, struct msghdr *msg, 
  2.                 struct scm_cookie *scm, int flags){ 
  3.     scm_detach_fds(msg, scm);}void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm){ 
  4.     int fdmax = min_t(int, scm_max_fds(msg), scm->fp->count); 
  5.     int i; 
  6.  
  7.     for (i = 0; i < fdmax; i++) { 
  8.         err = receive_fd_user(scm->fp->fp[i], cmsg_data + i, o_flags); 
  9.         if (err < 0) 
  10.             break; 
  11.     } 

scm_detach_fds中調用了receive_fd_user處理一個文件描述符。其中第一個入參scm->fp->fp[i]是file結構體,即需傳遞到文件描述符對應的file。我們看看怎么處理的。

  1. static inline int receive_fd_user(struct file *file, int __user *ufd, 
  2.                   unsigned int o_flags){ 
  3.     return __receive_fd(-1, file, ufd, o_flags);}int __receive_fd(int fd, struct file *file, int __user *ufd, unsigned int o_flags){ 
  4.     int new_fd; 
  5.     // fd是-1,申請一個新的 
  6.     if (fd < 0) { 
  7.         new_fd = get_unused_fd_flags(o_flags); 
  8.     } else { 
  9.         new_fd = fd; 
  10.     } 
  11.  
  12.     if (fd < 0) { 
  13.         fd_install(new_fd, get_file(file)); 
  14.     } else { 
  15.         // ... 
  16.     } 
  17.     return new_fd; 

我們看到首先申請了當前進程的一個新的文件描述符。然后調用fd_install關聯到file。

  1. void fd_install(unsigned int fd, struct file *file){    
  2.     // current->files是當前進程打開的文件描述符列表 
  3.     __fd_install(current->files, fd, file);}void __fd_install(struct files_struct *files, unsigned int fd, 
  4.         struct file *file){ 
  5.     struct fdtable *fdt; 
  6.     // 拿到管理文件描述符的數據結構 
  7.     fdt = rcu_dereference_sched(files->fdt); 
  8.     // 給某個元素賦值指向file 
  9.     rcu_assign_pointer(fdt->fd[fd], file); 

最后形成下圖所示的架構。

后記,我們看到文件描述符傳遞的核心就是在發送的數據中記錄要傳遞的文件描述符對應的file結構體,然后發送做好標記,接著接收的過程中,重新建立新的fd到傳遞的file的關聯關系。

 

責任編輯:武曉燕 來源: 編程雜技
相關推薦

2025-01-10 15:13:38

2012-08-08 10:31:41

IBMdW

2019-03-05 22:15:08

BashLinux命令

2020-02-07 18:16:01

進程線程底層原理

2023-12-13 14:01:34

Elasticsea文件描述符操作系統

2021-06-26 07:04:24

Epoll服務器機制

2016-10-28 21:55:28

Javascript屬性特性屬性描述符

2009-07-08 09:46:45

Servlet注釋部署描述符

2023-04-06 15:22:15

Linux進程系統

2017-02-05 10:06:53

Python黑魔法描述符

2019-07-05 14:20:45

RPC服務器模型

2021-05-19 14:48:58

Linux文件fd

2009-09-04 14:04:53

C#文檔

2021-07-07 23:38:05

內核IOLinux

2016-08-23 17:21:51

UnixLinux重定向

2019-07-09 15:30:31

Linuxulimit文件描述符

2016-09-20 15:21:35

LinuxInnoDBMysql

2019-07-09 14:30:16

LinuxJava 服務器

2025-11-05 03:00:00

Linux內核TCP粘包

2019-03-27 09:14:38

CPU內核應用程序
點贊
收藏

51CTO技術棧公眾號

国产日韩欧美一区| 欧洲vs亚洲vs国产| 洋洋av久久久久久久一区| 岛国视频一区免费观看| 天堂网免费视频| 99精品视频在线| 亚洲福利精品在线| 午夜激情在线观看视频| 性欧美高清come| 91香蕉视频mp4| 国产综合久久久久久| 日韩免费一二三区| 欧美日韩中字| 精品国产123| 久久国产精品国产精品| 第四色日韩影片| 中文字幕一区二区三区精华液| 成人黄色片视频网站| 进去里视频在线观看| 韩国av一区| 色七七影院综合| 国产麻豆xxxvideo实拍| 经典三级久久| 在线视频一区二区免费| 给我免费播放片在线观看| 91av资源在线| 久久婷婷国产综合精品青草| 91黄在线观看| 在线免费观看高清视频| 国产精品婷婷| 久久久久女教师免费一区| 粉嫩精品久久99综合一区| 首页亚洲中字| 精品国产乱码91久久久久久网站| 久久婷婷综合色| 欧美舌奴丨vk视频| 午夜av一区二区| 一级性生活视频| 成年人在线视频免费观看| 92精品国产成人观看免费| 99c视频在线| 国产免费黄色大片| 免费av成人在线| 国产成人啪精品视频免费网| 日本三级网站在线观看| 黄色国产精品| 久久777国产线看观看精品| 在线观看亚洲大片短视频| 宅男在线一区| 亚洲精品一区中文| 少妇按摩一区二区三区| 天海翼精品一区二区三区| 亚洲成色999久久网站| 四虎国产精品免费| 亚洲精品国产九九九| 在线播放91灌醉迷j高跟美女| 五月婷婷之综合激情| 亚洲精品粉嫩美女一区| 欧美亚洲综合在线| 午夜免费看视频| 国产乱子精品一区二区在线观看| 欧美写真视频网站| 欧美午夜aaaaaa免费视频| 成人精品三级| 欧美日韩一区不卡| 欧美伦理片在线观看| 欧美激情三区| 91精品国产综合久久国产大片| 在线视频观看91| 亚洲国产高清在线观看| 精品动漫一区二区三区在线观看| xxxwww国产| 日本在线中文字幕一区| 亚洲日本成人网| 一本在线免费视频| 欧美在线免费一级片| 欧美精品久久久久久久免费观看| 日操夜操天天操| 久久蜜桃精品| 成人激情视频网| 亚洲老妇色熟女老太| 99久久精品国产导航| 日韩av在线电影观看| 日韩美女网站| 亚洲一区二区三区四区的| 久久久久久久久久网| 日韩国产网站| 日韩视频一区二区三区| 国产一级伦理片| 精品一区二区三区在线| 久久网福利资源网站| 久久精品视频8| 日韩中文字幕1| 亚洲www视频| 台湾av在线二三区观看| 中文成人综合网| 欧美一区二区激情| 欧美性xxx| 日韩免费一区二区三区在线播放| 日本黄色动态图| 欧美r级电影| 91精品国产乱码久久久久久蜜臀 | 国产一级免费在线观看| 亚洲丝袜自拍清纯另类| 精品一二三四五区| 日韩毛片一区| 日韩高清不卡av| 黄色一级大片在线免费观看| 亚洲国产日本| 成人天堂噜噜噜| 九九热视频在线观看| 亚洲精品国产a| 日本美女高潮视频| 成人激情自拍| 久久影视免费观看| 国产熟妇一区二区三区四区| 国产成人精品免费在线| 亚洲一区二区精品在线| 在线日韩影院| 亚洲第一av在线| 亚洲不卡在线播放| 日韩av一级片| 美女黄毛**国产精品啪啪| 欧美v亚洲v| 91麻豆精品91久久久久久清纯| 丰满圆润老女人hd| 亚洲精品美女91| 亚洲最大成人免费视频| 92国产在线视频| 色综合天天综合狠狠| 精品1卡二卡三卡四卡老狼| 99久久亚洲精品| 国产精品久久久久久影视 | 色婷婷成人网| 国产一区二区三区欧美| 91精品国产乱码久久久张津瑜| 国产精品一区二区黑丝| 亚洲一区二区在线观| 亚洲精品国产嫩草在线观看| 日韩av网址在线| 日本特黄一级片| 国产sm精品调教视频网站| 一级黄色免费在线观看| 久久久久毛片| 色偷偷偷综合中文字幕;dd| 日韩国产成人在线| 国产网红主播福利一区二区| 国产亚洲综合视频| 美女视频亚洲色图| 91精品国产高清自在线| 日本精品久久久久| 香蕉影视欧美成人| 中出视频在线观看| 免费日韩av| 免费看成人片| 性感美女一区二区在线观看| 亚洲人精品午夜在线观看| 最近中文字幕免费观看| 国产精品萝li| 激情文学亚洲色图| 欧美喷水视频| 国外成人在线视频网站| 亚洲v.com| 一本色道久久综合狠狠躁篇的优点 | 成人精品在线观看视频| 老司机一区二区三区| 日韩妆和欧美的一区二区| 成人高清一区| 美女黄色丝袜一区| 手机看片福利永久| 色综合久久中文字幕综合网| 久久久视频6r| 精品午夜久久福利影院| 亚洲精品蜜桃久久久久久| 国产欧美自拍一区| 国产suv精品一区二区三区88区| 成人影院免费观看| 欧美一区二区成人6969| 日本三级2019| 国产精品视频观看| 亚洲免费观看在线| 老司机精品福利视频| 国产一区一区三区| 国产精品一线| 国产精品一区二区久久| 欧美人与禽猛交乱配| 日韩成人在线网站| 96日本xxxxxⅹxxx17| 午夜视频一区二区| 国产一二三av| 成人激情av网| 国产一伦一伦一伦| 亚洲精品九九| 在线一区亚洲| 日韩极品少妇| 亚洲qvod图片区电影| 男人的天堂免费在线视频| 中文字幕日韩高清| 欧美熟妇乱码在线一区| 欧美网站一区二区| 日韩av片在线播放| 亚洲欧美怡红院| 国产精品嫩草av| 国内成+人亚洲+欧美+综合在线| 欧美综合在线播放| 亚洲激情中文| 亚洲国产日韩欧美| 激情小说一区| 亚洲一区亚洲二区亚洲三区| 忘忧草在线日韩www影院| 不卡毛片在线看| 高清在线观看av| 亚洲精品成人网| 99久久精品国产色欲| 在线观看日韩电影| 国产精品30p| 亚洲美女视频在线观看| 先锋影音av在线| 99re亚洲国产精品| www.黄色网| 国内成人自拍视频| 午夜久久久精品| 久久国产日韩| 国产视频九色蝌蚪| 在线日韩欧美| 国产一级大片免费看| 国产精品7m凸凹视频分类| 日本一区二区高清视频| 亚洲成a人片77777在线播放| 国内成+人亚洲| 7777精品| 成人永久免费| 日韩三级av高清片| 91在线视频精品| 亚洲精品一区av| 国产女同一区二区| 国产黄色精品| 国产精品免费小视频| 日韩久久一区二区三区| 日产精品久久久一区二区福利 | 国产精品久久久久久超碰| 天堂电影一区| 日本一区二区不卡| 超级碰碰久久| 欧美中文字幕在线| 欧美性xxx| 国产精品久久久久久久久久| 日本综合视频| 国产女精品视频网站免费| 欧美高清xxx| 成人精品视频99在线观看免费| 日韩成人一区| 亚洲在线第一页| 亚洲视频三区| 久久精品日产第一区二区三区| 你懂的在线观看一区二区| 加勒比在线一区二区三区观看| 欧美理伦片在线播放| 精品无码久久久久国产| 竹菊久久久久久久| 日韩欧美一区二区三区四区| 日韩免费视频| 青青草综合视频| 亚洲第一黄色| 国产v亚洲v天堂无码久久久| 日韩精品电影在线| 国产三级精品三级在线| 国产iv一区二区三区| 给我免费观看片在线电影的| 久久亚洲精品小早川怜子| 日韩女同一区二区三区| 中文字幕欧美一| 国产一级一片免费播放| 色综合久久六月婷婷中文字幕| 国产裸体美女永久免费无遮挡| 欧美精品三级在线观看| 丰满少妇在线观看bd| 日韩激情视频在线| av网站在线免费播放| 久久精品国产视频| 99riav视频在线观看| 国产91在线播放精品91| 国产精品久久久久久久久久久久久久久| 99re在线观看视频| 少妇精品久久久一区二区| 一区不卡视频| 99pao成人国产永久免费视频| www.日本xxxx| 国产91综合一区在线观看| 扒开jk护士狂揉免费| 亚洲天堂网中文字| 欧美日韩精品区| 欧美精品1区2区3区| 人妻视频一区二区三区| 中文字幕精品视频| 久久男人天堂| 成人免费激情视频| 日本亚洲不卡| 成年在线观看视频| 日本怡春院一区二区| 香蕉久久久久久av成人| 国产午夜精品在线观看| 欧美国产日韩综合| 欧美最新大片在线看| 亚洲爱情岛论坛永久| 中文字幕无线精品亚洲乱码一区 | 日韩免费不卡av| 日韩成人在线看| 五月婷婷一区| 亚洲中字黄色| 波多野结衣三级视频| 中文字幕成人在线观看| 日韩成人高清视频| 日韩欧美亚洲国产另类| 98在线视频| 日本不卡高字幕在线2019| 8848成人影院| 日韩video| 另类综合日韩欧美亚洲| 人妻无码一区二区三区| 亚洲一区二区精品视频| 国产精品无码久久av| 国产亚洲美女精品久久久| 成人片免费看| 精品久久久久久中文字幕动漫| 午夜精品av| 亚洲五月激情网| 自拍偷拍亚洲激情| 中文字幕福利视频| 亚洲人成在线观看| 在线最新版中文在线| 国产日韩一区欧美| 在线播放精品| 欧美日韩一区二区区别是什么| 亚洲丝袜精品丝袜在线| 136福利视频导航| 日韩中文字幕在线免费观看| 欧美xoxoxo| 人禽交欧美网站免费| 国产亚洲一级| 狠狠人妻久久久久久综合蜜桃| 亚洲一区二区三区三| 国产xxxx在线观看| 欧美精品制服第一页| 一区二区三区亚洲变态调教大结局| 在线观看福利一区| 国产在线精品一区二区| 欧美黄片一区二区三区| 日韩欧美的一区| 女子免费在线观看视频www| 成人免费视频网站| 黄色成人91| 久久久精品人妻无码专区| 黑人与娇小精品av专区| 免费在线视频你懂得| 国产91在线播放九色快色| jlzzjlzz亚洲女人| 奇米视频7777| 亚洲精品伦理在线| 色丁香婷婷综合久久| 26uuu久久噜噜噜噜| 深爱激情综合| 亚洲欧美久久久久| 亚洲免费视频成人| 国模私拍视频在线| 欧美在线视频网| 成人免费电影网址| 天天av天天操| 午夜精品影院在线观看| 欧美日韩免费做爰大片| 国产精品一区二区久久久| 羞羞色午夜精品一区二区三区| 国产又粗又猛又爽又黄| 性做久久久久久久久| 撸视在线观看免费视频| 国产在线精品播放| 亚洲国产专区校园欧美| 精品无人区无码乱码毛片国产| 欧美日韩亚洲国产综合| 深夜国产在线播放| 免费日韩av电影| 久久99国产精品尤物| 久久久久久久九九九九| 亚洲欧洲国产精品| 91精品网站在线观看| 亚洲人精品午夜射精日韩 | 欧美日韩免费做爰视频| 日韩精品视频在线观看免费| 成人福利一区二区| 精品视频在线观看一区| 国产亚洲视频系列| 精品久久久久久亚洲综合网站 | 最近2019中文字幕mv免费看| 亚洲日本一区二区三区在线| 97xxxxx| 一区二区三区免费观看| 第三区美女视频在线| 国内精品视频在线播放| 极品尤物av久久免费看| 国产精品人人人人|