123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- package netlink
- import (
- "testing"
- )
- func TestClassAddDel(t *testing.T) {
- tearDown := setUpNetlinkTest(t)
- defer tearDown()
- if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil {
- t.Fatal(err)
- }
- if err := LinkAdd(&Ifb{LinkAttrs{Name: "bar"}}); err != nil {
- t.Fatal(err)
- }
- link, err := LinkByName("foo")
- if err != nil {
- t.Fatal(err)
- }
- if err := LinkSetUp(link); err != nil {
- t.Fatal(err)
- }
- attrs := QdiscAttrs{
- LinkIndex: link.Attrs().Index,
- Handle: MakeHandle(0xffff, 0),
- Parent: HANDLE_ROOT,
- }
- qdisc := NewHtb(attrs)
- if err := QdiscAdd(qdisc); err != nil {
- t.Fatal(err)
- }
- qdiscs, err := QdiscList(link)
- if err != nil {
- t.Fatal(err)
- }
- if len(qdiscs) != 1 {
- t.Fatal("Failed to add qdisc")
- }
- _, ok := qdiscs[0].(*Htb)
- if !ok {
- t.Fatal("Qdisc is the wrong type")
- }
- classattrs := ClassAttrs{
- LinkIndex: link.Attrs().Index,
- Parent: MakeHandle(0xffff, 0),
- Handle: MakeHandle(0xffff, 2),
- }
- htbclassattrs := HtbClassAttrs{
- Rate: 1234000,
- Cbuffer: 1690,
- }
- class := NewHtbClass(classattrs, htbclassattrs)
- if err := ClassAdd(class); err != nil {
- t.Fatal(err)
- }
- classes, err := ClassList(link, MakeHandle(0xffff, 0))
- if err != nil {
- t.Fatal(err)
- }
- if len(classes) != 1 {
- t.Fatal("Failed to add class")
- }
- htb, ok := classes[0].(*HtbClass)
- if !ok {
- t.Fatal("Class is the wrong type")
- }
- if htb.Rate != class.Rate {
- t.Fatal("Rate doesn't match")
- }
- if htb.Ceil != class.Ceil {
- t.Fatal("Ceil doesn't match")
- }
- if htb.Buffer != class.Buffer {
- t.Fatal("Buffer doesn't match")
- }
- if htb.Cbuffer != class.Cbuffer {
- t.Fatal("Cbuffer doesn't match")
- }
- qattrs := QdiscAttrs{
- LinkIndex: link.Attrs().Index,
- Handle: MakeHandle(0x2, 0),
- Parent: MakeHandle(0xffff, 2),
- }
- nattrs := NetemQdiscAttrs{
- Latency: 20000,
- Loss: 23.4,
- Duplicate: 14.3,
- LossCorr: 8.34,
- Jitter: 1000,
- DelayCorr: 12.3,
- ReorderProb: 23.4,
- CorruptProb: 10.0,
- CorruptCorr: 10,
- }
- qdiscnetem := NewNetem(qattrs, nattrs)
- if err := QdiscAdd(qdiscnetem); err != nil {
- t.Fatal(err)
- }
- qdiscs, err = QdiscList(link)
- if err != nil {
- t.Fatal(err)
- }
- if len(qdiscs) != 2 {
- t.Fatal("Failed to add qdisc")
- }
- _, ok = qdiscs[0].(*Htb)
- if !ok {
- t.Fatal("Qdisc is the wrong type")
- }
- netem, ok := qdiscs[1].(*Netem)
- if !ok {
- t.Fatal("Qdisc is the wrong type")
- }
- // Compare the record we got from the list with the one we created
- if netem.Loss != qdiscnetem.Loss {
- t.Fatal("Loss does not match")
- }
- if netem.Latency != qdiscnetem.Latency {
- t.Fatal("Latency does not match")
- }
- if netem.CorruptProb != qdiscnetem.CorruptProb {
- t.Fatal("CorruptProb does not match")
- }
- if netem.Jitter != qdiscnetem.Jitter {
- t.Fatal("Jitter does not match")
- }
- if netem.LossCorr != qdiscnetem.LossCorr {
- t.Fatal("Loss does not match")
- }
- if netem.DuplicateCorr != qdiscnetem.DuplicateCorr {
- t.Fatal("DuplicateCorr does not match")
- }
- // Deletion
- if err := ClassDel(class); err != nil {
- t.Fatal(err)
- }
- classes, err = ClassList(link, MakeHandle(0xffff, 0))
- if err != nil {
- t.Fatal(err)
- }
- if len(classes) != 0 {
- t.Fatal("Failed to remove class")
- }
- if err := QdiscDel(qdisc); err != nil {
- t.Fatal(err)
- }
- qdiscs, err = QdiscList(link)
- if err != nil {
- t.Fatal(err)
- }
- if len(qdiscs) != 0 {
- t.Fatal("Failed to remove qdisc")
- }
- }
- func TestHtbClassAddHtbClassChangeDel(t *testing.T) {
- /**
- This test first set up a interface ans set up a Htb qdisc
- A HTB class is attach to it and a Netem qdisc is attached to that class
- Next, we test changing the HTB class in place and confirming the Netem is
- still attached. We also check that invoting ClassChange with a non-existing
- class will fail.
- Finally, we test ClassReplace. We confirm it correctly behave like
- ClassChange when the parent/handle pair exists and that it will create a
- new class if the handle is modified.
- */
- tearDown := setUpNetlinkTest(t)
- defer tearDown()
- if err := LinkAdd(&Ifb{LinkAttrs{Name: "foo"}}); err != nil {
- t.Fatal(err)
- }
- link, err := LinkByName("foo")
- if err != nil {
- t.Fatal(err)
- }
- if err := LinkSetUp(link); err != nil {
- t.Fatal(err)
- }
- attrs := QdiscAttrs{
- LinkIndex: link.Attrs().Index,
- Handle: MakeHandle(0xffff, 0),
- Parent: HANDLE_ROOT,
- }
- qdisc := NewHtb(attrs)
- if err := QdiscAdd(qdisc); err != nil {
- t.Fatal(err)
- }
- qdiscs, err := QdiscList(link)
- if err != nil {
- t.Fatal(err)
- }
- if len(qdiscs) != 1 {
- t.Fatal("Failed to add qdisc")
- }
- _, ok := qdiscs[0].(*Htb)
- if !ok {
- t.Fatal("Qdisc is the wrong type")
- }
- classattrs := ClassAttrs{
- LinkIndex: link.Attrs().Index,
- Parent: MakeHandle(0xffff, 0),
- Handle: MakeHandle(0xffff, 2),
- }
- htbclassattrs := HtbClassAttrs{
- Rate: 1234000,
- Cbuffer: 1690,
- }
- class := NewHtbClass(classattrs, htbclassattrs)
- if err := ClassAdd(class); err != nil {
- t.Fatal(err)
- }
- classes, err := ClassList(link, 0)
- if err != nil {
- t.Fatal(err)
- }
- if len(classes) != 1 {
- t.Fatal("Failed to add class")
- }
- htb, ok := classes[0].(*HtbClass)
- if !ok {
- t.Fatal("Class is the wrong type")
- }
- qattrs := QdiscAttrs{
- LinkIndex: link.Attrs().Index,
- Handle: MakeHandle(0x2, 0),
- Parent: MakeHandle(0xffff, 2),
- }
- nattrs := NetemQdiscAttrs{
- Latency: 20000,
- Loss: 23.4,
- Duplicate: 14.3,
- LossCorr: 8.34,
- Jitter: 1000,
- DelayCorr: 12.3,
- ReorderProb: 23.4,
- CorruptProb: 10.0,
- CorruptCorr: 10,
- }
- qdiscnetem := NewNetem(qattrs, nattrs)
- if err := QdiscAdd(qdiscnetem); err != nil {
- t.Fatal(err)
- }
- qdiscs, err = QdiscList(link)
- if err != nil {
- t.Fatal(err)
- }
- if len(qdiscs) != 2 {
- t.Fatal("Failed to add qdisc")
- }
- _, ok = qdiscs[1].(*Netem)
- if !ok {
- t.Fatal("Qdisc is the wrong type")
- }
- // Change
- // For change to work, the handle and parent cannot be changed.
- // First, test it fails if we change the Handle.
- oldHandle := classattrs.Handle
- classattrs.Handle = MakeHandle(0xffff, 3)
- class = NewHtbClass(classattrs, htbclassattrs)
- if err := ClassChange(class); err == nil {
- t.Fatal("ClassChange should not work when using a different handle.")
- }
- // It should work with the same handle
- classattrs.Handle = oldHandle
- htbclassattrs.Rate = 4321000
- class = NewHtbClass(classattrs, htbclassattrs)
- if err := ClassChange(class); err != nil {
- t.Fatal(err)
- }
- classes, err = ClassList(link, MakeHandle(0xffff, 0))
- if err != nil {
- t.Fatal(err)
- }
- if len(classes) != 1 {
- t.Fatalf(
- "1 class expected, %d found",
- len(classes),
- )
- }
- htb, ok = classes[0].(*HtbClass)
- if !ok {
- t.Fatal("Class is the wrong type")
- }
- // Verify that the rate value has changed.
- if htb.Rate != class.Rate {
- t.Fatal("Rate did not get changed while changing the class.")
- }
- // Check that we still have the netem child qdisc
- qdiscs, err = QdiscList(link)
- if err != nil {
- t.Fatal(err)
- }
- if len(qdiscs) != 2 {
- t.Fatalf("2 qdisc expected, %d found", len(qdiscs))
- }
- _, ok = qdiscs[0].(*Htb)
- if !ok {
- t.Fatal("Qdisc is the wrong type")
- }
- _, ok = qdiscs[1].(*Netem)
- if !ok {
- t.Fatal("Qdisc is the wrong type")
- }
- // Replace
- // First replace by keeping the same handle, class will be changed.
- // Then, replace by providing a new handle, n new class will be created.
- // Replace acting as Change
- class = NewHtbClass(classattrs, htbclassattrs)
- if err := ClassReplace(class); err != nil {
- t.Fatal("Failed to replace class that is existing.")
- }
- classes, err = ClassList(link, MakeHandle(0xffff, 0))
- if err != nil {
- t.Fatal(err)
- }
- if len(classes) != 1 {
- t.Fatalf(
- "1 class expected, %d found",
- len(classes),
- )
- }
- htb, ok = classes[0].(*HtbClass)
- if !ok {
- t.Fatal("Class is the wrong type")
- }
- // Verify that the rate value has changed.
- if htb.Rate != class.Rate {
- t.Fatal("Rate did not get changed while changing the class.")
- }
- // It should work with the same handle
- classattrs.Handle = MakeHandle(0xffff, 3)
- class = NewHtbClass(classattrs, htbclassattrs)
- if err := ClassReplace(class); err != nil {
- t.Fatal(err)
- }
- classes, err = ClassList(link, MakeHandle(0xffff, 0))
- if err != nil {
- t.Fatal(err)
- }
- if len(classes) != 2 {
- t.Fatalf(
- "2 classes expected, %d found",
- len(classes),
- )
- }
- htb, ok = classes[1].(*HtbClass)
- if !ok {
- t.Fatal("Class is the wrong type")
- }
- // Verify that the rate value has changed.
- if htb.Rate != class.Rate {
- t.Fatal("Rate did not get changed while changing the class.")
- }
- // Deletion
- for _, class := range classes {
- if err := ClassDel(class); err != nil {
- t.Fatal(err)
- }
- }
- classes, err = ClassList(link, MakeHandle(0xffff, 0))
- if err != nil {
- t.Fatal(err)
- }
- if len(classes) != 0 {
- t.Fatal("Failed to remove class")
- }
- if err := QdiscDel(qdisc); err != nil {
- t.Fatal(err)
- }
- qdiscs, err = QdiscList(link)
- if err != nil {
- t.Fatal(err)
- }
- if len(qdiscs) != 0 {
- t.Fatal("Failed to remove qdisc")
- }
- }
|