青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

linux內核網絡棧代碼的準備知識 -- 來自網絡

一.linux內核網絡棧代碼的準備知識
 
1. linux內核ipv4網絡部分分層結構
 

BSD socket層: 這一部分處理BSD socket相關操作,每個socket在內核中以struct socket結構體現。這一部分的文件
 
主要有:/net/socket.c /net/protocols.c etc

INET socket層:BSD socket是個可以用于各種網絡協議的接口,而當用于tcp/ip,即建立了AF_INET形式的socket時,
 
還需要保留些額外的參數,于是就有了struct sock結構。文件主要
 
有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c etc

TCP/UDP層:處理傳輸層的操作,傳輸層用struct inet_protocol和struct proto兩個結構表示。文件主要
 
有:/net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c /net/ipv4//tcp_output.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_output.c /net/ipv4/tcp_timer.c
 
etc  
     
IP層:處理網絡層的操作,網絡層用struct packet_type結構表示。文件主要有:/net/ipv4/ip_forward.c
ip_fragment.c ip_input.c ip_output.c etc.

數據鏈路層和驅動程序:每個網絡設備以struct net_device表示,通用的處理在dev.c中,驅動程序都在/driver/net目
 
錄下。
 
2. 兩臺主機建立udp通信所走過的函數列表
 
^
|       sys_read                fs/read_write.c
|       sock_read               net/socket.c
|       sock_recvmsg            net/socket.c
|       inet_recvmsg            net/ipv4/af_inet.c
|       udp_recvmsg             net/ipv4/udp.c
|       skb_recv_datagram       net/core/datagram.c
|       -------------------------------------------
|       sock_queue_rcv_skb      include/net/sock.h
|       udp_queue_rcv_skb       net/ipv4/udp.c
|       udp_rcv                 net/ipv4/udp.c
|       ip_local_deliver_finish net/ipv4/ip_input.c
|       ip_local_deliver        net/ipv4/ip_input.c
|       ip_recv                 net/ipv4/ip_input.c
|       net_rx_action           net/dev.c
|       -------------------------------------------
|       netif_rx                net/dev.c
|       el3_rx                  driver/net/3c309.c
|       el3_interrupt           driver/net/3c309.c

==========================

|       sys_write               fs/read_write.c
|       sock_writev             net/socket.c                    
|       sock_sendmsg            net/socket.c
|       inet_sendmsg            net/ipv4/af_inet.c
|       udp_sendmsg             net/ipv4/udp.c
|       ip_build_xmit           net/ipv4/ip_output.c
|       output_maybe_reroute    net/ipv4/ip_output.c
|       ip_output               net/ipv4/ip_output.c
|       ip_finish_output        net/ipv4/ip_output.c
|       dev_queue_xmit          net/dev.c
|       --------------------------------------------
|       el3_start_xmit          driver/net/3c309.c
V
 
 
3. 網絡路徑圖、重要數據結構sk_buffer及路由介紹
 
    linux-net.pdf 第2.1章 第2.3章 第2.4章
    
4. 從連接、發送、到接收數據包的過程
 
    linux-net.pdf 第4、5、6章詳細闡述
 
 
二.linux的tcp-ip棧代碼的詳細分析
 
1.數據結構(msghdr,sk_buff,socket,sock,proto_ops,proto)
 
bsd套接字層,操作的對象是socket,數據存放在msghdr這樣的數據結構:
 
創建socket需要傳遞family,type,protocol三個參數,創建socket其實就是創建一個socket實例,然后創建一個文件描述符結構,并且互相建立一些關聯,即建立互相連接的指針,并且初始化這些對文件的寫讀操作映射到socket的read,write函數上來。
 
同時初始化socket的操作函數(proto_ops結構),如果傳入的type參數是STREAM類型,那么就初始化為SOCKET->ops為inet_stream_ops,如果是DGRAM類型,則SOCKET-ops為inet_dgram_ops。對于inet_stream_ops其實是一個結構體,包含了stream類型的socket操作的一些入口函數,在這些函數里主要做的是對socket進行相關的操作,同時通過調用下面提到的sock中的相關操作完成socket到sock層的傳遞。比如在inet_stream_ops里有個inet_release的操作,這個操作除了釋放socket的類型空間操作外,還通過調用socket連接的sock的close操作,對于stream類型來說,即tcp_close來關閉sock
釋放sock。
 
創建socket同時還創建sock數據空間,初始化sock,初始化過程主要做的事情是初始化三個隊列,receive_queue(接收到的數據包sk_buff鏈表隊列),send_queue(需要發送數據包的sk_buff鏈表隊列),backlog_queue(主要用于tcp中三次握手成功的那些數據包,自己猜的),根據family、type參數,初始化sock的操作,比如對于family為inet類型的,type為stream類型的,sock->proto初始化為tcp_prot.其中包括stream類型的協議sock操作對應的入口函數。
 
在一端對socket進行write的過程中,首先會把要write的字符串緩沖區整理成msghdr的數據結構形式(參見linux內核2.4版源代碼分析大全),然后調用sock_sendmsg把msghdr的數據傳送至inet層,對于msghdr結構中數據區中的每個數據包,創建sk_buff結構,填充數據,掛至發送隊列。一層層往下層協議傳遞。一下每層協議不再對數據進行拷貝。而是對sk_buff結構進行操作。
 
inet套接字及以下層 數據存放在sk_buff這樣的數據結構里:
 
路由:
    
    在linux的路由系統主要保存了三種與路由相關的數據,第一種是在物理上和本機相連接的主機地址信息表,第二種是保存了在網絡訪問中判斷一個網絡地址應該走什么路由的數據表;第三種是最新使用過的查詢路由地址的緩存地址數據表。
    1.neighbour結構  neighbour_table{ }是一個包含和本機所連接的所有鄰元素的信息的數據結構。該結構中有個元素是neighbour結構的數組,數組的每一個元素都是一個對應于鄰機的neighbour結構,系統中由于協議的不同,會有不同的判斷鄰居的方式,每種都有neighbour_table{}類型的實例,這些實例是通過neighbour_table{}中的指針next串聯起來的。在neighbour結構中,包含有與該鄰居相連的網絡接口設備net_device的指針,網絡接口的硬件地址,鄰居的硬件地址,包含有neigh_ops{}指針,這些函數指針是直接用來連接傳輸數據的,包含有queue_xmit(struct * sk_buff)函數入口地址,這個函數可能會調用硬件驅動程序的發送函數。
 
    2.FIB結構 在FIB中保存的是最重要的路由規則,通過對FIB數據的查找和換算,一定能夠獲得路由一個地址的方法。系統中路由一般采取的手段是:先到路由緩存中查找表項,如果能夠找到,直接對應的一項作為路由的規則;如果不能找到,那么就到FIB中根據規則換算傳算出來,并且增加一項新的,在路由緩存中將項目添加進去。
    3.route結構(即路由緩存中的結構)
 
 
 
數據鏈路層:
  
   net_device{}結構,對應于每一個網絡接口設備。這個結構中包含很多可以直接獲取網卡信息的函數和變量,同時包含很多對于網卡操作的函數,這些直接指向該網卡驅動程序的許多函數入口,包括發送接收數據幀到緩沖區等。當這些完成后,比如數據接收到緩沖區后便由netif_rx(在net/core/dev.c各種設備驅動程序的上層框架程序)把它們組成sk_buff形式掛到系統接收的backlog隊列然后交由上層網絡協議處理。同樣,對于上層協議處理下來的那些sk_buff。便由dev_queue_xmit函數放入網絡緩沖區,交給網卡驅動程序的發送程序處理。
 
   在系統中存在一張鏈表dev_base將系統中所有的net_device{}結構連在一起。對應于內核初始化而言,系統啟動時便為每個所有可能支持的網絡接口設備申請了一個net_device{}空間并串連起來,然后對每個接點運行檢測過程,如果檢測成功,則在dev_base鏈表中保留這個接點,否則刪除。對應于模塊加載來說,則是調用register_netdev()注冊net_device,在這個函數中運行檢測過程,如果成功,則加到dev_base鏈表。否則就返回檢測不到信息。刪除同理,調用
unregister_netdev。
 
 
2.啟動分析
 
    2.1 初始化進程 :start-kernel(main.c)---->do_basic_setup(main.c)---->sock_init(/net/socket.c)---->do_initcalls(main.c)
 
void __init sock_init(void)
{
 int i;
 
 printk(KERN_INFO "Linux NET4.0 for Linux 2.4\n");
 printk(KERN_INFO "Based upon Swansea University Computer Society NET3.039\n");
 
 /*
  * Initialize all address (protocol) families. 每一項表示的是針對一個地址族的操作集合,例如對于ipv4來說,在net/ipv4/af_inet.c文件中的函數inet_proto_init()就調用sock_register()函數將inet_families_ops初始化到屬于IPV4的net_families數組中的一項。
  */
 
 for (i = 0; i < NPROTO; i++)
  net_families[i] = NULL;  
 
 /*
  * Initialize sock SLAB cache.初始化對于sock結構預留的內存的slab緩存。
  */
 
 sk_init();
 
#ifdef SLAB_SKB
 /*
  * Initialize skbuff SLAB cache 初始化對于skbuff結構的slab緩存。以后對于skbuff的申請可以通過函數kmem_cache_alloc()在這個緩存中申請空間。
  */
 skb_init();
#endif
 
 /*
  * Wan router layer.
  */
 
#ifdef CONFIG_WAN_ROUTER 
 wanrouter_init();
#endif
 
 /*
  * Initialize the protocols module. 向系統登記sock文件系統,并且將其安裝到系統上來。
  */
 
 register_filesystem(&sock_fs_type);
 sock_mnt = kern_mount(&sock_fs_type);
 /* The real protocol initialization is performed when
  *  do_initcalls is run. 
  */

 /*
  * The netlink device handler may be needed early.
  */
 
#ifdef CONFIG_NET
 rtnetlink_init();
#endif
#ifdef CONFIG_NETLINK_DEV
 init_netlink();
#endif
#ifdef CONFIG_NETFILTER
 netfilter_init();
#endif
 
#ifdef CONFIG_BLUEZ
 bluez_init();
#endif
 
/*yfhuang ipsec*/
#ifdef CONFIG_IPSEC            
 pfkey_init();
#endif
/*yfhuang ipsec*/
}
 
 
    2.2 do_initcalls() 中做了其它的初始化,其中包括
 
                協議初始化,路由初始化,網絡接口設備初始化
 
(例如inet_init函數以_init開頭表示是系統初始化時做,函數結束后跟module_init(inet_init),這是一個宏,在include/linux/init.c中定義,展開為_initcall(inet_init),表示這個函數在do_initcalls被調用了)
 
    2.3 協議初始化
此處主要列舉inet協議的初始化過程。
 
static int __init inet_init(void)
{
 struct sk_buff *dummy_skb;
 struct inet_protocol *p;
 struct inet_protosw *q;
 struct list_head *r;
 
 printk(KERN_INFO "NET4: Linux TCP/IP 1.0 for NET4.0\n");
 
 if (sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb)) {
  printk(KERN_CRIT "inet_proto_init: panic\n");
  return -EINVAL;
 }
 
 /*
  * Tell SOCKET that we are alive... 注冊socket,告訴socket inet類型的地址族已經準備好了
  */
  
   (void) sock_register(&inet_family_ops);
 
 /*
  * Add all the protocols. 包括arp,ip、ICMP、UPD、tcp_v4、tcp、igmp的初始化,主要初始化各種協議對應的inode和socket變量。
 
其中arp_init完成系統中路由部分neighbour表的初始化
 
ip_init完成ip協議的初始化。在這兩個函數中,都通過定義一個packet_type結構的變量將這種數據包對應的協議發送數據、允許發送設備都做初始化。

  */
 
 printk(KERN_INFO "IP Protocols: ");
 for (p = inet_protocol_base; p != NULL;) {
  struct inet_protocol *tmp = (struct inet_protocol *) p->next;
  inet_add_protocol(p);
  printk("%s%s",p->name,tmp?", ":"\n");
  p = tmp;
 }
 
 /* Register the socket-side information for inet_create. */
 for(r = &inetsw[0]; r < &inetsw[SOCK_MAX]; ++r)
  INIT_LIST_HEAD(r);
 
 for(q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q)
  inet_register_protosw(q);
 
 /*
  * Set the ARP module up 
  */
 
 arp_init();
 
   /*
    * Set the IP module up
    */
 
 ip_init();
 
 tcp_v4_init(&inet_family_ops);
 
 /* Setup TCP slab cache for open requests. */
 tcp_init();

 /*
  * Set the ICMP layer up
  */
 
 icmp_init(&inet_family_ops);
 
 /* I wish inet_add_protocol had no constructor hook...
    I had to move IPIP from net/ipv4/protocol.c :-( --ANK
  */
#ifdef CONFIG_NET_IPIP
 ipip_init();
#endif
#ifdef CONFIG_NET_IPGRE
 ipgre_init();
#endif
 
 /*
  * Initialise the multicast router
  */
#if defined(CONFIG_IP_MROUTE)
 ip_mr_init();
#endif
 
 /*
  * Create all the /proc entries.
  */
#ifdef CONFIG_PROC_FS
 proc_net_create ("raw", 0, raw_get_info);
 proc_net_create ("netstat", 0, netstat_get_info);
 proc_net_create ("snmp", 0, snmp_get_info);
 proc_net_create ("sockstat", 0, afinet_get_info);
 proc_net_create ("tcp", 0, tcp_get_info);
 proc_net_create ("udp", 0, udp_get_info);
#endif  /* CONFIG_PROC_FS */
 
 ipfrag_init();
 
 return 0;
}   
module_init(inet_init);
                                                 
 
     2.4 路由初始化(包括neighbour表、FIB表、和路由緩存表的初始化工作)
 
            2.4.1 rtcache表 ip_rt_init()函數 在net/ipv4/ip_output中調用,net/ipv4/route.c中定義
 
            2.4.2 FIB初始化 在ip_rt_init()中調用 在net/ipv4/fib_front.c中定義
 
           2.4.3 neigbour表初始化  arp_init()函數中定義 
 
     2.5 網絡接口設備初始化
             
             在系統中網絡接口都是由一個dev_base鏈表進行管理的。通過內核的啟動方式也是通過這個鏈表進行操作的。在系統啟動之初,將所有內核能夠支持的網絡接口都初始化成這個鏈表中的一個節點,并且每個節點都需要初始化出init函數指針,用來檢測網絡接口設備。然后,系統遍歷整個dev_base鏈表,對每個節點分別調用init函數指針,如果成功,證明網絡接口設備可用,那么這個節點就可以進一步初始化,如果返回失敗,那么證明該網絡設備不存在或是不可用,只能將該節點刪除。啟動結束之后,在dev_base中剩下的都是可以用的網絡接口設備。
 
            2.5.1 do_initcalls---->net_dev_init()(net/core/dev.c)------>ethif_probe()(drivers/net/Space.c,在netdevice{}結構的init中調用,這邊ethif_probe是以太網卡針對的調用)
 
 
 
3.網絡設備驅動程序(略)
        
 
4.網絡連接
 
     4.1 連接的建立和關閉
 
            tcp連接建立的代碼如下:
                    server=gethostbyname(SERVER_NAME);
                    sockfd=socket(AF_INET,SOCK_STREAM,0);
                    address.sin_family=AF_INET;
                    address.sin_port=htons(PORT_NUM);
                    memcpy(&address.sin_addr,server->h_addr,server->h_length);
                    connect(sockfd,&address,sizeof(address));
 
       連接的初始化與建立期間主要發生的事情如下:
                      
       1)sys_socket調用:調用socket_creat(),創建出一個滿足傳入參數family、type、和protocol的socket,調用sock_map_fd()獲取一個未被使用的文件描述符,并且申請并初始化對應的file{}結構。
        
       2)sock_creat():創建socket結構,針對每種不同的family的socket結構的初始化,就需要調用不同的create函數來完成。對應于inet類型的地址來說,在網絡協議初始化時調用sock_register()函數中完成注冊的定義如下:
        struct net_proto_family inet_family_ops={
                PF_INET;
                inet_create
        };所以inet協議最后會調用inet_create函數。
        
       3)inet_create: 初始化sock的狀態設置為SS_UNCONNECTED,申請一個新的sock結構,并且初始化socket的成員ops初始化為inet_stream_ops,而sock的成員prot初始化為tcp_prot。然后調用sock_init_data,將該socket結構的變量sock和sock類型的變量關聯起來。
 
       4)在系統初始化完畢后便是進行connect的工作,系統調用connect將一個和socket結構關聯的文件描述符和一個sockaddr{}結構的地址對應的遠程機器相關聯,并且調用各個協議自己對應的connect連接函數。對應于tcp類型,則sock->ops->connect便為inet_stream_connect。
 
 
       5)inet_stream_connect: 得到sk,sk=sock->sk,鎖定sk,對自動獲取sk的端口號存放在sk->num中,并且用htons()函數轉換存放在sk->sport中。然后調用sk->prot->connect()函數指針,對tcp協議來說就是tcp_v4_connect()函數。然后將sock->state狀態字設置為SS_CONNECTING,等待后面一系列的處理完成之后,就將狀態改成SS_CONNECTTED。
 
       6) tcp_v4_connect():調用函數ip_route_connect(),尋找合適的路由存放在rt中。ip_route_connect找兩次,第一次找到下一跳的ip地址,在路由緩存或fib中找到,然后第二次找到下一跳的具體鄰居,到neigh_table中找到。然后申請出tcp頭的空間存放在buff中。將sk中相關地址數據做一些針對路由的變動,并且初始化一個tcp連接的序列號,調用函數tcp_connect(),初始化tcp頭,并設置tcp處理需要的定時器。一次connect()建立的過程就結束了。
 
       連接的關閉主要如下:
 
        1)close: 一個socket文件描述符對應的file{}結構中,有一個file_operations{}結構的成員f_ops,它的初始化關閉函數為sock_close函數。
 
        2)sock_close:調用函數sock_release(),參數為一個socket{}結構的指針。
 
        3)sock_release:調用inet_release,并釋放socket的指針和文件空間
 
        4)inet_release: 調用和該socket對應協議的關閉函數inet_release,如果是tcp協議,那么調用的是tcp_close;最后釋放sk。
 
        4.2 數據發送流程圖
 
 
 
各層主要函數以及位置功能說明:
        1)sock_write:初始化msghdr{}結構 net/socket.c
        2)sock_sendmsg:net/socket.c
        3)inet_sendmsg:net/ipv4/af_net.c
        4)tcp_sendmsg:申請sk_buff{}結構的空間,把msghdr{}結構中的數據填入sk_buff空間。net/ipv4/tcp.c
        5)tcp_send_skb:net/ipv4/tcp_output.c
        6)tcp_transmit_skb:net/ipv4/tcp_output.c
        7)ip_queue_xmit:net/ipv4/ip_output.c
        8)ip_queue_xmit2:net/ipv4/ip_output.c
        9)ip_output:net/ipv4/ip_output.c
        10)ip_finish_output:net/ipv4/ip_output.c
        11)ip_finish_output2:net/ipv4/ip_output.c
        12)neigh_resolve_output:net/core/neighbour.c
        13)dev_queue_xmit:net/core/dev.c
 
 
        4.3 數據接收流程圖
 
各層主要函數以及位置功能說明:
 
        1)sock_read:初始化msghdr{}的結構類型變量msg,并且將需要接收的數據存放的地址傳給msg.msg_iov->iov_base.      net/socket.c
        2)sock_recvmsg: 調用函數指針sock->ops->recvmsg()完成在INET Socket層的數據接收過程.其中sock->ops被初始化為inet_stream_ops,其成員recvmsg對應的函數實現為inet_recvmsg()函數. net/socket.c
        3)sys_recv()/sys_recvfrom():分別對應著面向連接和面向無連接的協議兩種情況. net/socket.c
        4)inet_recvmsg:調用sk->prot->recvmsg函數完成數據接收,這個函數對于tcp協議便是tcp_recvmsg net/ipv4/af_net.c
        5)tcp_recvmsg:從網絡協議棧接收數據的動作,自上而下的觸發動作一直到這個函數為止,出現了一次等待的過程.函數tcp_recvmsg可能會被動地等待在sk的接收數據隊列上,也就是說,系統中肯定有其他地方會去修改這個隊列使得tcp_recvmsg可以進行下去.入口參數sk是這個網絡連接對應的sock{}指針,msg用于存放接收到的數據.接收數據的時候會去遍歷接收隊列中的數據,找到序列號合適的.
        但讀取隊列為空時tcp_recvmsg就會調用tcp_v4_do_rcv使用backlog隊列填充接收隊列.
        6)tcp_v4_rcv:tcp_v4_rcv被ip_local_deliver函數調用,是從IP層協議向INET Socket層提交的"數據到"請求,入口參數skb存放接收到的數據,len是接收的數據的長度,這個函數首先移動skb->data指針,讓它指向tcp頭,然后更新tcp層的一些數據統計,然后進行tcp的一些值的校驗.再從INET Socket層中已經建立的sock{}結構變量中查找正在等待當前到達數據的哪一項.可能這個sock{}結構已經建立,或者還處于監聽端口、等待數據連接的狀態。返回的sock結構指針存放在sk中。然后根據其他進程對sk的操作情況,將skb發送到合適的位置.調用如下:
 
        TCP包接收器(tcp_v4_rcv)將TCP包投遞到目的套接字進行接收處理. 當套接字正被用戶鎖定,TCP包將暫時排入該套接字的后備隊列(sk_add_backlog).這時如果某一用戶線程企圖鎖定該套接字(lock_sock),該線程被排入套接字的后備處理等待隊列(sk->lock.wq).當用戶釋放上鎖的套接字時(release_sock,在tcp_recvmsg中調用),后備隊列中的TCP包被立即注入TCP包處理器(tcp_v4_do_rcv)進行處理,然后喚醒等待隊列中最先的一個用戶來獲得其鎖定權. 如果套接字未被上鎖,當用戶正在讀取該套接字時, TCP包將被排入套接字的預備隊列(tcp_prequeue),將其傳遞到該用戶線程上下文中進行處理.如果添加到sk->prequeue不成功,便可以添加到 sk->receive_queue隊列中(用戶線程可以登記到預備隊列,當預備隊列中出現第一個包時就喚醒等待線程.)   /net/tcp_ipv4.c
 
        7)ip_rcv、ip_rcv_finish:從以太網接收數據,放到skb里,作ip層的一些數據及選項檢查,調用ip_route_input()做路由處理,判斷是進行ip轉發還是將數據傳遞到高一層的協議.調用skb->dst->input函數指針,這個指針的實現可能有多種情況,如果路由得到的結果說明這個數據包應該轉發到其他主機,這里的input便是ip_forward;如果數據包是給本機的,那么input指針初始化為ip_local_deliver函數./net/ipv4/ip_input.c
 
        8)ip_local_deliver、ip_local_deliver_finish:入口參數skb存放需要傳送到上層協議的數據,從ip頭中獲取是否已經分拆的信息,如果已經分拆,則調用函數ip_defrag將數據包重組。然后通過調用ip_prot->handler指針調用tcp_v4_rcv(tcp)。ip_prot是inet_protocol結構指針,是用來ip層登記協議的,比如由udp,tcp,icmp等協議。 /net/ipv4/ip_input.c

posted on 2007-04-13 10:05 大龍 閱讀(942) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久成年人视频| 亚洲一区二区三区四区中文 | 亚洲精品小视频| 亚洲成色www8888| 亚洲女人天堂成人av在线| 一区二区三区四区国产| 亚洲九九九在线观看| 欧美全黄视频| 亚洲欧美日韩国产中文在线| 亚洲在线免费视频| 国产亚洲福利一区| 免费在线看成人av| 亚洲精品乱码久久久久久按摩观| 欧美精品乱码久久久久久按摩| 日韩亚洲欧美在线观看| 国产精品99久久99久久久二8 | 国产精品一区二区久久久久| 午夜精品久久久久久久99热浪潮 | 亚洲性图久久| 欧美在线一二三| 精品动漫一区二区| 亚洲国产婷婷| 欧美一区二区三区四区在线观看地址| 国内外成人在线视频| 欧美成人一区二区| 欧美特黄视频| 玖玖综合伊人| 欧美日韩一区在线观看视频| 欧美一区不卡| 欧美高清hd18日本| 久久成人国产| 欧美日韩国产123区| 久久激情视频免费观看| 欧美国产精品劲爆| 久久精品一区中文字幕| 欧美精品在线观看播放| 久久精品女人的天堂av| 欧美屁股在线| 欧美 日韩 国产 一区| 欧美午夜精品久久久久久久 | 午夜精品区一区二区三| 蜜臀av性久久久久蜜臀aⅴ| 亚洲欧美日韩成人| 麻豆成人在线观看| 久久精品国产99国产精品| 欧美黄色免费| 免费一区视频| 国产日韩欧美成人| 中日韩视频在线观看| 亚洲精品1234| 久久久综合网| 久久久久久自在自线| 国产精品日韩高清| 91久久久亚洲精品| 欧美无砖砖区免费| 亚洲风情亚aⅴ在线发布| 国产视频一区在线观看| 亚洲午夜电影在线观看| 国产精品99久久久久久久女警 | 欧美三级资源在线| 亚洲大胆在线| 亚洲国产高清视频| 久久免费视频观看| 久久人人爽人人| 国产综合久久| 久久精品免费| 免费日韩视频| 最新成人av网站| 欧美高清免费| 日韩一级免费| 宅男噜噜噜66国产日韩在线观看| 欧美成人黄色小视频| 欧美aⅴ一区二区三区视频| 亚洲国产精品999| 欧美不卡视频一区发布| 亚洲国产精彩中文乱码av在线播放| 黄色亚洲精品| 久久综合一区二区三区| 欧美多人爱爱视频网站| 亚洲美女淫视频| 欧美日韩精品免费看| 夜夜嗨av一区二区三区四区 | 亚洲精品日韩欧美| 欧美国产精品人人做人人爱| 亚洲日本va午夜在线影院| 亚洲少妇自拍| 国产精品伊人日日| 久久精品日产第一区二区| 免费在线亚洲| 亚洲视频免费看| 国产亚洲va综合人人澡精品| 久久免费国产精品| 亚洲国产精品久久久久久女王 | 国产农村妇女精品一二区| 羞羞色国产精品| 蜜臀a∨国产成人精品| 亚洲国产视频一区| 欧美日韩一级大片网址| 午夜视频在线观看一区二区| 鲁大师成人一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 欧美日韩伦理在线| 欧美一级午夜免费电影| 欧美激情视频给我| 亚洲欧美综合一区| 在线不卡亚洲| 国产精品视频网| 欧美成人精品福利| 中文在线不卡视频| 欧美电影专区| 欧美一区二区久久久| 亚洲日本精品国产第一区| 国产精品www.| 欧美极品在线观看| 欧美在线高清视频| 99精品久久久| 欧美成人伊人久久综合网| 亚洲在线视频观看| 亚洲美女毛片| 尹人成人综合网| 国产日韩欧美精品| 欧美日韩国产一区精品一区| 久久精品国产综合| 亚洲欧美卡通另类91av | 久久久久久亚洲精品中文字幕| 一区二区电影免费观看| 激情久久影院| 国产欧美视频在线观看| 欧美日本亚洲| 欧美国产日韩精品免费观看| 久久大香伊蕉在人线观看热2| 一区二区三区日韩精品视频| 亚洲国产精品久久人人爱蜜臀| 久久网站免费| 久久精品一区二区国产| 亚洲专区在线| 亚洲午夜一区二区三区| 99热在这里有精品免费| 亚洲丰满少妇videoshd| 激情欧美一区| 在线视频国产日韩| 伊人久久噜噜噜躁狠狠躁| 国产视频一区在线观看| 国产欧美一级| 国产午夜亚洲精品不卡| 国产欧美欧洲在线观看| 国产精品日本精品| 国产精品美女久久久久av超清| 欧美日韩久久久久久| 欧美日韩在线观看一区二区| 欧美日韩国产不卡在线看| 欧美精品一区二区蜜臀亚洲| 欧美国产视频在线观看| 欧美片在线播放| 国产精品爱啪在线线免费观看| 欧美日韩一区二区在线视频| 欧美日韩直播| 国产精品资源在线观看| 国产欧美69| 在线观看亚洲精品| 亚洲激情在线视频| 在线亚洲一区| 欧美亚洲日本网站| 裸体丰满少妇做受久久99精品| 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久精视频免费在线久久完整在线看| 欧美一区二区三区在线| 久久久久久久久久久久久久一区| 久久亚洲精品欧美| 亚洲高清不卡在线观看| 99视频国产精品免费观看| 亚洲一区二区三区四区视频| 欧美伊人久久大香线蕉综合69| 久久久久欧美精品| 欧美精品九九99久久| 国产精品尤物| 亚洲电影免费观看高清| 一区二区三区欧美| 久久深夜福利| 亚洲人屁股眼子交8| 先锋影音国产精品| 久久最新视频| 国产精品一二三视频| 在线色欧美三级视频| 亚洲综合日韩在线| 久久在线免费| 亚洲免费高清| 玖玖玖免费嫩草在线影院一区| 欧美视频日韩| 亚洲电影在线观看| 欧美亚洲三级| 亚洲国产精选| 久久精品免视看| 欧美性做爰猛烈叫床潮| 激情一区二区三区| 亚洲欧美中文字幕| 91久久精品美女| 久久久亚洲国产美女国产盗摄| 欧美日韩亚洲一区二区三区| 在线观看日韩一区|