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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

網(wǎng)絡(luò)驅(qū)動(dòng)程序編程要點(diǎn)

編寫(xiě) Windows 2000 的任何網(wǎng)絡(luò)驅(qū)動(dòng)程序時(shí)通常都需要考慮的幾點(diǎn)問(wèn)題

1 可移植性

2 多處理器支持

3 IRQLs

4 同步和指示

5 包結(jié)構(gòu)

6 使用共享內(nèi)存

7 異步I/O和完成函數(shù)

?

1. 可移植性

NDIS 驅(qū)動(dòng)程序應(yīng)很容易在支持 Windows 2000 的平臺(tái)間移植。一般說(shuō)來(lái),從一個(gè)硬件平臺(tái)移植到另一個(gè)平臺(tái)只需要將它在兼容系統(tǒng)的編譯中重新編譯即何。

驅(qū)動(dòng)程序開(kāi)發(fā)者應(yīng)當(dāng)避免調(diào)用與操作系統(tǒng)相關(guān)的函數(shù),因?yàn)檫@將使他們的驅(qū)動(dòng)程序不可移植。應(yīng)用 NDIS 函數(shù)替換這些調(diào)用,只調(diào)用 NDIS 函數(shù)將使代碼在支持 NDIS 的微軟操作系統(tǒng)中可移植, NDIS 為編寫(xiě)驅(qū)動(dòng)程序提供了很多支持函數(shù),并且直接調(diào)用操作系統(tǒng)是不需要的。

驅(qū)動(dòng)程序應(yīng)用 C 來(lái)編寫(xiě)。更近一步,驅(qū)動(dòng)程序代碼應(yīng)當(dāng)限制在 ANSI C 標(biāo)準(zhǔn)并且應(yīng)當(dāng)避免使用不被其他兼容系統(tǒng)編譯器支持的語(yǔ)言特性。驅(qū)動(dòng)程序代碼編寫(xiě)不應(yīng)當(dāng)使用任何 ANSI C 標(biāo)準(zhǔn)指明為“ implementation defined” 的特性來(lái)編寫(xiě)。

驅(qū)動(dòng)程序應(yīng)當(dāng)避免使用任何在不同平臺(tái)上大小和結(jié)構(gòu)變化的數(shù)據(jù)類型,驅(qū)動(dòng)程序代碼不應(yīng)該調(diào)用任何 C 的運(yùn)行時(shí)庫(kù)函數(shù),而是限于調(diào)用 NDIS 提供的函數(shù)。

在內(nèi)核模式下漂移指針是不允許的。試圖運(yùn)行這樣的操作將是一個(gè)致命的錯(cuò)誤。

如果驅(qū)動(dòng)程序代碼要支持特殊平臺(tái)的特性,那么這些代碼應(yīng)當(dāng)包含在 #ifdef #endif 聲明之間。

2 . 多處理器支持

編寫(xiě)的代碼應(yīng)當(dāng)可以在多處理器系統(tǒng)中安全運(yùn)行。這對(duì)于編寫(xiě)可移植的 Windows 2000 驅(qū)動(dòng)程序是很重要的。一個(gè)網(wǎng)絡(luò)驅(qū)動(dòng)程序必須使用 NDIS 函數(shù)庫(kù)提供的多處理器安全保證。

在單處理器環(huán)境下,在一個(gè)時(shí)刻單處理器只運(yùn)行一條機(jī)器指令,既使這樣,當(dāng)包到達(dá)或時(shí)間中斷發(fā)生時(shí),對(duì)于NIC或其他設(shè)備執(zhí)行的中斷也可能發(fā)生。典型的,當(dāng)正在操縱數(shù)據(jù)結(jié)構(gòu)時(shí),例如它的隊(duì)列時(shí),驅(qū)動(dòng)程序?qū)?span lang="EN-US">NIC發(fā)出停用中斷來(lái)操縱數(shù)據(jù),隨后再發(fā)生可用中斷。許多線程在單處理器環(huán)境下表現(xiàn)的好像是在同一時(shí)刻運(yùn)行的,但是實(shí)際上它們卻是在獨(dú)立的時(shí)間片上運(yùn)行的。

在多處理器環(huán)境下,處理器同時(shí)可運(yùn)行多條機(jī)器指令,一個(gè)驅(qū)動(dòng)程序必須異步化,這使得當(dāng)一個(gè)驅(qū)動(dòng)程序函數(shù)正在操縱一個(gè)數(shù)據(jù)結(jié)構(gòu)時(shí),同樣的在其他處理器運(yùn)行的驅(qū)動(dòng)程序函數(shù)不能修改共享的數(shù)據(jù)。在一個(gè)SMP機(jī)器中,所有的驅(qū)動(dòng)程序代碼都要重新裝入,為了消除這種資源保護(hù)問(wèn)題,Windows 2000驅(qū)動(dòng)程序使用自旋鎖。

3. IRQL

所有 NDIS 調(diào)用的驅(qū)動(dòng)程序函數(shù)都運(yùn)行在系統(tǒng)決定的 IRQL 下, PASSIVE_LEVEL<DLSPATCH_LEVEL<DIRQL 中的一個(gè)。例如,一個(gè)微端口初始化函數(shù)、掛起函數(shù)、重啟函數(shù)和有時(shí)的關(guān)閉函數(shù)通常都運(yùn)行在 PASSIVE_LEVEL 下。中斷代碼運(yùn)行在 DIRQL 下,所以 NDIS 中層或協(xié)議驅(qū)動(dòng)程序從不運(yùn)行在 DIRQL 下。所有其他的 NDIS 驅(qū)動(dòng)程序函數(shù)運(yùn)行在 IRQL<=DISPATCH_LEVEL 下。

驅(qū)動(dòng)程序函數(shù)運(yùn)行于的 IRQL 將影響調(diào)用什么樣的 NDIS 函數(shù)。特定的函數(shù)只可在 IRQL PASSIVE_LEVEL 下調(diào)用,其他的函數(shù)可在 DISPATCH_LEVEL 或更低層調(diào)用。一個(gè)驅(qū)動(dòng)程序的編寫(xiě)者應(yīng)當(dāng)檢查每一個(gè) NDIS 函數(shù)的 IRQL 限制。

任何與驅(qū)動(dòng)程序的 ISR 共享資源的驅(qū)動(dòng)程序函數(shù)必須能將它的 IRQL 升級(jí)到 DTRQL 來(lái)防止?fàn)幱们闆r的發(fā)生, NDIS 提供了這種機(jī)質(zhì)。

4. 同步和指示

當(dāng)兩個(gè)線程共享可被同時(shí)訪問(wèn)的資源時(shí),無(wú)論是單處理機(jī)還是 SMP ,同步是必須的。例如,對(duì)于一個(gè)單處理機(jī),如果一個(gè)驅(qū)動(dòng)程序正在訪問(wèn)一個(gè)共享資源時(shí),被一個(gè)運(yùn)行在更高 IRQL (例如 ISR )的函數(shù)中斷時(shí),必須保護(hù)共享資源以阻止這種爭(zhēng)用的發(fā)生而使資源處于不確定狀態(tài)。在一個(gè) SMP 中,兩個(gè)線程可以在同一時(shí)刻運(yùn)行,在不同處理器上并且試圖來(lái)修改同一數(shù)據(jù)的訪問(wèn)必須同步。

NDIS 提供了自旋鎖可以用來(lái)對(duì)在同一 IRQL 下運(yùn)行的線程間訪問(wèn)共享資源實(shí)現(xiàn)同步。當(dāng)兩個(gè)線程在不同 IRQL 下訪問(wèn)共享資源時(shí), NDIS 提供了一種機(jī)制來(lái)臨時(shí) 高低 IRQL 代碼的 IRQL ,以使得訪問(wèn)共享資源串行化。

??? NDIS提供下面四種機(jī)制來(lái)保證同步:

自旋鎖

自旋鎖提供了一個(gè)用來(lái)保護(hù)共享資源的同步機(jī)制,這種資源是單處理器或一個(gè)多處理機(jī)下的、運(yùn)行在 IRQL>PASSIVE_LEVEL 下的、內(nèi)核模式中的線程所共享使用的。一個(gè)自旋鎖在同時(shí)運(yùn)行在一個(gè) SMP 機(jī)上不同的執(zhí)行線程之間提供同步。一個(gè)線程在訪問(wèn)保護(hù)資源前獲得一個(gè)自旋鎖。自旋鎖使得任務(wù)線程中只有持有自旋鎖的線程可使用資源。一個(gè)等待自旋鎖的線程將在試圖獲得鎖時(shí)間內(nèi)循環(huán),直到持有鎖的線程釋放為止。

??? 自旋鎖還存在著一個(gè)不太明顯但很重要的事實(shí):你僅能在低于或等于 DISPATCH_LEVEL 級(jí)上請(qǐng)求自旋鎖,在你擁有自旋鎖期間,內(nèi)核將把你的代碼提升到 DISPATCH_LEVEL 級(jí)上運(yùn)行。在內(nèi)部,內(nèi)核能在高于 DISPATCH_LEVEL 的級(jí)上獲取自旋鎖,但你和我都做不到這一點(diǎn)。 當(dāng) KeAcquireSpinLock 獲取自旋鎖時(shí),它會(huì)把 IRQL 提升到 DISPATCH_LEVEL 級(jí)上。當(dāng) KeReleaseSpinLock 釋放自旋鎖時(shí),它會(huì)把 IRQL 降低到原來(lái)的 IRQL 級(jí)上。如果你知道代碼已經(jīng)處在 DISPATCH_LEVEL 級(jí)上,你可以調(diào)用兩個(gè)專用函數(shù)來(lái)獲取自旋鎖。 KeAcquireSpinLockAtDpcLevel KeReleaseSpinLockFromDpcLevel 。一個(gè)編寫(xiě)很好的網(wǎng)絡(luò)驅(qū)動(dòng)程序應(yīng)該會(huì)減少自旋鎖持有的時(shí)間。

??? 一個(gè)典型的使用自旋鎖的例子是保護(hù)一個(gè)隊(duì)列。例如,微端口發(fā)送函數(shù)MiniportSend將協(xié)議驅(qū)動(dòng)程序傳來(lái)的包進(jìn)行排隊(duì)。因?yàn)槠渌?qū)動(dòng)程序函數(shù)也使用這個(gè)隊(duì)列,MiniportSend必須用一個(gè)自旋鎖保護(hù)這個(gè)隊(duì)列使得在一個(gè)時(shí)刻只有一個(gè)線程可操縱這個(gè)隊(duì)列。Miniport Send獲得自旋鎖,添加包到隊(duì)列后釋放自旋鎖。使用自旋鎖保證持鎖線程是唯一修改隊(duì)列的線程,同時(shí)使得包被安全地添加到隊(duì)列中。當(dāng)NIC驅(qū)動(dòng)程序從隊(duì)列中取走包時(shí),通過(guò)同樣的自旋鎖保護(hù)這個(gè)訪問(wèn)。當(dāng)執(zhí)行指令修改隊(duì)列頭或任何隊(duì)列組成域時(shí),驅(qū)動(dòng)程序必須用自旋鎖保護(hù)隊(duì)列。

避免死鎖問(wèn)題

Windows 2000 并不限制網(wǎng)絡(luò)驅(qū)動(dòng)程序同時(shí)持有多于一個(gè)的自旋鎖。但是,驅(qū)動(dòng)程序的某部分在持有自旋鎖 B 時(shí),試圖獲得自旋鎖 A ,并且其他部分在持有鎖 A 時(shí),試圖獲得自旋鎖 B 時(shí),死鎖就會(huì)發(fā)生。如果要獲得多于一個(gè)的自旋鎖,驅(qū)動(dòng)程序應(yīng)當(dāng)通過(guò)強(qiáng)制以某一順序獲得鎖來(lái)避免死鎖,這就是說(shuō),如果一個(gè)驅(qū)動(dòng)程序強(qiáng)制在獲得自旋鎖 A 之后才可獲得鎖 B ,那么上述情況就不會(huì)發(fā)生。

總得來(lái)說(shuō),使用自旋鎖將對(duì)系統(tǒng)性能帶來(lái)負(fù)面效應(yīng),所以驅(qū)動(dòng)程序不應(yīng)當(dāng)使用許多鎖。

時(shí)鐘

時(shí)鐘被用來(lái)輪詢或進(jìn)行超時(shí)操作的。一個(gè)驅(qū)動(dòng)程序可以產(chǎn)生一個(gè)時(shí)鐘并與一個(gè)函數(shù)關(guān)聯(lián)上。當(dāng)一個(gè)特定周期時(shí)鐘期滿時(shí),調(diào)用相關(guān)函數(shù)。時(shí)鐘可以是一次的或周期性的,一但設(shè)置了一個(gè)周期時(shí)鐘,當(dāng)每個(gè)周期結(jié)束時(shí)都會(huì)觸發(fā),直到它被完全清除掉為止。一次性時(shí)鐘在觸發(fā)后必須重新設(shè)置。

時(shí)鐘通過(guò)調(diào)用 NdisMInitializeTimer 來(lái)產(chǎn)生和初始化,并且通過(guò)調(diào)用 NdisMsetTimer 來(lái)設(shè)置,也可調(diào)用 NdisMsetPeriodicTimer 設(shè)置周期時(shí)鐘。如果使用了一個(gè)非周期時(shí)鐘,那么通過(guò)調(diào)用 NdisMSetPeriodicTimer 重新設(shè)置時(shí)鐘。通過(guò)調(diào)用 NdisMCancelTimer 可以清除時(shí)鐘。

事件

事件在兩個(gè)執(zhí)行線程之間實(shí)現(xiàn)同步操作。一個(gè)事件通過(guò)一個(gè)驅(qū)動(dòng)程序裝入并且通過(guò)調(diào)用 NdisInitializeEvent 初始化。一個(gè)運(yùn)行在 IRQL PASSIVE_LEVEL 下的線程調(diào)用 NdisWaitEvent 來(lái)將自身轉(zhuǎn)入等侯狀態(tài)。當(dāng)一個(gè)驅(qū)動(dòng)程序線程等待一個(gè)事件時(shí),它指定了最大等待時(shí)間即等待事件的時(shí)間。當(dāng)調(diào)用 NdisSetEvent 使時(shí)間得到信號(hào)量,或最大等待時(shí)間段結(jié)束時(shí),它們兩個(gè)無(wú)論是誰(shuí)先發(fā)生時(shí)都將結(jié)束線程等待狀態(tài)。

典型的,事件是通過(guò)相互協(xié)調(diào)的線程調(diào)用 NdisSetEvent 來(lái)設(shè)置的。事件被創(chuàng)建時(shí)是沒(méi)有信號(hào)量的,但為了指示等待線程,它必須要設(shè)置信號(hào)量,事件將一直處于保持有信號(hào)狀態(tài),直到 NdiResetEvent 調(diào)用后為止。

5. 包結(jié)構(gòu)

通過(guò)一個(gè)協(xié)議驅(qū)動(dòng)程序可以分配NDIS包、填充數(shù)據(jù),并且將它傳遞到下層的NDIS驅(qū)動(dòng)程序,以便將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上。一些最底層的NIC驅(qū)動(dòng)程序分配包用來(lái)保存接收到的數(shù)據(jù),并將包傳遞到對(duì)應(yīng)的高層驅(qū)動(dòng)程序。有時(shí),一個(gè)協(xié)議驅(qū)動(dòng)程序分配一個(gè)包,并且通過(guò)一個(gè)請(qǐng)求將它傳給NIC驅(qū)動(dòng)程序,以使NIC驅(qū)動(dòng)程序?qū)⒔邮盏降臄?shù)據(jù)拷貝到提供的包中。NDIS提供函數(shù)用來(lái)分配和操縱構(gòu)成包的子結(jié)構(gòu)。

包描述符

Flags physicallPageCount

ToralLenth FirstBuffer P

緩存描述符:

StartVirtualAddress P

ByteOffset ByteCount PhysicalPage [] Next P....

?

緩存

?

緩存描述符:

StartVirtualAddress P

ByteOffset ByteCount PhysicalPage [] Next P....

?

虛擬內(nèi)存

虛擬頁(yè)

虛擬頁(yè)

虛擬頁(yè)

虛擬頁(yè)

虛擬頁(yè)

物理內(nèi)存

物理頁(yè)

物理頁(yè)

物理頁(yè)

物理頁(yè)

物理頁(yè)


1NDIS包結(jié)構(gòu)

具體詳情可以參考:http://www.ndis.com/papers/ndispacket/ndispacket1.htm

6 . 使用共享內(nèi)存

??? 用作總線管理DMA設(shè)備的微端口驅(qū)動(dòng)程序必須為NICNIC驅(qū)動(dòng)程序分配共享內(nèi)存。當(dāng)在一個(gè)驅(qū)動(dòng)程序和它的NIC之間共享cache時(shí),特別的預(yù)防是必須的。在某種結(jié)構(gòu)下,必須采取特別步驟來(lái)保證內(nèi)存一致,因?yàn)?span lang="EN-US">NIC可以直接訪問(wèn)共享的物理內(nèi)存,而NIC驅(qū)動(dòng)程序卻要通過(guò)cache訪問(wèn)內(nèi)存。這就引起驅(qū)動(dòng)程序和NIC訪問(wèn)內(nèi)存的不同,即使它們看起來(lái)在同一位置。

7. 異步I/O和完成函數(shù)

因?yàn)樵谝恍┚W(wǎng)絡(luò)操作中有繼承的因素,許多由 NIC 驅(qū)動(dòng)程序提供的上層函數(shù)和協(xié)議驅(qū)動(dòng)程序提供的下層函數(shù)被設(shè)計(jì)成支持異步操作,而不是用 CPU 消耗一定時(shí)間的循環(huán)來(lái)等待一個(gè)任務(wù)的完成或硬件事件的指示,網(wǎng)絡(luò)驅(qū)動(dòng)程序依賴處理許多異步操作的能力。

通過(guò)使用完成函數(shù)來(lái)支持異步網(wǎng)絡(luò) I/O 。以下的例子將說(shuō)明網(wǎng)絡(luò)的 send 操作如何使用一個(gè)完成函數(shù),同樣的機(jī)制也存在一個(gè)協(xié)議或 NIC 驅(qū)動(dòng)程序的其他操作中。

當(dāng)協(xié)議驅(qū)動(dòng)程序調(diào)用 NDIS 發(fā)送一個(gè)包時(shí), NDIS 調(diào)用 NIC 驅(qū)動(dòng)程序的 MiniportSend 函數(shù)發(fā)送請(qǐng)求, NIC 驅(qū)動(dòng)程序試圖立即完成這個(gè)請(qǐng)求并且返回一個(gè)恰當(dāng)?shù)臓顟B(tài)值。對(duì)于 步操作,可能返回 NDIS_STATUS_SUCCESS 作為發(fā)送成功的標(biāo)志, NDIS_STATUS_RESOURCES NDIS_STATUS_FAILURE 表明有某些失敗。

但是一個(gè)發(fā)送操作要花費(fèi)一些時(shí)間來(lái)完成,此時(shí) NIC 驅(qū)動(dòng)程序 ( NDIS) 可將包排隊(duì)并且等侯 NIC 指示發(fā)送操作的結(jié)果。 NIC 驅(qū)動(dòng)程序的 MiniportSend 函數(shù)可以通過(guò)返回一個(gè) NDIS_STATUS_PENDING 的狀態(tài)值來(lái)異步處理這個(gè)操作,當(dāng) NIC 驅(qū)動(dòng)程序完成了發(fā)送操作后,包調(diào)用完成函數(shù) NdisMSendComplete 在調(diào)用中傳遞指向一個(gè)已被發(fā)送的包的描述符的指針。這個(gè)信息會(huì)傳給協(xié)議驅(qū)動(dòng)程序,指示完成了操作。

許多需要一定時(shí)間來(lái)完成的驅(qū)動(dòng)程序操作用完成數(shù)來(lái)完成支持異步的操作。這種函數(shù)有同一形式的名字 NidisMXxxComplete 。不僅可用于發(fā)送和接收函數(shù),完成函數(shù)也可用于查詢、配置、重新設(shè)置硬件、狀態(tài)指示、指示收到數(shù)據(jù)和傳送收到數(shù)據(jù)。

?

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区播放| 日韩亚洲精品电影| 鲁大师影院一区二区三区| 欧美主播一区二区三区| 国产亚洲一本大道中文在线| 欧美中文字幕视频| 性一交一乱一区二区洋洋av| 国产一区二区成人| 久久久久久伊人| 久久精品91| 亚洲国产精品va在线看黑人动漫| 欧美福利视频在线观看| 男男成人高潮片免费网站| 亚洲人成网站色ww在线| 亚洲人成网在线播放| 欧美日韩高清一区| 亚洲一区欧美| 亚洲欧美精品伊人久久| 国产一区二区三区在线观看网站| 久久综合久色欧美综合狠狠| 狂野欧美一区| 99热免费精品在线观看| 夜夜狂射影院欧美极品| 国产精品一区免费视频| 久久精品一级爱片| 久久综合影音| 日韩一级网站| 亚洲一区二区三区午夜| 国产一区日韩欧美| 欧美成人精品在线播放| 欧美人成免费网站| 小嫩嫩精品导航| 久久久久久高潮国产精品视| 亚洲精品四区| 亚洲一卡久久| 一区二区在线视频| 亚洲精品日韩久久| 国产精品一区二区女厕厕| 蜜桃av一区| 欧美日韩国产三区| 久久精品99国产精品日本| 久久午夜精品| 亚洲婷婷免费| 久久狠狠婷婷| 日韩网站在线观看| 午夜精品久久久久久久久| 亚洲国产精品999| 一区二区欧美激情| 今天的高清视频免费播放成人| 亚洲二区在线| 国产精品嫩草久久久久| 蜜月aⅴ免费一区二区三区| 欧美日韩和欧美的一区二区| 久久国产精彩视频| 欧美不卡视频一区| 欧美一进一出视频| 欧美/亚洲一区| 亚洲欧美日韩爽爽影院| 老司机aⅴ在线精品导航| 亚洲线精品一区二区三区八戒| 久久久国产亚洲精品| 在线中文字幕一区| 久久国产免费| 亚洲影视在线播放| 久久综合影音| 欧美在线首页| 欧美日韩亚洲系列| 女生裸体视频一区二区三区| 国产精品日韩欧美综合 | 欧美国产精品日韩| 欧美在线啊v一区| 欧美精品一区二区三区蜜桃| 久久久久国产一区二区| 欧美日韩亚洲免费| 欧美国产在线观看| 国产欧美综合在线| 亚洲精选久久| 亚洲国产岛国毛片在线| 亚洲欧美日韩中文播放| 一区二区精品国产| 久久一区二区三区超碰国产精品| 欧美一区二区在线免费观看| 欧美激情一区二区在线| 久久视频在线免费观看| 国产精品盗摄一区二区三区| 欧美岛国在线观看| 国产色爱av资源综合区| 夜夜嗨av一区二区三区中文字幕| 亚洲黄色成人网| 香蕉久久一区二区不卡无毒影院| 亚洲午夜高清视频| 欧美成人一区在线| 美女脱光内衣内裤视频久久网站| 国产精品一区二区你懂得| 亚洲精品看片| 亚洲国产mv| 久久精品毛片| 久久激情综合网| 国产精品美女久久久浪潮软件 | 欧美一区成人| 午夜精品久久久久久久白皮肤| 欧美华人在线视频| 欧美激情视频一区二区三区在线播放| 国产一在线精品一区在线观看| 亚洲综合色丁香婷婷六月图片| 在线综合视频| 欧美日韩久久精品| 亚洲精品1234| 亚洲精品在线免费| 欧美成人在线免费观看| 欧美激情精品久久久久久| 亚洲国产成人av| 久久美女性网| 欧美成人午夜激情| 尤物网精品视频| 久久久久青草大香线综合精品| 久久美女艺术照精彩视频福利播放| 国产欧美精品一区aⅴ影院| 亚洲视频网站在线观看| 亚洲欧美日本国产有色| 国产精品户外野外| 亚洲一二三区精品| 羞羞色国产精品| 国产精品一区在线观看| 亚洲一区精品电影| 欧美亚洲系列| 国产性天天综合网| 久久都是精品| 久久久久久亚洲精品不卡4k岛国| 国产一区免费视频| 久久精品一本| 欧美91大片| 亚洲精品在线观| 欧美日韩国产精品专区| 一区二区三区福利| 欧美一区二区在线免费观看| 国产婷婷一区二区| 久久久亚洲人| 欧美黄污视频| 中文无字幕一区二区三区| 欧美午夜电影一区| 午夜精品免费| 久久综合国产精品台湾中文娱乐网| 亚洲成人在线| 欧美成人一区二区三区| 日韩网站免费观看| 欧美一级黄色网| 经典三级久久| 欧美高清在线一区| 99国产精品久久久久久久| 欧美一区二区三区的| 韩国v欧美v日本v亚洲v| 麻豆国产va免费精品高清在线| 亚洲人体影院| 性欧美8khd高清极品| 狠狠入ady亚洲精品经典电影| 久久夜色精品国产亚洲aⅴ| 最新中文字幕亚洲| 午夜精品在线观看| 狠狠综合久久| 欧美韩国在线| 亚洲一区三区电影在线观看| 久久性色av| 亚洲美女视频在线观看| 国产精品亚洲成人| 久久阴道视频| 一本色道婷婷久久欧美| 久久久成人精品| 日韩性生活视频| 国产欧美一区在线| 免费久久久一本精品久久区| 亚洲视频1区2区| 免费日韩av片| 亚洲制服丝袜在线| 在线播放亚洲一区| 欧美日韩一区精品| 久久精品亚洲精品国产欧美kt∨| 亚洲精品视频二区| 久久精品91| 夜久久久久久| 国产一区二区三区久久久久久久久 | 国产精品成人在线观看| 久久精品视频在线| 日韩午夜免费| 免播放器亚洲| 亚洲欧美激情诱惑| 亚洲大胆美女视频| 欧美午夜宅男影院在线观看| 久久视频免费观看| 亚洲婷婷综合久久一本伊一区| 欧美超级免费视 在线| 性8sex亚洲区入口| 亚洲伦理久久| 狠狠狠色丁香婷婷综合久久五月| 欧美日韩一区二区三区四区五区| 久久久精品国产99久久精品芒果| 夜色激情一区二区| 欧美韩日一区二区三区| 久久精品亚洲精品国产欧美kt∨| 亚洲乱码国产乱码精品精天堂|