Skip to content

Commit 7a14f71

Browse files
committed
Support for MACsec statistics
1 parent d8ca31c commit 7a14f71

File tree

4 files changed

+127
-12
lines changed

4 files changed

+127
-12
lines changed

orchagent/flex_counter/flex_counter_manager.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ const unordered_map<CounterType, string> FlexCounterManager::counter_id_field_lo
3939
{ CounterType::PORT, PORT_COUNTER_ID_LIST },
4040
{ CounterType::QUEUE, QUEUE_COUNTER_ID_LIST },
4141
{ CounterType::MACSEC_SA_ATTR, MACSEC_SA_ATTR_ID_LIST },
42+
{ CounterType::MACSEC_SA, MACSEC_SA_COUNTER_ID_LIST },
43+
{ CounterType::MACSEC_FLOW, MACSEC_FLOW_COUNTER_ID_LIST },
4244
};
4345

4446
FlexCounterManager::FlexCounterManager(

orchagent/flex_counter/flex_counter_manager.h

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ enum class CounterType
2424
PORT_DEBUG,
2525
SWITCH_DEBUG,
2626
MACSEC_SA_ATTR,
27+
MACSEC_SA,
28+
MACSEC_FLOW,
2729
};
2830

2931
// FlexCounterManager allows users to manage a group of flex counters.

orchagent/macsecorch.cpp

+116-10
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
#define AVAILABLE_ACL_PRIORITIES_LIMITATION (32)
2020
#define EAPOL_ETHER_TYPE (0x888e)
2121
#define MACSEC_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS (1000)
22-
#define COUNTERS_MACSEC_ATTR_GROUP "COUNTERS_MACSEC_ATTR"
22+
#define COUNTERS_MACSEC_SA_ATTR_GROUP "COUNTERS_MACSEC_SA_ATTR"
23+
#define COUNTERS_MACSEC_SA_GROUP "COUNTERS_MACSEC_SA"
24+
#define COUNTERS_MACSEC_FLOW_GROUP "COUNTERS_MACSEC_FLOW"
2325

2426
extern sai_object_id_t gSwitchId;
2527
extern sai_macsec_api_t *sai_macsec_api;
@@ -35,6 +37,62 @@ static const std::vector<std::string> macsec_sa_attrs =
3537
{
3638
"SAI_MACSEC_SA_ATTR_CURRENT_XPN",
3739
};
40+
static const std::vector<std::string> macsec_sa_ingress_stats =
41+
{
42+
"SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED",
43+
"SAI_MACSEC_SA_STAT_OCTETS_PROTECTED",
44+
"SAI_MACSEC_SA_STAT_IN_PKTS_UNCHECKED",
45+
"SAI_MACSEC_SA_STAT_IN_PKTS_DELAYED",
46+
"SAI_MACSEC_SA_STAT_IN_PKTS_LATE",
47+
"SAI_MACSEC_SA_STAT_IN_PKTS_INVALID",
48+
"SAI_MACSEC_SA_STAT_IN_PKTS_NOT_VALID",
49+
"SAI_MACSEC_SA_STAT_IN_PKTS_NOT_USING_SA",
50+
"SAI_MACSEC_SA_STAT_IN_PKTS_UNUSED_SA",
51+
"SAI_MACSEC_SA_STAT_IN_PKTS_OK",
52+
};
53+
static const std::vector<std::string> macsec_sa_egress_stats =
54+
{
55+
"SAI_MACSEC_SA_STAT_OCTETS_ENCRYPTED",
56+
"SAI_MACSEC_SA_STAT_OCTETS_PROTECTED",
57+
"SAI_MACSEC_SA_STAT_OUT_PKTS_ENCRYPTED",
58+
"SAI_MACSEC_SA_STAT_OUT_PKTS_PROTECTED",
59+
};
60+
static const std::vector<std::string> macsec_flow_ingress_stats =
61+
{
62+
"SAI_MACSEC_FLOW_STAT_OTHER_ERR",
63+
"SAI_MACSEC_FLOW_STAT_OCTETS_UNCONTROLLED",
64+
"SAI_MACSEC_FLOW_STAT_OCTETS_CONTROLLED",
65+
"SAI_MACSEC_FLOW_STAT_UCAST_PKTS_UNCONTROLLED",
66+
"SAI_MACSEC_FLOW_STAT_UCAST_PKTS_CONTROLLED",
67+
"SAI_MACSEC_FLOW_STAT_MULTICAST_PKTS_UNCONTROLLED",
68+
"SAI_MACSEC_FLOW_STAT_MULTICAST_PKTS_CONTROLLED",
69+
"SAI_MACSEC_FLOW_STAT_BROADCAST_PKTS_UNCONTROLLED",
70+
"SAI_MACSEC_FLOW_STAT_BROADCAST_PKTS_CONTROLLED",
71+
"SAI_MACSEC_FLOW_STAT_CONTROL_PKTS",
72+
"SAI_MACSEC_FLOW_STAT_PKTS_UNTAGGED",
73+
"SAI_MACSEC_FLOW_STAT_IN_TAGGED_CONTROL_PKTS",
74+
"SAI_MACSEC_FLOW_STAT_IN_PKTS_NO_TAG",
75+
"SAI_MACSEC_FLOW_STAT_IN_PKTS_BAD_TAG",
76+
"SAI_MACSEC_FLOW_STAT_IN_PKTS_NO_SCI",
77+
"SAI_MACSEC_FLOW_STAT_IN_PKTS_UNKNOWN_SCI",
78+
"SAI_MACSEC_FLOW_STAT_IN_PKTS_OVERRUN",
79+
};
80+
static const std::vector<std::string> macsec_flow_egress_stats =
81+
{
82+
"SAI_MACSEC_FLOW_STAT_OTHER_ERR",
83+
"SAI_MACSEC_FLOW_STAT_OCTETS_UNCONTROLLED",
84+
"SAI_MACSEC_FLOW_STAT_OCTETS_CONTROLLED",
85+
"SAI_MACSEC_FLOW_STAT_OUT_OCTETS_COMMON",
86+
"SAI_MACSEC_FLOW_STAT_UCAST_PKTS_UNCONTROLLED",
87+
"SAI_MACSEC_FLOW_STAT_UCAST_PKTS_CONTROLLED",
88+
"SAI_MACSEC_FLOW_STAT_MULTICAST_PKTS_UNCONTROLLED",
89+
"SAI_MACSEC_FLOW_STAT_MULTICAST_PKTS_CONTROLLED",
90+
"SAI_MACSEC_FLOW_STAT_BROADCAST_PKTS_UNCONTROLLED",
91+
"SAI_MACSEC_FLOW_STAT_BROADCAST_PKTS_CONTROLLED",
92+
"SAI_MACSEC_FLOW_STAT_CONTROL_PKTS",
93+
"SAI_MACSEC_FLOW_STAT_PKTS_UNTAGGED",
94+
"SAI_MACSEC_FLOW_STAT_OUT_PKTS_TOO_LONG",
95+
};
3896

3997
template <typename T, typename... Args>
4098
static bool extract_variables(const std::string &input, char delimiter, T &output, Args &... args)
@@ -457,8 +515,16 @@ MACsecOrch::MACsecOrch(
457515
m_state_macsec_ingress_sa(state_db, STATE_MACSEC_INGRESS_SA_TABLE_NAME),
458516
m_counter_db("COUNTERS_DB", 0),
459517
m_macsec_counters_map(&m_counter_db, COUNTERS_MACSEC_NAME_MAP),
460-
m_macsec_flex_counter_manager(
461-
COUNTERS_MACSEC_ATTR_GROUP,
518+
m_macsec_sa_attr_manager(
519+
COUNTERS_MACSEC_SA_ATTR_GROUP,
520+
StatsMode::READ,
521+
MACSEC_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, true),
522+
m_macsec_sa_stat_manager(
523+
COUNTERS_MACSEC_SA_GROUP,
524+
StatsMode::READ,
525+
MACSEC_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, true),
526+
m_macsec_flow_stat_manager(
527+
COUNTERS_MACSEC_FLOW_GROUP,
462528
StatsMode::READ,
463529
MACSEC_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, true)
464530
{
@@ -1095,7 +1161,7 @@ bool MACsecOrch::updateMACsecPort(MACsecPort &macsec_port, const TaskArgs &port_
10951161
}
10961162
else
10971163
{
1098-
SWSS_LOG_WARN("Unknow Cipher Suite %s", cipher_suite.c_str());
1164+
SWSS_LOG_WARN("Unknown Cipher Suite %s", cipher_suite.c_str());
10991165
return false;
11001166
}
11011167
}
@@ -1743,11 +1809,11 @@ task_process_status MACsecOrch::createMACsecSA(
17431809
fvVector.emplace_back("state", "ok");
17441810
if (direction == SAI_MACSEC_DIRECTION_EGRESS)
17451811
{
1746-
m_state_macsec_egress_sa.set(swss::join('|', port_name, sci, an), fvVector);
1812+
installCounter(CounterType::MACSEC_SA, port_sci_an, sc->m_sa_ids[an], macsec_ m_state_macsec_egress_sa.set(swss::join('|', port_name, sci, an), fvVector);
17471813
}
17481814
else
17491815
{
1750-
m_state_macsec_ingress_sa.set(swss::join('|', port_name, sci, an), fvVector);
1816+
installCounter(CounterType::MACSEC_SA, port_sci_an, sc->m_sa_ids[an], macsec_ m_state_macsec_ingress_sa.set(swss::join('|', port_name, sci, an), fvVector);
17511817
}
17521818

17531819
SWSS_LOG_NOTICE("MACsec SA %s is created.", port_sci_an.c_str());
@@ -1781,7 +1847,8 @@ task_process_status MACsecOrch::deleteMACsecSA(
17811847

17821848
auto result = task_success;
17831849

1784-
uninstallCounter(port_sci_an, ctx.get_macsec_sc()->m_sa_ids[an]);
1850+
uninstallCounter(CounterType::MACSEC_SA_ATTR, port_sci_an, ctx.get_macsec_sc()->m_sa_ids[an]);
1851+
uninstallCounter(CounterType::MACSEC_SA, port_sci_an, ctx.get_macsec_sc()->m_sa_ids[an]);
17851852
if (!deleteMACsecSA(ctx.get_macsec_sc()->m_sa_ids[an]))
17861853
{
17871854
SWSS_LOG_WARN("Cannot delete the MACsec SA %s.", port_sci_an.c_str());
@@ -1922,12 +1989,51 @@ void MACsecOrch::installCounter(
19221989
{
19231990
counter_stats.emplace(stat);
19241991
}
1925-
m_macsec_flex_counter_manager.setCounterIdList(obj_id, counter_type, counter_stats);
1992+
switch(counter_type)
1993+
{
1994+
case CounterType::MACSEC_SA_ATTR:
1995+
m_macsec_sa_attr_manager.setCounterIdList(obj_id, counter_type, counter_stats);
1996+
break;
1997+
1998+
case CounterType::MACSEC_SA:
1999+
m_macsec_sa_stat_manager.setCounterIdList(obj_id, counter_type, counter_stats);
2000+
break;
2001+
2002+
case CounterType::MACSEC_FLOW:
2003+
m_macsec_flow_stat_manager.setCounterIdList(obj_id, counter_type, counter_stats);
2004+
break;
2005+
2006+
default:
2007+
SWSS_LOG_ERROR("Failed to install unknown counter type %u.\n",
2008+
static_cast<uint32_t>(counter_type));
2009+
break;
2010+
}
19262011
}
19272012

1928-
void MACsecOrch::uninstallCounter(const std::string &obj_name, sai_object_id_t obj_id)
2013+
void MACsecOrch::uninstallCounter(
2014+
CounterType counter_type,
2015+
const std::string &obj_name,
2016+
sai_object_id_t obj_id)
19292017
{
1930-
m_macsec_flex_counter_manager.clearCounterIdList(obj_id);
2018+
switch(counter_type)
2019+
{
2020+
case CounterType::MACSEC_SA_ATTR:
2021+
m_macsec_sa_attr_manager.clearCounterIdList(obj_id);
2022+
break;
2023+
2024+
case CounterType::MACSEC_SA:
2025+
m_macsec_sa_stat_manager.clearCounterIdList(obj_id);
2026+
break;
2027+
2028+
case CounterType::MACSEC_FLOW:
2029+
m_macsec_flow_stat_manager.clearCounterIdList(obj_id);
2030+
break;
2031+
2032+
default:
2033+
SWSS_LOG_ERROR("Failed to uninstall unknown counter type %u.\n",
2034+
static_cast<uint32_t>(counter_type));
2035+
break;
2036+
}
19312037

19322038
m_counter_db.hdel(COUNTERS_MACSEC_NAME_MAP, obj_name);
19332039
}

orchagent/macsecorch.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ class MACsecOrch : public Orch
6363

6464
DBConnector m_counter_db;
6565
Table m_macsec_counters_map;
66-
FlexCounterManager m_macsec_flex_counter_manager;
66+
FlexCounterManager m_macsec_sa_attr_manager;
67+
FlexCounterManager m_macsec_sa_stat_manager;
68+
FlexCounterManager m_macsec_flow_stat_manager;
6769

6870
struct MACsecACLTable
6971
{
@@ -195,7 +197,10 @@ class MACsecOrch : public Orch
195197
const std::string &obj_name,
196198
sai_object_id_t obj_id,
197199
const std::vector<std::string> &stats);
198-
void uninstallCounter(const std::string &obj_name, sai_object_id_t obj_id);
200+
void uninstallCounter(
201+
CounterType counter_type,
202+
const std::string &obj_name,
203+
sai_object_id_t obj_id);
199204

200205
/* MACsec ACL */
201206
bool initMACsecACLTable(

0 commit comments

Comments
 (0)