久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区

以文本方式查看主題

-  曙海教育集團論壇  (http://www.rfoamep.cn/bbs/index.asp)
--  Linux驅(qū)動開發(fā)  (http://www.rfoamep.cn/bbs/list.asp?boardid=33)
----  NAPI技術(shù)在Linux網(wǎng)絡(luò)驅(qū)動上的應(yīng)用  (http://www.rfoamep.cn/bbs/dispbbs.asp?boardid=33&id=1734)

--  作者:wangxinxin
--  發(fā)布時間:2010-11-24 11:29:37
--  NAPI技術(shù)在Linux網(wǎng)絡(luò)驅(qū)動上的應(yīng)用
這個方法通常被網(wǎng)絡(luò)層在向驅(qū)動的接收循環(huán)隊列獲取新的數(shù)據(jù)包時刻調(diào)用,而驅(qū)動的接收循環(huán)隊列中可以向網(wǎng)絡(luò)層交付的包數(shù)量則在 dev->quota 字段中表示,我們來看 8139cp 中 POLL 的原型:

  static int cp_rx_poll (struct net_device *dev, int *budget)   

  參數(shù) budget 的上層任務(wù)所需要底層傳遞的數(shù)據(jù)包的數(shù)量,這個數(shù)值不能超過netdev_max_backlog 的值。   

  總而言之,POLL 方法被網(wǎng)絡(luò)層調(diào)用,只負責按照網(wǎng)絡(luò)層的要求值("預算"值)提交對應(yīng)數(shù)量的數(shù)據(jù)包。8139CP 的 POLL 方法注冊通常在設(shè)備驅(qū)動程序模塊初始化(調(diào)用 probe)的時候進行,如下:

  static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)

  {

  … …

  dev->poll = cp_rx_poll;

  … …

  }

  

  設(shè)備的 POLL 方法正如前所說的是被網(wǎng)絡(luò)層上的軟中斷 net_rx_action 調(diào)用,我們現(xiàn)在來看具體的流程:

  

  static int cp_rx_poll (struct net_device *dev, int *budget)

  {

   struct cp_private *cp = netdev_priv(dev);

   unsigned rx_tail = cp->rx_tail;

   /*設(shè)定每次進行調(diào)度的時候從設(shè)備發(fā)送到網(wǎng)絡(luò)層次最大的數(shù)據(jù)包的大小*/

  unsigned rx_work = dev->quota;

   unsigned rx;

  

  rx_status_loop:

   rx = 0;

  /*重新打開NIC中斷,在 cp_interrupt 中斷句柄中中斷關(guān)閉了,現(xiàn)在 POLl 已經(jīng)開始處理環(huán)行緩沖隊列中的數(shù)據(jù),

  所以中斷可以打開,準備接收新的數(shù)據(jù)包*/

   cpw16(IntrStatus, cp_rx_intr_mask);  

   while (1) {/*POLL循環(huán)的開始*/

   u32 status, len;

   dma_addr_t mapping;

   struct sk_buff *skb, *new_skb;

   struct cp_desc *desc;

   unsigned buflen;

  /*從下標為rx_tail的內(nèi)存中的環(huán)行緩沖隊列接收隊列rx_skb上"摘下"套接字緩沖區(qū)*/

   skb = cp->rx_skb[rx_tail].skb;

   if (!skb)

   BUG();

  

   desc = &cp->rx_ring[rx_tail];

  /*檢查在 NIC 的環(huán)形隊列(rx_ring)上的最后的數(shù)據(jù)接收狀態(tài),是否有出現(xiàn)接收或者 FIFO 的錯誤,是否*/

   status = le32_to_cpu(desc->opts1);

   if (status & DescOwn)

   break;

  

   len = (status & 0x1fff) - 4;

   mapping = cp->rx_skb[rx_tail].mapping;

  

   if ((status & (FirstFrag   LastFrag)) != (FirstFrag   LastFrag)) {

   /* we don\'t support incoming fragmented frames.

   * instead, we attempt to ensure that the

   * pre-allocated RX skbs are properly sized such

   * that RX fragments are never encountered

   */

   cp_rx_err_acct(cp, rx_tail, status, len);

   cp->net_stats.rx_dropped++;

   cp->cp_stats.rx_frags++;

   goto rx_next;

   }

  

   if (status & (RxError   RxErrFIFO)) {

   cp_rx_err_acct(cp, rx_tail, status, len);

   goto rx_next;

   }

  

   if (netif_msg_rx_status(cp))

   printk(KERN_DEBUG "%s: rx slot %d status 0x%x len %d\\n",

   cp->dev->name, rx_tail, status, len);

  

   buflen = cp->rx_buf_sz + RX_OFFSET;

  /*創(chuàng)建新的套接字緩沖區(qū)*/

   new_skb = dev_alloc_skb (buflen);

   if (!new_skb) {

   cp->net_stats.rx_dropped++;

   goto rx_next;

   }

  

   skb_reserve(new_skb, RX_OFFSET);

   new_skb->dev = cp->dev;

  /*解除原先映射的環(huán)行隊列上的映射區(qū)域*/

   pci_unmap_single(cp->pdev, mapping,

   buflen, PCI_DMA_FROMDEVICE);

  /*檢查套接字緩沖區(qū)(sk_buff)上得到的數(shù)據(jù)校驗和是否正確*/

   /* Handle checksum offloading for incoming packets. */

   if (cp_rx_csum_ok(status))

   skb->ip_summed = CHECKSUM_UNNECESSARY;

   else

   skb->ip_summed = CHECKSUM_NONE;

  /*按照數(shù)據(jù)的實際大小重新定義套接字緩沖區(qū)的大小*/

   skb_put(skb, len);  

   mapping =

   cp->rx_skb[rx_tail].mapping =

  /*DMA影射在前面新創(chuàng)建的套接字緩沖區(qū)虛擬地址new_buf->tail到實際的物理地址上,

  并且把這個物理地址掛在接收緩沖區(qū)的隊列中*/

   pci_map_single(cp->pdev, new_skb->tail,

   buflen, PCI_DMA_FROMDEVICE);

  /*把新建立的緩沖區(qū)的虛擬地址掛在接收緩沖區(qū)的隊列中,在下一次訪問rx_skb數(shù)組的這個結(jié)構(gòu)時候,

  POLL方法會從這個虛擬地址讀出接收到的數(shù)據(jù)包*/

   cp->rx_skb[rx_tail].skb = new_skb;

  /*在cp_rx_skb調(diào)用netif_rx_skb,填充接收數(shù)據(jù)包隊列,等待網(wǎng)絡(luò)層在Bottom half隊列中調(diào)用ip_rcv接收網(wǎng)絡(luò)數(shù)據(jù),

  這個函數(shù)替代了以前使用的netif_rx*/

   cp_rx_skb(cp, skb, desc);

   rx++;  

  rx_next:

  /*把前面映射的物理地址掛在NIC設(shè)備的環(huán)行隊列上(也就是rx_ring上,它是在和NIC中物理存儲區(qū)進行了DMA映射的,

  而不是驅(qū)動在內(nèi)存中動態(tài)建立的),準備提交給下層(NIC)進行數(shù)據(jù)傳輸*/

   cp->rx_ring[rx_tail].opts2 = 0;

   cp->rx_ring[rx_tail].addr = cpu_to_le64(mapping);

  /*在相應(yīng)的傳輸寄存器中寫入控制字,把rx_ring的控制權(quán)從驅(qū)動程序交還給NIC硬件*/

   if (rx_tail == (CP_RX_RING_SIZE - 1))

   desc->opts1 = cpu_to_le32(DescOwn   RingEnd  

   cp->rx_buf_sz);

   else

   desc->opts1 = cpu_to_le32(DescOwn   cp->rx_buf_sz);

  /*步進到下一個接收緩沖隊列的下一個單元*/

   rx_tail = NEXT_RX(rx_tail);

  

   if (!rx_work--)

   break;  

   cp->rx_tail = rx_tail;

  /*遞減配額值quota,一旦quota遞減到0表示這次的POLL傳輸已經(jīng)完成了使命,

  就等待有數(shù)據(jù)到來的時候再次喚醒軟中斷執(zhí)行POLL方法*/

   dev->quota -= rx;

   *budget -= rx;  

   /* if we did not reach work limit, then we\'re done with

   * this round of polling

   */

   if (rx_work) {

  /*如果仍然有數(shù)據(jù)達到,那么返回POLL方法循環(huán)的開始,繼續(xù)接收數(shù)據(jù)*/

   if (cpr16(IntrStatus) & cp_rx_intr_mask)

   goto rx_status_loop;

  /*這里表示數(shù)據(jù)已經(jīng)接收完畢,而且沒有新的接收中斷產(chǎn)生了,這個時候使能NIC的接收中斷,

  并且調(diào)用__netif_rx_complete把已經(jīng)完成POLL的設(shè)備從poll_list上摘除,等待下一次中斷產(chǎn)生的時候,

  再次把設(shè)備掛上poll_list隊列中。*/

   local_irq_disable();

   cpw16_f(IntrMask, cp_intr_mask);

   __netif_rx_complete(dev);

   local_irq_enable();  

   return 0; /* done */

   }  

   return 1; /* not done */

  }  

  其他的使用 NAPI 的驅(qū)動程序和 8139CP 大同小異,只是使用了網(wǎng)絡(luò)層專門提供的 POLL 方法--proecess_backlog(/net/dev.c),在 NIC 中斷接收到了數(shù)據(jù)包后,調(diào)用網(wǎng)絡(luò)層上的 netif_rx(/net/dev.c)將硬件中斷中接收到數(shù)據(jù)幀存入 sk_buff 結(jié)構(gòu), 然后檢查硬件幀頭,識別幀類型, 放入接收隊列(softnet_data 結(jié)構(gòu)中的 input_pkt_queue 隊列上), 激活接收軟中斷作進一步處理. 軟中斷函數(shù)(net_rx_action)提取接收包,而 process_backlog(也就是 POLL 方法)向上層提交數(shù)據(jù)。


久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
亚洲无玛一区| 日韩电影网1区2区| 国产成人一区在线| 欧美日韩在线播放三区四区| 日韩中文欧美在线| 一区二区三区欧美成人| 五月天激情综合| 色综合天天天天做夜夜夜夜做| 午夜久久福利影院| 色综合咪咪久久| 久久电影网站中文字幕| 欧美精品aⅴ在线视频| 国产老肥熟一区二区三区| 在线播放一区二区三区| 成人免费观看视频| 久久久青草青青国产亚洲免观| 91大片在线观看| 国产精品麻豆网站| 免费一区二区三区在在线视频| 亚洲一区二区三区中文字幕| 日本乱码高清不卡字幕| 国产一区二区三区蝌蚪| 337p日本欧洲亚洲大胆色噜噜| 不卡一卡2卡3卡4卡精品在| 国产精品国产三级国产普通话蜜臀 | 日本成人三级电影网站| 午夜亚洲国产au精品一区二区| 欧美色窝79yyyycom| 国产成人精品亚洲午夜麻豆| 久久精品亚洲国产奇米99| 精品免费国产| 日韩va欧美va亚洲va久久| 这里只有精品视频在线观看| 国产经典一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了| 在线观看国产一区二区| 成人午夜视频网站| 亚洲图片你懂的| 在线免费观看日本一区| jizzjizzjizz欧美| 一区二区三区在线播| 欧洲一区二区av| 91理论电影在线观看| 亚洲精品日韩综合观看成人91| 色丁香久综合在线久综合在线观看| 国产91精品入口| 亚洲精品午夜久久久| 欧美午夜在线一二页| 91视频网页| 午夜伊人狠狠久久| 日韩三级视频在线看| 麻豆一区区三区四区产品精品蜜桃| 奇米精品一区二区三区四区| 久久亚洲一级片| 色综合中文字幕| 91麻豆国产在线观看| 午夜视频一区在线观看| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 在线综合+亚洲+欧美中文字幕| 国产精品视频在线免费观看| 男人操女人的视频在线观看欧美| 久久免费精品国产久精品久久久久| 日韩精品久久一区二区三区| 东方aⅴ免费观看久久av| 一区二区免费在线播放| 精品国产sm最大网站免费看| 亚洲欧洲一区二区在线观看| av成人老司机| 捆绑调教美女网站视频一区| 亚洲欧美综合另类在线卡通| 91精品国产综合久久福利| 日本高清一区| 99久久精品免费看国产四区| 激情图区综合网| 亚洲精品成人在线| 久久久久久久久久久黄色| 欧美吻胸吃奶大尺度电影| 欧美日韩日本网| 5566中文字幕一区二区| 久草中文综合在线| 亚洲一区二区三区三| 久久久久九九视频| 欧美电影一区二区三区| 日韩视频精品| 国产日本一区二区三区| 成人午夜激情片| 久久国产成人午夜av影院| 亚洲精品国产一区二区精华液| 精品国产99国产精品| 欧美精品久久一区| 一区二区三区四区国产| 精品国产一区二区三区麻豆免费观看完整版 | 欧美日韩免费一区二区三区| 日韩中文字幕一区| 国产一区二区三区四区五区加勒比| 国产91丝袜在线播放| 美女视频网站久久| 香蕉成人伊视频在线观看| 中文字幕在线观看不卡| 久久一日本道色综合| 欧美精品丝袜中出| 在线观看精品一区| 中文字幕一区二区三区最新| 日产中文字幕在线精品一区| 精品国产一区二区三区麻豆小说| 91网址在线看| 成人av午夜电影| 国产成人精品免费看| 久久国产视频网| 另类小说综合欧美亚洲| 五月天亚洲精品| 亚洲国产视频直播| 亚洲午夜一区二区| 一区二区三区四区激情| 亚洲丝袜另类动漫二区| 国产精品久久久久国产精品日日| 久久欧美一区二区| 久久久精品免费网站| 久久久亚洲高清| 国产亚洲视频系列| 中文字幕精品三区| 国产清纯白嫩初高生在线观看91 | 日本视频一区二区不卡| 免费av在线一区二区| 精品国产一区二区三区麻豆免费观看完整版 | 国内精品国产成人国产三级粉色| 日本亚洲最大的色成网站www| 同产精品九九九| 午夜欧美在线一二页| 亚洲国产欧美日韩另类综合| 亚洲妇女屁股眼交7| 亚洲综合色自拍一区| 亚洲综合色成人| 一区二区三区四区精品在线视频| 亚洲欧美色一区| 亚洲主播在线观看| 午夜精品成人在线视频| 视频一区中文字幕国产| 免播放器亚洲一区| 国产精品主播直播| www.欧美亚洲| 高清视频一区二区三区| 久久国产精品一区二区三区| 欧美亚洲一级二级| 一本大道久久a久久综合婷婷 | 99视频热这里只有精品免费| 91猫先生在线| 精品国产第一页| 午夜视频久久久| 欧美优质美女网站| 精品区一区二区| 中文字幕va一区二区三区| 国产精品第13页| 亚洲综合色视频| 国内久久精品视频| 91美女在线视频| 欧美日本韩国国产| 日本电影欧美片| 欧美xxxxx裸体时装秀| 亚洲国产成人一区二区三区| 亚洲视频免费观看| 午夜a成v人精品| 国产a区久久久| 精品视频一区二区| 在线视频精品一区| 日韩美女天天操| 1区2区3区欧美| 日韩主播视频在线| 粉嫩高潮美女一区二区三区| 国产私拍一区| 色综合久久66| 26uuu国产一区二区三区| 椎名由奈av一区二区三区| 日本伊人精品一区二区三区观看方式| 国产经典欧美精品| 韩国精品一区二区三区六区色诱| 中文字幕免费在线不卡| 日韩欧美黄色影院| 亚洲伦理在线免费看| 激情小说欧美图片| 久久国产精品免费一区| 欧美在线你懂得| 日本一区二区三区国色天香| 丝袜诱惑制服诱惑色一区在线观看| 国产成人综合网| 久久影视中文粉嫩av| 欧美日韩激情一区二区三区| 国产精品色呦呦| 麻豆精品在线视频| 国产伦精品一区二区三区四区视频 | 成人av电影在线网| 日韩少妇中文字幕| 精品sm在线观看| 日韩—二三区免费观看av| 处破女av一区二区| 天天综合色天天综合色hd| 欧美α欧美αv大片| 午夜影视日本亚洲欧洲精品| 5g国产欧美日韩视频| 欧美在线色视频|