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

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

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

?? Linux設備驅動程序用于開發LINUX
?? HTM
?? 第 1 頁 / 共 4 頁
字號:
          <TD width="8%" height=4>
            <DIV align=center><A href="mailto:joyfire@sina.com"><FONT 
            color=#ffffff>聯系</FONT></A></DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE borderColor=#666666 cellPadding=2 width="90%" align=center border=2>
  <TBODY>
  <TR>
    <TD bgColor=#000000>
      <P align=center><A 
      href="http://211.71.69.201/joyfire/lsdp/index.htm"><FONT color=#ffffff 
      size=2>目錄頁</FONT></A> | <A 
      href="http://211.71.69.201/joyfire/lsdp/17.htm"><FONT color=#ffffff 
      size=2>上一頁</FONT></A> | <A 
      href="http://211.71.69.201/joyfire/lsdp/19.htm"><FONT color=#ffffff 
      size=2>下一頁</FONT></A></P>
      <P align=center><FONT face=黑體 color=#ffffff size=6>(LDD) 
      Ch14-網絡驅動程序(下)(轉載) </FONT></P><SPAN 
      style="LINE-HEIGHT: 1; LETTER-SPACING: 0pt"><FONT color=#ffffff size=3>
      <P>發信人:&nbsp;Altmayer&nbsp;(alt),&nbsp;信區:&nbsp;GNULinux<BR>標&nbsp;&nbsp;題:&nbsp;(LDD)&nbsp;Ch14-網絡驅動程序(下)(轉載)<BR>發信站:&nbsp;飲水思源&nbsp;(2001年12月13日08:57:59&nbsp;星期四),&nbsp;站內信件<BR>&nbsp;<BR>【&nbsp;以下文字轉載自&nbsp;<FONT 
      color=#00ff00>UNIXpost&nbsp;</FONT>討論區&nbsp;】<BR>【&nbsp;原文由<FONT 
      color=#00ff00>&nbsp;altmayer.bbs@bbs.nju.edu.cn,</FONT>&nbsp;所發表&nbsp;】<BR>&nbsp;<BR>【&nbsp;以下文字轉載自&nbsp;<FONT 
      color=#00ff00>altmayer&nbsp;</FONT>的信箱&nbsp;】<BR>&nbsp;<BR>&nbsp;<BR>打開和關閉<BR>&nbsp;<BR>我們的驅動程序可以在模塊加載和核心引導時探測接口。下一步是給接口賦一個地址,<BR>這樣驅動程序就可以通過它交換數據了。打開和關閉一個接口由ifconfig命令完成。<BR>&nbsp;<BR>當使用ifconfig為一個接口賦地址時,它完成兩項工作。第一,它通過<BR>ioctl(SIOCSIFADDR)(即Socket&nbsp;I/O&nbsp;Control&nbsp;Set&nbsp;InterFace&nbsp;ADDRess)來賦地址。接著<BR>它通過ioctl(SIOCSIFFLAGS)(即Socket&nbsp;I/O&nbsp;Control&nbsp;Set&nbsp;InterFace&nbsp;FLAGS)&nbsp;對dev-&gt;fl<BR>ag中的IFF_UP置位來打開接口。<BR>&nbsp;<BR>至于設備,ioctl(SIOCSIFADDR)設置dev-&gt;pa_addr,dev-&gt;family,dev-&gt;pa_mask,dev-<BR><FONT 
      color=#00ffff>&gt;pa_brdaddr,沒有驅動程序函數被調用----這個任務是設備無關的,由核心來完成。不</FONT><BR>過,后一個命令ioctl(SIOCSIFFLAGS)為設備調用open方法。<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>過,后一個命令ioctl(SIOCSIFFLAGS)為設備調用open方法。<BR>&nbsp;<BR>類似地,當一個接口關閉時,ifconfig使用ioctl(SIOCSIFFLAGS)來清除IFF_UP,并且調<BR>用stop方法。<BR>&nbsp;<BR>兩個設備方法在成功時都返回0,發生錯誤時,通常返回一個負值。<BR>&nbsp;<BR>至于代碼,驅動程序必須執行與字符和塊設備同樣的工作。open請求它所需要的所有的<BR>系統資源,并告訴接口啟動;stop則關閉接口,并釋放系統資源。<BR>&nbsp;<BR>如果驅動程序不準備使用共享中斷(例如,它不打算與舊的核心兼容),還有最后一步<BR>需要做。核心引出一個irq2dev_map陣列,它由IRQ號尋址,持有空指針;驅動程序也許<BR>想用這個數組將中斷號映射到指向device結構的指針。這是在不使用接口處理程序的情<BR>況下,在一個驅動程序里支持一個以上接口的唯一方法。<BR>&nbsp;<BR>另外,在接口可以和外界通信以前,硬件地址還必須從板上復制到dev-&gt;dev_addr。硬件<BR>地址可以按驅動程序的意愿在探測時或打開時被賦值。snull軟件接口時從open里對其賦<BR>值;它用兩個ASCII串偽造一個硬件號碼。地址的第一個字節是個空字符(在后面的“地<BR>址解析”中解釋)。<BR>&nbsp;<BR>結果得到的open代碼如下所示:<BR>&nbsp;<BR>(代碼319)<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>(代碼319)<BR>&nbsp;<BR>(代碼320&nbsp;#1)<BR>&nbsp;<BR>正如你所看到的,device結構中的幾個域被修改了。start表明接口已準備好,&nbsp;tbusy斷<BR>言發送者不忙(也就是說,核心可以發出一個包)。<BR>&nbsp;<BR>stop方法是open的操作的反轉。由于這個原因,實現&nbsp;stop的函數通常調用&nbsp;close。<BR>&nbsp;<BR>(代碼320&nbsp;#2)<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>包發送<BR>&nbsp;<BR>網絡接口執行的最重要的工作是數據發送和接收。我準備從發送開始,因為它相對比較<BR>簡單。<BR>&nbsp;<BR>當核心需要發送一個數據包時,它調用hard_start_transmit方法將數據放到一個輸出隊<BR>列。核心處理的每個包包含在一個套接字緩沖區結構(struct&nbsp;sk_buff)中,其定義見&lt;<BR>linux/skbuff.h&gt;。這個結構從Unix用來表示一個網絡連接的抽象,即套接字得名。即使<BR>接口與套接字無關,每個網絡包在較高的網絡層中一定屬于某個套接字,任何套接字的<BR>輸入輸出緩沖區都是sk_buff結構的列表。同樣的sk_buff結構在整個Linux網絡子系統中<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>輸入輸出緩沖區都是sk_buff結構的列表。同樣的sk_buff結構在整個Linux網絡子系統中<BR>都被用來承載網絡數據,但在考慮接口時,一個套接字緩沖區就是一個包。<BR>&nbsp;<BR>指向sk_buff的指針通常被稱做skb,我將在示例和正文中都使用使用這個習慣。<BR>&nbsp;<BR>套接字緩沖區是一個復雜的結構,核心提供一組函數來對其操作。這些函數在后面的“<BR>套接字緩沖區”中描述----目前,知道sk_buff的一些基本事實已足以寫出可工作的驅動<BR>程序。另外,我習慣于在扎入另人討厭的細節之前先弄明白是如何工作的。<BR>&nbsp;<BR>傳遞給hard_start_xmit的套接字緩沖區含有物理包,它具有傳輸層的包頭。接口不需要<BR>修改被發送的數據。skb-&gt;data指向被發送的包,skb-&gt;len是它的長度,以八元組為單位<BR>。<BR>&nbsp;<BR>snull的包發送代碼如下所示;物理發送機制被隔離在另一個函數中,因為每個接口驅動<BR>程序必須按照被驅動的特定硬件來實現它。<BR>&nbsp;<BR>(代碼321)<BR>&nbsp;<BR>這樣發送函數只進行一些清晰的對包的檢查,并通過硬件相關的函數發送數據。在一個<BR>中斷表明一個“發送結束”的條件時,dev-&gt;tbusy被清除。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>包接收<BR>&nbsp;<BR>從網絡中接收數據比發送要復雜一些,因為必須分配一個sk_buff,并從一個中斷處理程<BR>序中將其交遞給高層----接收包的最好的辦法是通過中斷,除非接口是象snull一樣是純<BR>軟件的,或是環回接口。盡管有可能寫輪詢的驅動程序,而且在正式的核心里也的確有<BR>幾個,但中斷驅動的要好的多,不管是在數據吞吐率還是計算需求上。由于絕大多數網<BR>絡接口都是中斷驅動的,我不打算談論輪詢實現,它只是利用了核心計時器。<BR>&nbsp;<BR>snull的實現是將硬件細節和設備無關的工作分離開的。這樣,在硬件收到一個包后,sn<BR>ull_rx被調用,它已經在計算機的內存中了。snull_rx因此收到一個指向數據的指針和<BR>包的長度。。這個函數唯一的責任就是將包和一些額外信息發送到網絡代碼的高層。其<BR>代碼與數據指針及長度獲得的方法無關。<BR>&nbsp;<BR>(代碼322)<BR>&nbsp;<BR>這個函數足夠通用,可以作為任何網絡驅動程序模版,但在你有信心重用這個代碼段之<BR>前還需要一些解釋。<BR>&nbsp;<BR>注意緩沖區分配函數需要知道數據長度。者避免了在調用kmalloc時浪費內存。dev_allo<BR>c_skb以原子優先級調用分配函數,因此它也可以在中斷時安全地使用。核心還提供了套<BR>接字緩沖區分配的其它一些接口,但不值得在這里介紹;套接字緩沖區在本章后面的“<BR>套接字緩沖區”中詳細介紹。<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>套接字緩沖區”中詳細介紹。<BR>&nbsp;<BR>一旦有了一個有效的skb指針,就可以通過調用memcpy將包數據復制到這個緩沖區。skb_<BR>put更新緩沖區中數據尾的指針,并返回一個指向新生成空間的指針。<BR>&nbsp;<BR>不幸的是,包頭中沒有足夠的信息來正確處理網絡層----在緩沖區向上層傳遞之前,dev<BR>和protocol域必須被賦值。接著我們需要指定如何執行校驗和(snull不進行任何校驗和<BR>)。skb-&gt;ip_summed可能的策略為:<BR>&nbsp;<BR>CHECKSUM_HW<BR>&nbsp;<BR>板子用硬件執行校驗和。一個硬件校驗和的離子是Sparc&nbsp;HME接口。<BR>&nbsp;<BR>CHECKSUM_NONE<BR>&nbsp;<BR>校驗和完全有軟件完成。對新分配的緩沖區,這是缺省的策略。<BR>&nbsp;<BR>CHECKSUM_UNNECESSARY<BR>&nbsp;<BR>不做任何校驗和。這是snull和環回接口的策略。<BR>&nbsp;<BR>在1.2核心版本中沒有校驗和選項和ip_summed。<BR>&nbsp;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>最后,驅動程序更新它的統計計數器記錄一個新包被收到了。統計結構有幾個域組成,<BR>最重要的是rx_packets和tx_packets,它們包含收到的和發送的包的個數。所有的域在<BR>后面的“統計信息”中給出一個徹底的描述。<BR>&nbsp;<BR>包接收的最后一步由netif_rx完成,它將套接字緩沖區遞交到上一層。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>中斷驅動的操作<BR>&nbsp;<BR>大多數硬件接口以中斷處理程序的方式控制。接口中斷處理器表明兩種事件中的一種:<BR>一個新包到達了或一個包發送完成了。這種一般化并不是總適用,但它基本上揭示了與<BR>異步包傳送相關的問題。PLIP和PPP是不適用這種一般化的例子。它們處理同樣的事件,<BR>但低級中斷處理略有不同。<BR>&nbsp;<BR>一般的中斷例程可以通過檢查在硬件設備上的一個狀態寄存器來分辨新包到達中斷與完<BR>成發送的通知。snull接口工作方式類似,但其狀態字在dev-&gt;priv中。網絡接口的中斷<BR>處理程序看起來如下:<BR>&nbsp;<BR>(代碼324)<BR>&nbsp;<BR>處理程序的第一個任務是接收一個指向正確的device結構的指針。你可以用irq2dev_map<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>處理程序的第一個任務是接收一個指向正確的device結構的指針。你可以用irq2dev_map<BR>[](假如你在打開是給它賦了一個值)或者接收到的dev_id指針作為一個參數。如果你<BR>希望驅動程序可以與新于1.3.70的核心工作,你必須使用irq2dev_map[],因為早期版本<BR>中沒有dev_id。<BR>&nbsp;<BR>這個處理程序中有趣的部分是處理“發送完成”的部分。接口通過清除dev-&gt;tbusy并標<BR>志網絡下半部例程來相應發送完成。如果net_bh的確運行了,它會試圖發送所有等待的<BR>包。<BR>&nbsp;<BR>另一方面,包接收并不需要任何特殊的中斷處理。所有需要做的就是調用snull_rx。<BR>&nbsp;<BR>實際上,當netif_rx被接收函數調用時,它所進行的實際操作只有標志net_bh。換句話<BR>說,核心在一個下半部處理程序中完成了所有網絡相關的工作。因此,網絡驅動程序應<BR>該總是宣稱它的中斷處理程序太慢,因為下半部將會更早地執行(見第九章中“下半部<BR>設計”)。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>套接字緩沖區<BR>&nbsp;<BR>我們已經討論了于網絡接口相關的多數內容。下面幾節我們將更細地討論sk_buff時如何<BR>設計的。這幾節既介紹這個結構的主要域,也介紹在套接字緩沖區上操作的函數。<BR>&nbsp;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>盡管并沒有理解sk_buff內部的嚴格需要,但是如果能理解它的內容將會有助于你解決問<BR>題和優化代碼。例如,如果你看了loopback.c,你會發現一個基于sk_buff內部知識的優<BR>化。<BR>&nbsp;<BR>我不打算在這里描述整個結構,而只是那些可能被驅動程序用到的域。如果你想知道更<BR>多,你可以看&lt;linux/skbuff.h&gt;,結構的定義和函數的原形都在那里定義。至于這些域<BR>和函數如何使用的細節可以通過瀏覽核心源碼得到。<BR>&nbsp;<BR>重要的域<BR>&nbsp;<BR>出于我們的目的,結構里重要的域是那些驅動程序的作者可能要用到的域。它們如下所<BR>示,無特別順序。<BR>&nbsp;<BR>struct&nbsp;device&nbsp;*dev;<BR>&nbsp;<BR>設備接收或者發送這個緩沖區。<BR>&nbsp;<BR>__u32&nbsp;saddr;<BR>&nbsp;<BR>__u32&nbsp;daddr;<BR>&nbsp;<BR>__u32&nbsp;raddr;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>__u32&nbsp;raddr;<BR>&nbsp;<BR>源地址,目的地址,和路由器地址,由IP協議使用。raddr是包要到達其目的地的第一步<BR>。這些域在包被發送前被設置,收到之后就不必賦值了。到達hard_start_xmit方法的外<BR>出包已經有了一個合適的硬件包頭設置反映了“第一步”信息。<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;*head;<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;*data;<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;*tail;<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;*end;<BR>&nbsp;<BR>這些指針用來訪問包中的數據。head指向分配空間的開始,data是有效八元組的開始(<BR>通常比head略大),tail是有效八元組的結束,&nbsp;end指向tail可以到達的最大地址。觀<BR>察它們的另一個方法是:可用緩沖區空間為skb-&gt;end-skb-&gt;head,當前使用的數據空間<BR>為skb-&gt;tail-skb-&gt;data。這種處理內存區域的清晰方法在1.3開發時才實現。這是snull<BR>沒有被移植在Linux1.2上編譯的主要原因。<BR>&nbsp;<BR>unsigned&nbsp;long&nbsp;len;<BR>&nbsp;<BR>數據本身的長度(skb-&gt;tail-skb-&gt;head)。<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>數據本身的長度(skb-&gt;tail-skb-&gt;head)。<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;ip_summed;<BR>&nbsp;<BR>這個域有驅動程序對進來包設置,由TCP/UDP校驗和使用。它在前面的“包接收”中介紹<BR>過。<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;pkt_type;<BR>&nbsp;<BR>這個域被內部用來發送進來包。驅動程序負責將其設置為PACKET_HOST(這個包是我的)<BR>,&nbsp;PACKET_BROADCAST,PACKET_MULTICAST,或是PACKET_OTHERHOST(不,這個包不是我<BR>的)&nbsp;。以太網驅動程序并不顯式地修改pkt_type,因為eth_type_trans會為它做這件事<BR>。<BR>&nbsp;<BR>union&nbsp;{&nbsp;unsigned&nbsp;char&nbsp;*raw;&nbsp;[…]}&nbsp;mac;<BR>&nbsp;<BR>與pkt_type類似,這個域被用來處理進來包,必須在包接收時設置。函數eth_type_tran<BR>s為以太網驅動程序負責這件事。非以太網驅動程序應設置skb-&gt;mac.raw指針,后面“非<BR>以太網包頭”中將會提到。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>結構中其余的域并無特別興趣。它們被用來維護緩沖區列表,解釋占有緩沖區的套接字<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>結構中其余的域并無特別興趣。它們被用來維護緩沖區列表,解釋占有緩沖區的套接字<BR>的內存,等等。<BR>&nbsp;<BR>在套接字緩沖區上操作的函數<BR>&nbsp;<BR>使用sock_buff的網絡設備通過正式的接口函數在這個結構上操作。有很多在套接字緩沖<BR>區上操作的函數,下面是最有趣的一些:<BR>&nbsp;<BR>struct&nbsp;sk_buff&nbsp;*alloc_skb(unsigned&nbsp;int&nbsp;len,&nbsp;int&nbsp;priority);<BR>&nbsp;<BR>struct&nbsp;sk_buff&nbsp;*dev_alloc_skb(unsigned&nbsp;int&nbsp;len);<BR>&nbsp;<BR>分配一個緩沖區。alloc_skb分配一個緩沖區并初始化skb-&gt;data和skb-&gt;tail到skb-&gt;hea<BR>d。&nbsp;dev_alloc_skb函數(在Linux1.2中沒有)一個快捷方式,它用GFP_ATOMIC優先級調<BR>用alloc_skb,并反轉skb-&gt;head和skb-&gt;data之間的16個字節。這個數據空間可以用來“<BR>推”硬件包頭。<BR>&nbsp;<BR>void&nbsp;kfree_skb(struct&nbsp;sk_buff&nbsp;*skb,&nbsp;int&nbsp;rw);<BR>&nbsp;<BR>void&nbsp;dev_kfree)skb(struct&nbsp;sk_buff&nbsp;*skb,&nbsp;int&nbsp;rw);<BR>&nbsp;<BR>釋放一個緩沖區。kfree_skb被核心內部使用。驅動程序應該使用dev_kfree_skb,在擁<BR>有緩沖區的套接字需要再次使用它的情況下,它可以正確地處理緩沖區加鎖。兩個函數<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>有緩沖區的套接字需要再次使用它的情況下,它可以正確地處理緩沖區加鎖。兩個函數<BR>的rw參數是FREE_READ或FREE_WRITE。這個值用來跟蹤套接字的內存。外出緩沖區應用<BR>FREE_WRITE來釋放,而進來的則使用FREE_READ。<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;*skb_put(struct&nbsp;sk_buff&nbsp;*skb,&nbsp;int&nbsp;len);<BR>&nbsp;<BR>這個線入函數更新結構sk_buff的tail和len域,它被用來在緩沖區尾加入數據。其返回<BR>值是skb-&gt;tail以前的值(或者說,它指向剛生成的數據空間)。有些驅動程序通過調用<BR>ins(ioaddr,skb_put(…))或memcpy(skb_put(…),&nbsp;data,len)來使用這個返回值。這個<BR>函數及下面的一些在為Linux1.2構造模塊是不存在。<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;*skb_push(struct&nbsp;sk_buff&nbsp;*skb,&nbsp;int&nbsp;len);<BR>&nbsp;<BR>這個函數減小skb-&gt;data,增加skb-&gt;len。類似于skb_put,除了數據是加在包開始而不<BR>是結尾。返回值指向剛生成的空間。<BR>&nbsp;<BR>int&nbsp;skb_tailroom(struct&nbsp;sk_buff&nbsp;*skb);<BR>&nbsp;<BR>這個函數返回為在緩沖區中放置數據的可用空間量。如果驅動程序在緩沖區中放了多于<BR>它能承載的數據,系統可能回崩潰。你也許會反對并認為,用printk指出這個錯誤已經<BR>足夠了,而內存崩潰對系統太有害了,開發者肯定要采取一些措施。但實際上,如果緩<BR>沖區被正確分配了,你根本不必檢查可用空間。因為驅動程序通常在分配緩沖區之前獲<BR>得包大小,只有有嚴重缺陷的驅動程序才可能在緩沖區內放太多的數據,崩潰可以認為<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>得包大小,只有有嚴重缺陷的驅動程序才可能在緩沖區內放太多的數據,崩潰可以認為<BR>是應得的懲罰。<BR>&nbsp;<BR>int&nbsp;skb_headroom(struct&nbsp;sk_buff&nbsp;*skb);<BR>&nbsp;<BR>返回數據前面得可用空間量,也就是可以向緩沖區中“推”多少八元組。<BR>&nbsp;<BR>void&nbsp;skb_reserve(struct&nbsp;sk_buff&nbsp;*skb,&nbsp;int&nbsp;len);<BR>&nbsp;<BR>這個函數增加data和tail。它可以用來在填充緩沖區前預留空間。大多數以太網接口在<BR>包前預留兩個字節;這樣IP頭可以在一個4字節以太網頭之后,在16字節邊界對齊。snul<BR>l完成得很好,盡管在“包接收”中并未提到這一點,那主要是為了避免彼時引入過多得<BR>概念。<BR>&nbsp;<BR>unsigned&nbsp;char&nbsp;*skb)pull(struct&nbsp;sk_buff&nbsp;*skb,&nbsp;int&nbsp;len);<BR>&nbsp;<BR>從包頭中刪除數據。驅動程序并不用這個函數,但為了完整性也包含在這里。它減少skb<BR>-&gt;len,增加skb-&gt;data;這是從進來包的開始剝出以太網包頭的方法。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>核心還定義了幾個在套接字緩沖區上操作得別的函數,但它們主要應用于網絡代碼得高<BR>層,驅動程序并不需要它們。<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>層,驅動程序并不需要它們。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>地址解析<BR>&nbsp;<BR>以太網通信最急迫得問題之一是硬件地址(接口得唯一標志符)與IP號碼之間的關聯。<BR>大多數協議都有類似問題,但我只向重點討論一下以太網類得情況。我力圖給出一個全<BR>面得描述,因此我將顯示三種情況:ARP,沒有ARP的以太網頭(象plip),以及非以太網<BR>包頭。<BR>&nbsp;<BR>在以太網上使用ARP<BR>&nbsp;<BR>地址解析得一般方法是ARP,即地址解析協議。幸運的是,ARP由核心管理,以太網接口<BR>不必為支持ARP做任何特殊工作。只要在打開時正確地設置了dev-&gt;addr和dev-&gt;addr_len<BR>,驅動程序不需擔心任何從IP號碼到物理地址的轉換;ether_setup將正確的設備方法賦<BR>給dev-&gt;hard_header和dev-&gt;rebuild_header。<BR>&nbsp;<BR>當一個包被構造時,以太網包頭由dev-&gt;hard_header來布局,并由dev-&gt;rebuild_header<BR>在后來填充,它使用ARP協議將未知的IP號碼映射到地址上。驅動程序作者不必知道這個<BR>過程的細節去寫一個可工作得驅動程序。<BR>&nbsp;<BR>越過ARP<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>越過ARP<BR>&nbsp;<BR>簡單得點到點網絡接口如plip可以從以太網包頭獲益,但卻要避免來回發送ARP包得開銷<BR>。snull中得示例代碼就屬于這一類網絡設備。snull不能使用ARP,因為驅動程序修改被<BR>發送得包得IP地址,而ARP包也交換IP地址。<BR>&nbsp;<BR>如果你的設備想用一般的硬件包頭,卻不想運行ARP,你需要越過缺省的dev-&gt;rebuild_h<BR>eader方法。這就是snull實現的方法,這個簡單的函數有三條語句:<BR>&nbsp;<BR>(代碼329)<BR>&nbsp;<BR>事實上,并沒有指定eth-&gt;h_source和eth-&gt;h_dest內容的實際需要,因為這些值只被用<BR>來進行包得物理傳送,而一個點到點得連接保證能將包發送到它的目的地,而與硬件地<BR>址無關。snull重構包頭的原因是向你演示,當eth_rebuild_header不可用時,一個真實<BR>的網絡接口的重構函數是如何實現的,<BR>&nbsp;<BR>當接口收到一個包時,硬件包頭只被eth_type_trans使用。我們在snull_rx中已經見過<BR>這個調用:<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skb-&gt;protocol=eth_type_trans(skb,dev);<BR>&nbsp;<BR>這個函數從以太網包頭中抽取協議標志符(在這里是ETH_P_IP);它還要賦值skb-&gt;mac.<BR>raw,從包數據中刪去硬件包頭,并設置skb-&gt;pkt_type。最后一項在skb分配時缺省為PA<BR></P></FONT><FONT 
      color=#ffffff size=3>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91一区二区在线观看| 337p亚洲精品色噜噜狠狠| 色妞www精品视频| 欧美成人一区二区| 一区二区三区在线观看网站| 蜜桃久久av一区| 欧美天堂一区二区三区| 国产精品美日韩| 国内精品视频一区二区三区八戒| 欧美中文字幕亚洲一区二区va在线| 久久网站热最新地址| 天天综合色天天| 在线视频观看一区| 亚洲天堂中文字幕| 国产91精品免费| 久久免费的精品国产v∧| 日韩中文字幕1| 欧美日韩国产一区二区三区地区| 亚洲免费观看在线视频| 成人小视频在线观看| 久久综合狠狠综合| 韩国欧美国产1区| 欧美电影精品一区二区| 日本不卡在线视频| 欧美夫妻性生活| 亚洲成人资源在线| 欧美日韩国产精选| 天天综合色天天综合| 3atv一区二区三区| 久久激情五月婷婷| 久久九九久久九九| 成人午夜视频在线观看| 国产精品传媒视频| 色天天综合色天天久久| 亚洲福利一区二区三区| 欧美二区在线观看| 精品一区二区日韩| 久久久久国产精品麻豆ai换脸| 国产麻豆一精品一av一免费 | 欧美a级理论片| 日韩写真欧美这视频| 日韩电影一二三区| 精品欧美久久久| 国产成人亚洲综合a∨猫咪| 国产丝袜美腿一区二区三区| 不卡的av电影| 亚洲欧洲99久久| 欧美亚洲高清一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 日韩限制级电影在线观看| 国产一区二区精品久久91| 国产精品萝li| 色8久久人人97超碰香蕉987| 香蕉成人伊视频在线观看| 欧美电视剧在线观看完整版| 国产suv一区二区三区88区| 国产精品午夜免费| 欧美日韩另类国产亚洲欧美一级| 免费观看在线综合| 国产精品久久久久9999吃药| 欧美在线小视频| 久久精品国产久精国产爱| 中文字幕乱码亚洲精品一区| 91蜜桃婷婷狠狠久久综合9色| 午夜精品aaa| 欧美激情一区二区三区在线| 在线一区二区三区| 国产一区二区三区在线观看免费| 亚洲人妖av一区二区| 欧美一区二区视频观看视频| 粉嫩久久99精品久久久久久夜| 亚洲激情男女视频| 久久综合九色综合欧美亚洲| 欧美在线一区二区| 国产精品91xxx| 石原莉奈在线亚洲三区| 亚洲欧美综合色| 欧美精品一区二区三区很污很色的 | 国产精品美女久久久久久| 欧美日韩国产123区| 大尺度一区二区| 日本不卡在线视频| 亚洲美女屁股眼交3| 久久久久久一二三区| 欧美日韩国产大片| 91在线观看污| 国产一区二区精品在线观看| 日韩综合一区二区| 一区二区三区久久久| 久久精品亚洲精品国产欧美kt∨| 欧美日韩不卡一区二区| av电影在线不卡| 国产福利一区在线| 国产专区欧美精品| 免费成人在线视频观看| 午夜精品福利在线| 亚洲激情欧美激情| 欧美国产综合一区二区| 久久久久久夜精品精品免费| 日韩视频在线一区二区| 欧美日韩国产综合视频在线观看| 色综合天天综合网天天狠天天| 国产福利一区在线| 国产美女久久久久| 国产精品一区二区久激情瑜伽| 日本怡春院一区二区| 亚洲五码中文字幕| 亚洲一区二区在线观看视频 | 91在线观看视频| 成人激情视频网站| 本田岬高潮一区二区三区| 国产成人精品综合在线观看| 国产成人一级电影| 国产激情精品久久久第一区二区| 蜜桃av噜噜一区| 久久丁香综合五月国产三级网站| 美女高潮久久久| 精品写真视频在线观看| 国产伦精品一区二区三区免费迷| 韩国av一区二区三区四区| 国产一区二区三区黄视频| 国产福利不卡视频| 国产成人aaa| 91在线一区二区三区| 在线观看不卡视频| 欧美丰满嫩嫩电影| 欧美r级在线观看| 中文字幕 久热精品 视频在线| 欧美国产成人精品| 日韩一区日韩二区| 亚洲一区二区欧美| 麻豆一区二区三| 国产风韵犹存在线视精品| www.亚洲色图.com| 欧美午夜一区二区三区 | 日本91福利区| 国产一区二区美女| 色综合一区二区三区| 欧美日韩高清一区| 2021久久国产精品不只是精品| 欧美激情一区二区三区四区| 亚洲精品欧美二区三区中文字幕| 亚洲成人自拍偷拍| 国产高清久久久久| 欧美唯美清纯偷拍| 国产欧美日韩视频一区二区| 韩国女主播一区二区三区| 精品一区二区三区在线播放| 北条麻妃一区二区三区| 欧美日韩国产在线观看| 国产色产综合色产在线视频| 亚洲欧美日韩系列| 激情欧美一区二区| 在线看国产日韩| 久久人人爽爽爽人久久久| 亚洲一区二区三区小说| 国产乱色国产精品免费视频| 欧美在线你懂得| 久久精品在这里| 日韩黄色片在线观看| 99久久精品国产毛片| 欧美一区二区大片| 一区二区三区欧美激情| 国内一区二区视频| 欧美精品xxxxbbbb| 亚洲同性gay激情无套| 九九久久精品视频| 欧美日韩你懂得| 亚洲欧美aⅴ...| 丁香激情综合国产| 精品日韩欧美在线| 日韩国产一区二| 欧美伊人久久久久久久久影院| 久久久精品2019中文字幕之3| 日韩电影在线观看网站| 欧美在线观看一区二区| 中文字幕一区二区三| 粉嫩蜜臀av国产精品网站| 精品国产一区二区在线观看| 日韩电影免费在线观看网站| 欧美午夜精品一区二区三区| 亚洲欧洲精品一区二区三区不卡| 国产一本一道久久香蕉| 日韩欧美中文字幕制服| 日韩电影免费在线观看网站| 欧美亚一区二区| 亚洲精品视频一区二区| 91小视频在线观看| 亚洲人成精品久久久久久| 国产精品一区专区| 久久久久国产一区二区三区四区| 老色鬼精品视频在线观看播放| 欧美一二三区精品| 美脚の诱脚舐め脚责91| 日韩视频一区二区| 毛片av一区二区| 精品久久久久久综合日本欧美| 日本午夜一区二区| 精品国精品国产尤物美女| 国产精品羞羞答答xxdd|