<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 17.4.?打開與關閉 我們的驅動可以在模塊加載時或者內核啟動時探測接口. 在接口能夠承載報文前, 但是, 內核必須打開它并分配一個地址給它. 內核打開或者關閉一個接口對應 ifconfig 命令. 當 ifconfig 用來給接口安排一個地址, 它做 2 個任務. 第一, 它通過 ioctl(SIOCSIFADDR)( Socket I/O Control Set Interface Address) 來安排地址. 接著它設置 dev->flag 的 IFF_UP 位, 通過 ioctl(SIOCSIFFLAGS) ( Socket I/O Control Set Interface Flags) 來打開接口. 目前為止, ioctl(SIOCSIFADDR) 不做任何事. 沒有驅動函數被調用 -- 這個任務是獨立于設備的, 并且是內核實現它. 后面的命令 (ioctl(SIOCSIFFLAGS)), 但是, 為設備調用 open 方法. 相似地, 當接口關閉, ifconfig 使用 ioctl(SIOCSIFFLAGS) 來清除 IFF_UP, 并且 stop 方法被調用. 2 個設備方法都返回 0 在成功時, 并且出錯時返回負值. 目前為止的實際代碼, 驅動不得不進行許多與字符和塊驅動同樣的任務. open 請求任何它需要的系統資源并且告知接口啟動; stop 關閉接口并釋放系統資源. 網絡驅動必須進行一些附加的步驟在 open 時, 但是. 第一, 硬件 (MAC) 地址需要從硬件設備拷貝到 dev->dev_addr, 在接口可以和外部世界通訊之前. 硬件地址接著在 open 時拷貝到設備. snull 軟件接口在 open 里面安排它; 它只是使用了一個長為 ETH_ALEN 的字符串偽造了一個硬件號, ETH_ALEN 是以太網硬件地址長度. open 方法應當也啟動接口的發送隊列( 允許它接受發送報文 ), 一旦它準備好啟動發送數據. 內核提供了一個函數來啟動隊列: ~~~ void netif_start_queue(struct net_device *dev); ~~~ snull 的 open 代碼看來如下: ~~~ int snull_open(struct net_device *dev) { /* request_region(), request_irq( ), .... (like fops->open) */ /* * Assign the hardware address of the board: use "\0SNULx", where * x is 0 or 1. The first byte is '\0' to avoid being a multicast * address (the first byte of multicast addrs is odd). */ memcpy(dev->dev_addr, "\0SNUL0", ETH_ALEN); if (dev == snull_devs[1]) dev->dev_addr[ETH_ALEN-1]++; /* \0SNUL1 */ netif_start_queue(dev); return 0; } ~~~ 如你所見, 在缺乏真實硬件的情況下, 在 *open* 方法中沒什么可做. stop 方法也一樣; 它只是反轉 open 的操作. 因此, 實現 stop 的函數常常稱為 close 或者 release. ~~~ int snull_release(struct net_device *dev) { /* release ports, irq and such -- like fops->close */ netif_stop_queue(dev); /* can't transmit any more */ return 0; } ~~~ 函數: ~~~ void netif_stop_queue(struct net_device *dev); ~~~ 是 netif_start_queue 的對立面; 它標志設備為不能再發送任何報文. 這個函數必須在接口關閉( 在 stop 方法中 )時調用, 但以可用于暫時停止發送, 如下一節中解釋的.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看