Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
b43797b
[dhcpmon]: Add packet event quiescing
Xichen96 Jul 25, 2026
27f0f10
[dhcpmon]: Reconcile runtime membership state
Xichen96 Jul 25, 2026
49d843a
Merge branch 'tmp-pr92' into dev/xichenlin/live-membership-listener-fd
Xichen96 Jul 25, 2026
049ef7c
[dhcpmon]: Listen for membership updates
Xichen96 Jul 25, 2026
aa103b1
[dhcpmon]: Preserve health checks during refresh deferral
Xichen96 Jul 25, 2026
efb3282
[dhcpmon]: Harden packet event resume
Xichen96 Jul 25, 2026
21ae089
[dhcpmon]: Guard packet event suspension
Xichen96 Jul 26, 2026
1bef9c3
[dhcpmon]: Fail safely on topology refresh errors
Xichen96 Jul 26, 2026
282c578
[dhcpmon]: Reject unknown packet event tags
Xichen96 Jul 26, 2026
ab9d9d7
[dhcpmon]: Wait for in-flight packet callbacks
Xichen96 Jul 26, 2026
6ce460d
[dhcpmon]: Release packet quiesce on startup failure
Xichen96 Jul 26, 2026
14919da
[dhcpmon]: Handle topology snapshot failures
Xichen96 Jul 26, 2026
8b4b059
[dhcpmon]: Avoid implicit event tag creation
Xichen96 Jul 26, 2026
c7ba5ce
[dhcpmon]: Avoid blocking callbacks during quiesce
Xichen96 Jul 26, 2026
8764b40
[dhcpmon]: Keep event cleanup idempotent
Xichen96 Jul 26, 2026
7756d7f
[dhcpmon]: Correct counter reconcile documentation
Xichen96 Jul 26, 2026
43dbc88
[dhcpmon]: Synchronize counter sampling and updates
Xichen96 Jul 26, 2026
1123988
[dhcpmon]: Lock health sampling after topology refresh
Xichen96 Jul 26, 2026
cdd77fc
[dhcpmon]: Guarantee counter writer progress
Xichen96 Jul 26, 2026
f90475f
[dhcpmon]: Block packet callbacks without spinning
Xichen96 Jul 26, 2026
851ec79
[dhcpmon]: Harden topology refresh retries
Xichen96 Jul 26, 2026
70c0f39
[dhcpmon]: Keep packet callback fast path lock-free
Xichen96 Jul 26, 2026
1213def
[dhcpmon]: Keep topology reconciliation internal
Xichen96 Jul 26, 2026
b8520a2
[dhcpmon]: Avoid unused socket bindings
Xichen96 Jul 26, 2026
c242200
[dhcpmon]: Write DB counters from a stable snapshot
Xichen96 Jul 26, 2026
0ce0481
[dhcpmon]: Drop stale monitor packets after refresh
Xichen96 Jul 26, 2026
23fff73
[dhcpmon]: Skip unknown counter snapshot sockets
Xichen96 Jul 26, 2026
a4d4e77
[dhcpmon]: Prune stale snapshot-only counters
Xichen96 Jul 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 39 additions & 10 deletions src/dhcp_devman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#include <stdlib.h>
#include <arpa/inet.h>

#include <exception>

#include "dhcp_devman.h"


Expand Down Expand Up @@ -205,11 +207,13 @@ bool dhcp_devman_is_tracked_interface(const std::string &ifname)
* @param none
* @return none
*/
static void update_vlan_mapping()
static void update_vlan_mapping(const std::shared_ptr<swss::DBConnector> &config_db,
std::unordered_map<std::string, std::string> &vlan_mapping,
std::unordered_map<std::string, std::unordered_set<std::string>> &reverse_vlan_mapping)
{
syslog(LOG_INFO, "Updating vlan mapping from VLAN_MEMBER");
auto match_pattern = std::string("VLAN_MEMBER|*");
auto keys = mConfigDbPtr->keys(match_pattern);
auto keys = config_db->keys(match_pattern);
std::string all_ifname;
std::string all_skipped_ifname;
for (const auto &key : keys) {
Expand All @@ -221,8 +225,8 @@ static void update_vlan_mapping()
all_skipped_ifname += "<" + ifname + ", " + vlan + ">, ";
continue;
}
vlan_map[ifname] = vlan;
rev_vlan_map[vlan].insert(ifname);
vlan_mapping[ifname] = vlan;
reverse_vlan_mapping[vlan].insert(ifname);
all_ifname += "<" + ifname + ", " + vlan + ">, ";
}
syslog(LOG_INFO, "Added vlan member interface mappings: %s", all_ifname.c_str());
Expand All @@ -236,11 +240,13 @@ static void update_vlan_mapping()
* @param none
* @return none
*/
static void update_portchannel_mapping()
static void update_portchannel_mapping(const std::shared_ptr<swss::DBConnector> &config_db,
std::unordered_map<std::string, std::string> &portchannel_mapping,
std::unordered_map<std::string, std::unordered_set<std::string>> &reverse_portchannel_mapping)
{
syslog(LOG_INFO, "Updating port-channel mapping from PORTCHANNEL_MEMBER");
auto match_pattern = std::string("PORTCHANNEL_MEMBER|*");
auto keys = mConfigDbPtr->keys(match_pattern);
auto keys = config_db->keys(match_pattern);
std::string all_ifname;
std::string all_skipped_ifname;
for (const auto &key : keys) {
Expand All @@ -252,14 +258,31 @@ static void update_portchannel_mapping()
all_skipped_ifname += "<" + ifname + ", " + portchannel + ">, ";
continue;
}
portchan_map[ifname] = portchannel;
rev_portchan_map[portchannel].insert(ifname);
portchannel_mapping[ifname] = portchannel;
reverse_portchannel_mapping[portchannel].insert(ifname);
all_ifname += "<" + ifname + ", " + portchannel + ">, ";
}
syslog(LOG_INFO, "Added port-channel member interface mappings: %s", all_ifname.c_str());
syslog(LOG_INFO, "Skipped port-channel member interface mappings: %s", all_skipped_ifname.c_str());
}

void dhcp_devman_refresh_mappings()
{
std::unordered_map<std::string, std::string> new_vlan_map;
std::unordered_map<std::string, std::string> new_portchan_map;
std::unordered_map<std::string, std::unordered_set<std::string>> new_rev_vlan_map;
std::unordered_map<std::string, std::unordered_set<std::string>> new_rev_portchan_map;
auto config_db = std::make_shared<swss::DBConnector>("CONFIG_DB", 0);

update_vlan_mapping(config_db, new_vlan_map, new_rev_vlan_map);
update_portchannel_mapping(config_db, new_portchan_map, new_rev_portchan_map);

vlan_map.swap(new_vlan_map);
portchan_map.swap(new_portchan_map);
rev_vlan_map.swap(new_rev_vlan_map);
rev_portchan_map.swap(new_rev_portchan_map);
}

int dhcp_devman_init()
{
syslog(LOG_INFO, "Initializing dhcp device manager");
Expand Down Expand Up @@ -297,8 +320,12 @@ int dhcp_devman_init()
agg_dev_prefix = agg_dev_all + "-";

// vlan and its members, portchannel and its members are initialized regardless of whether they are in cmdline
update_vlan_mapping();
update_portchannel_mapping();
try {
dhcp_devman_refresh_mappings();
} catch (const std::exception &e) {
syslog(LOG_ALERT, "Failed to initialize DHCP interface mappings: %s", e.what());
return -1;
}

Comment thread
Xichen96 marked this conversation as resolved.
syslog(LOG_INFO, "Dhcp device manager initialized successfully");

Expand All @@ -309,6 +336,8 @@ void dhcp_devman_free()
{
vlan_map.clear();
portchan_map.clear();
rev_vlan_map.clear();
rev_portchan_map.clear();
for (const auto &[ifname, context] : intfs) {
dhcp_device_free(context);
}
Expand Down
9 changes: 9 additions & 0 deletions src/dhcp_devman.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,15 @@ bool dhcp_devman_is_tracked_interface(const std::string &ifname);
*/
int dhcp_devman_init();

/**
* @code dhcp_devman_refresh_mappings();
*
* @brief rebuild VLAN and PortChannel membership mappings transactionally from CONFIG_DB.
*
* @return none
*/
void dhcp_devman_refresh_mappings();

/**
* @code dhcp_devman_free();
*
Expand Down
Loading