1
2
3
4 package netlink
5
6 import (
7 "testing"
8 )
9
10 func TestProtinfo(t *testing.T) {
11 tearDown := setUpNetlinkTest(t)
12 defer tearDown()
13 master := &Bridge{LinkAttrs: LinkAttrs{Name: "foo"}}
14 if err := LinkAdd(master); err != nil {
15 t.Fatal(err)
16 }
17 iface1 := &Dummy{LinkAttrs{Name: "bar1", MasterIndex: master.Index}}
18 iface2 := &Dummy{LinkAttrs{Name: "bar2", MasterIndex: master.Index}}
19 iface3 := &Dummy{LinkAttrs{Name: "bar3"}}
20 iface4 := &Dummy{LinkAttrs{Name: "bar4", MasterIndex: master.Index}}
21
22 if err := LinkAdd(iface1); err != nil {
23 t.Fatal(err)
24 }
25 if err := LinkAdd(iface2); err != nil {
26 t.Fatal(err)
27 }
28 if err := LinkAdd(iface3); err != nil {
29 t.Fatal(err)
30 }
31 if err := LinkAdd(iface4); err != nil {
32 t.Fatal(err)
33 }
34
35 oldpi1, err := LinkGetProtinfo(iface1)
36 if err != nil {
37 t.Fatal(err)
38 }
39 oldpi2, err := LinkGetProtinfo(iface2)
40 if err != nil {
41 t.Fatal(err)
42 }
43 oldpi4, err := LinkGetProtinfo(iface4)
44 if err != nil {
45 t.Fatal(err)
46 }
47
48 if err := LinkSetHairpin(iface1, true); err != nil {
49 t.Fatal(err)
50 }
51
52 if err := LinkSetRootBlock(iface1, true); err != nil {
53 t.Fatal(err)
54 }
55
56 pi1, err := LinkGetProtinfo(iface1)
57 if err != nil {
58 t.Fatal(err)
59 }
60 if !pi1.Hairpin {
61 t.Fatalf("Hairpin mode is not enabled for %s, but should", iface1.Name)
62 }
63 if !pi1.RootBlock {
64 t.Fatalf("RootBlock is not enabled for %s, but should", iface1.Name)
65 }
66 if pi1.Isolated {
67 t.Fatalf("Isolated mode is enabled for %s, but shouldn't", iface1.Name)
68 }
69 if pi1.ProxyArp != oldpi1.ProxyArp {
70 t.Fatalf("ProxyArp field was changed for %s but shouldn't", iface1.Name)
71 }
72 if pi1.ProxyArpWiFi != oldpi1.ProxyArp {
73 t.Fatalf("ProxyArpWiFi ProxyArp field was changed for %s but shouldn't", iface1.Name)
74 }
75 if pi1.Guard != oldpi1.Guard {
76 t.Fatalf("Guard field was changed for %s but shouldn't", iface1.Name)
77 }
78 if pi1.FastLeave != oldpi1.FastLeave {
79 t.Fatalf("FastLeave field was changed for %s but shouldn't", iface1.Name)
80 }
81 if pi1.Learning != oldpi1.Learning {
82 t.Fatalf("Learning field was changed for %s but shouldn't", iface1.Name)
83 }
84 if pi1.Flood != oldpi1.Flood {
85 t.Fatalf("Flood field was changed for %s but shouldn't", iface1.Name)
86 }
87 if pi1.NeighSuppress != oldpi1.NeighSuppress {
88 t.Fatalf("NeighSuppress field was changed for %s but shouldn't", iface1.Name)
89 }
90
91 if err := LinkSetGuard(iface2, true); err != nil {
92 t.Fatal(err)
93 }
94 if err := LinkSetLearning(iface2, false); err != nil {
95 t.Fatal(err)
96 }
97 pi2, err := LinkGetProtinfo(iface2)
98 if err != nil {
99 t.Fatal(err)
100 }
101 if pi2.Hairpin {
102 t.Fatalf("Hairpin mode is enabled for %s, but shouldn't", iface2.Name)
103 }
104 if !pi2.Guard {
105 t.Fatalf("Guard is not enabled for %s, but should", iface2.Name)
106 }
107 if pi2.ProxyArp != oldpi2.ProxyArp {
108 t.Fatalf("ProxyArp field was changed for %s but shouldn't", iface2.Name)
109 }
110 if pi2.ProxyArpWiFi != oldpi2.ProxyArpWiFi {
111 t.Fatalf("ProxyArpWiFi field was changed for %s but shouldn't", iface2.Name)
112 }
113 if pi2.Learning {
114 t.Fatalf("Learning is enabled for %s, but shouldn't", iface2.Name)
115 }
116 if pi2.RootBlock != oldpi2.RootBlock {
117 t.Fatalf("RootBlock field was changed for %s but shouldn't", iface2.Name)
118 }
119 if pi2.FastLeave != oldpi2.FastLeave {
120 t.Fatalf("FastLeave field was changed for %s but shouldn't", iface2.Name)
121 }
122 if pi2.Flood != oldpi2.Flood {
123 t.Fatalf("Flood field was changed for %s but shouldn't", iface2.Name)
124 }
125 if pi2.NeighSuppress != oldpi2.NeighSuppress {
126 t.Fatalf("NeighSuppress field was changed for %s but shouldn't", iface2.Name)
127 }
128
129 if err := LinkSetHairpin(iface3, true); err == nil || err.Error() != "operation not supported" {
130 t.Fatalf("Set protinfo attrs for link without master is not supported, but err: %s", err)
131 }
132
133
134 minKernelRequired(t, 3, 19)
135
136 if err := LinkSetBrProxyArp(iface4, true); err != nil {
137 t.Fatal(err)
138 }
139
140 if err := LinkSetBrProxyArpWiFi(iface4, true); err != nil {
141 t.Fatal(err)
142 }
143 pi4, err := LinkGetProtinfo(iface4)
144 if err != nil {
145 t.Fatal(err)
146 }
147 if pi4.Hairpin != oldpi4.Hairpin {
148 t.Fatalf("Hairpin field was changed for %s but shouldn't", iface4.Name)
149 }
150 if pi4.Guard != oldpi4.Guard {
151 t.Fatalf("Guard field was changed for %s but shouldn't", iface4.Name)
152 }
153 if pi4.Learning != oldpi4.Learning {
154 t.Fatalf("Learning field was changed for %s but shouldn't", iface4.Name)
155 }
156 if !pi4.ProxyArp {
157 t.Fatalf("ProxyArp is not enabled for %s, but should", iface4.Name)
158 }
159 if !pi4.ProxyArpWiFi {
160 t.Fatalf("ProxyArpWiFi is not enabled for %s, but should", iface4.Name)
161 }
162 if pi4.RootBlock != oldpi4.RootBlock {
163 t.Fatalf("RootBlock field was changed for %s but shouldn't", iface4.Name)
164 }
165 if pi4.FastLeave != oldpi4.FastLeave {
166 t.Fatalf("FastLeave field was changed for %s but shouldn't", iface4.Name)
167 }
168 if pi4.Flood != oldpi4.Flood {
169 t.Fatalf("Flood field was changed for %s but shouldn't", iface4.Name)
170 }
171
172
173 minKernelRequired(t, 4, 15)
174
175 if err := LinkSetBrNeighSuppress(iface1, true); err != nil {
176 t.Fatal(err)
177 }
178 pi1, err = LinkGetProtinfo(iface1)
179 if err != nil {
180 t.Fatal(err)
181 }
182 if !pi1.NeighSuppress {
183 t.Fatalf("NeighSuppress is not enabled for %s but should", iface1.Name)
184 }
185
186
187 minKernelRequired(t, 4, 18)
188
189 if err := LinkSetIsolated(iface1, true); err != nil {
190 t.Fatal(err)
191 }
192 pi1, err = LinkGetProtinfo(iface1)
193 if err != nil {
194 t.Fatal(err)
195 }
196 if !pi1.Isolated {
197 t.Fatalf("Isolated mode is not enabled for %s, but should", iface1.Name)
198 }
199 }
200
View as plain text