歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

網絡設備驅動 和 DM9000 驅動程序分析

分析內核版本:Linux 2.6.36.2。 分析網卡:DM9000

一、網絡設備驅動程序分析。

1、Linux 網絡設備驅動程序 分層:

Linux 網絡設備驅動程序從上到下可分為4層,依次為:網絡協議接口層、網絡設備接口層、提供實際功能的設備 驅動功能層、以及  網絡設備與媒介層。這4層作用如下:

1) 網絡協議接口層:網絡協議接口層想網絡協議提供統一的數據包收發接口,不論是上層ARP,還是IP,都通過dev_queue_xmit() 函數收發數據,並通過netif_rx 函數

接收數據。這一層的存在使得上層協議獨立於具體的設備。

2)網絡設備接口層:網絡設備接口層向協議層接口層提供統一的用於描述具體網絡設備屬性 和 操作的結構體 net_device,該結構體是設備驅動功能層中各函數的容器,

實際上,網絡設備接口層從宏觀上規劃了具體操作硬件的設備驅動功能層的結構。

3)設備功能層:該層的各個函數是網絡設備接口層net_device 數據結構具體成員,是驅使網絡設備硬件完成相應動作的程序,它通過har_start_xmit() 函數啟動發送操作,

並通過網絡設備上的中斷觸發接收操作。

4)網絡設備 與 媒介層: 是完成數據包發送和接收的物理實體,包括網絡適配器和具體的傳輸媒介,網絡適配器被設備驅動功能層中的函數物理上驅動,對於Linux而言,

網絡設備和媒介都是可以虛擬的。

在設計具體的網絡設備驅動程序是,我們需要完成的主要工作是編寫設備驅動功能層 的 相關函數以以填充net_device 數據結構的內容並將net_device 注冊入內核。

2、網絡協議接口層程序分析:

1) int netif_xmit (struct sk_buff *skb);// 發送一個sk_buff 數據包

int netif_rx (struct sk_buff *skb);   // 接收一個數據包

以上函數定義在 net/core/dev.c 中

sk_buff 結構體定義在 include/linux/skbuff.h 文件, 它的含義為“套接字緩沖區”,用於在Linux 網絡子系統中個層之間傳遞數據,是Linux 網絡子系統數據傳遞的“中樞神經”

2) 套接字緩沖區 sk_buff 結構體

  1. struct sk_buff {  
  2.     /* These two members must be first. */  
  3.     struct sk_buff      *next;  
  4.     struct sk_buff      *prev;  
  5.   
  6.     ktime_t         tstamp;  
  7.   
  8.     struct sock     *sk;  
  9.     struct net_device   *dev;  
  10.   
  11.     /* 
  12.      * This is the control buffer. It is free to use for every 
  13.      * layer. Please put your private variables there. If you 
  14.      * want to keep them across layers you have to do a skb_clone() 
  15.      * first. This is owned by whoever has the skb queued ATM. 
  16.      */  
  17.     char            cb[48] __aligned(8);  
  18.   
  19.     unsigned long       _skb_refdst;  
  20. #ifdef CONFIG_XFRM   
  21.     struct  sec_path    *sp;  
  22. #endif   
  23.     unsigned int        len,  
  24.                 data_len;  
  25.     __u16           mac_len,  
  26.                 hdr_len;  
  27.     union {  
  28.         __wsum      csum;  
  29.         struct {  
  30.             __u16   csum_start;  
  31.             __u16   csum_offset;  
  32.         };  
  33.     };  
  34.     __u32           priority;  
  35.     kmemcheck_bitfield_begin(flags1);  
  36.     __u8            local_df:1,  
  37.                 cloned:1,  
  38.                 ip_summed:2,  
  39.                 nohdr:1,  
  40.                 nfctinfo:3;  
  41.     __u8            pkt_type:3,  
  42.                 fclone:2,  
  43.                 ipvs_property:1,  
  44.                 peeked:1,  
  45.                 nf_trace:1;  
  46.     kmemcheck_bitfield_end(flags1);  
  47.     __be16          protocol;  
  48.   
  49.     void            (*destructor)(struct sk_buff *skb);  
  50. #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)   
  51.     struct nf_conntrack *nfct;  
  52.     struct sk_buff      *nfct_reasm;  
  53. #endif   
  54. #ifdef CONFIG_BRIDGE_NETFILTER   
  55.     struct nf_bridge_info   *nf_bridge;  
  56. #endif   
  57.   
  58.     int         skb_iif;  
  59. #ifdef CONFIG_NET_SCHED   
  60.     __u16           tc_index;   /* traffic control index */  
  61. #ifdef CONFIG_NET_CLS_ACT   
  62.     __u16           tc_verd;    /* traffic control verdict */  
  63. #endif   
  64. #endif   
  65.   
  66.     __u32           rxhash;  
  67.   
  68.     kmemcheck_bitfield_begin(flags2);  
  69.     __u16           queue_mapping:16;  
  70. #ifdef CONFIG_IPV6_NDISC_NODETYPE   
  71.     __u8            ndisc_nodetype:2,  
  72.                 deliver_no_wcard:1;  
  73. #else   
  74.     __u8            deliver_no_wcard:1;  
  75. #endif   
  76.     kmemcheck_bitfield_end(flags2);  
  77.   
  78.     /* 0/14 bit hole */  
  79.   
  80. #ifdef CONFIG_NET_DMA   
  81.     dma_cookie_t        dma_cookie;  
  82. #endif   
  83. #ifdef CONFIG_NETWORK_SECMARK   
  84.     __u32           secmark;  
  85. #endif   
  86.     union {  
  87.         __u32       mark;  
  88.         __u32       dropcount;  
  89.     };  
  90.   
  91.     __u16           vlan_tci;  
  92.   
  93.     sk_buff_data_t      transport_header;    // 傳輸層   
  94.     sk_buff_data_t      network_header;      // 網絡層   
  95.     sk_buff_data_t      mac_header;          // MAC 層   
  96.     /* These elements must be at the end, see alloc_skb() for details.  */  
  97.     sk_buff_data_t      tail;  
  98.     sk_buff_data_t      end;  
  99.     unsigned char       *head,      // 緩沖區頭指針   
  100.                 *data;      // 有效數據頭指針   
  101.     unsigned int        truesize;  
  102.     atomic_t        users;  
  103. };  
Copyright © Linux教程網 All Rights Reserved