Network Driver in Linux 2.4.ppt

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Network Driver in Linux 2.4.ppt

Network Driver in Linux 2.4 潘仁義 CCU COMM Overview Outline Driver framework Linux network drivers Device operation RTL8139 programming Driver example A piece of code for 93C46 series EEPROM, 93C46 64 x 16 bits, 93C66 256 x 16 bits pci_skeleton.c (for RTL8139) Linux network driver framework Connecting to the Kernel (1/2) Module_loading struct net_device snull_dev = { init : snull_init, }; //初始化函式 if((result = register_netdev(snull_dev)))) printk(“error”); 呼叫前, 先設定name 為“eth%d”, 以便其配置 “ethX” 函式內部會呼叫 dev?init() snull_init( ) Probe function Called when register_netdev() Usually avoid registering I/O and IRQ, delay until dev?open() time To fill in the “dev” strcuture ether_setup(dev) 設定私有資料結構 “priv”; 網路介面生命期與系統一樣長, 可放統計資料 Module_unloading kfree(priv); unregister_netdev (snull_dev); Linux network driver framework Connecting to the Kernel (2/2) struct net_device { char name[IFNAMSIZ]; // eth%d unsigned long base_addr, unsigned char irq; unsigned char broadcast[], dev_addr[MAX_ADDR_LEN]; unsigned short flags; // IFF_UP, IFF_PROMISC, IFF_ALLMULTI Function pointers: (*init) 初始化 (*open) 開啟介面 (*stop) 停用介面 (*do_ioctl)() (*tx_timeout) 逾時處理 (*get_stats) 結算統計資訊 (*hard_start_xmit) 送出封包 (*set_multicast_list) 群播及flag變動處理 unsigned long trans_start, last_rx; // for watchdog and power management struct dev_mc_list *mc_list; // multicast address list Linux network driver framework Opening and closing 在介面傳輸封包之前,必須先以ifconfig開啟介面,並賦予IP位址 ifconfig設定IP位址給介面時: ioctl(SIOCSIFADDR)?設定軟體位址給介面 Ioctl(SIOCSIFILAGS)?要求驅動程式開啟、關閉介面?觸動open及stop open() 設法取得必要的系統資源(佔領IRQ, IObase, buffer) 要求介面硬體起動 讀出MAC, 複製到 dev?dev_addr (也可作在init或probe時) 將dev?dev_addr設定至介面MAC暫存器中 stop() 停止介面硬體 歸還系統資源 Linux network driver framework Packet transmission: 當核心需要送出資料封包時 將資料排入出境封包佇列(outgoing queue) 呼叫作業方法 hard_start_transmit(struct sk_buff *skb, struct net_device *dev) 僅將封包交付網卡。網卡後續會再將封包傳送至網路(例如RTL8139) Spinlock_t xmit_lock; 只有在返回後才有可能再被呼叫 實務上,於返回之後,網路卡仍忙著傳輸剛交付的封包。 網卡緩衝區小,滿了必須讓核心知道,不接收新的傳輸要求。 netif_stop_queue()與netif_wake_qu

文档评论(0)

gtez + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档