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


曙海教育集團(tuán)論壇Linux專區(qū)Linux驅(qū)動(dòng)開發(fā) → NAPI技術(shù)在Linux網(wǎng)絡(luò)驅(qū)動(dòng)上的應(yīng)用


  共有9763人關(guān)注過本帖樹形打印

主題:NAPI技術(shù)在Linux網(wǎng)絡(luò)驅(qū)動(dòng)上的應(yīng)用

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個(gè)性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發(fā)短信
等級(jí):青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊(cè):2010-11-12 11:08:23
NAPI技術(shù)在Linux網(wǎng)絡(luò)驅(qū)動(dòng)上的應(yīng)用  發(fā)帖心情 Post By:2010-11-24 11:29:37

這個(gè)方法通常被網(wǎng)絡(luò)層在向驅(qū)動(dòng)的接收循環(huán)隊(duì)列獲取新的數(shù)據(jù)包時(shí)刻調(diào)用,而驅(qū)動(dòng)的接收循環(huán)隊(duì)列中可以向網(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ù)量,這個(gè)數(shù)值不能超過netdev_max_backlog 的值。   

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

  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è)定每次進(jìn)行調(diào)度的時(shí)候從設(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)行緩沖隊(duì)列中的數(shù)據(jù),

  所以中斷可以打開,準(zhǔn)備接收新的數(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;

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

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

   if (!skb)

   BUG();

  

   desc = &cp->rx_ring[rx_tail];

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

   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)行隊(duì)列上的映射區(qū)域*/

   pci_unmap_single(cp->pdev, mapping,

   buflen, PCI_DMA_FROMDEVICE);

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

   /* 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ù)的實(shí)際大小重新定義套接字緩沖區(qū)的大小*/

   skb_put(skb, len);  

   mapping =

   cp->rx_skb[rx_tail].mapping =

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

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

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

   buflen, PCI_DMA_FROMDEVICE);

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

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

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

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

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

   cp_rx_skb(cp, skb, desc);

   rx++;  

  rx_next:

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

  而不是驅(qū)動(dòng)在內(nèi)存中動(dòng)態(tài)建立的),準(zhǔn)備提交給下層(NIC)進(jìn)行數(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ū)動(dòng)程序交還給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);

  /*步進(jìn)到下一個(gè)接收緩沖隊(duì)列的下一個(gè)單元*/

   rx_tail = NEXT_RX(rx_tail);

  

   if (!rx_work--)

   break;  

   cp->rx_tail = rx_tail;

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

  就等待有數(shù)據(jù)到來的時(shí)候再次喚醒軟中斷執(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ù)達(dá)到,那么返回POLL方法循環(huán)的開始,繼續(xù)接收數(shù)據(jù)*/

   if (cpr16(IntrStatus) & cp_rx_intr_mask)

   goto rx_status_loop;

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

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

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

   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ū)動(dòng)程序和 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), 然后檢查硬件幀頭,識(shí)別幀類型, 放入接收隊(duì)列(softnet_data 結(jié)構(gòu)中的 input_pkt_queue 隊(duì)列上), 激活接收軟中斷作進(jìn)一步處理. 軟中斷函數(shù)(net_rx_action)提取接收包,而 process_backlog(也就是 POLL 方法)向上層提交數(shù)據(jù)。


支持(0中立(0反對(duì)(0單帖管理 | 引用 | 回復(fù) 回到頂部

返回版面帖子列表

NAPI技術(shù)在Linux網(wǎng)絡(luò)驅(qū)動(dòng)上的應(yīng)用








簽名
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
日韩免费看网站| 久久久欧美精品sm网站| 91精品国产免费久久综合| 国产精品久久久久久久岛一牛影视 | 不卡一卡2卡3卡4卡精品在| 一区二区三区视频在线播放| 欧美xxx久久| 另类小说综合欧美亚洲| 欧美久久久久久久| 欧美国产精品专区| 成人精品一区二区三区四区| 91久久线看在观草草青青| 亚洲免费在线播放| 久久99精品久久久| 国产91清纯白嫩初高中在线观看 | 在线观看不卡一区| 尤物视频一区二区| 99视频免费观看蜜桃视频| 91精品啪在线观看国产60岁| 午夜在线电影亚洲一区| 麻豆成人av| 欧美国产精品v| 成人激情动漫在线观看| 欧美日韩免费视频| 奇米影视7777精品一区二区| 日本在线观看一区二区| 国产精品免费视频一区| 99re在线精品| 精品国产伦一区二区三区观看方式| 久久99最新地址| 日韩精品不卡| 欧美日韩国产影片| 亚洲一二三区视频在线观看| 国产精品久久久久久久久久久久冷 | 国产成人av一区二区| 欧美日韩视频在线第一区 | 国产专区欧美精品| 在线日韩国产精品| 蜜臀av一区二区| 在线观看欧美一区| 视频一区二区三区中文字幕| 91精品免费在线| 一区二区三区国| 亚洲一区在线观看网站| 玖玖玖精品中文字幕| 国产精品午夜免费| 国产一区免费视频| 中文字幕av在线一区二区三区| aaa欧美色吧激情视频| 精品久久久久一区二区国产| 成人看片黄a免费看在线| 久久品道一品道久久精品| 91麻豆精品一区二区三区| 久久精品视频免费观看| 国产精品一国产精品最新章节| 中文字幕第一页久久| 国产欧美欧洲| 亚洲综合丁香婷婷六月香| 亚洲欧美日本国产有色| 日本va欧美va精品发布| 欧美吻胸吃奶大尺度电影| 国产剧情一区在线| 日韩精品一区二区三区老鸭窝| 99久久久久久| 国产精品家庭影院| 水蜜桃一区二区| 蜜乳av一区二区| 欧美电影免费观看高清完整版在线 | 91在线国产福利| 中文文精品字幕一区二区| 欧美日韩亚洲免费| 美国十次了思思久久精品导航| 555夜色666亚洲国产免| jvid福利写真一区二区三区| 在线视频精品一区| 欧美在线观看视频一区二区三区| 青青青伊人色综合久久| 欧美午夜电影一区| 成人aaaa免费全部观看| 国产精品九色蝌蚪自拍| 性欧美videosex高清少妇| 免费高清在线视频一区·| 日韩亚洲欧美一区| 国产精品手机视频| 丝袜亚洲精品中文字幕一区| 538在线一区二区精品国产| av激情久久| 五月激情综合网| 欧美成人a视频| 欧美日韩在线一二三| 韩国v欧美v日本v亚洲v| 日本一区二区视频在线观看| 新呦u视频一区二区| 成人午夜激情在线| 中文字幕五月欧美| 激情综合色播五月| 看国产成人h片视频| 欧美岛国在线观看| 韩日午夜在线资源一区二区| 午夜精品福利一区二区三区蜜桃| 7799精品视频| 好吊妞www.84com只有这里才有精品 | 中文字幕一区二区三区在线乱码| 成人sese在线| 亚洲不卡一区二区三区| 精品国产乱码久久久久久图片 | 在线一区高清| 91美女在线看| 日本成人中文字幕| 国产精品视频在线看| 欧美体内she精高潮| 精品欧美一区二区久久久伦| 国模无码大尺度一区二区三区| 综合av第一页| 日韩精品一区二区三区老鸭窝| 亚洲欧洲一区二区福利| 99九九视频| 国产精品一区三区| 亚洲超碰精品一区二区| 欧美国产欧美亚州国产日韩mv天天看完整| 91久久久免费一区二区| 久久综合狠狠综合久久综青草| 成人在线视频首页| 久久精品噜噜噜成人av农村| 亚洲日本一区二区三区| 精品国产精品网麻豆系列| 色吧成人激情小说| 欧美连裤袜在线视频| 97se亚洲国产综合自在线不卡| 精一区二区三区| 亚洲一二三区不卡| 国产精品三级av| 精品国产制服丝袜高跟| 欧美日韩综合在线免费观看| 亚洲国产高清国产精品| 国产精品一区二区不卡视频| 国产成人av影院| 激情综合网激情| 人人爽香蕉精品| 亚洲大型综合色站| 亚洲欧美日本韩国| 国产天堂亚洲国产碰碰| 日韩免费在线观看| 欧美美女一区二区三区| 欧美综合亚洲图片综合区| 视频一区二区在线| 欧美日韩视频在线一区二区观看视频| av一区二区三区在线观看| 不卡免费追剧大全电视剧网站| 极品少妇xxxx精品少妇偷拍| 日本视频一区二区三区| 亚洲一区二区三区四区中文字幕| 成人免费在线播放视频| 欧美激情综合网| 国产日韩欧美综合在线| 精品国一区二区三区| 日韩免费性生活视频播放| 91精品免费观看| 欧美一区二区在线视频| 欧美人动与zoxxxx乱| 欧美日韩一区精品| 欧美精品一级二级三级| 欧美日韩高清一区二区不卡| 色94色欧美sute亚洲线路二| 正义之心1992免费观看全集完整版| 天天人人精品| 亚洲看片网站| 91福利社在线观看| 色综合久久中文字幕| 在线丝袜欧美日韩制服| 色美美综合视频| 欧美三级日韩三级国产三级| 欧美日韩一区二区三区视频| 制服视频三区第一页精品| 欧美一级欧美三级在线观看| 欧美刺激脚交jootjob| 精品久久久久久久一区二区蜜臀| 精品捆绑美女sm三区| 久久蜜桃av一区精品变态类天堂| 久久女同性恋中文字幕| 国产精品女主播av| 亚洲美女免费视频| 亚洲高清不卡在线观看| 日韩中文字幕区一区有砖一区| 日本aⅴ免费视频一区二区三区| 蜜桃av一区二区在线观看| 国产精品自拍三区| av激情亚洲男人天堂| 国产传媒一区二区三区| 久久久久九九九| 亚洲日本精品一区| 欧美日产国产精品| 精品蜜桃在线看| 国产精品久久一级| 亚洲电影一级黄| 狠狠色伊人亚洲综合成人| 成人深夜视频在线观看| 国产精品国产三级欧美二区| 欧美一区三区二区在线观看| 色综合久久综合网欧美综合网|