Skip to content

Commit ffe9750

Browse files
committed
Support for MACsec statistics
1 parent 9f30ca1 commit ffe9750

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
{ CounterType::TUNNEL, TUNNEL_COUNTER_ID_LIST },
4345
};
4446

orchagent/flex_counter/flex_counter_manager.h

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ enum class CounterType
2626
PORT_DEBUG,
2727
SWITCH_DEBUG,
2828
MACSEC_SA_ATTR,
29+
MACSEC_SA,
30+
MACSEC_FLOW,
2931
TUNNEL,
3032
};
3133

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)
@@ -479,8 +537,16 @@ MACsecOrch::MACsecOrch(
479537
m_state_macsec_ingress_sa(state_db, STATE_MACSEC_INGRESS_SA_TABLE_NAME),
480538
m_counter_db("COUNTERS_DB", 0),
481539
m_macsec_counters_map(&m_counter_db, COUNTERS_MACSEC_NAME_MAP),
482-
m_macsec_flex_counter_manager(
483-
COUNTERS_MACSEC_ATTR_GROUP,
540+
m_macsec_sa_attr_manager(
541+
COUNTERS_MACSEC_SA_ATTR_GROUP,
542+
StatsMode::READ,
543+
MACSEC_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, true),
544+
m_macsec_sa_stat_manager(
545+
COUNTERS_MACSEC_SA_GROUP,
546+
StatsMode::READ,
547+
MACSEC_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, true),
548+
m_macsec_flow_stat_manager(
549+
COUNTERS_MACSEC_FLOW_GROUP,
484550
StatsMode::READ,
485551
MACSEC_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, true)
486552
{
@@ -1139,7 +1205,7 @@ bool MACsecOrch::updateMACsecPort(MACsecPort &macsec_port, const TaskArgs &port_
11391205
}
11401206
else
11411207
{
1142-
SWSS_LOG_WARN("Unknow Cipher Suite %s", cipher_suite.c_str());
1208+
SWSS_LOG_WARN("Unknown Cipher Suite %s", cipher_suite.c_str());
11431209
return false;
11441210
}
11451211
}
@@ -1798,11 +1864,11 @@ task_process_status MACsecOrch::createMACsecSA(
17981864
fvVector.emplace_back("state", "ok");
17991865
if (direction == SAI_MACSEC_DIRECTION_EGRESS)
18001866
{
1801-
m_state_macsec_egress_sa.set(swss::join('|', port_name, sci, an), fvVector);
1867+
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);
18021868
}
18031869
else
18041870
{
1805-
m_state_macsec_ingress_sa.set(swss::join('|', port_name, sci, an), fvVector);
1871+
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);
18061872
}
18071873

18081874
SWSS_LOG_NOTICE("MACsec SA %s is created.", port_sci_an.c_str());
@@ -1836,7 +1902,8 @@ task_process_status MACsecOrch::deleteMACsecSA(
18361902

18371903
auto result = task_success;
18381904

1839-
uninstallCounter(port_sci_an, ctx.get_macsec_sc()->m_sa_ids[an]);
1905+
uninstallCounter(CounterType::MACSEC_SA_ATTR, port_sci_an, ctx.get_macsec_sc()->m_sa_ids[an]);
1906+
uninstallCounter(CounterType::MACSEC_SA, port_sci_an, ctx.get_macsec_sc()->m_sa_ids[an]);
18401907
if (!deleteMACsecSA(ctx.get_macsec_sc()->m_sa_ids[an]))
18411908
{
18421909
SWSS_LOG_WARN("Cannot delete the MACsec SA %s.", port_sci_an.c_str());
@@ -1977,12 +2044,51 @@ void MACsecOrch::installCounter(
19772044
{
19782045
counter_stats.emplace(stat);
19792046
}
1980-
m_macsec_flex_counter_manager.setCounterIdList(obj_id, counter_type, counter_stats);
2047+
switch(counter_type)
2048+
{
2049+
case CounterType::MACSEC_SA_ATTR:
2050+
m_macsec_sa_attr_manager.setCounterIdList(obj_id, counter_type, counter_stats);
2051+
break;
2052+
2053+
case CounterType::MACSEC_SA:
2054+
m_macsec_sa_stat_manager.setCounterIdList(obj_id, counter_type, counter_stats);
2055+
break;
2056+
2057+
case CounterType::MACSEC_FLOW:
2058+
m_macsec_flow_stat_manager.setCounterIdList(obj_id, counter_type, counter_stats);
2059+
break;
2060+
2061+
default:
2062+
SWSS_LOG_ERROR("Failed to install unknown counter type %u.\n",
2063+
static_cast<uint32_t>(counter_type));
2064+
break;
2065+
}
19812066
}
19822067

1983-
void MACsecOrch::uninstallCounter(const std::string &obj_name, sai_object_id_t obj_id)
2068+
void MACsecOrch::uninstallCounter(
2069+
CounterType counter_type,
2070+
const std::string &obj_name,
2071+
sai_object_id_t obj_id)
19842072
{
1985-
m_macsec_flex_counter_manager.clearCounterIdList(obj_id);
2073+
switch(counter_type)
2074+
{
2075+
case CounterType::MACSEC_SA_ATTR:
2076+
m_macsec_sa_attr_manager.clearCounterIdList(obj_id);
2077+
break;
2078+
2079+
case CounterType::MACSEC_SA:
2080+
m_macsec_sa_stat_manager.clearCounterIdList(obj_id);
2081+
break;
2082+
2083+
case CounterType::MACSEC_FLOW:
2084+
m_macsec_flow_stat_manager.clearCounterIdList(obj_id);
2085+
break;
2086+
2087+
default:
2088+
SWSS_LOG_ERROR("Failed to uninstall unknown counter type %u.\n",
2089+
static_cast<uint32_t>(counter_type));
2090+
break;
2091+
}
19862092

19872093
m_counter_db.hdel(COUNTERS_MACSEC_NAME_MAP, obj_name);
19882094
}

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
{
@@ -200,7 +202,10 @@ class MACsecOrch : public Orch
200202
const std::string &obj_name,
201203
sai_object_id_t obj_id,
202204
const std::vector<std::string> &stats);
203-
void uninstallCounter(const std::string &obj_name, sai_object_id_t obj_id);
205+
void uninstallCounter(
206+
CounterType counter_type,
207+
const std::string &obj_name,
208+
sai_object_id_t obj_id);
204209

205210
/* MACsec ACL */
206211
bool initMACsecACLTable(

0 commit comments

Comments
 (0)