qdisc_test.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. package netlink
  2. import (
  3. "testing"
  4. )
  5. func TestTbfAddDel(t *testing.T) {
  6. tearDown := setUpNetlinkTest(t)
  7. defer tearDown()
  8. if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil {
  9. t.Fatal(err)
  10. }
  11. link, err := LinkByName("foo")
  12. if err != nil {
  13. t.Fatal(err)
  14. }
  15. if err := LinkSetUp(link); err != nil {
  16. t.Fatal(err)
  17. }
  18. qdisc := &Tbf{
  19. QdiscAttrs: QdiscAttrs{
  20. LinkIndex: link.Attrs().Index,
  21. Handle: MakeHandle(1, 0),
  22. Parent: HANDLE_ROOT,
  23. },
  24. Rate: 131072,
  25. Limit: 1220703,
  26. Buffer: 16793,
  27. }
  28. if err := QdiscAdd(qdisc); err != nil {
  29. t.Fatal(err)
  30. }
  31. qdiscs, err := QdiscList(link)
  32. if err != nil {
  33. t.Fatal(err)
  34. }
  35. if len(qdiscs) != 1 {
  36. t.Fatal("Failed to add qdisc")
  37. }
  38. tbf, ok := qdiscs[0].(*Tbf)
  39. if !ok {
  40. t.Fatal("Qdisc is the wrong type")
  41. }
  42. if tbf.Rate != qdisc.Rate {
  43. t.Fatal("Rate doesn't match")
  44. }
  45. if tbf.Limit != qdisc.Limit {
  46. t.Fatal("Limit doesn't match")
  47. }
  48. if tbf.Buffer != qdisc.Buffer {
  49. t.Fatal("Buffer doesn't match")
  50. }
  51. if err := QdiscDel(qdisc); err != nil {
  52. t.Fatal(err)
  53. }
  54. qdiscs, err = QdiscList(link)
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. if len(qdiscs) != 0 {
  59. t.Fatal("Failed to remove qdisc")
  60. }
  61. }
  62. func TestHtbAddDel(t *testing.T) {
  63. tearDown := setUpNetlinkTest(t)
  64. defer tearDown()
  65. if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil {
  66. t.Fatal(err)
  67. }
  68. link, err := LinkByName("foo")
  69. if err != nil {
  70. t.Fatal(err)
  71. }
  72. if err := LinkSetUp(link); err != nil {
  73. t.Fatal(err)
  74. }
  75. attrs := QdiscAttrs{
  76. LinkIndex: link.Attrs().Index,
  77. Handle: MakeHandle(1, 0),
  78. Parent: HANDLE_ROOT,
  79. }
  80. qdisc := NewHtb(attrs)
  81. qdisc.Rate2Quantum = 5
  82. if err := QdiscAdd(qdisc); err != nil {
  83. t.Fatal(err)
  84. }
  85. qdiscs, err := QdiscList(link)
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. if len(qdiscs) != 1 {
  90. t.Fatal("Failed to add qdisc")
  91. }
  92. htb, ok := qdiscs[0].(*Htb)
  93. if !ok {
  94. t.Fatal("Qdisc is the wrong type")
  95. }
  96. if htb.Defcls != qdisc.Defcls {
  97. t.Fatal("Defcls doesn't match")
  98. }
  99. if htb.Rate2Quantum != qdisc.Rate2Quantum {
  100. t.Fatal("Rate2Quantum doesn't match")
  101. }
  102. if htb.Debug != qdisc.Debug {
  103. t.Fatal("Debug doesn't match")
  104. }
  105. if err := QdiscDel(qdisc); err != nil {
  106. t.Fatal(err)
  107. }
  108. qdiscs, err = QdiscList(link)
  109. if err != nil {
  110. t.Fatal(err)
  111. }
  112. if len(qdiscs) != 0 {
  113. t.Fatal("Failed to remove qdisc")
  114. }
  115. }
  116. func TestPrioAddDel(t *testing.T) {
  117. tearDown := setUpNetlinkTest(t)
  118. defer tearDown()
  119. if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil {
  120. t.Fatal(err)
  121. }
  122. link, err := LinkByName("foo")
  123. if err != nil {
  124. t.Fatal(err)
  125. }
  126. if err := LinkSetUp(link); err != nil {
  127. t.Fatal(err)
  128. }
  129. qdisc := NewPrio(QdiscAttrs{
  130. LinkIndex: link.Attrs().Index,
  131. Handle: MakeHandle(1, 0),
  132. Parent: HANDLE_ROOT,
  133. })
  134. if err := QdiscAdd(qdisc); err != nil {
  135. t.Fatal(err)
  136. }
  137. qdiscs, err := QdiscList(link)
  138. if err != nil {
  139. t.Fatal(err)
  140. }
  141. if len(qdiscs) != 1 {
  142. t.Fatal("Failed to add qdisc")
  143. }
  144. _, ok := qdiscs[0].(*Prio)
  145. if !ok {
  146. t.Fatal("Qdisc is the wrong type")
  147. }
  148. if err := QdiscDel(qdisc); err != nil {
  149. t.Fatal(err)
  150. }
  151. qdiscs, err = QdiscList(link)
  152. if err != nil {
  153. t.Fatal(err)
  154. }
  155. if len(qdiscs) != 0 {
  156. t.Fatal("Failed to remove qdisc")
  157. }
  158. }
  159. func TestTbfAddHtbReplaceDel(t *testing.T) {
  160. tearDown := setUpNetlinkTest(t)
  161. defer tearDown()
  162. if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil {
  163. t.Fatal(err)
  164. }
  165. link, err := LinkByName("foo")
  166. if err != nil {
  167. t.Fatal(err)
  168. }
  169. if err := LinkSetUp(link); err != nil {
  170. t.Fatal(err)
  171. }
  172. // Add
  173. attrs := QdiscAttrs{
  174. LinkIndex: link.Attrs().Index,
  175. Handle: MakeHandle(1, 0),
  176. Parent: HANDLE_ROOT,
  177. }
  178. qdisc := &Tbf{
  179. QdiscAttrs: attrs,
  180. Rate: 131072,
  181. Limit: 1220703,
  182. Buffer: 16793,
  183. }
  184. if err := QdiscAdd(qdisc); err != nil {
  185. t.Fatal(err)
  186. }
  187. qdiscs, err := QdiscList(link)
  188. if err != nil {
  189. t.Fatal(err)
  190. }
  191. if len(qdiscs) != 1 {
  192. t.Fatal("Failed to add qdisc")
  193. }
  194. tbf, ok := qdiscs[0].(*Tbf)
  195. if !ok {
  196. t.Fatal("Qdisc is the wrong type")
  197. }
  198. if tbf.Rate != qdisc.Rate {
  199. t.Fatal("Rate doesn't match")
  200. }
  201. if tbf.Limit != qdisc.Limit {
  202. t.Fatal("Limit doesn't match")
  203. }
  204. if tbf.Buffer != qdisc.Buffer {
  205. t.Fatal("Buffer doesn't match")
  206. }
  207. // Replace
  208. // For replace to work, the handle MUST be different that the running one
  209. attrs.Handle = MakeHandle(2, 0)
  210. qdisc2 := NewHtb(attrs)
  211. qdisc2.Rate2Quantum = 5
  212. if err := QdiscReplace(qdisc2); err != nil {
  213. t.Fatal(err)
  214. }
  215. qdiscs, err = QdiscList(link)
  216. if err != nil {
  217. t.Fatal(err)
  218. }
  219. if len(qdiscs) != 1 {
  220. t.Fatal("Failed to add qdisc")
  221. }
  222. htb, ok := qdiscs[0].(*Htb)
  223. if !ok {
  224. t.Fatal("Qdisc is the wrong type")
  225. }
  226. if htb.Defcls != qdisc2.Defcls {
  227. t.Fatal("Defcls doesn't match")
  228. }
  229. if htb.Rate2Quantum != qdisc2.Rate2Quantum {
  230. t.Fatal("Rate2Quantum doesn't match")
  231. }
  232. if htb.Debug != qdisc2.Debug {
  233. t.Fatal("Debug doesn't match")
  234. }
  235. if err := QdiscDel(qdisc2); err != nil {
  236. t.Fatal(err)
  237. }
  238. qdiscs, err = QdiscList(link)
  239. if err != nil {
  240. t.Fatal(err)
  241. }
  242. if len(qdiscs) != 0 {
  243. t.Fatal("Failed to remove qdisc")
  244. }
  245. }
  246. func TestTbfAddTbfChangeDel(t *testing.T) {
  247. tearDown := setUpNetlinkTest(t)
  248. defer tearDown()
  249. if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil {
  250. t.Fatal(err)
  251. }
  252. link, err := LinkByName("foo")
  253. if err != nil {
  254. t.Fatal(err)
  255. }
  256. if err := LinkSetUp(link); err != nil {
  257. t.Fatal(err)
  258. }
  259. // Add
  260. attrs := QdiscAttrs{
  261. LinkIndex: link.Attrs().Index,
  262. Handle: MakeHandle(1, 0),
  263. Parent: HANDLE_ROOT,
  264. }
  265. qdisc := &Tbf{
  266. QdiscAttrs: attrs,
  267. Rate: 131072,
  268. Limit: 1220703,
  269. Buffer: 16793,
  270. }
  271. if err := QdiscAdd(qdisc); err != nil {
  272. t.Fatal(err)
  273. }
  274. qdiscs, err := QdiscList(link)
  275. if err != nil {
  276. t.Fatal(err)
  277. }
  278. if len(qdiscs) != 1 {
  279. t.Fatal("Failed to add qdisc")
  280. }
  281. tbf, ok := qdiscs[0].(*Tbf)
  282. if !ok {
  283. t.Fatal("Qdisc is the wrong type")
  284. }
  285. if tbf.Rate != qdisc.Rate {
  286. t.Fatal("Rate doesn't match")
  287. }
  288. if tbf.Limit != qdisc.Limit {
  289. t.Fatal("Limit doesn't match")
  290. }
  291. if tbf.Buffer != qdisc.Buffer {
  292. t.Fatal("Buffer doesn't match")
  293. }
  294. // Change
  295. // For change to work, the handle MUST not change
  296. qdisc.Rate = 23456
  297. if err := QdiscChange(qdisc); err != nil {
  298. t.Fatal(err)
  299. }
  300. qdiscs, err = QdiscList(link)
  301. if err != nil {
  302. t.Fatal(err)
  303. }
  304. if len(qdiscs) != 1 {
  305. t.Fatal("Failed to add qdisc")
  306. }
  307. tbf, ok = qdiscs[0].(*Tbf)
  308. if !ok {
  309. t.Fatal("Qdisc is the wrong type")
  310. }
  311. if tbf.Rate != qdisc.Rate {
  312. t.Fatal("Rate doesn't match")
  313. }
  314. if tbf.Limit != qdisc.Limit {
  315. t.Fatal("Limit doesn't match")
  316. }
  317. if tbf.Buffer != qdisc.Buffer {
  318. t.Fatal("Buffer doesn't match")
  319. }
  320. if err := QdiscDel(qdisc); err != nil {
  321. t.Fatal(err)
  322. }
  323. qdiscs, err = QdiscList(link)
  324. if err != nil {
  325. t.Fatal(err)
  326. }
  327. if len(qdiscs) != 0 {
  328. t.Fatal("Failed to remove qdisc")
  329. }
  330. }