亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? (ldd) ch14-網絡驅動程序(上)(轉載).htm

?? 描述驅動程序實現的基本原理及實現的基本接口
?? HTM
?? 第 1 頁 / 共 4 頁
字號:
      color=#ffffff size=3>
      <P>但主要目的是提供一個參考而不是要被記住。本章的其余部分在一個域被示例代碼用到<BR>的時候會簡單地描述一下,所以你不必不停地回頭來參考本節。<BR>&nbsp;<BR>結構device在結構上可以分為兩個部分:“可見的”和“不可見的”。可見部分由那些<BR>在靜態device結構中顯式賦值的域組成,象前面給出的在snull中出現的兩項。其余的域<BR>內部使用。有些被驅動程序訪問(例如在初始化時被賦值的那些),而有些不能動。本<BR>章在版本2.0.30前都是完全的。<BR>&nbsp;<BR>可見的頭<BR>&nbsp;<BR>結構device的第一部分由下列域組成,按序為:<BR>&nbsp;<BR>char&nbsp;*name;<BR>&nbsp;<BR>設備名。如果第一個字符是0(NULL字符)或空格,register_netdev給它分配名字ethn<BR>,n取合適的值。<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;rmem_end;<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;rmem_start;<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;mem_end;<BR>&nbsp;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>unsigned&nbsp;long&nbsp;mem_start;<BR>&nbsp;<BR>這些域存有設備使用的共享內存的開始和結束地址。如果設備有不同的發送和接收內存<BR>,那么mem域就用做發送內存,而rmem用做接收內存。mem_end和mem_start可以在系統引<BR>導時在核心命令行指定,它們的值由ifconfig獲取。Rmem域在驅動程序以外不會被引用<BR>。一般地,end域被設置成使得end-start為板上可用內存量。<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;base_addr;<BR>&nbsp;<BR>I/O基地址。這個域,和前面的一樣,在設備檢測時被賦值。ifconfig可以用來顯示和修<BR>改當前值。base_addr可以在系統引導或加載時在核心命令行顯式賦值。<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;irq;<BR>&nbsp;<BR>被賦予的中斷號。當接口被列出時dev-&gt;irq由ifconfig打印出來。這個值通常在引導或<BR>加載時被設置,以后可以用ifconfig修改。<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;start;<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;interrupt;<BR>&nbsp;<BR>這些域是二進制標志。start通常在設備打開時設置,在關閉時清楚。在接口準備號運行<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>這些域是二進制標志。start通常在設備打開時設置,在關閉時清楚。在接口準備號運行<BR>時它是非零。interrupt是用來告訴代碼的高層一個中斷到達接口,并正在處理中。<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;tbusy;<BR>&nbsp;<BR>這個域表明“傳送忙”。當驅動程序不能再接收新的包發送時(既所有的輸出緩沖區都<BR>滿了),它應該為非零。使用long類型而不是char是因為有時要使用原子的位操作以避<BR>免競爭條件。注意在核心1.2,tbusy的確是個八位的域,向后可移植的驅動程序應該注<BR>意這一點。原子的位操作在第九章的“使用鎖變量”一節中介紹過。<BR>&nbsp;<BR>struct&nbsp;device&nbsp;*next;<BR>&nbsp;<BR>用來維護鏈表;任何驅動程序都不能動這個域。<BR>&nbsp;<BR>int&nbsp;(*init)(struct&nbsp;device&nbsp;*dev);<BR>&nbsp;<BR>初始化函數。這個域通常是device結構中顯式列出的最后一個域。<BR>&nbsp;<BR>隱藏的域<BR>&nbsp;<BR>device結構包含幾個額外的域,通常在設備初始化時被賦值。這些域中的一些攜帶了接<BR>口的信息,一些存在只是為了方便驅動程序(也就是說,核心并不使用它們);還有一<BR>些域,最引人注意的是一些設備方法,它們是核心和驅動程序的接口。<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>些域,最引人注意的是一些設備方法,它們是核心和驅動程序的接口。<BR>&nbsp;<BR>我想分別列為三組,與域的實際順序無關,那并不重要。<BR>&nbsp;<BR>接口信息<BR>&nbsp;<BR>多數接口信息都由函數ether_setup來正確設置。以太網卡在大部分域都可以依賴這個通<BR>用目的的函數,但flags和dev_addr域是設備特定的,必須在初始化時顯式地賦值。<BR>&nbsp;<BR>一些非以太網的接口可以使用類似于ether_setup的助手函數。driver/net/net_init.c<BR>引出tr_setup(令牌環)和fddi_setup。如果你的設備不屬于這些類中的一種,你需要自<BR>己為所有的域賦值。<BR>&nbsp;<BR>unsigned&nbsp;short&nbsp;hard_header_len;<BR>&nbsp;<BR>“硬件包頭長”。發送包頭中IP頭(或其它協議信息)之前那部分的八元組個數。對以<BR>太網接口來說,這個值是14。<BR>&nbsp;<BR>unsigned&nbsp;short&nbsp;mtu;<BR>&nbsp;<BR>“最大傳送單元”。在包傳輸時,這個域由網絡層使用。以太網的MTU為1500個八元組。<BR>&nbsp;<BR>__u32&nbsp;tx_queue_len;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>__u32&nbsp;tx_queue_len;<BR>&nbsp;<BR>在設備傳送隊列中可以排隊的最大禎數。ether_setup將這個值設為100,不過你可以改<BR>變它。例如,plip使用10以避免浪費系統內存(plip比實際的以太網接口吞吐率要低)<BR>。<BR>&nbsp;<BR>unsigned&nbsp;short&nbsp;type;<BR>&nbsp;<BR>接口的硬件類型。這個域被ARP使用以判斷接口支持的硬件地址類型。以太網接口把它設<BR>為ARPHRD_ETHER----ether_setup為你做這件事。<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;addr_len;<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;broadcast[MAX_ADDR_LEN];<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;dev_addr[MAX_ADDR_LEN];<BR>&nbsp;<BR>以太網地址長為六個八元組(我們是指接口板的硬件標志),播送地址由六個0xff八元<BR>組組成;ether_setup負責這些值的正確設置。另一方面,設備地址必須以設備特定的方<BR>式從接口板中讀出,驅動程序應把它復制到dev_addr。這個硬件地址用來在把包交給驅<BR>動程序傳送前產生正確的以太網包頭。snull并不使用物理接口,它生成一個它自己的物<BR>理地址。<BR>&nbsp;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>unsigned&nbsp;short&nbsp;family;<BR>&nbsp;<BR>接口的地址族,通常為AF_INET。接口并不常查看這個域或者向其賦值。<BR>&nbsp;<BR>unsigned&nbsp;short&nbsp;pa_alen;<BR>&nbsp;<BR>協議地址長。對AF_INET來說為四個八元組。接口不需要修改這個數。<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;pa_addr;<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;pa_brdaddr;<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;pa_mask;<BR>&nbsp;<BR>刻劃接口的三個地址:接口地址,播送地址,及網絡掩碼。這些值是協議特定的(既它<BR>們是“協議地址”);如果dev-&gt;family是INET,則它們為IP地址。這些域由ifconfig賦<BR>值,對驅動程序是只讀的。<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;pa_dstaddr;<BR>&nbsp;<BR>plip和ppp一類點到點協議使用這個域記錄連接另一側的IP號碼。和前面的域一樣,它也<BR>是只讀的。<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>是只讀的。<BR>&nbsp;<BR>unsigned&nbsp;short&nbsp;flags;<BR>&nbsp;<BR>接口標志。這個域含有下列位值。前綴IFF意為接口標志(InterFace&nbsp;Flags)。有些標<BR>志由核心管理,有些則是在初始化時由接口設置,以確認接口的能力。有效的標志是:<BR>&nbsp;<BR>IFF_UP<BR>&nbsp;<BR>當接口是活躍的時,核心置上該標志。這個標志對驅動程序是只讀的。<BR>&nbsp;<BR>IFF_BROADCAST<BR>&nbsp;<BR>這個標志表明接口的播送地址是有效的。以太網卡支持播送。<BR>&nbsp;<BR>IFF_DEBUG<BR>&nbsp;<BR>查錯模式。這標志控制printk調用的嘮叨,還用在其它一些查錯目的。盡管目前沒有官<BR>方驅動程序使用它,用戶程序可以通過ioctl來對其置位或者清除,你的驅動程序可以使<BR>用它。misc-progs/netifdebug程序可以用來將這個標志打開或關閉。<BR>&nbsp;<BR>IFF_LOOPBACK<BR>&nbsp;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>這個標志在環回接口中要被置位。核心檢測這個標志而不是將名字lo作為特殊接口硬寫<BR>入程序。<BR>&nbsp;<BR>IFF_POINTOPOINT<BR>&nbsp;<BR>點到點的初始化函數應置位這個標志。例如,plip對它置位。ifconfig工具也可以對其<BR>置位和清除。當它被置位時,dev-&gt;pa_dstaddr應該指向連接的另一端。<BR>&nbsp;<BR>IFF_NOARP<BR>&nbsp;<BR>常規網絡接口可以傳送ARP包。如果接口不能進行ARP,它必須置這個標志。例如,點到<BR>點接口并不需要運行ARP,它只能增加額外的通信,卻不能獲取任何有用的信息。snull<BR>不具有ARP能力,因此它要對其置位。<BR>&nbsp;<BR>IFF_PROMISC<BR>&nbsp;<BR>這個標志被置位以獲得雜類操作。在缺省情況下,以太網接口使用硬件過濾器以保證它<BR>只收到播送包和指向其硬件地址的包。而象tcpdump一類包監視器則在接口上設置雜類模<BR>式,以獲取經過接口傳輸介質的所有包。<BR>&nbsp;<BR>IFF_MULTICAST<BR>&nbsp;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>能進行選播傳送的接口要置這個標志。ether_setup在缺省情況下對其置位。所以如果你<BR>的驅動程序不支持選播,它必須在初始化時清除這個標志。<BR>&nbsp;<BR>IFF_ALLMULTI<BR>&nbsp;<BR>這個標志告訴接口接收所有的選播包。只有當IFF_MULTICAST被置位,而主機由進行選播<BR>路由時,核心對其置位。它對接口時只讀的。IFF_MULTICAST和IFF_ALLMULTI早在1.2版<BR>就已經定義了,但那時并未使用。在后面“選播”一節我們將看到它是如何使用的。<BR>&nbsp;<BR>IFF_MASTER<BR>&nbsp;<BR>IFF_SLAVE<BR>&nbsp;<BR>這些標志被加載均衡代碼使用。接口驅動程序不需要知道它們。<BR>&nbsp;<BR>IFF_NOTRAILERS<BR>&nbsp;<BR>IFF_RUNNING<BR>&nbsp;<BR>這些標志在Linux中不使用,只是為了和BSD兼容而存在。<BR>&nbsp;<BR>當一個程序改變IFF_UP,open和close方法會被調用。當IFF_UP或其它標志被修改時,se<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>當一個程序改變IFF_UP,open和close方法會被調用。當IFF_UP或其它標志被修改時,se<BR>t_multicast_list方法被調用。如果驅動程序因為標志的修改而要執行一些動作,那么<BR>必須在set_multicast_list中進行。例如,當IFF_PROMIS被置位或清除時,板上硬件過<BR>濾器必須被通知。這個設備方法的責任將在后面的“選播”一節簡單介紹。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>設備方法<BR>&nbsp;<BR>與字符設備和塊設備的情況一樣,每個網絡設備要聲明在其上操作的函數。可以在網絡<BR>接口上進行的操作列在下面。一些操作可以留為NULL,還有一些通常不去動它們,因為e<BR>ther_setup給它們分配合適的方法。<BR>&nbsp;<BR>一個網絡接口的設備方法可以分為兩類:基本的和可選的。基本的包括那些為訪問接口<BR>所需要的;可選的方法實現一些并不嚴格要求的高級功能。下面是基本方法:<BR>&nbsp;<BR>int&nbsp;(*open)(struct&nbsp;device&nbsp;*dev);<BR>&nbsp;<BR>打開接口。只要ifconfig激活一個接口,它就被打開了。open方法要注冊它需要的所有<BR>資源(I/O端口,IRQ,DMA,等),打開硬件,增加模塊的使用計數。<BR>&nbsp;<BR>int&nbsp;(*stop)(struct&nbsp;device&nbsp;*dev);<BR>&nbsp;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>終止接口。接口在關閉時就終止了;在打開時進行的操作應被保留。<BR>&nbsp;<BR>int&nbsp;(*hard_start_xmit)(struct&nbsp;sk_buff&nbsp;*skb,&nbsp;struct&nbsp;device&nbsp;*dev);<BR>&nbsp;<BR>硬件開始傳送。這個方法請求一個包的傳送。這個包含在一個套接字緩沖區結構(sk_bu<BR>ff)中。套接字緩沖區在下面介紹。<BR>&nbsp;<BR>int&nbsp;(*rebuild_header)(void&nbsp;*buf,&nbsp;struct&nbsp;device&nbsp;*dev,&nbsp;unsigned&nbsp;long&nbsp;raddr,<BR>struct&nbsp;sk_buffer&nbsp;*skb);<BR>&nbsp;<BR>這個函數用來在一個包傳送之前重構硬件包頭。這個以太網設備使用的缺省包頭用ARP向<BR>包中填入缺少的信息。snull驅動程序實現了它自己的這個方法,因為ARP并不在sn接口<BR>上運行。(在本章的后面會介紹ARP。)這個方法的參數是一些指針,分別指向硬件包頭<BR>,設備,“路由器地址”(包的初始目的地),以及被傳送的緩沖區。<BR>&nbsp;<BR>int&nbsp;(*hard_header)(struct&nbsp;sk_buffer&nbsp;*skb,&nbsp;struct&nbsp;device&nbsp;*dev,&nbsp;unsigned<BR>short&nbsp;type,<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*daddr,&nbsp;void&nbsp;*saddr,&nbsp;unsigned&nbsp;len);<BR>&nbsp;<BR>硬件包頭。這個函數用以前獲取的源和目的地址構造包頭;它的任務是組織那些以參數<BR>的形式傳給它的信息。eth_header是以太網類接口的缺省函數,&nbsp;ether_setup相應地對<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>的形式傳給它的信息。eth_header是以太網類接口的缺省函數,&nbsp;ether_setup相應地對<BR>這個域賦值。給出的參數順序適用于核心2.0或更高版本,但與1.2有所不同。這個改變<BR>對以太網驅動程序是透明的,因為它繼承了&nbsp;eth_header的實現;其它驅動程序可能要處<BR>理一下這個不同,如果它們想保持向后兼容的話。<BR>&nbsp;<BR>struct&nbsp;enet_statistics&nbsp;*&nbsp;(*get_stats)(struct&nbsp;device&nbsp;*dev);<BR>&nbsp;<BR>當應用希望獲得接口的統計信息時需要調用這個方法,例如,當運行ifconfig或netstat<BR>&nbsp;–i時。在snull中的一個示例實現將在后面“統計信息”中介紹。<BR>&nbsp;<BR>int&nbsp;(*set_config)(struct&nbsp;device&nbsp;*dev,&nbsp;struct&nbsp;ifmap&nbsp;*map);<BR>&nbsp;<BR>改變接口的配置。這個方法是配置驅動程序的入口點。設備的I/O地址和中斷號可以在運<BR>行時用set_config改變。在接口不能探測到時,系統管理員可以適用這個能力。這個方<BR>法在后面的“運行時配置”中介紹。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>其余的設備方法是被我稱為可選的那些。傳遞給其中一些的參數在Linux1.2到Linux2.0<BR>的轉變中改了好幾次。如果你想寫一個可以在兩個版本核心都工作的驅動程序,你可以<BR>只為從2.0開始的版本實現這些操作。<BR>&nbsp;<BR>int&nbsp;(*do_ioctl)(struct&nbsp;devices&nbsp;*dev,&nbsp;struct&nbsp;ifreg&nbsp;*ifr,&nbsp;int&nbsp;cmd);<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>int&nbsp;(*do_ioctl)(struct&nbsp;devices&nbsp;*dev,&nbsp;struct&nbsp;ifreg&nbsp;*ifr,&nbsp;int&nbsp;cmd);<BR>&nbsp;<BR>執行接口特定的ioctl命令。這些命令的實現在后面的“自定義ioctl命令”中描述。這<BR>里給出的原形在1.2以上的核心都能工作。如果接口不需要任何接口特定的命令,那么結<BR>構device中相應的域可以留為NULL。<BR>&nbsp;<BR>void&nbsp;(*set_multicast_list)(struct&nbsp;device&nbsp;*dev);<BR>&nbsp;<BR>當設備的選播列表改變和標志改變時,將調用這個方法。這里的參數傳遞與1.2版本不同<BR>。更多的細節和一個示例實現見“選播”一節。<BR>&nbsp;<BR>int&nbsp;(*set_mac_address)(struct&nbsp;device&nbsp;*dev,&nbsp;void&nbsp;*addr);<BR>&nbsp;<BR>如果接口支持改變硬件地址的能力,可實現這個函數。多數接口要么不支持這個能力,<BR>要么使用缺省的eth_mac_addr實現。這個原形與1.2版也不同。<BR>&nbsp;<BR>#define&nbsp;HAVE_HEADER_CACHE<BR>&nbsp;<BR>void&nbsp;(*header_cache_bind)(struct&nbsp;hh_cache&nbsp;**hhp,&nbsp;struct&nbsp;device&nbsp;*dev,<BR>unsigned&nbsp;short&nbsp;htype,&nbsp;__u32&nbsp;daddr);<BR>&nbsp;<BR>void&nbsp;(*header_cache_update)(struct&nbsp;hh_cache&nbsp;*hh,&nbsp;struct&nbsp;device&nbsp;*dev,<BR>unsigned&nbsp;char&nbsp;*haddr);<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>unsigned&nbsp;char&nbsp;*haddr);<BR>&nbsp;<BR>這些函數和宏在Linux1.2中沒有。以太網驅動程序不必關心header_cache的問題,因為e<BR>th_setup會安排使用缺省的方法。<BR>&nbsp;<BR>#define&nbsp;HAVE_CACHE_MTU<BR>&nbsp;<BR>int&nbsp;(*change_mtu)(struct&nbsp;device&nbsp;*dev,&nbsp;int&nbsp;new_mtu);<BR>&nbsp;<BR>如果接口的MTU(最大傳送單元)發生了改變,這個函數負責采取動作。這個函數和宏在<BR>Linux1.2中都沒有。當MTU改變時,如果驅動程序要做一些特殊的事情,它應該聲明它自<BR>己的函數,不然將由缺省函數來完成。如果你感興趣,snull有一個這個函數的模版。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>工具域<BR>&nbsp;<BR>其余的結構device中的域被接口用來保存一些有用的狀態信息。其中一些被ifconfig和n<BR>etstat用來向用戶提供當前配置的信息。因此,接口應該對這些域賦值。<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;trans_start;<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;last_rx;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>unsigned&nbsp;long&nbsp;last_rx;<BR>&nbsp;<BR>這兩個域用來保存一些瞬間值。它們目前不用,但核心有可能將來使用這些計時提示。<BR>驅動程序負責在傳送開始時和收到包時更新這些值。trans_start域還可以被驅動程序用<BR>來檢測鎖定。驅動程序可以在等待一個“傳送完成”的中斷時用trans_start來檢查超時<BR>。<BR>&nbsp;<BR>void&nbsp;*priv<BR>&nbsp;<BR>等價于filp-&gt;private_data。驅動程序擁有這個指針,可以隨意使用。通常這個私有數<BR>據結構含有一個enet_statistics結構項。這個域在以前的“初始化每個設備”中用過。<BR>&nbsp;<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;if_prot;<BR>&nbsp;<BR>這個域用來記錄哪個硬件端口被接口使用(例如,BNC,AUI,TP)。任何數值都可以按<BR>需要賦給它。<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;dma;<BR>&nbsp;<BR>被接口使用的DMA通道。這個域被ioctl的SIOCGIFMAP命令使用。<BR>&nbsp;<BR>struct&nbsp;dev_mc_list&nbsp;*mc_list;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>unsigned&nbsp;char&nbsp;dma;<BR>&nbsp;<BR>被接口使用的DMA通道。這個域被ioctl的SIOCGIFMAP命令使用。<BR>&nbsp;<BR>struct&nbsp;dev_mc_list&nbsp;*mc_list;<BR>&nbsp;<BR>int&nbsp;mc_count<BR>&nbsp;<BR>這兩個域被用來處理選播傳送。Mc_count是mc_list中項的個數。更多的細節見“選播”<BR>結構device中還有一些別的域,但驅動程序沒有使用它們<BR>--<BR><FONT 
      color=#00ff00>※&nbsp;來源:.華南網木棉站&nbsp;bbs.gznet.edu.cn.[FROM:&nbsp;202.38.196.234]</FONT><BR>--<BR><FONT 
      color=#00ffff>※&nbsp;轉寄:.華南網木棉站&nbsp;bbs.gznet.edu.cn.[FROM:&nbsp;211.80.41.106]</FONT><BR>--<BR><FONT 
      color=#0000ff>※&nbsp;轉寄:.華南網木棉站&nbsp;bbs.gznet.edu.cn.[FROM:&nbsp;211.80.41.106]</FONT><BR>--<BR><FONT 
      color=#ffff00>※&nbsp;轉載:.南京大學小百合站&nbsp;bbs.nju.edu.cn.[FROM:&nbsp;211.80.41.106]</FONT><BR>--<BR><FONT 
      color=#ff0000>※&nbsp;轉載:·飲水思源&nbsp;bbs.sjtu.edu.cn·[FROM:&nbsp;211.80.41.106]</FONT><BR></P></FONT>
      <P align=center><A href="http://joyfire.net/lsdp/index.htm"><FONT 
      color=#ffffff size=2>目錄頁</FONT></A> | <A 
      href="http://joyfire.net/lsdp/16.htm"><FONT color=#ffffff 
      size=2>上一頁</FONT></A> | <A href="http://joyfire.net/lsdp/18.htm"><FONT 
      color=#ffffff size=2>下一頁</FONT></A></P></SPAN></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=0>
  <TBODY>
  <TR>
    <TD colSpan=3 height=2>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
狠狠色狠狠色综合系列| 一个色在线综合| 91精品国产综合久久精品图片| 成人av免费网站| 成人app下载| 色婷婷国产精品综合在线观看| 91亚洲精品乱码久久久久久蜜桃 | 中文字幕在线一区| 国产欧美日韩亚州综合| 日本一区二区免费在线观看视频 | 97久久超碰精品国产| 成人久久久精品乱码一区二区三区| 国产成人av电影| 白白色 亚洲乱淫| 色呦呦一区二区三区| 欧美亚洲国产一卡| 日韩欧美在线网站| 久久久.com| 亚洲精品高清在线| 蜜桃一区二区三区在线观看| 久久疯狂做爰流白浆xx| 粉嫩绯色av一区二区在线观看| 9人人澡人人爽人人精品| 在线免费观看日韩欧美| 欧美一激情一区二区三区| 国产亚洲欧洲一区高清在线观看| 中文字幕一区二区三| 婷婷综合五月天| 国产精品一级片在线观看| 色婷婷久久久综合中文字幕 | 一区二区三区在线观看欧美| 日本中文字幕一区| 国产成人午夜电影网| 欧美亚洲动漫另类| 久久色视频免费观看| 亚洲免费在线电影| 国模一区二区三区白浆| 色噜噜狠狠色综合欧洲selulu| 欧美一区二区视频观看视频| 国产精品乱人伦中文| 视频一区欧美精品| 91免费看视频| 久久久久久久免费视频了| 亚洲一区二区三区四区在线| 国产呦精品一区二区三区网站| 在线观看亚洲精品| 久久精品一区二区三区不卡 | 午夜精品久久久久久久99水蜜桃 | 国产综合色在线视频区| 欧美最新大片在线看| 国产欧美一区二区精品久导航| 天天av天天翘天天综合网色鬼国产 | 国产乱码精品1区2区3区| 欧美优质美女网站| 亚洲欧美日韩系列| 国产成人精品免费在线| 日韩天堂在线观看| 亚洲国产精品天堂| 91丝袜高跟美女视频| 亚洲国产精品精华液2区45| 蜜臀国产一区二区三区在线播放| 欧洲av在线精品| 一区二区三区中文在线观看| www.亚洲色图.com| 欧美激情一区二区| 国产麻豆9l精品三级站| 欧美电影免费观看高清完整版在线观看| 亚洲乱码国产乱码精品精的特点| 9l国产精品久久久久麻豆| 国产精品免费人成网站| 国产91高潮流白浆在线麻豆| 久久品道一品道久久精品| 美日韩一区二区| 日韩一级成人av| 国产在线一区观看| 精品88久久久久88久久久| 国产在线国偷精品产拍免费yy| 欧美mv日韩mv亚洲| 极品销魂美女一区二区三区| 欧美第一区第二区| 国产一区二区三区香蕉| 久久久三级国产网站| 成人网在线播放| 亚洲欧洲三级电影| 欧美专区亚洲专区| 天使萌一区二区三区免费观看| 欧美精品一卡二卡| 美女诱惑一区二区| 国产清纯在线一区二区www| 成人app网站| 一区二区三区成人在线视频| 精品日韩av一区二区| 久久精品久久久精品美女| 国产午夜精品福利| 一本大道久久a久久综合| 午夜欧美在线一二页| 欧美一级黄色录像| 国产大陆亚洲精品国产| 亚洲人成网站色在线观看| 欧美日韩国产不卡| 精品伊人久久久久7777人| 国产日韩欧美精品电影三级在线| 91女人视频在线观看| 天天综合天天做天天综合| 欧美成人艳星乳罩| av不卡免费在线观看| 日韩精品1区2区3区| 国产精品女主播在线观看| 日本道在线观看一区二区| 韩国精品一区二区| 亚洲国产中文字幕在线视频综合| 久久综合视频网| 欧美性做爰猛烈叫床潮| 国产一区三区三区| 亚洲国产精品尤物yw在线观看| 国产亚洲视频系列| 欧美日韩高清一区二区三区| 国产剧情一区二区| 亚洲高清视频中文字幕| 国产欧美综合在线| 欧美一级艳片视频免费观看| 色综合久久天天综合网| 激情亚洲综合在线| 视频精品一区二区| 亚洲免费三区一区二区| 国产亚洲综合在线| 日韩一级黄色大片| 欧美日韩在线三区| 91小视频在线免费看| 国产精品白丝jk黑袜喷水| 蜜臀久久99精品久久久久久9| 亚洲一二三四区| 日韩美女视频一区| 国产日韩精品视频一区| 久久亚洲私人国产精品va媚药| 欧美视频一区在线观看| 91久久线看在观草草青青| 成人黄色一级视频| 国产精品白丝jk黑袜喷水| 久久99久久久久| 日日夜夜免费精品| 亚洲一区二区免费视频| 国产精品高潮久久久久无| 精品va天堂亚洲国产| 日韩一二在线观看| 欧美大片在线观看| 欧美喷潮久久久xxxxx| 色久综合一二码| 色综合久久久久网| 色激情天天射综合网| 欧美主播一区二区三区| 在线视频国内自拍亚洲视频| 欧美性生活影院| 欧美日本一道本| 欧美日本视频在线| 日韩视频免费观看高清在线视频| 制服丝袜亚洲网站| 精品剧情v国产在线观看在线| 欧美xxxx老人做受| 国产视频不卡一区| 中文字幕成人在线观看| 国产精品久久福利| 亚洲免费观看高清完整版在线观看 | av网站免费线看精品| 97久久人人超碰| 欧美日韩在线免费视频| 欧美精品日日鲁夜夜添| 欧美岛国在线观看| 日本一区二区不卡视频| 亚洲欧美日韩在线| 日韩高清欧美激情| 国产二区国产一区在线观看| 成人毛片在线观看| 欧美日韩极品在线观看一区| 777xxx欧美| 久久久国产精华| 亚洲综合成人在线| 九色|91porny| eeuss鲁一区二区三区| 欧美在线视频不卡| 欧美成人video| 亚洲精品成a人| 麻豆精品久久精品色综合| 成人国产精品免费网站| 欧美色图免费看| 久久精品一区二区三区不卡| 亚洲女同一区二区| 久久精品99国产精品日本| 成人激情校园春色| 欧美精品一二三| 中文字幕日韩欧美一区二区三区| 午夜私人影院久久久久| 国产精品99久久久久久似苏梦涵| 日本乱人伦一区| 精品久久久影院| 一区二区三区在线视频观看58 | 国产精品色呦呦| 免费看精品久久片| 色婷婷精品久久二区二区蜜臂av | 天堂av在线一区|