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

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

?? linux網絡驅動程序編寫(二).txt

?? LINUX下的安裝聲卡等操作和技巧介紹
?? TXT
字號:
作者:獨孤九劍
email: mikaiyue@sina.com
日期:2001-7-4 19:44:53
2.2 網絡驅動程序的基本方法
    網絡設備做為一個對象,提供一些方法供系統(tǒng)訪問。正是這些有統(tǒng)一接口的方法,掩蔽了硬件的具體細節(jié),讓系統(tǒng)對各種網絡設備的訪問都采用統(tǒng)一的形式,做到硬件無關性。
    下面解釋最基本的方法。
2.2.1 初始化(initialize)
    驅動程序必須有一個初始化方法。在把驅動程序載入系統(tǒng)的時候會調用這個初始化程序。它做以下幾方面的工作。檢測設備。在初始化程序里你可以根據硬件的特征檢查硬件是否存在,然后決定是否啟動這個驅動程序。配置和初始化硬件。在初始化程序里你可以完成對硬件資源的配置,比如即插即用的硬件就可以在這個時候進行配置(Linux內核對PnP功能沒有很好的支持,可以在驅動程序里完成這個功能)。配置或協(xié)商好硬件占用的資源以后,就可以向系統(tǒng)申請這些資源。有些資源是能)。配置或協(xié)商好硬件占用的資源以后,就可以向系統(tǒng)申請這些資源。有些資源是可以和別的設備共享的,如中斷。有些是不能共享的,如IO、DMA。接下來你要初始化device結構中的變量。最后,你可以讓硬件正式開始工作。

2.2.2 打開(open)
    open這個方法在網絡設備驅動程序里是網絡設備被激活的時候被調用(即設備狀態(tài)由down-->up)。所以實際上很多在initialize中的工作可以放到這里來做。比如資源的申請,硬件的激活。如果dev->open返回非0(error),則硬件的狀態(tài)還是down。
    open方法另一個作用是如果驅動程序做為一個模塊被裝入,則要防止模塊卸載時設備處于打開狀態(tài)。在open方法里要調用MOD_INC_USE_COUNT宏。

2.2.3 關閉(stop)
    close方法做和open相反的工作。可以釋放某些資源以減少系統(tǒng)負擔。close是在設備狀態(tài)由up轉為down時被調用的。另外如果是做為模塊裝入的驅動程序,close里應該調用MOD_DEC_USE_COUNT,減少設備被引用的次數,以使驅動程序可以被卸載。另外close方法必須返回成功(0==success)。

2.2.4 發(fā)送(hard_start_xmit)
    所有的網絡設備驅動程序都必須有這個發(fā)送方法。在系統(tǒng)調用驅動程序的xmit時,發(fā)送的數據放在一個sk_buff結構中。一般的驅動程序把數據傳給硬件發(fā)出去。也有一些特殊的設備比如loopback把數據組成一個接收數據再回送給系統(tǒng),或者dummy設備直接丟棄數據。如果發(fā)送成功,hard_start_xmit方法里釋放sk_buff,返回0(發(fā)送成功)。如果發(fā)送成功,hard_start_xmit方法里釋放sk_buff,返回0(發(fā)送成功)。如果設備暫時無法處理,比如硬件忙,則返回1。這時如果dev->tbusy置為非0,則系統(tǒng)認為硬件忙,要等到dev->tbusy置0以后才會再次發(fā)送。tbusy的置0任務一般由中斷完成。硬件在發(fā)送結束后產生中斷,這時可以把tbusy置0,然后用mark_bh()調用通知系統(tǒng)可以再次發(fā)送。在發(fā)送不成功的情況下,也可以不置dev->tbusy為非0,這樣系統(tǒng)會不斷嘗試重發(fā)。如果hard_start_xmit發(fā)送不成功,則不要釋放sk_buff。
    傳送下來的sk_buff中的數據已經包含硬件需要的幀頭。所以在發(fā)送方法里不需要再填充硬件幀頭,數據可以直接提交給硬件發(fā)送。sk_buff是被鎖住的(locked),確保其他程序不會存取它。

2.2.5 接收(reception)
    驅動程序并不存在一個接收方法。有數據收到應該是驅動程序來通知系統(tǒng)的。一般設備收到數據后都會產生一個中斷,在中斷處理程序中驅動程序申請一塊sk_buff(skb),從硬件讀出數據放置到申請好的緩沖區(qū)里。接下來填充sk_buff中的一些信息。skb->dev = dev,判斷收到幀的協(xié)議類型,填入skb->protocol(多協(xié)議的支持)。把指針skb->mac.raw指向硬件數據然后丟棄硬件幀頭(skb_pull)。還要設置skb->pkt_type,標明第二層(鏈路層)數據類型。可以是以下類型: 
  PACKET_BROADCAST : 鏈路層廣播
  PACKET_MULTICAST : 鏈路層組播
  PACKET_SELF      : 發(fā)給自己的幀
  PACKET_OTHERHOST : 發(fā)給別人的幀(監(jiān)聽模式時會有這種幀)

最后調用netif_rx()把數據傳送給協(xié)議層。netif_rx()里數據放入處理隊列然后返最后調用netif_rx()把數據傳送給協(xié)議層。netif_rx()里數據放入處理隊列然后返回,真正的處理是在中斷返回以后,這樣可以減少中斷時間。調用netif_rx()以后,驅動程序就不能再存取數據緩沖區(qū)skb。

2.2.6 硬件幀頭(hard_header)
    硬件一般都會在上層數據發(fā)送之前加上自己的硬件幀頭,比如以太網(Ethernet)就有14字節(jié)的幀頭。這個幀頭是加在上層ip、ipx等數據包的前面的。驅動程序提供一個hard_header方法,協(xié)議層(ip、ipx、arp等)在發(fā)送數據之前會調用這段程序。硬件幀頭的長度必須填在dev->hard_header_len,這樣協(xié)議層回在數據之前保留好硬件幀頭的空間。這樣hard_header程序只要調用skb_push然后正確填入硬件幀頭就可以了。
    在協(xié)議層調用hard_header時,傳送的參數包括(2.0.xx):數據的sk_buff,
device指針,protocol,目的地址(daddr),源地址(saddr),數據長度(len)。數據長度不要使用sk_buff中的參數,因為調用hard_header時數據可能還沒完全組織好。saddr是NULL的話是使用缺省地址(default)。daddr是NULL表明協(xié)議層不知道硬件目的地址。如果hard_header完全填好了硬件幀頭,則返回添加的字節(jié)數。如果硬件幀頭中的信息還不完全(比如daddr為NULL,但是幀頭中需要目的硬件地址。典型的情況是以太網需要地址解析(arp)),則返回負字節(jié)數。hard_header返回負數的情況下,協(xié)議層會做進一步的build header的工作。目前Linux系統(tǒng)里就是做arp(如果hard_header返回正,dev->arp=1,表明不需要做arp,返回負,dev->arp=0,做arp)。對hard_header的調用在每個協(xié)議層的處理程序里。如ip_output。

2.2.7 地址解析(xarp)
    有些網絡有硬件地址(比如Ethernet),并且在發(fā)送硬件幀時需要知道目的硬件地址。這樣就需要上層協(xié)議地址(ip、ipx)和硬件地址的對應。這個對應是通過地址解析完成的。需要做arp的的設備在發(fā)送之前會調用驅動程序的rebuild_header方法。調用的主要參數包括指向硬件幀頭的指針,協(xié)議層地址。如果驅動程序能夠解析硬件地址,就返回1,如果不能,返回0。
    對rebuild_header的調用在net/core/dev.c的do_dev_queue_xmit()里。
2.2.8 參數設置和統(tǒng)計數據
    在驅動程序里還提供一些方法供系統(tǒng)對設備的參數進行設置和讀取信息。一般只有超級用戶(root)權限才能對設備參數進行設置。設置方法有:
    dev->set_mac_address()
    當用戶調用ioctl類型為SIOCSIFHWADDR時是要設置這個設備的mac地址。一般對mac地址的設置沒有太大意義的。
    dev->set_config()

    當用戶調用ioctl時類型為SIOCSIFMAP時,系統(tǒng)會調用驅動程序的set_config方法。用戶會傳遞一個ifmap結構包含需要的I/O、中斷等參數。
    dev->do_ioctl()
    dev->do_ioctl()
    如果用戶調用ioctl時類型在SIOCDEVPRIVATE和SIOCDEVPRIVATE+15之間,系統(tǒng)會調用驅動程序的這個方法。一般是設置設備的專用數據。
    讀取信息也是通過ioctl調用進行。除次之外驅動程序還可以提供一個
dev->get_stats方法,返回一個enet_statistics結構,包含發(fā)送接收的統(tǒng)計信息。
    ioctl的處理在net/core/dev.c的dev_ioctl()和dev_ifsioc()里。

2.3 網絡驅動程序中用到的數據結構
    最重要的是網絡設備的數據結構。定義在include/linux/netdevice.h里。它的注釋已經足夠詳盡。
struct device
{

  /*
   * This is the first field of the "visible" part of this structure
   * (i.e. as seen by users in the "Space.c" file).  It is the name
   * the interface.
   */
  char                    *name;

  /* I/O specific fields - FIXME: Merge these and struct ifmap into one */
  unsigned long           rmem_end;             /* shmem "recv" end     */
  unsigned long           rmem_end;             /* shmem "recv" end     */
  unsigned long           rmem_start;           /* shmem "recv" start   */
  unsigned long           mem_end;              /* shared mem end       */
  unsigned long           mem_start;            /* shared mem start     */
  unsigned long           base_addr;            /* device I/O address   */
  unsigned char           irq;                  /* device IRQ number    */

  /* Low-level status flags. */
  volatile unsigned char  start,                /* start an operation   */
                          interrupt;            /* interrupt arrived    */
  /* 在處理中斷時interrupt設為1,處理完清0。 */
  unsigned long           tbusy;                /* transmitter busy must be long
 for

  struct device           *next;

  /* The device initialization function. Called only once. */
  /* 指向驅動程序的初始化方法。 */
  int                     (*init)(struct device *dev);

  /* Some hardware also needs these fields, but they are not part of the
     usual set specified in Space.c. */
  /* 一些硬件可以在一塊板上支持多個接口,可能用到if_port。 */
  /* 一些硬件可以在一塊板上支持多個接口,可能用到if_port。 */
  unsigned char           if_port;              /* Selectable AUI, TP,..*/
  unsigned char           dma;                  /* DMA channel          */

  struct enet_statistics* (*get_stats)(struct device *dev);

  /*
   * This marks the end of the "visible" part of the structure. All
   * fields hereafter are internal to the system, and may change at
   * will (read: may be cleaned up at will).
   */

  /* These may be needed for future network-power-down code. */
  /* trans_start記錄最后一次成功發(fā)送的時間。可以用來確定硬件是否工作正常。*/
  unsigned long           trans_start;  /* Time (in jiffies) of last Tx */
  unsigned long           last_rx;      /* Time of last Rx              */

  /* flags里面有很多內容,定義在include/linux/if.h里。*/
  unsigned short          flags;        /* interface flags (a la BSD)   */
  unsigned short          family;       /* address family ID (AF_INET)  */
  unsigned short          metric;       /* routing metric (not used)    */
  unsigned short          mtu;          /* interface MTU value          */

  /* type標明物理硬件的類型。主要說明硬件是否需要arp。定義在
     include/linux/if_arp.h里。 */
  unsigned short          type;         /* interface hardware type      */

  /* 上層協(xié)議層根據hard_header_len在發(fā)送數據緩沖區(qū)前面預留硬件幀頭空間。*/
  unsigned short          hard_header_len;      /* hardware hdr length  */

  /* priv指向驅動程序自己定義的一些參數。*/
  void                    *priv;        /* pointer to private data      */

  /* Interface address info. */
  unsigned char           broadcast[MAX_ADDR_LEN];      /* hw bcast add */
  unsigned char           pad;                          /* make dev_addr aligned
 to 8
bytes */
  unsigned char           dev_addr[MAX_ADDR_LEN];       /* hw address   */
  unsigned char           addr_len;     /* hardware address length      */
  unsigned long           pa_addr;      /* protocol address             */
  unsigned long           pa_brdaddr;   /* protocol broadcast addr      */
  unsigned long           pa_dstaddr;   /* protocol P-P other side addr */
  unsigned long           pa_mask;      /* protocol netmask             */

  struct dev_mc_list     *mc_list;      /* Multicast mac addresses      */
  int                    mc_count;      /* Number of installed mcasts   */

  struct ip_mc_list      *ip_mc_list;   /* IP multicast filter chain    */
  __u32                 tx_queue_len;   /* Max frames per queue allowed */

  /* For load balancing driver pair support */

  unsigned long            pkt_queue;   /* Packets queued */
  struct device           *slave;       /* Slave device */
  struct net_alias_info         *alias_info;    /* main dev alias info */
  struct net_alias              *my_alias;      /* alias devs */

  /* Pointer to the interface buffers. */
  struct sk_buff_head     buffs[DEV_NUMBUFFS];

  /* Pointers to interface service routines. */
  int                     (*open)(struct device *dev);
  int                     (*hard_start_xmit) (struct sk_buff *skb,
                                              struct device *dev);
  int                     (*hard_header) (struct sk_buff *skb,
                                          struct device *dev,
                                          unsigned short type,
                                          void *daddr,
                                          void *saddr,
                                          unsigned len);
  int                     (*rebuild_header)(void *eth, struct device *dev,
                                unsigned long raddr, struct sk_buff *skb);
#define HAVE_MULTICAST
  void                    (*set_multicast_list)(struct device *dev);
#define HAVE_SET_MAC_ADDR
  int                     (*set_mac_address)(struct device *dev, void *addr);
#define HAVE_PRIVATE_IOCTL
  int                     (*do_ioctl)(struct device *dev, struct ifreq *ifr, int
 cmd);
#define HAVE_SET_CONFIG
  int                     (*set_config)(struct device *dev, struct ifmap *map);
#define HAVE_HEADER_CACHE
  void                    (*header_cache_bind)(struct hh_cache **hhp, struct dev
ice
*dev, unsigned short htype, __u32 daddr);
*dev, unsigned short htype, __u32 daddr);
  void                    (*header_cache_update)(struct hh_cache *hh, struct dev
ice
*dev, unsigned char *  haddr);
#define HAVE_CHANGE_MTU

  struct iw_statistics*   (*get_wireless_stats)(struct device *dev);
};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美羞羞免费网站| 国内精品久久久久影院一蜜桃| 99久久国产综合精品女不卡| www.日韩av| 91成人免费在线视频| 日韩三级视频在线观看| 中文字幕一区日韩精品欧美| 午夜精品爽啪视频| 国产成人精品在线看| 欧美亚洲国产一区二区三区va | 自拍偷拍国产亚洲| 日韩成人精品在线观看| 国产精品18久久久久久久网站| 欧美中文字幕一二三区视频| 久久久久国产精品人| 亚洲黄色录像片| 国产精品一区二区在线播放| 日本道免费精品一区二区三区| 久久综合久久综合久久| 亚洲最大色网站| 国产精品正在播放| 欧美天天综合网| 欧美激情综合网| 日韩黄色免费电影| av亚洲精华国产精华| 欧美一级在线视频| 亚洲色图欧美偷拍| 国产在线视频精品一区| 欧美日本乱大交xxxxx| 中文字幕欧美一| 老司机精品视频导航| 91福利视频久久久久| 欧美激情综合五月色丁香小说| 日本不卡中文字幕| 色噜噜狠狠成人中文综合| 久久久噜噜噜久噜久久综合| 午夜成人免费电影| 色综合婷婷久久| 日本欧美大码aⅴ在线播放| 成人av资源在线| 久久网这里都是精品| 热久久久久久久| 欧洲国内综合视频| 国产精品久久综合| 国产老肥熟一区二区三区| 欧美一区二区三区播放老司机| 一区二区三区美女视频| 99精品视频一区二区| 国产亚洲精久久久久久| 精品一区二区三区影院在线午夜| 欧美日韩视频在线一区二区| 亚洲欧美激情一区二区| 99久久精品国产观看| 国产色一区二区| 国产激情偷乱视频一区二区三区| 欧美成人aa大片| 青青草视频一区| 在线播放中文字幕一区| 香蕉成人伊视频在线观看| 欧洲一区二区三区在线| 夜夜爽夜夜爽精品视频| 91蝌蚪porny九色| 最新日韩av在线| 99精品久久只有精品| 国产欧美一区二区精品性| 国产一区二区三区美女| 久久香蕉国产线看观看99| 精品在线一区二区三区| 精品国产髙清在线看国产毛片| 麻豆国产精品官网| 欧美大肚乱孕交hd孕妇| 玖玖九九国产精品| 欧美不卡在线视频| 九九九精品视频| 国产日产亚洲精品系列| 风间由美中文字幕在线看视频国产欧美| 久久精品免视看| 成人午夜av电影| 亚洲色图欧美在线| 欧美视频在线播放| 婷婷夜色潮精品综合在线| 51精品视频一区二区三区| 老鸭窝一区二区久久精品| 欧美r级电影在线观看| 国产麻豆精品在线观看| 国产视频一区在线观看| 不卡电影一区二区三区| 亚洲美女视频一区| 欧美性欧美巨大黑白大战| 午夜视频一区二区三区| 欧美成人精品高清在线播放| 国产高清一区日本| 亚洲图片激情小说| 欧美色图在线观看| 六月丁香婷婷色狠狠久久| 久久婷婷色综合| 91视频xxxx| 亚洲不卡一区二区三区| 日韩免费看的电影| 成人高清视频在线| 亚洲国产毛片aaaaa无费看 | 黄页视频在线91| 国产精品狼人久久影院观看方式| 在线亚洲高清视频| 男人的天堂亚洲一区| 日本一二三不卡| 欧美在线啊v一区| 久久不见久久见免费视频7| 国产亚洲成年网址在线观看| 日本道在线观看一区二区| 久久精品国产网站| 中文字幕在线观看一区| 91精品视频网| 波多野结衣中文字幕一区 | 欧美精品乱人伦久久久久久| 狠狠网亚洲精品| 亚洲精品成人a在线观看| 日韩女优av电影| 99精品久久久久久| 免费在线观看视频一区| 国产精品电影一区二区| 欧美一区二区三区视频免费播放 | 亚洲色图清纯唯美| 欧美一区二区三区在线看| 波多野结衣中文字幕一区二区三区 | 久久国产精品第一页| 国产精品免费视频一区| 欧美一区在线视频| 99在线热播精品免费| 另类成人小视频在线| 一区二区视频在线| 久久影院电视剧免费观看| 欧美日韩在线播放| 成人sese在线| 国内一区二区在线| 午夜不卡av免费| 亚洲男帅同性gay1069| 精品国产乱码久久久久久图片| 欧美三级电影在线看| 成人免费黄色在线| 蜜臀av性久久久久蜜臀av麻豆| 亚洲精品国产第一综合99久久 | 波多野结衣视频一区| 秋霞影院一区二区| 一区二区三区欧美亚洲| 国产日产欧美一区| 精品日产卡一卡二卡麻豆| 色综合天天性综合| 国产精品18久久久| 蜜臂av日日欢夜夜爽一区| 亚洲一区二区综合| 136国产福利精品导航| 国产日韩在线不卡| 日韩精品一区二区三区四区| 欧美午夜不卡在线观看免费| 色综合久久中文综合久久97| 高清视频一区二区| 精彩视频一区二区| 老司机精品视频在线| 日韩成人免费电影| 视频一区中文字幕| 夜夜嗨av一区二区三区四季av| 国产精品拍天天在线| 久久久亚洲精华液精华液精华液| 日韩精品一区二区三区swag | 激情六月婷婷久久| 久久99精品久久久| 蜜臀99久久精品久久久久久软件| 午夜日韩在线观看| 亚洲bt欧美bt精品| 亚洲综合一区在线| 亚洲综合在线第一页| 亚洲色图欧洲色图婷婷| 中文字幕一区二区三区在线不卡| 国产精品女主播在线观看| 久久九九久久九九| 久久精品视频在线免费观看 | 一本色道a无线码一区v| 99精品欧美一区二区三区综合在线| 成人性生交大片免费| www.亚洲国产| 91在线播放网址| 91在线观看成人| 在线观看国产精品网站| 欧美日韩亚洲综合一区| 欧美夫妻性生活| 日韩精品一区二区三区四区| 精品理论电影在线| 久久亚洲一级片| 国产精品美女视频| 亚洲男同性视频| 亚洲成精国产精品女| 青青青爽久久午夜综合久久午夜| 日本伊人午夜精品| 久久av资源网| 国产成人午夜99999| 国产成a人亚洲精品| 91网站视频在线观看| 欧美最猛黑人xxxxx猛交| 欧美一区二区三区电影|