<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.16.?快速參考 本節提供了本章中介紹的概念的參考. 也解釋了每個驅動需要包含的頭文件的角色. 在 net_device 和 sk_buff 結構中成員的列表, 但是, 這里沒有重復. ~~~ #include <linux/netdevice.h> ~~~ 定義 struct net_device 和 struct net_device_stats 的頭文件, 包含了幾個其他網絡驅動需要的頭文件. ~~~ struct net_device *alloc_netdev(int sizeof_priv, char *name, void (*setup)(struct net_device *); struct net_device *alloc_etherdev(int sizeof_priv); void free_netdev(struct net_device *dev); ~~~ 分配和釋放 net_device 結構的函數 ~~~ int register_netdev(struct net_device *dev); void unregister_netdev(struct net_device *dev); ~~~ 注冊和注銷一個網絡設備. ~~~ void *netdev_priv(struct net_device *dev); ~~~ 獲取網絡設備結構的驅動私有區域的指針的函數. ~~~ struct net_device_stats; ~~~ 持有設備統計的結構. ~~~ netif_start_queue(struct net_device *dev); netif_stop_queue(struct net_device *dev); netif_wake_queue(struct net_device *dev); ~~~ 控制傳送給驅動來發送的報文的函數. 沒有報文被傳送, 直到 netif_start_queue 被調用. netif_stop_queue 掛起發送, netif_wake_queue 重啟隊列并刺探網絡層重啟發送報文. ~~~ skb_shinfo(struct sk_buff *skb); ~~~ 宏定義, 提供對報文緩存的"shared info"部分的存取. ~~~ void netif_rx(struct sk_buff *skb); ~~~ 調用來通知內核一個報文已經收到并且封裝到一個 socket 緩存中的函數. ~~~ void netif_rx_schedule(dev); ~~~ 來告訴內核報文可用并且應當啟動查詢接口; 它只是被 NAPI 兼容的驅動使用. ~~~ int netif_receive_skb(struct sk_buff *skb); void netif_rx_complete(struct net_device *dev); ~~~ 應當只被 NAPI 兼容的驅動使用. netif_receive_skb 是對于 netif_rx 的 NAPI 對等函數; 它遞交一個報文給內核. 當一個 NAPI 兼容的驅動已耗盡接收報文的供應, 它應當重開中斷, 并且調用 netif_rx_complete 來停止查詢. ~~~ #include <linux/if.h> ~~~ 由 netdevice.h 包含, 這個文件聲明接口標志( IFF_ 宏定義 )和 struct ifmap, 它在網絡驅動的 ioctl 實現中有重要地位. ~~~ void netif_carrier_off(struct net_device *dev); void netif_carrier_on(struct net_device *dev); int netif_carrier_ok(struct net_device *dev); ~~~ 前 2 個函數可用來告知內核是否接口上有載波信號. netif_carrier_ok 測試載波狀態, 如同在設備結構中反映的. ~~~ #include <linux/if_ether.h> ETH_ALENETH_P_IPstruct ethhdr; ~~~ 由 netdevice.h 包含, if_ether.h 定義所有的 ETH_ 宏定義, 用來代表字節長度( 例如地址長度 )以及網絡協議(例如 IP). 它也定義 ethhdr 結構. ~~~ #include <linux/skbuff.h> ~~~ struct sk_buff 和相關結構的定義, 以及幾個操作緩存的內聯函數. 這個頭文件由 netdevice.h 包含. ~~~ struct sk_buff *alloc_skb(unsigned int len, int priority); struct sk_buff *dev_alloc_skb(unsigned int len); void kfree_skb(struct sk_buff *skb); void dev_kfree_skb(struct sk_buff *skb); void dev_kfree_skb_irq(struct sk_buff *skb); void dev_kfree_skb_any(struct sk_buff *skb); ~~~ 處理 socket 緩存的分配和釋放的函數. 通常驅動應當使用 dev_ 變體, 其意圖就是此目的. ~~~ unsigned char *skb_put(struct sk_buff *skb, int len); unsigned char *__skb_put(struct sk_buff *skb, int len); unsigned char *skb_push(struct sk_buff *skb, int len); unsigned char *__skb_push(struct sk_buff *skb, int len); ~~~ 添加數據到一個 skb 的函數; skb_put 在 skb 的尾部放置數據, 而 skb_push 放在開始. 正常版本進行檢查以確保有足夠的空間; 雙下劃線版本不進行檢查. ~~~ int skb_headroom(struct sk_buff *skb); int skb_tailroom(struct sk_buff *skb); void skb_reserve(struct sk_buff *skb, int len); ~~~ 進行 skb 中的空間管理的函數. skb_headroom 和 skb_tailroom 說明在開始和結尾分別有多少空間可用. skb_reserve 可用來保留空間, 在一個必須為空的 skb 開始. ~~~ unsigned char *skb_pull(struct sk_buff *skb, int len); ~~~ skb_pull "去除" 數據從一個 skb, 通過調整內部指針. ~~~ int skb_is_nonlinear(struct sk_buff *skb); ~~~ 如果這個 skb 是為發散/匯聚 I/O 分隔為幾個片, 函數返回一個真值. ~~~ int skb_headlen(struct sk_buff *skb); ~~~ 返回 skb 的第一個片的長度, 由 skb->data 指向. ~~~ void *kmap_skb_frag(skb_frag_t *frag); void kunmap_skb_frag(void *vaddr); ~~~ 提供對非線性 skb 中的片直接存取的函數. ~~~ #include <linux/etherdevice.h> void ether_setup(struct net_device *dev); ~~~ 為以太網驅動設置大部分方法為通用實現的函數. 它還設置 dev->flags 和安排下一個可用的 ethx 給 dev->name, 如果名子的第一個字符是一個空格或者 NULL 字符. ~~~ unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev); ~~~ 當一個以太網接口收到一個報文, 這個函數被調用來設置 skb->pkt_type. 返回值是一個協議號, 通常存儲于 skb->protocol. ~~~ #include <linux/sockios.h> SIOCDEVPRIVATE ~~~ 前 16 個 ioctl 命令, 每個驅動可為它們自己的私有用途而實現. 所有的網絡 ioctl 命令都在 sockios.h 中定義. ~~~ #include <linux/mii.h> struct mii_if_info; ~~~ 聲明和一個結構, 支持實現 MII 標準的設備的驅動. ~~~ #include <linux/ethtool.h> struct ethtool_ops; ~~~ 聲明和結構, 使得設備與 ethtool 工具一起工作.
                  <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>

                              哎呀哎呀视频在线观看