Skip to content

Commit 8d3d393

Browse files
authored
[202305] Revert DHCPv4 and DHCPv6 counter (#18253)
Why I did it Reverting DHCP counter changes due to unexpected packet drops seen in recv buffer, causing counter counts to be inaccurate in dhcpmon and affecting dhcp6relay performance Work item tracking Microsoft ADO (number only): 26918588 How I did it Reset submodule head and revert related dockerfile changes How to verify it Ran mgmt test and stress test
1 parent ac82e2f commit 8d3d393

6 files changed

Lines changed: 40 additions & 133 deletions

File tree

dockers/docker-dhcp-relay/Dockerfile.j2

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ ENV IMAGE_VERSION=$image_version
1313
# Update apt's cache of available packages
1414
RUN apt-get update
1515

16-
RUN apt-get install -y libjsoncpp-dev
17-
1816
{% if docker_dhcp_relay_debs.strip() -%}
1917
# Copy built Debian packages
2018
{{ copy_files("debs/", docker_dhcp_relay_debs.split(' '), "/debs/") }}

dockers/docker-dhcp-relay/cli-plugin-tests/test_show_dhcp6relay_counters.py

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,24 @@
1717
except KeyError:
1818
pass
1919

20-
expected_counts_v6 = """\
21-
Message Type Vlan1000(RX)
22-
-------------- ---------------
23-
24-
Message Type Vlan1000(TX)
25-
-------------- ---------------
26-
27-
"""
28-
29-
expected_counts_v4 = """\
30-
Message Type Vlan1000(RX)
31-
-------------- ---------------
32-
33-
Message Type Vlan1000(TX)
34-
-------------- ---------------
20+
expected_counts = """\
21+
Message Type Vlan1000
22+
------------------- -----------
23+
Unknown
24+
Solicit
25+
Advertise
26+
Request
27+
Confirm
28+
Renew
29+
Rebind
30+
Reply
31+
Release
32+
Decline
33+
Reconfigure
34+
Information-Request
35+
Relay-Forward
36+
Relay-Reply
37+
Malformed
3538
3639
"""
3740

@@ -40,14 +43,5 @@ class TestDhcp6RelayCounters(object):
4043
def test_show_counts(self):
4144
runner = CliRunner()
4245
result = runner.invoke(show.dhcp6relay_counters.commands["counts"], ["-i Vlan1000"])
43-
print(result.output)
44-
assert result.output == expected_counts_v6
45-
46-
class TestDhcpRelayCounters(object):
47-
48-
def test_show_counts(self):
49-
runner = CliRunner()
50-
result = runner.invoke(show.dhcp4relay_counters.commands["counts"], ["-i Vlan1000"])
51-
print(result.output)
52-
assert result.output == expected_counts_v4
46+
assert result.output == expected_counts
5347

dockers/docker-dhcp-relay/cli/show/plugins/show_dhcp_relay.py

Lines changed: 19 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import click
2-
import ast
32
from natsort import natsorted
43
from tabulate import tabulate
54
import show.vlan as show_vlan
@@ -8,20 +7,13 @@
87
from swsscommon.swsscommon import ConfigDBConnector
98
from swsscommon.swsscommon import SonicV2Connector
109

10+
1111
# STATE_DB Table
12-
DHCPv4_COUNTER_TABLE = 'DHCP_COUNTER_TABLE'
1312
DHCPv6_COUNTER_TABLE = 'DHCPv6_COUNTER_TABLE'
1413

15-
# DHCPv4 Counter Messages
16-
dhcpv4_messages = [
17-
"Unknown", "Discover", "Offer", "Request", "Decline", "Ack", "Nack", "Release", "Inform"
18-
]
19-
2014
# DHCPv6 Counter Messages
21-
dhcpv6_messages = [
22-
"Unknown", "Solicit", "Advertise", "Request", "Confirm", "Renew", "Rebind", "Reply", "Release",
23-
"Decline", "Reconfigure", "Information-Request", "Relay-Forward", "Relay-Reply", "Malformed"
24-
]
15+
messages = ["Unknown", "Solicit", "Advertise", "Request", "Confirm", "Renew", "Rebind", "Reply", "Release", "Decline",
16+
"Reconfigure", "Information-Request", "Relay-Forward", "Relay-Reply", "Malformed"]
2517

2618
# DHCP_RELAY Config Table
2719
DHCP_RELAY = 'DHCP_RELAY'
@@ -45,75 +37,6 @@ def get_dhcp_helper_address(ctx, vlan):
4537

4638
show_vlan.VlanBrief.register_column('DHCP Helper Address', get_dhcp_helper_address)
4739

48-
class DHCPv4_Counter(object):
49-
def __init__(self):
50-
self.db = SonicV2Connector(use_unix_socket_path=False)
51-
self.db.connect(self.db.STATE_DB)
52-
self.table_name = DHCPv4_COUNTER_TABLE + self.db.get_db_separator(self.db.STATE_DB)
53-
54-
def get_interface(self):
55-
""" Get all names of all interfaces in DHCPv4_COUNTER_TABLE """
56-
interfaces = []
57-
for key in self.db.keys(self.db.STATE_DB):
58-
if DHCPv4_COUNTER_TABLE in key:
59-
interfaces.append(key[21:])
60-
return interfaces
61-
62-
def get_dhcp4relay_msg_count(self, interface, dir):
63-
""" Get count of a dhcprelay message """
64-
value = self.db.get(self.db.STATE_DB, self.table_name + str(interface), str(dir))
65-
cnts = ast.literal_eval(str(value))
66-
data = []
67-
if cnts is not None:
68-
for k, v in cnts.items():
69-
data.append([k, v])
70-
return data
71-
72-
def clear_table(self, interface):
73-
""" Reset all message counts to 0 """
74-
v4_cnts = {}
75-
for msg in dhcpv4_messages:
76-
v4_cnts[msg] = '0'
77-
self.db.set(self.db.STATE_DB, self.table_name + str(interface), str("RX"), str(v4_cnts))
78-
self.db.set(self.db.STATE_DB, self.table_name + str(interface), str("TX"), str(v4_cnts))
79-
80-
def print_dhcpv4_count(counter, intf):
81-
"""Print count of each message"""
82-
rx_data = counter.get_dhcp4relay_msg_count(intf, "RX")
83-
print(tabulate(rx_data, headers=["Message Type", intf+"(RX)"], tablefmt='simple', stralign='right') + "\n")
84-
tx_data = counter.get_dhcp4relay_msg_count(intf, "TX")
85-
print(tabulate(tx_data, headers=["Message Type", intf+"(TX)"], tablefmt='simple', stralign='right') + "\n")
86-
87-
#
88-
# 'dhcp4relay_counters' group ###
89-
#
90-
91-
92-
@click.group(cls=clicommon.AliasedGroup, name="dhcp4relay_counters")
93-
def dhcp4relay_counters():
94-
"""Show DHCPv4 counter"""
95-
pass
96-
97-
98-
def ipv4_counters(interface):
99-
counter = DHCPv4_Counter()
100-
counter_intf = counter.get_interface()
101-
102-
if interface:
103-
print_dhcpv4_count(counter, interface)
104-
else:
105-
for intf in counter_intf:
106-
print_dhcpv4_count(counter, intf)
107-
108-
109-
# 'counts' subcommand ("show dhcp4relay_counters counts")
110-
@dhcp4relay_counters.command('counts')
111-
@click.option('-i', '--interface', required=False)
112-
@click.option('--verbose', is_flag=True, help="Enable verbose output")
113-
def counts(interface, verbose):
114-
"""Show dhcp4relay message counts"""
115-
ipv4_counters(interface)
116-
11740

11841
class DHCPv6_Counter(object):
11942
def __init__(self):
@@ -123,37 +46,30 @@ def __init__(self):
12346

12447
def get_interface(self):
12548
""" Get all names of all interfaces in DHCPv6_COUNTER_TABLE """
126-
interfaces = []
49+
vlans = []
12750
for key in self.db.keys(self.db.STATE_DB):
12851
if DHCPv6_COUNTER_TABLE in key:
129-
interfaces.append(key[21:])
130-
return interfaces
52+
vlans.append(key[21:])
53+
return vlans
13154

132-
def get_dhcp6relay_msg_count(self, interface, dir):
55+
def get_dhcp6relay_msg_count(self, interface, msg):
13356
""" Get count of a dhcp6relay message """
134-
value = self.db.get(self.db.STATE_DB, self.table_name + str(interface), str(dir))
135-
cnts = ast.literal_eval(str(value))
136-
data = []
137-
if cnts is not None:
138-
for k, v in cnts.items():
139-
data.append([k, v])
57+
count = self.db.get(self.db.STATE_DB, self.table_name + str(interface), str(msg))
58+
data = [str(msg), count]
14059
return data
14160

14261
def clear_table(self, interface):
14362
""" Reset all message counts to 0 """
144-
v6_cnts = {}
145-
for msg in dhcpv6_messages:
146-
v6_cnts[msg] = '0'
147-
self.db.set(self.db.STATE_DB, self.table_name + str(interface), str("RX"), str(v6_cnts))
148-
self.db.set(self.db.STATE_DB, self.table_name + str(interface), str("TX"), str(v6_cnts))
63+
for msg in messages:
64+
self.db.set(self.db.STATE_DB, self.table_name + str(interface), str(msg), '0')
14965

15066

151-
def print_dhcpv6_count(counter, intf):
67+
def print_count(counter, intf):
15268
"""Print count of each message"""
153-
rx_data = counter.get_dhcp6relay_msg_count(intf, "RX")
154-
print(tabulate(rx_data, headers=["Message Type", intf+"(RX)"], tablefmt='simple', stralign='right') + "\n")
155-
tx_data = counter.get_dhcp6relay_msg_count(intf, "TX")
156-
print(tabulate(tx_data, headers=["Message Type", intf+"(TX)"], tablefmt='simple', stralign='right') + "\n")
69+
data = []
70+
for i in messages:
71+
data.append(counter.get_dhcp6relay_msg_count(intf, i))
72+
print(tabulate(data, headers=["Message Type", intf], tablefmt='simple', stralign='right') + "\n")
15773

15874

15975
#
@@ -172,10 +88,10 @@ def ipv6_counters(interface):
17288
counter_intf = counter.get_interface()
17389

17490
if interface:
175-
print_dhcpv6_count(counter, interface)
91+
print_count(counter, interface)
17692
else:
17793
for intf in counter_intf:
178-
print_dhcpv6_count(counter, intf)
94+
print_count(counter, intf)
17995

18096

18197
# 'counts' subcommand ("show dhcp6relay_counters counts")
@@ -184,6 +100,7 @@ def ipv6_counters(interface):
184100
@click.option('--verbose', is_flag=True, help="Enable verbose output")
185101
def counts(interface, verbose):
186102
"""Show dhcp6relay message counts"""
103+
187104
ipv6_counters(interface)
188105

189106

@@ -282,7 +199,6 @@ def dhcp_relay_ip6counters(interface):
282199

283200

284201
def register(cli):
285-
cli.add_command(dhcp4relay_counters)
286202
cli.add_command(dhcp6relay_counters)
287203
cli.add_command(dhcp_relay_helper)
288204
cli.add_command(dhcp_relay)

sonic-slave-bullseye/Dockerfile.j2

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,6 @@ RUN apt-get update && apt-get install -y \
359359
# For DHCP Monitor tool
360360
libexplain-dev \
361361
libevent-dev \
362-
libjsoncpp-dev \
363362
# For libyang
364363
swig \
365364
# For build dtb

0 commit comments

Comments
 (0)