Skip to content

Commit e16a249

Browse files
committed
Call the "tc qdisc" command for ingress qdisc without parent
The "tc qdisc" command to create an ingress qdisc does not require to define a parent qdisc [1]. The ingress qdisc "differs from other qdiscs in that it does not occupy the root of a device". The previous command was replacing the default root egress qdisc: root@dev20:~# ip netns exec ns01 tc qdisc show qdisc noqueue 0: dev dummy root refcnt 2 This operation is now not permitted with the new kernel. This patch is also changing how the TC funtional tests interact with the namespace interface created. Now the interface is set to UP before the test starts. That changes the "tc qdisc show" command because now the default qdisc (see the aforementioned CLI output) is now present, as it should be in a live environment (where the interfaces are UP). Closes-Bug: #2034540 [1]https://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.adv-qdisc.ingress.html Change-Id: I2f8130dc3cf3244be2a44a4ecbdbaa9c7f865731 (cherry picked from commit 8cba9a2)
1 parent fbda749 commit e16a249

File tree

1 file changed

+30
-14
lines changed

1 file changed

+30
-14
lines changed

neutron/tests/functional/privileged/agent/linux/test_tc_lib.py

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def setUp(self):
3434
self.addCleanup(self._remove_ns, self.namespace)
3535
self.device = 'int_dummy'
3636
priv_ip_lib.create_interface(self.device, self.namespace, 'dummy')
37+
priv_ip_lib.set_link_attribute(self.device, self.namespace, state='up')
3738

3839
def _remove_ns(self, namespace):
3940
priv_ip_lib.remove_netns(namespace)
@@ -53,7 +54,9 @@ def test_add_tc_qdisc_htb(self):
5354
namespace=self.namespace)
5455
qdiscs = priv_tc_lib.list_tc_qdiscs(self.device,
5556
namespace=self.namespace)
56-
self.assertEqual(0, len(qdiscs))
57+
self.assertEqual(1, len(qdiscs))
58+
self.assertEqual('noqueue',
59+
linux_utils.get_attr(qdiscs[0], 'TCA_KIND'))
5760

5861
def test_add_tc_qdisc_htb_no_handle(self):
5962
priv_tc_lib.add_tc_qdisc(
@@ -70,7 +73,9 @@ def test_add_tc_qdisc_htb_no_handle(self):
7073
namespace=self.namespace)
7174
qdiscs = priv_tc_lib.list_tc_qdiscs(self.device,
7275
namespace=self.namespace)
73-
self.assertEqual(0, len(qdiscs))
76+
self.assertEqual(1, len(qdiscs))
77+
self.assertEqual('noqueue',
78+
linux_utils.get_attr(qdiscs[0], 'TCA_KIND'))
7479

7580
def test_add_tc_qdisc_tbf(self):
7681
burst = 192000
@@ -96,24 +101,30 @@ def test_add_tc_qdisc_tbf(self):
96101
namespace=self.namespace)
97102
qdiscs = priv_tc_lib.list_tc_qdiscs(self.device,
98103
namespace=self.namespace)
99-
self.assertEqual(0, len(qdiscs))
104+
self.assertEqual(1, len(qdiscs))
105+
self.assertEqual('noqueue',
106+
linux_utils.get_attr(qdiscs[0], 'TCA_KIND'))
100107

101108
def test_add_tc_qdisc_ingress(self):
102109
priv_tc_lib.add_tc_qdisc(self.device, kind='ingress',
103110
namespace=self.namespace)
104111
qdiscs = priv_tc_lib.list_tc_qdiscs(self.device,
105112
namespace=self.namespace)
106-
self.assertEqual(1, len(qdiscs))
107-
self.assertEqual('ingress', linux_utils.get_attr(qdiscs[0],
113+
self.assertEqual(2, len(qdiscs))
114+
self.assertEqual('noqueue',
115+
linux_utils.get_attr(qdiscs[0], 'TCA_KIND'))
116+
self.assertEqual('ingress', linux_utils.get_attr(qdiscs[1],
108117
'TCA_KIND'))
109-
self.assertEqual(rtnl.TC_H_INGRESS, qdiscs[0]['parent'])
110-
self.assertEqual(0xffff0000, qdiscs[0]['handle'])
118+
self.assertEqual(rtnl.TC_H_INGRESS, qdiscs[1]['parent'])
119+
self.assertEqual(0xffff0000, qdiscs[1]['handle'])
111120

112121
priv_tc_lib.delete_tc_qdisc(self.device, kind='ingress',
113122
namespace=self.namespace)
114123
qdiscs = priv_tc_lib.list_tc_qdiscs(self.device,
115124
namespace=self.namespace)
116-
self.assertEqual(0, len(qdiscs))
125+
self.assertEqual(1, len(qdiscs))
126+
self.assertEqual('noqueue',
127+
linux_utils.get_attr(qdiscs[0], 'TCA_KIND'))
117128

118129
def test_delete_tc_qdisc_no_device(self):
119130
self.assertRaises(
@@ -140,15 +151,19 @@ def test_delete_tc_qdisc_ingress_twice(self):
140151
namespace=self.namespace)
141152
qdiscs = priv_tc_lib.list_tc_qdiscs(self.device,
142153
namespace=self.namespace)
143-
self.assertEqual(1, len(qdiscs))
144-
self.assertEqual('ingress', linux_utils.get_attr(qdiscs[0],
154+
self.assertEqual(2, len(qdiscs))
155+
self.assertEqual('noqueue',
156+
linux_utils.get_attr(qdiscs[0], 'TCA_KIND'))
157+
self.assertEqual('ingress', linux_utils.get_attr(qdiscs[1],
145158
'TCA_KIND'))
146159
self.assertIsNone(
147160
priv_tc_lib.delete_tc_qdisc(self.device, kind='ingress',
148161
namespace=self.namespace))
149162
qdiscs = priv_tc_lib.list_tc_qdiscs(self.device,
150163
namespace=self.namespace)
151-
self.assertEqual(0, len(qdiscs))
164+
self.assertEqual(1, len(qdiscs))
165+
self.assertEqual('noqueue',
166+
linux_utils.get_attr(qdiscs[0], 'TCA_KIND'))
152167
self.assertEqual(
153168
errno.EINVAL,
154169
priv_tc_lib.delete_tc_qdisc(self.device, kind='ingress',
@@ -170,6 +185,7 @@ def setUp(self):
170185
self.addCleanup(self._remove_ns, self.namespace)
171186
self.device = 'int_dummy'
172187
priv_ip_lib.create_interface('int_dummy', self.namespace, 'dummy')
188+
priv_ip_lib.set_link_attribute(self.device, self.namespace, state='up')
173189

174190
def _remove_ns(self, namespace):
175191
priv_ip_lib.remove_netns(namespace)
@@ -251,6 +267,7 @@ def setUp(self):
251267
self.addCleanup(self._remove_ns, self.namespace)
252268
self.device = 'int_dummy'
253269
priv_ip_lib.create_interface('int_dummy', self.namespace, 'dummy')
270+
priv_ip_lib.set_link_attribute(self.device, self.namespace, state='up')
254271

255272
def _remove_ns(self, namespace):
256273
priv_ip_lib.remove_netns(namespace)
@@ -277,9 +294,8 @@ def test_add_tc_filter_match32(self):
277294
self.assertEqual(value, filter_keys[index])
278295

279296
def test_add_tc_filter_policy(self):
280-
priv_tc_lib.add_tc_qdisc(
281-
self.device, parent=rtnl.TC_H_ROOT, kind='ingress',
282-
namespace=self.namespace)
297+
priv_tc_lib.add_tc_qdisc(self.device, kind='ingress',
298+
namespace=self.namespace)
283299

284300
# NOTE(ralonsoh):
285301
# - rate: 320000 bytes/sec (pyroute2 units) = 2560 kbits/sec (OS units)

0 commit comments

Comments
 (0)