《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 嵌入式Linux網絡驅動程序的體系結構和實現原理
嵌入式Linux網絡驅動程序的體系結構和實現原理
摘要: 隨著人們對開放源代碼軟件熱情的日益增高,Linux作為一個功能強大而穩定的開源操作系統,越來越受到成千上萬的計算機專家和愛好者的青睞。
Abstract:
Key words :

  隨著人們對開放源代碼軟件熱情的日益增高,Linux作為一個功能強大而穩定的開源操作系統,越來越受到成千上萬的計算機專家和愛好者的青睞。在嵌入式領域,通過對Linux進行小型化裁剪后,使其能夠固化在容量只有幾十兆字節的存儲器芯片或單片機中,成為應用于特定場合的嵌入式Linux系統。Linux強大的網絡支持功能實現了對包括TCP/IP在內的多種協議的支持,滿足了面向21世紀的嵌入式系統應用聯網的需求。因此,在嵌入式系統開發調試時,網絡接口幾乎成為不可或缺的模塊。

  1 嵌入式Linux網絡驅動程序介紹

  Linux網絡驅動程序作為Linux網絡子系統的一部分,位于TCP/IP網絡體系結構的網絡接口層,主要實現上層協議棧與網絡設備的數據交換。Linux的網絡系統主要是基于BSD Unix的套接字(socket)機制,網絡設備與字符設備和塊設備不同,沒有對應地映射到文件系統中的設備節點。

  通常,Linux驅動程序有兩種加載方式:一種是靜態地編譯進內核,內核啟動時自動加載;另一種是編寫為內核模塊,使用insmod命令將模塊動態加載到正在運行的內核,不需要時可用rmmod命令將模塊卸載。Linux 2.6內核引入了kbuild機制,將外部內核模塊的編譯同內核源碼樹的編譯統一起來,大大簡化了特定的參數和宏的設置。這樣將編寫好的驅動模塊加入內核源碼樹,只需要修改相應目錄的Kconfig文件,把新的驅動加入內核的配置菜單,然后需要修改相應子目錄中與模塊編譯相關的Kbuild Makefile,即可使新的驅動在內核源碼樹中被編譯。在嵌入式系統驅動開發時,常常將驅動程序編寫為內核模塊,方便開發調試。調試完畢后,就可以將驅動模塊編譯進內核,并重新編譯出支持特定物理設備的Linux內核。

  2 嵌入式Linux網絡驅動程序的體系結構和實現原理

  2.1 Linux網絡設備驅動的體系結構

  如圖1所示,Linux網絡驅動程序的體系結構可劃分為4個層次。Linux內核源代碼中提供了網絡設備接口及以上層次的代碼,因此移植特定網絡硬件的驅動程序的主要工作就是完成設備驅動功能層的相應代碼,根據底層具體的硬件特性,定義網絡設備接口struct net_device類型的結構體變量,并實現其中相應的操作函數及中斷處理程序。

  

  Linux中所有的網絡設備都抽象為一個統一的接口,即網絡設備接口,通過struct net_device類型的結構體變量表示網絡設備在內核中的運行情況,這里既包括回環(loopback)設備,也包括硬件網絡設備接口。內核通過以dev_base為頭指針的設備鏈表來管理所有的網絡設備。

  2.2 net_device 數據結構

  struct net_device結構體是整個網絡驅動結構的核心,其中定義了很多供網絡協議接口層調用設備的標準方法,該結構在2.6內核源碼樹文件中定義,下面只列出其中主要的成員。

  2.2.1全局信息及底層硬件信息

  name:網絡設備名稱,默認是以太網;

  *next:指向全局鏈表下一個設備的指針,驅動程序中不修改;

  mem_,rmem_:發送和接收緩沖區的起始,結束位置;

  base_addr,irq:網絡設備的I/O基地址,中斷號,ifconfig命令可顯示和修改;

  hard_header_len:硬件頭的長度,以太網中值為14;

  mtu:最大傳輸單元,以太網中值為1500B;

  dev_addr[MAX_ADDR_LEN]:硬件(MAC)地址長度及設備硬件地址,以太網地址長度是48bit,ether_setup會對其進行正確的設置;

  隨著人們對開放源代碼軟件熱情的日益增高,Linux作為一個功能強大而穩定的開源操作系統,越來越受到成千上萬的計算機專家和愛好者的青睞。在嵌入式領域,通過對Linux進行小型化裁剪后,使其能夠固化在容量只有幾十兆字節的存儲器芯片或單片機中,成為應用于特定場合的嵌入式Linux系統。Linux強大的網絡支持功能實現了對包括TCP/IP在內的多種協議的支持,滿足了面向21世紀的嵌入式系統應用聯網的需求。因此,在嵌入式系統開發調試時,網絡接口幾乎成為不可或缺的模塊。

  1 嵌入式Linux網絡驅動程序介紹

  Linux網絡驅動程序作為Linux網絡子系統的一部分,位于TCP/IP網絡體系結構的網絡接口層,主要實現上層協議棧與網絡設備的數據交換。Linux的網絡系統主要是基于BSD Unix的套接字(socket)機制,網絡設備與字符設備和塊設備不同,沒有對應地映射到文件系統中的設備節點。

  通常,Linux驅動程序有兩種加載方式:一種是靜態地編譯進內核,內核啟動時自動加載;另一種是編寫為內核模塊,使用insmod命令將模塊動態加載到正在運行的內核,不需要時可用rmmod命令將模塊卸載。Linux 2.6內核引入了kbuild機制,將外部內核模塊的編譯同內核源碼樹的編譯統一起來,大大簡化了特定的參數和宏的設置。這樣將編寫好的驅動模塊加入內核源碼樹,只需要修改相應目錄的Kconfig文件,把新的驅動加入內核的配置菜單,然后需要修改相應子目錄中與模塊編譯相關的Kbuild Makefile,即可使新的驅動在內核源碼樹中被編譯。在嵌入式系統驅動開發時,常常將驅動程序編寫為內核模塊,方便開發調試。調試完畢后,就可以將驅動模塊編譯進內核,并重新編譯出支持特定物理設備的Linux內核。

  2 嵌入式Linux網絡驅動程序的體系結構和實現原理

  2.1 Linux網絡設備驅動的體系結構

  如圖1所示,Linux網絡驅動程序的體系結構可劃分為4個層次。Linux內核源代碼中提供了網絡設備接口及以上層次的代碼,因此移植特定網絡硬件的驅動程序的主要工作就是完成設備驅動功能層的相應代碼,根據底層具體的硬件特性,定義網絡設備接口struct net_device類型的結構體變量,并實現其中相應的操作函數及中斷處理程序。

  

  Linux中所有的網絡設備都抽象為一個統一的接口,即網絡設備接口,通過struct net_device類型的結構體變量表示網絡設備在內核中的運行情況,這里既包括回環(loopback)設備,也包括硬件網絡設備接口。內核通過以dev_base為頭指針的設備鏈表來管理所有的網絡設備。

  2.2 net_device 數據結構

  struct net_device結構體是整個網絡驅動結構的核心,其中定義了很多供網絡協議接口層調用設備的標準方法,該結構在2.6內核源碼樹文件中定義,下面只列出其中主要的成員。

  2.2.1全局信息及底層硬件信息

  name:網絡設備名稱,默認是以太網;

  *next:指向全局鏈表下一個設備的指針,驅動程序中不修改;

  mem_,rmem_:發送和接收緩沖區的起始,結束位置;

  base_addr,irq:網絡設備的I/O基地址,中斷號,ifconfig命令可顯示和修改;

  hard_header_len:硬件頭的長度,以太網中值為14;

  mtu:最大傳輸單元,以太網中值為1500B;

  dev_addr[MAX_ADDR_LEN]:硬件(MAC)地址長度及設備硬件地址,以太網地址長度是48bit,ether_setup會對其進行正確的設置;

  2.2.2 主要的操作方法

  int (*init)(struct net_device *dev); 設備初始化和向系統注冊的函數,僅調用一次;

  int (*open)(struct net_device *dev);設備打開接口函數,當用ifconfig激活網絡設備時被調用,注冊所用的系統資源(I/O端口,IRQ,DMA等)同時激活硬件并增加使用計數;

  int (*stop)(struct net_device *dev);執行open方法的反操作;

  *hard_start_xmit;初始化數據包傳輸的函數;

  *hard_header;該函數(在hard_start_xmit前被調用)根據先前檢索到的源和目標硬件地址建立硬件頭。 eth_header是以太網類型接口的默認函數;

  2.3網絡驅動程序的編寫及實現原理

  Linux網絡系統各個層次之間的數據傳送都是通過套接字緩沖區sk_buff完成的,sk_buff數據結構是各層協議數據處理的對象。sk_buff是驅動程序與網絡之間交換數據的媒介,驅動程序向網絡發送數據時,必須從其中獲取數據源和數據長度;驅動程序從網絡上接收到數據后也要將數據保存到sk_buff中才能交給上層協議處理。

  對于實際開發以太網驅動程序,可以參照內核源碼樹中的相應模板程序,重點理解網絡驅動的實現原理和程序的結構框架,然后針對開發的特定硬件改寫代碼,實現相應的操作函數。下面結合作者利用Linux2.6.18內核在深圳優龍公司的FS2410開發板(SAMSUNG S3C2410處理器)上移植編寫嵌入式CS8900A網卡驅動程序的實例,說明網絡驅動程序的實現原理。

  2.3.1網絡設備初始化

  網絡設備的初始化是由net_device結構中的init函數實現的,內核加載網絡驅動模塊后,就會調用初始化過程。實例中初始化函數_init cs8900_probe中主要完成的工作:

  a.調用內核中通用的設置以太網接口的函數ether_setup();

  b.填充net_device結構體變量dev中其它大部分成員;

  c.調用check_mem_region()檢測I/O地址空間,然后調用request_mem_region()申請以dev-》base_addr為起始地址的16個連續的 I/O地址空間;

  d.通過cs8900_read()探測網卡CS8900A,讀取ID信息;

  e.設置CS8900A的INTRQ0作為中斷信號輸出引腳;

  f.將MAC地址寫入CS8900A的IA寄存器中;

  g.通過register_netdev()將CS8900A注冊到Linux全局網絡設備鏈表中;

  2.3.2打開(或關閉)網絡設備

  系統響應ifconfig命令時,打開(關閉)一個網絡接口。ifconfig命令開始會調用ioctl(SIOCSIFADDR)來將地址賦予接口。響應SIOCSIFADDR由內核來完成,與設備無關。接著,ifconfig命令會調用ioctl(SIOCSIFFLAGS)設置dev-》flag的IFF_UP位來打開設備,這個調用會使設備的open方法得到調用。(當ifconfig調用ioctl(SIOCSIFFLAGS)清除dev-》flag的IFF_UP位時,設備的stop方法將被調用)

  實例中利用cs8900_start()函數打開網絡設備,主要完成的工作:

  a.通過set_irq_type()向內核注冊網絡設備的中斷處理程序;

  b.通過cs8900_set()設置CS8900A網卡中各控制寄存器和配置寄存器;

  c.通過內核中netif_start_queue()函數開啟網絡接口的數據傳輸隊列;

  2.3.3網絡數據包的發送

  數據包的發送和接收是網絡驅動程序中實現的兩個最重要的任務。當網絡設備被激活時,net_device結構中的open方法被調用,它負責打開設備并調用net_device結構中的hard_header函數指針建立硬件幀頭信息。最后通過函數dev_queue_xmit()來調用net_device結構中的hard_start_xmit方法把存放在sk_buff中的數據發送到網絡物理設備。如果發送成功,則在hard_start_xmit中釋放sk_buff并返回0;如果硬件設備忙暫時無法處理,則返回1。網絡硬件在發送完數據包后會產生中斷,把dev-》tbusy置0,通知系統可以再次發送。

  實例中,hard_start_xmit方法即為網絡設備數據發送函數cs8900_send_start(),該函數實現把數據發送到以太網上,由網絡協議接口層函數dev_queue_xmit()對其調用。cs8900_send_start()中主要完成的工作:

  a.發送數據前關閉中斷,中止網絡設備的數據傳輸隊列;

  b.向CS8900A寄存器TxCMD中寫入傳送數據命令控制字,向寄存器TxLength中寫入待發送數據幀長度;

  c.通過cs8900_read()反復讀取CS8900A總線狀態寄存器BusST信息,直到其已經準備好接收來自主機的數據;

  d.調用cs8900_frame_write()將待發數據送入CS8900A的sk_buff中,硬件設備會將數據幀發送到以太網上;

  e.記錄數據幀的發送時刻,打開中斷,釋放sk_buff緩存,函數返回0;

  2.3.4網絡數據包的接收和中斷處理

  網絡設備是異步地接收外來的數據包并且主動的“請求”將硬件獲得的數據包壓入內核。網絡設備接收數據包是通過中斷實現的。對于網絡接口,接收到新數據包,發送完成或者報告錯誤信息及連接狀態等都會觸發中斷,通常中斷處理程序通過檢測硬件狀態寄存器判斷是哪種情況。

  當設備收到數據后會產生一個中斷,由硬件通知驅動程序有數據包到達。在中斷處理程序中驅動程序申請一塊sk_buff(一般定義為skb)緩沖區,然后從硬件讀出數據放到申請好的緩沖區里,接下來填充sk_buff中的部分信息:包括接收到數據的設備結構體指針填入skb-》dev;收到數據幀的類型填入skb-》protocol;把指針skb-》mac.raw指向硬件數據并丟棄硬件針頭(skb_pull);設置skb-》pkt_type,標明鏈路層數據類型。最后調用協議接口層函數netif_rx() 把接收到的數據包傳輸到網絡上層協議處理。這里,netif_rx()只是負責把數據放入工作隊列就返回,真正的處理是在中斷返回以后,這樣可減少中斷處理的時間。幾乎每個中斷處理程序的編寫都要涉及底半部機制,這樣可以保證中斷的高效處理。

  實例中數據接收函數cs8900_receive()由網絡驅動的中斷處理函數調用,主要完成如下工作:

  a.通過從I/O口讀取RxStatus和RxLength的值,確定接收數據幀的狀態信息和長度;

  b.判斷接收數據幀的狀態是否正常,若異常則記錄相關錯誤信息,然后函數返回;

  c.正常情況下,在內存中申請一塊sk_buff緩存,并將數據從CS8900A的片內存儲器傳送到sk_buff緩存中;d.從數據幀中獲取協議頭并賦給skb-》protocol;

  e.通過調用netif_rx()函數將接收到的數據送往上層協議棧進行處理;

  f.記錄接收數據的時間并更新統計信息;

  3將設備驅動模塊編譯進內核

  設計好模塊化的網絡驅動程序后,我們就可以編譯這個內核模塊,并將這個自定義的內核模塊作為Linux系統源碼的一部分編譯出新的系統。下面介紹的內容均在Linux2.6.18內核上編譯通過,可以在2.6.x版本內核中通用。如前所述,由于Linux2.6內核引入了kbuild的新機制,使得編譯新的內核模塊或者將自己編寫的內核模塊集成到內核源碼中都變得非常簡單了。

  Linux2.6內核中,編譯內核模塊首先要在/usr/src下正確配置和構造內核源碼樹,即把需要版本的內核源碼解壓在/usr/src/,并在內核源碼的主目錄下(這里為/usr/src/linux-2.6.18.3),使用make menuconfig或者make gconfig命令配置內核,然后使用make all完整編譯內核。

  下面以作者開發的CS8900A網卡驅動為實例,介紹如何將網絡設備驅動模塊編譯進內核。

  a.在系統源碼樹drivers目錄下創建新目錄Cs8900;

  b.將編寫好的文件cs8900.c和cs8900.h拷貝到drivers/Cs8900目錄下;

  c.在drivers/Cs8900目錄下,編寫Makefile文件:

 ?。akefile for CS8900A Network Driver

  obj -$(CONFIG_DRIVER_CS8900A) +=cs8900.o

  d.在drivers/Cs8900目錄下,編寫Kconfig文件:

 ?。ust for CS8900A Network Interface

  menu “CS8900A Network Interface support”

  config DRIVER_CS8900A

  tristate “CS8900A support”

  --------help--------

  This is a network driver module for CS8900A.

  endmenu

  e.在driver目錄下的Kconfig文件endmenu語句前,加入一行:

  source “drivers/Cs8900/Kconfig”

  這樣在內核源碼樹的主目錄下,通過make menuconfig或者make gconfig命令就可以在Device Drivers選項的下面找到CS8900A Network Interface support選項,并找到CS8900A support的選擇菜單,它有三種狀態:未選中(不編譯)、選中(M)一編譯為模塊、選中(*)一編譯為新系統一部分。

  重新編譯內核即可得到支持CS8900A網卡的內核,然后將內核下載到FS2410的開發板上,通過配置網絡參數,就可以測試網卡驅動程序的行為了。

  4 結束語

  在這個信息爆炸的時代,人們對于網絡的需求愈發強烈,越來越多的嵌入式設備都需要具有以太網的接入功能,因此開發網絡驅動程序對于很多嵌入式產品的研發至關重要。具體開發嵌入式Linux網絡驅動程序時,可以參照內核中已經支持的網絡驅動源代碼,在重點理解Linux網絡驅動實現原理的基礎上,按照模塊設計較為固定的開發模式,結合具體物理設備的硬件手冊,移植編寫需要的模塊化的網絡驅動程序。

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          99精品国产在热久久婷婷| 久久夜色精品国产欧美乱| 亚洲一二区在线| 亚洲乱码国产乱码精品精| 亚洲免费在线视频一区 二区| 99在线热播精品免费| 99精品国产福利在线观看免费| 久久国内精品视频| 欧美视频在线一区二区三区| 久久综合狠狠综合久久综青草| 欧美日韩国产欧美日美国产精品| 亚洲人成绝费网站色www| 国产精品欧美激情| 久久国产成人| 久久不见久久见免费视频1| 欧美精品国产一区| 一区二区三区精品视频在线观看| 一区二区三区偷拍| 国产精品美女久久久久久久| 黄色亚洲在线| 亚洲在线免费观看| 亚洲精品小视频| 国产综合色在线视频区| 一区免费视频| 国产欧美精品日韩| 久久在线播放| 亚洲麻豆一区| 欧美一区二区三区免费看| 欧美中文在线免费| 欧美国产高潮xxxx1819| 欧美日韩日日夜夜| 久久精品国产第一区二区三区| 免费久久精品视频| 午夜国产精品视频免费体验区| 欧美日韩高清在线| 韩国av一区二区三区| 亚洲视频在线一区观看| 久久精品二区| 国产一区二区精品久久91| 欧美视频一区二区三区四区| 国产精品欧美风情| 久久精品一区二区三区中文字幕| 欧美精品九九99久久| 激情亚洲网站| 一区二区欧美日韩| 一区二区冒白浆视频| 国产精品qvod| 欧美激情视频一区二区三区不卡| 亚洲免费在线精品一区| 国产精品久久久久国产精品日日| 久久久久国产一区二区三区| 欧美一级片久久久久久久| 一区二区在线视频| 欧美视频一区| 午夜精品久久99蜜桃的功能介绍| 亚洲精品日韩综合观看成人91| 久久综合九色九九| 久久综合五月天婷婷伊人| 一色屋精品亚洲香蕉网站| 国产精品推荐精品| 性欧美xxxx大乳国产app| 在线看国产一区| 国产精品成人久久久久| 国产伦精品一区二区三| 亚洲一区精品视频| 一区二区免费在线观看| 亚洲国产va精品久久久不卡综合| 噜噜爱69成人精品| 亚洲国产精品美女| 欧美日韩综合不卡| 日韩一级黄色大片| 欧美精品18+| 欧美日韩在线免费视频| 亚洲国产精品久久久久婷婷老年| 亚洲欧美日产图| 国内一区二区在线视频观看| 美日韩精品免费| 久久综合久久88| 亚洲黄色有码视频| 日韩午夜在线电影| 99视频+国产日韩欧美| 亚洲在线播放| 国产精品久久久99| 欧美午夜电影完整版| 国产精品chinese| 美女主播视频一区| 国产精品99久久久久久久vr| 在线不卡欧美| 久久精品欧美日韩| 欧美成人精品一区二区| 国产精品一区二区男女羞羞无遮挡| 欧美一区二区日韩一区二区| 亚洲第一区中文99精品| 欧美在线网站| 欧美日韩大片| 国产日韩欧美综合| 亚洲小说春色综合另类电影| 国产一区在线播放| 国产在线欧美日韩| 正在播放欧美一区| 国产精品三上| 久久久久九九九| 在线视频欧美精品| 国产精品视频精品| 欧美人与禽猛交乱配| 欧美成人在线免费观看| 亚洲国产精品成人综合色在线婷婷| 久久久久九九九九| 久久久不卡网国产精品一区| 欧美一区二区三区久久精品茉莉花| 亚洲欧美在线观看| 开元免费观看欧美电视剧网站| 国产日韩精品综合网站| 亚洲美女精品成人在线视频| 亚洲特级片在线| 欧美日韩精品综合在线| 亚洲国产色一区| 欧美成人精品福利| 国产精品日韩欧美| 久久天天躁夜夜躁狠狠躁2022| 国产精品一页| 精品99一区二区| 久久亚洲捆绑美女| 欧美成人一区二免费视频软件| 亚洲激情在线| 久久精品人人爽| 欧美在线日韩| 国产精品久久久久aaaa九色| 另类图片国产| 久久久水蜜桃av免费网站| 欧美精品一区二区三区很污很色的| 亚洲欧洲一区二区在线播放| 在线观看免费视频综合| 欧美电影在线观看完整版| 亚洲第一天堂av| 欧美制服第一页| 久久国产主播精品| 狠狠色综合日日| 午夜精品成人在线视频| 午夜视黄欧洲亚洲| 欧美精品二区三区四区免费看视频| 亚洲国产日韩一区| 亚洲一级在线观看| 国产欧美日韩精品在线| 亚洲剧情一区二区| 最新国产拍偷乱拍精品| 久久精品99久久香蕉国产色戒| 好看不卡的中文字幕| 亚洲一区二区高清| 激情综合色综合久久综合| 国产一区二区久久| 一区二区三区欧美亚洲| 黄色亚洲大片免费在线观看| 亚洲成人在线观看视频| 亚洲国产精品专区久久| 亚洲在线观看| 免费日本视频一区| 久久九九热免费视频| 在线视频观看日韩| 亚洲五月六月| 欧美亚洲系列| 久久精品夜色噜噜亚洲aⅴ| 久久久国际精品| 欧美日韩精品一区二区三区| 艳妇臀荡乳欲伦亚洲一区| 在线观看视频亚洲| 国产精品老牛| 99国产精品国产精品毛片| 国产色综合久久| 国产三级欧美三级| 欧美精品日韩www.p站| 久久综合久久综合九色| 久久精品99无色码中文字幕| 国产午夜精品视频| 亚洲国产精品123| 欧美日韩精品一区二区三区四区| 亚洲免费av电影| 欧美大片在线观看| 亚洲视频一区二区| 亚洲裸体俱乐部裸体舞表演av| 国产美女精品| 亚洲精品一区二区三区99| 久久激情五月丁香伊人| 国产一区二区丝袜高跟鞋图片| 免费观看日韩| 久久躁狠狠躁夜夜爽| 欧美sm重口味系列视频在线观看| 国产在线观看精品一区二区三区| 夜夜精品视频一区二区| 91久久极品少妇xxxxⅹ软件| 久久天天狠狠| 欧美日韩日本视频| 国语自产精品视频在线看抢先版结局| 亚洲午夜激情在线| 国产日韩精品在线观看| 久久国产主播精品| 米奇777超碰欧美日韩亚洲| 久久人体大胆视频| 久久国产欧美日韩精品| 欧美成人精品一区| 欧美在线地址| 久久综合色天天久久综合图片| 免费一级欧美片在线播放| 久久高清国产| 欧美一区二区视频在线观看| 国产精品国产三级国产aⅴ9色| 国产精品亚洲第一区在线暖暖韩国| 亚洲午夜小视频| 国产一区久久久| 国模叶桐国产精品一区| 欧美麻豆久久久久久中文| 国产午夜精品久久| 午夜欧美精品久久久久久久| 国产日韩精品综合网站| 亚洲国产天堂久久国产91| 欧美午夜在线| 亚洲自拍偷拍网址| 日韩视频一区| 亚洲一级在线观看| 亚洲欧美在线x视频| 欧美黄在线观看| 麻豆精品精品国产自在97香蕉| 国产一区二区三区四区在线观看| 亚洲国产精品www| 亚洲图片自拍偷拍| 亚洲欧美另类综合偷拍| 国产精品久久婷婷六月丁香| 欧美日韩福利视频| 一区在线免费| 免费91麻豆精品国产自产在线观看| 91久久精品国产91性色| 美女脱光内衣内裤视频久久影院| 欧美成人中文字幕在线| 国产精品麻豆欧美日韩ww| 中文网丁香综合网| 欧美成人精品在线播放| 久久久水蜜桃av免费网站| 99精品久久| 欧美视频中文一区二区三区在线观看| 亚洲一二区在线| 亚洲第一搞黄网站| 欧美国产日本在线| 国产精品久久久久77777| 欧美**人妖| 在线日本高清免费不卡| 国产日本欧美在线观看| 国产精品一区一区三区| 销魂美女一区二区三区视频在线| 欧美人与性动交a欧美精品| 亚洲高清视频在线观看| 欧美资源在线观看| 欧美日韩亚洲一区二区三区在线| 国产欧美日韩视频一区二区三区| 91久久精品国产91性色| 亚洲欧美日韩国产综合| 久久亚洲春色中文字幕久久久| 99re这里只有精品6| 亚洲精品日韩欧美| 中文亚洲欧美| 欧美a级理论片| 国产精品综合色区在线观看| 国产精品美女久久久免费| 欧美专区第一页| 欧美日韩亚洲国产一区| 欧美久久久久久蜜桃| 在线观看日韩www视频免费| 欧美日韩亚洲综合在线| 欧美日韩综合| 亚洲综合色自拍一区| 欧美三级午夜理伦三级中视频| 国产精品日日做人人爱| 中文精品视频一区二区在线观看| 久久成人这里只有精品| 欧美激情亚洲国产| 国产一二三精品| 欧美天堂亚洲电影院在线播放| 亚洲国产精品ⅴa在线观看| 亚洲欧美视频一区| 一区二区欧美日韩视频| 葵司免费一区二区三区四区五区| 欧美午夜精品久久久久久浪潮| 午夜在线视频观看日韩17c| 亚洲人成网站777色婷婷| 午夜视频一区在线观看| 欧美尤物一区| 欧美成人福利视频| 欧美黄免费看| 一区在线播放视频| 国户精品久久久久久久久久久不卡| 午夜一区二区三视频在线观看| 国产自产2019最新不卡| 欧美一区永久视频免费观看| 国产精品欧美风情| 免费不卡欧美自拍视频| 欧美在线免费播放| 久久婷婷国产麻豆91天堂| 中文欧美日韩| 亚洲成人中文| 欧美日韩亚洲综合在线| 欧美日精品一区视频| 在线观看亚洲精品| 午夜老司机精品| 在线观看日韩精品| 在线视频你懂得一区二区三区| 国产精品美女久久久久aⅴ国产馆| 日韩一级免费| 国产精品无码专区在线观看| 久久久久九九九| 久久人人爽人人爽| 在线精品国产成人综合| 亚洲精选91| 欧美日韩国产一区| 一区二区亚洲精品国产| 亚洲国产一区二区三区在线播| 艳女tv在线观看国产一区| 欧美精品久久天天躁| 久久亚洲欧洲| 欧美精品七区| 久久久国产精品一区| 亚洲黄色高清| 国产精品私拍pans大尺度在线| 欧美日韩国产另类不卡| 久久精品日韩一区二区三区| 欧美视频免费| 亚洲毛片在线| 国产精品夫妻自拍| 亚洲一级网站| 亚洲精品裸体|