80 Dbg info(Dbg::Port, Dbg::Info);
85 auto *p =
lookup(src, vlan_id);
88 info.printf(
"%s %-20s -> ", !p ?
"learned " :
"replaced",
95 auto status = _mac_table.emplace(std::tuple(src, vlan_id),
96 &_entries[_rr_index]);
99 if (_entries[_rr_index].port)
102 _mac_table.erase(std::tuple(_entries[_rr_index].addr,
103 _entries[_rr_index].vlan_id));
106 _entries[_rr_index].port = port;
107 _entries[_rr_index].addr = src;
108 _entries[_rr_index].vlan_id = vlan_id;
109 _rr_index = (_rr_index + 1U) % Size;
114 status.first->second->port = port;
131 typedef std::pair<std::tuple<const Mac_addr, l4_uint16_t>, Entry*> TableEntry;
133 auto iter = _mac_table.begin();
134 while ((iter = std::find_if(iter, _mac_table.end(),
135 [port](TableEntry
const &p)
136 { return p.second->port == port; }))
139 iter->second->port =
nullptr;
140 iter->second->addr = Mac_addr::Addr_unknown;
141 iter->second->vlan_id = 0;
142 iter = _mac_table.erase(iter);
145 assert(std::find_if(_mac_table.begin(), _mac_table.end(),
146 [port](TableEntry
const &p)
147 { return p.second->port == port; }) == _mac_table.end());