|
24 | 24 | #define MIRROR_SESSION_MONITOR_PORT "monitor_port"
|
25 | 25 | #define MIRROR_SESSION_ROUTE_PREFIX "route_prefix"
|
26 | 26 | #define MIRROR_SESSION_VLAN_HEADER_VALID "vlan_header_valid"
|
| 27 | +#define MIRROR_SESSION_POLICER "policer" |
27 | 28 |
|
28 | 29 | #define MIRROR_SESSION_DEFAULT_VLAN_PRI 0
|
29 | 30 | #define MIRROR_SESSION_DEFAULT_VLAN_CFI 0
|
@@ -60,12 +61,13 @@ MirrorEntry::MirrorEntry(const string& platform) :
|
60 | 61 | }
|
61 | 62 |
|
62 | 63 | MirrorOrch::MirrorOrch(TableConnector stateDbConnector, TableConnector confDbConnector,
|
63 |
| - PortsOrch *portOrch, RouteOrch *routeOrch, NeighOrch *neighOrch, FdbOrch *fdbOrch) : |
| 64 | + PortsOrch *portOrch, RouteOrch *routeOrch, NeighOrch *neighOrch, FdbOrch *fdbOrch, PolicerOrch *policerOrch) : |
64 | 65 | Orch(confDbConnector.first, confDbConnector.second),
|
65 | 66 | m_portsOrch(portOrch),
|
66 | 67 | m_routeOrch(routeOrch),
|
67 | 68 | m_neighOrch(neighOrch),
|
68 | 69 | m_fdbOrch(fdbOrch),
|
| 70 | + m_policerOrch(policerOrch), |
69 | 71 | m_mirrorTable(stateDbConnector.first, stateDbConnector.second)
|
70 | 72 | {
|
71 | 73 | m_portsOrch->attach(this);
|
@@ -239,6 +241,18 @@ void MirrorOrch::createEntry(const string& key, const vector<FieldValueTuple>& d
|
239 | 241 | {
|
240 | 242 | entry.queue = to_uint<uint8_t>(fvValue(i));
|
241 | 243 | }
|
| 244 | + else if (fvField(i) == MIRROR_SESSION_POLICER) |
| 245 | + { |
| 246 | + if (!m_policerOrch->policerExists(fvValue(i))) |
| 247 | + { |
| 248 | + SWSS_LOG_ERROR("Failed to get policer %s", |
| 249 | + fvValue(i).c_str()); |
| 250 | + return; |
| 251 | + } |
| 252 | + |
| 253 | + m_policerOrch->increaseRefCount(fvValue(i)); |
| 254 | + entry.policer = fvValue(i); |
| 255 | + } |
242 | 256 | else
|
243 | 257 | {
|
244 | 258 | SWSS_LOG_ERROR("Failed to parse session %s configuration. Unknown attribute %s.\n", key.c_str(), fvField(i).c_str());
|
@@ -292,6 +306,11 @@ void MirrorOrch::deleteEntry(const string& name)
|
292 | 306 | deactivateSession(name, session);
|
293 | 307 | }
|
294 | 308 |
|
| 309 | + if (!session.policer.empty()) |
| 310 | + { |
| 311 | + m_policerOrch->decreaseRefCount(session.policer); |
| 312 | + } |
| 313 | + |
295 | 314 | m_syncdMirrors.erase(sessionIter);
|
296 | 315 |
|
297 | 316 | SWSS_LOG_NOTICE("Removed mirror session %s", name.c_str());
|
@@ -387,7 +406,8 @@ bool MirrorOrch::getNeighborInfo(const string& name, MirrorEntry& session)
|
387 | 406 | }
|
388 | 407 | case Port::VLAN:
|
389 | 408 | {
|
390 |
| - SWSS_LOG_NOTICE("vlan id is %d", session.neighborInfo.port.m_vlan_info.vlan_id); |
| 409 | + SWSS_LOG_NOTICE("Get mirror session destination IP neighbor VLAN %d", |
| 410 | + session.neighborInfo.port.m_vlan_info.vlan_id); |
391 | 411 | Port member;
|
392 | 412 | if (!m_fdbOrch->getPort(session.neighborInfo.mac, session.neighborInfo.port.m_vlan_info.vlan_id, member))
|
393 | 413 | {
|
@@ -550,6 +570,20 @@ bool MirrorOrch::activateSession(const string& name, MirrorEntry& session)
|
550 | 570 | attr.value.u16 = session.greType;
|
551 | 571 | attrs.push_back(attr);
|
552 | 572 |
|
| 573 | + if (!session.policer.empty()) |
| 574 | + { |
| 575 | + sai_object_id_t oid = SAI_NULL_OBJECT_ID; |
| 576 | + if (!m_policerOrch->getPolicerOid(session.policer, oid)) |
| 577 | + { |
| 578 | + SWSS_LOG_ERROR("Faield to get policer %s", session.policer.c_str()); |
| 579 | + return false; |
| 580 | + } |
| 581 | + |
| 582 | + attr.id = SAI_MIRROR_SESSION_ATTR_POLICER; |
| 583 | + attr.value.oid = oid; |
| 584 | + attrs.push_back(attr); |
| 585 | + } |
| 586 | + |
553 | 587 | status = sai_mirror_api->
|
554 | 588 | create_mirror_session(&session.sessionId, gSwitchId, (uint32_t)attrs.size(), attrs.data());
|
555 | 589 | if (status != SAI_STATUS_SUCCESS)
|
|
0 commit comments