|
21 | 21 | #define PFC_WD_RESTORATION_TIME_MIN 100
|
22 | 22 | #define PFC_WD_POLL_TIMEOUT 5000
|
23 | 23 | #define PFC_WD_LOSSY_POLL_TIMEOUT_SEC (5 * 60)
|
| 24 | +#define SAI_PORT_STAT_PFC_PREFIX "SAI_PORT_STAT_PFC_" |
24 | 25 |
|
25 | 26 | extern sai_port_api_t *sai_port_api;
|
26 | 27 | extern sai_queue_api_t *sai_queue_api;
|
@@ -400,24 +401,32 @@ void PfcWdSwOrch<DropHandler, ForwardHandler>::registerInWdDb(const Port& port,
|
400 | 401 | return;
|
401 | 402 | }
|
402 | 403 |
|
| 404 | + set<uint8_t> losslessTc; |
| 405 | + uint8_t pfcMask = attr.value.u8; |
| 406 | + for (uint8_t i = 0; i < PFC_WD_TC_MAX; i++) |
| 407 | + { |
| 408 | + if ((pfcMask & (1 << i)) == 0) |
| 409 | + { |
| 410 | + continue; |
| 411 | + } |
| 412 | + |
| 413 | + losslessTc.insert(i); |
| 414 | + } |
| 415 | + |
403 | 416 | if (!c_portStatIds.empty())
|
404 | 417 | {
|
405 | 418 | string key = getFlexCounterTableKey(sai_serialize_object_id(port.m_port_id));
|
406 | 419 | vector<FieldValueTuple> fieldValues;
|
| 420 | + // Only register lossless tc counters in database. |
407 | 421 | string str = counterIdsToStr(c_portStatIds, &sai_serialize_port_stat);
|
408 |
| - fieldValues.emplace_back(PORT_COUNTER_ID_LIST, str); |
| 422 | + string filteredStr = filterPfcCounters(str, losslessTc); |
| 423 | + fieldValues.emplace_back(PORT_COUNTER_ID_LIST, filteredStr); |
409 | 424 |
|
410 | 425 | m_flexCounterTable->set(key, fieldValues);
|
411 | 426 | }
|
412 | 427 |
|
413 |
| - uint8_t pfcMask = attr.value.u8; |
414 |
| - for (uint8_t i = 0; i < PFC_WD_TC_MAX; i++) |
| 428 | + for (auto i : losslessTc) |
415 | 429 | {
|
416 |
| - if ((pfcMask & (1 << i)) == 0) |
417 |
| - { |
418 |
| - continue; |
419 |
| - } |
420 |
| - |
421 | 430 | sai_object_id_t queueId = port.m_queue_ids[i];
|
422 | 431 | string queueIdStr = sai_serialize_object_id(queueId);
|
423 | 432 |
|
@@ -461,9 +470,46 @@ void PfcWdSwOrch<DropHandler, ForwardHandler>::registerInWdDb(const Port& port,
|
461 | 470 | }
|
462 | 471 | }
|
463 | 472 |
|
| 473 | +template <typename DropHandler, typename ForwardHandler> |
| 474 | +string PfcWdSwOrch<DropHandler, ForwardHandler>::filterPfcCounters(string counters, set<uint8_t>& losslessTc) |
| 475 | +{ |
| 476 | + SWSS_LOG_ENTER(); |
| 477 | + |
| 478 | + istringstream is(counters); |
| 479 | + string counter; |
| 480 | + string filterCounters; |
| 481 | + |
| 482 | + while (getline(is, counter, ',')) |
| 483 | + { |
| 484 | + size_t index = 0; |
| 485 | + index = counter.find(SAI_PORT_STAT_PFC_PREFIX); |
| 486 | + if (index != 0) |
| 487 | + { |
| 488 | + filterCounters = filterCounters + counter + ","; |
| 489 | + } |
| 490 | + else |
| 491 | + { |
| 492 | + uint8_t tc = (uint8_t)atoi(counter.substr(index + sizeof(SAI_PORT_STAT_PFC_PREFIX) - 1, 1).c_str()); |
| 493 | + if (losslessTc.count(tc)) |
| 494 | + { |
| 495 | + filterCounters = filterCounters + counter + ","; |
| 496 | + } |
| 497 | + } |
| 498 | + } |
| 499 | + |
| 500 | + if (!filterCounters.empty()) |
| 501 | + { |
| 502 | + filterCounters.pop_back(); |
| 503 | + } |
| 504 | + |
| 505 | + return filterCounters; |
| 506 | +} |
| 507 | + |
464 | 508 | template <typename DropHandler, typename ForwardHandler>
|
465 | 509 | string PfcWdSwOrch<DropHandler, ForwardHandler>::getFlexCounterTableKey(string key)
|
466 | 510 | {
|
| 511 | + SWSS_LOG_ENTER(); |
| 512 | + |
467 | 513 | return string(PFC_WD_FLEX_COUNTER_GROUP) + ":" + key;
|
468 | 514 | }
|
469 | 515 |
|
|
0 commit comments