亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 3900 | 回復(fù): 3
打印 上一主題 下一主題

[網(wǎng)絡(luò)子系統(tǒng)] skb中的priority怎么用的? [復(fù)制鏈接]

求職 : 通訊/電信開(kāi)
論壇徽章:
2
2015亞冠之鹿島鹿角
日期:2015-07-08 11:58:2615-16賽季CBA聯(lián)賽之佛山
日期:2015-12-21 17:28:04
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-11-02 20:18 |只看該作者 |倒序?yàn)g覽
請(qǐng)教各位前輩,這是我剛才看到的ip包的tos字段與skb的priority之間的關(guān)系,我的問(wèn)題是系統(tǒng)后面是怎么用這個(gè)字段完成什么功能的,具體代碼在哪兒。如蒙回復(fù)不甚感激。

論壇徽章:
20
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-08-17 12:21:08
2 [報(bào)告]
發(fā)表于 2015-11-03 12:24 |只看該作者
tx路徑上qdisc根據(jù)skb優(yōu)先級(jí)enque/deque的時(shí)候使用。
最簡(jiǎn)單的可以參考net/sched/sch_prio.c的實(shí)現(xiàn)。

求職 : 通訊/電信開(kāi)
論壇徽章:
2
2015亞冠之鹿島鹿角
日期:2015-07-08 11:58:2615-16賽季CBA聯(lián)賽之佛山
日期:2015-12-21 17:28:04
3 [報(bào)告]
發(fā)表于 2015-11-03 15:09 |只看該作者
非常感謝您的回復(fù),我這就來(lái)看看,不甚感激啊回復(fù) 2# nswcfd


   

求職 : 通訊/電信開(kāi)
論壇徽章:
2
2015亞冠之鹿島鹿角
日期:2015-07-08 11:58:2615-16賽季CBA聯(lián)賽之佛山
日期:2015-12-21 17:28:04
4 [報(bào)告]
發(fā)表于 2015-11-03 15:58 |只看該作者
各位兄弟姐妹,經(jīng)過(guò)上面的兄弟的提醒,我找到了PFIFO_FAST流控算法,目前是默認(rèn)的流控算法,用到了skb->priority字段,給大家一個(gè)參考,共同進(jìn)步。感謝Chinaunix
  1. 5. 流控算法的具體實(shí)現(xiàn)

  2. 5.1 PFIFO_FAST

  3. PFIFO_FAST是缺省的流控算法,網(wǎng)卡初始化時(shí)就是設(shè)置該算法為網(wǎng)卡的流控算法,算法比較簡(jiǎn)單,就
  4. 在net/sched/sch_generic.c中定義了,沒(méi)在單獨(dú)文件中定義。

  5. 5.1.1 操作結(jié)構(gòu)定義
  6. #define PFIFO_FAST_BANDS 3
  7. static struct Qdisc_ops pfifo_fast_ops = {
  8. .id  = "pfifo_fast",
  9. // 私有數(shù)據(jù)是3個(gè)skb數(shù)據(jù)包鏈表頭
  10. .priv_size = PFIFO_FAST_BANDS * sizeof(struct sk_buff_head),
  11. .enqueue = pfifo_fast_enqueue,
  12. .dequeue = pfifo_fast_dequeue,
  13. .requeue = pfifo_fast_requeue,
  14. .init  = pfifo_fast_init,
  15. .reset  = pfifo_fast_reset,
  16. .dump  = pfifo_fast_dump,
  17. .owner  = THIS_MODULE,
  18. };

  19. 該算法中, 數(shù)據(jù)隊(duì)列是3個(gè), 流控算法就是將數(shù)據(jù)包輸入特定的隊(duì)列, 從特定隊(duì)列中取數(shù)據(jù)包。

  20. 5.1.2 初始化

  21. static int pfifo_fast_init(struct Qdisc *qdisc, struct rtattr *opt)
  22. {
  23. int prio;
  24. // qdisc私有數(shù)據(jù)指針, 數(shù)據(jù)包鏈表頭
  25. struct sk_buff_head *list = qdisc_priv(qdisc);
  26. // 初始化3個(gè)鏈表頭
  27. for (prio = 0; prio < PFIFO_FAST_BANDS; prio++)
  28.   skb_queue_head_init(list + prio);
  29. return 0;
  30. }
  31. 5.1.3 入隊(duì)

  32. static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc)
  33. {
  34. // 根據(jù)數(shù)據(jù)包的優(yōu)先級(jí)參數(shù)挑一個(gè)隊(duì)列頭準(zhǔn)備將數(shù)據(jù)包插入該隊(duì)列
  35. struct sk_buff_head *list = prio2list(skb, qdisc);
  36. // 如果當(dāng)前隊(duì)列中的數(shù)據(jù)包數(shù)量小于網(wǎng)卡設(shè)備允許的輸出隊(duì)列的數(shù)量
  37. // 則將該數(shù)據(jù)包插入該隊(duì)列
  38. if (skb_queue_len(list) < qdisc->dev->tx_queue_len) {
  39.   qdisc->q.qlen++;
  40.   return __qdisc_enqueue_tail(skb, qdisc, list);
  41. }
  42. // 否則的話(huà)丟棄該數(shù)據(jù)包
  43. return qdisc_drop(skb, qdisc);
  44. }
  45. // 選隊(duì)列處理
  46. static inline struct sk_buff_head *prio2list(struct sk_buff *skb,
  47.           struct Qdisc *qdisc)
  48. {
  49. // qdisc私有數(shù)據(jù)指針, 數(shù)據(jù)包鏈表頭
  50. struct sk_buff_head *list = qdisc_priv(qdisc);
  51. // 根據(jù)數(shù)據(jù)包的優(yōu)先權(quán)值確定隊(duì)列頭偏移值
  52. // skb->priority是個(gè)32位整數(shù), 只使用最后4位
  53. return list + prio2band[skb->priority & TC_PRIO_MAX];
  54. }
  55. // 優(yōu)先權(quán)值到隊(duì)列號(hào)的變換數(shù)組, 該數(shù)組體現(xiàn)算法內(nèi)容, 通過(guò)修改該數(shù)組可以調(diào)整算法效果
  56. // 該數(shù)組定義中, 優(yōu)先值(低4位)為1,2,3,5時(shí)使用2號(hào)隊(duì)列, 優(yōu)先值(低4位)為6,7時(shí)使用0號(hào)
  57. // 隊(duì)列, 其他值為1號(hào)隊(duì)列
  58. // 在普通情況下skb->priority都是0, 所有應(yīng)該只使用了1號(hào)隊(duì)列
  59. // 這個(gè)數(shù)組實(shí)際是根據(jù)RFC1349中定義的TOS類(lèi)型值定義的, 在該RFC中TOS就是只有4位有效
  60. static const u8 prio2band[TC_PRIO_MAX+1] =
  61. { 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 };

  62. 5.1.4 出隊(duì)

  63. static struct sk_buff *pfifo_fast_dequeue(struct Qdisc* qdisc)
  64. {
  65. int prio;
  66. struct sk_buff_head *list = qdisc_priv(qdisc);
  67. // 循環(huán)3個(gè)隊(duì)列
  68. for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) {
  69. // 如果隊(duì)列非空, 返回隊(duì)列頭的那個(gè)數(shù)據(jù)包
  70.   if (!skb_queue_empty(list + prio)) {
  71.    qdisc->q.qlen--;
  72.    return __qdisc_dequeue_head(qdisc, list + prio);
  73.   }
  74. }
  75. return NULL;
  76. }

  77. 由此可見(jiàn), 0號(hào)隊(duì)列有最高優(yōu)先級(jí), 2號(hào)隊(duì)列優(yōu)先級(jí)最低, 只有高優(yōu)先級(jí)隊(duì)列中的數(shù)據(jù)都發(fā)送完后才發(fā)
  78. 送低優(yōu)先級(jí)隊(duì)列中的數(shù)據(jù)。

  79. 5.1.5 重入隊(duì)

  80. static int pfifo_fast_requeue(struct sk_buff *skb, struct Qdisc* qdisc)
  81. {
  82. // 隊(duì)列長(zhǎng)度遞增
  83. qdisc->q.qlen++;
  84. // 使用標(biāo)準(zhǔn)重入隊(duì)函數(shù)將數(shù)據(jù)插回隊(duì)列鏈表
  85. return __qdisc_requeue(skb, qdisc, prio2list(skb, qdisc));
  86. }

  87. 5.1.6 復(fù)位
  88. static void pfifo_fast_reset(struct Qdisc* qdisc)
  89. {
  90. int prio;
  91. struct sk_buff_head *list = qdisc_priv(qdisc);
  92. // 釋放三個(gè)隊(duì)列鏈表中的所有數(shù)據(jù)包
  93. for (prio = 0; prio < PFIFO_FAST_BANDS; prio++)
  94.   __qdisc_reset_queue(qdisc, list + prio);
  95. // 計(jì)數(shù)清零
  96. qdisc->qstats.backlog = 0;
  97. qdisc->q.qlen = 0;
  98. }

  99. 5.1.7 輸出

  100. 輸出當(dāng)前算法的內(nèi)容信息, 由于PFIFO_FAST算法核心就是prio2band數(shù)組, 因此就是將該數(shù)組內(nèi)容輸
  101. 出到數(shù)據(jù)包供用戶(hù)空間獲取。
  102. static int pfifo_fast_dump(struct Qdisc *qdisc, struct sk_buff *skb)
  103. {
  104. // TC優(yōu)先權(quán)數(shù)組結(jié)構(gòu)
  105. struct tc_prio_qopt opt = { .bands = PFIFO_FAST_BANDS };
  106. // 將當(dāng)前prio2band數(shù)組內(nèi)容拷貝到選項(xiàng)數(shù)據(jù)中
  107. memcpy(&opt.priomap, prio2band, TC_PRIO_MAX+1);
  108. // 將結(jié)構(gòu)作為路由屬性復(fù)制到數(shù)據(jù)包中供返回
  109. RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt);
  110. return skb->len;
  111. rtattr_failure:
  112. return -1;
  113. }

  114. ...... 待續(xù) ......

  115. 發(fā)表于: 2007-07-28,修改于: 2007-07-29 15:30,已瀏覽3052次,有評(píng)論2條 推薦 投訴
  116.         網(wǎng)友: burning423         時(shí)間:2007-09-21 08:53:33 IP地址:218.108.51.★
  117.        

  118. 5.1.2 初始化



  119. static int pfifo_fast_init(struct Qdisc *qdisc, struct rtattr *opt)

  120. {

  121. int prio;

  122. // qdisc私有數(shù)據(jù)指針, 數(shù)據(jù)包鏈表頭

  123. struct sk_buff_head *list = qdisc_priv(qdisc);

  124. ........................................



  125. struct sk_buff_head *list = qdisc_priv(qdisc);這語(yǔ)句是怎樣得到qdisc的私有數(shù)據(jù)的?我看了qdisc_priv(qdisc)函數(shù)的定義,可還是不是很明白.你能否給我解釋一下?謝謝了..剛開(kāi)始看內(nèi)核的東西....


  126.         網(wǎng)友: yfydz         時(shí)間:2007-09-22 21:44:39 IP地址:123.116.100.★
  127.        

  128. 每種qdisc定義都包括基本的Qdisc結(jié)構(gòu)和后面一些參數(shù), 大小由prive_size指定, 那些參數(shù)就是該qdisc的私有數(shù)據(jù), 獲取私有數(shù)據(jù)的指針就是從Qdisc起始位置移動(dòng)標(biāo)準(zhǔn)Qdisc大小就是了
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP