5
5
#include " redisclient.h"
6
6
#include " sai_serialize.h"
7
7
8
- #define MC_WD_LOSSY_POLL_TIMEOUT_SEC (5 * 60 )
8
+ #define COUNTER_CHECK_POLL_TIMEOUT_SEC (5 * 60 )
9
9
10
10
extern sai_port_api_t *sai_port_api;
11
11
@@ -28,7 +28,7 @@ CounterCheckOrch::CounterCheckOrch(DBConnector *db, vector<string> &tableNames):
28
28
{
29
29
SWSS_LOG_ENTER ();
30
30
31
- auto interv = timespec { .tv_sec = MC_WD_LOSSY_POLL_TIMEOUT_SEC , .tv_nsec = 0 };
31
+ auto interv = timespec { .tv_sec = COUNTER_CHECK_POLL_TIMEOUT_SEC , .tv_nsec = 0 };
32
32
auto timer = new SelectableTimer (interv);
33
33
auto executor = new ExecutableTimer (timer, this );
34
34
Orch::addExecutor (" MC_COUNTERS_POLL" , executor);
@@ -40,54 +40,78 @@ CounterCheckOrch::~CounterCheckOrch(void)
40
40
SWSS_LOG_ENTER ();
41
41
}
42
42
43
- QueueMcCounters CounterCheckOrch::getQueueMcCounters (
44
- const Port& port)
43
+ void CounterCheckOrch::doTask (SelectableTimer &timer)
45
44
{
46
45
SWSS_LOG_ENTER ();
47
46
48
- vector<FieldValueTuple> fieldValues ;
49
- QueueMcCounters counters ;
50
- RedisClient redisClient (m_countersDb. get ());
47
+ mcCounterCheck () ;
48
+ pfcFrameCounterCheck () ;
49
+ }
51
50
52
- for (uint8_t prio = 0 ; prio < port.m_queue_ids .size (); prio++)
51
+ void CounterCheckOrch::mcCounterCheck ()
52
+ {
53
+ SWSS_LOG_ENTER ();
54
+
55
+ sai_attribute_t attr;
56
+ attr.id = SAI_PORT_ATTR_PRIORITY_FLOW_CONTROL;
57
+
58
+ for (auto & i : m_mcCountersMap)
53
59
{
54
- sai_object_id_t queueId = port.m_queue_ids [prio];
55
- auto queueIdStr = sai_serialize_object_id (queueId);
56
- auto queueType = redisClient.hget (COUNTERS_QUEUE_TYPE_MAP, queueIdStr);
60
+ auto oid = i.first ;
61
+ auto mcCounters = i.second ;
57
62
58
- if (queueType.get () == nullptr || *queueType != " SAI_QUEUE_TYPE_MULTICAST" || !m_countersTable->get (queueIdStr, fieldValues))
63
+ Port port;
64
+ if (!gPortsOrch ->getPort (oid, port))
59
65
{
66
+ SWSS_LOG_ERROR (" Invalid port oid 0x%lx" , oid);
60
67
continue ;
61
68
}
62
69
63
- uint64_t pkts = numeric_limits<uint64_t >::max ();
64
- for (const auto & fv : fieldValues)
70
+ auto newMcCounters = getQueueMcCounters (port);
71
+
72
+ sai_status_t status = sai_port_api->get_port_attribute (port.m_port_id , 1 , &attr);
73
+ if (status != SAI_STATUS_SUCCESS)
65
74
{
66
- const auto field = fvField (fv);
67
- const auto value = fvValue (fv);
75
+ SWSS_LOG_ERROR (" Failed to get PFC mask on port %s: %d" , port.m_alias .c_str (), status);
76
+ continue ;
77
+ }
68
78
69
- if (field == " SAI_QUEUE_STAT_PACKETS" )
79
+ uint8_t pfcMask = attr.value .u8 ;
80
+
81
+ for (size_t prio = 0 ; prio != mcCounters.size (); prio++)
82
+ {
83
+ bool isLossy = ((1 << prio) & pfcMask) == 0 ;
84
+ if (newMcCounters[prio] == numeric_limits<uint64_t >::max ())
70
85
{
71
- pkts = stoul (value);
86
+ SWSS_LOG_WARN (" Could not retreive MC counters on queue %lu port %s" ,
87
+ prio,
88
+ port.m_alias .c_str ());
89
+ }
90
+ else if (!isLossy && mcCounters[prio] < newMcCounters[prio])
91
+ {
92
+ SWSS_LOG_WARN (" Got Multicast %lu frame(s) on lossless queue %lu port %s" ,
93
+ newMcCounters[prio] - mcCounters[prio],
94
+ prio,
95
+ port.m_alias .c_str ());
72
96
}
73
97
}
74
- counters.push_back (pkts);
75
- }
76
98
77
- return move (counters);
99
+ i.second = newMcCounters;
100
+ }
78
101
}
79
102
80
- void CounterCheckOrch::doTask (SelectableTimer &timer )
103
+ void CounterCheckOrch::pfcFrameCounterCheck ( )
81
104
{
82
105
SWSS_LOG_ENTER ();
83
106
84
107
sai_attribute_t attr;
85
108
attr.id = SAI_PORT_ATTR_PRIORITY_FLOW_CONTROL;
86
109
87
- for (auto & i : m_CountersMap )
110
+ for (auto & i : m_pfcFrameCountersMap )
88
111
{
89
112
auto oid = i.first ;
90
- auto mcCounters = i.second ;
113
+ auto counters = i.second ;
114
+ auto newCounters = getPfcFrameCounters (oid);
91
115
92
116
Port port;
93
117
if (!gPortsOrch ->getPort (oid, port))
@@ -96,8 +120,6 @@ void CounterCheckOrch::doTask(SelectableTimer &timer)
96
120
continue ;
97
121
}
98
122
99
- auto newMcCounters = getQueueMcCounters (port);
100
-
101
123
sai_status_t status = sai_port_api->get_port_attribute (port.m_port_id , 1 , &attr);
102
124
if (status != SAI_STATUS_SUCCESS)
103
125
{
@@ -107,34 +129,118 @@ void CounterCheckOrch::doTask(SelectableTimer &timer)
107
129
108
130
uint8_t pfcMask = attr.value .u8 ;
109
131
110
- for (size_t prio = 0 ; prio != mcCounters .size (); prio++)
132
+ for (size_t prio = 0 ; prio != counters .size (); prio++)
111
133
{
112
134
bool isLossy = ((1 << prio) & pfcMask) == 0 ;
113
- if (newMcCounters [prio] == numeric_limits<uint64_t >::max ())
135
+ if (newCounters [prio] == numeric_limits<uint64_t >::max ())
114
136
{
115
- SWSS_LOG_WARN (" Could not retreive MC counters on queue %lu port %s" ,
137
+ SWSS_LOG_WARN (" Could not retreive PFC frame count on queue %lu port %s" ,
116
138
prio,
117
139
port.m_alias .c_str ());
118
140
}
119
- else if (! isLossy && mcCounters [prio] < newMcCounters [prio])
141
+ else if (isLossy && counters [prio] < newCounters [prio])
120
142
{
121
- SWSS_LOG_WARN (" Got Multicast %lu frame(s) on lossless queue %lu port %s" ,
122
- newMcCounters [prio] - mcCounters [prio],
143
+ SWSS_LOG_WARN (" Got PFC %lu frame(s) on lossy queue %lu port %s" ,
144
+ newCounters [prio] - counters [prio],
123
145
prio,
124
146
port.m_alias .c_str ());
125
147
}
126
148
}
127
149
128
- i.second = newMcCounters;
150
+ i.second = newCounters;
151
+ }
152
+ }
153
+
154
+
155
+ PfcFrameCounters CounterCheckOrch::getPfcFrameCounters (sai_object_id_t portId)
156
+ {
157
+ SWSS_LOG_ENTER ();
158
+
159
+ vector<FieldValueTuple> fieldValues;
160
+ PfcFrameCounters counters;
161
+ counters.fill (numeric_limits<uint64_t >::max ());
162
+
163
+ static const array<string, PFC_WD_TC_MAX> counterNames =
164
+ {
165
+ " SAI_PORT_STAT_PFC_0_RX_PKTS" ,
166
+ " SAI_PORT_STAT_PFC_1_RX_PKTS" ,
167
+ " SAI_PORT_STAT_PFC_2_RX_PKTS" ,
168
+ " SAI_PORT_STAT_PFC_3_RX_PKTS" ,
169
+ " SAI_PORT_STAT_PFC_4_RX_PKTS" ,
170
+ " SAI_PORT_STAT_PFC_5_RX_PKTS" ,
171
+ " SAI_PORT_STAT_PFC_6_RX_PKTS" ,
172
+ " SAI_PORT_STAT_PFC_7_RX_PKTS"
173
+ };
174
+
175
+ if (!m_countersTable->get (sai_serialize_object_id (portId), fieldValues))
176
+ {
177
+ return move (counters);
178
+ }
179
+
180
+ for (const auto & fv : fieldValues)
181
+ {
182
+ const auto field = fvField (fv);
183
+ const auto value = fvValue (fv);
184
+
185
+
186
+ for (size_t prio = 0 ; prio != counterNames.size (); prio++)
187
+ {
188
+ if (field == counterNames[prio])
189
+ {
190
+ counters[prio] = stoul (value);
191
+ }
192
+ }
193
+ }
194
+
195
+ return move (counters);
196
+ }
197
+
198
+ QueueMcCounters CounterCheckOrch::getQueueMcCounters (
199
+ const Port& port)
200
+ {
201
+ SWSS_LOG_ENTER ();
202
+
203
+ vector<FieldValueTuple> fieldValues;
204
+ QueueMcCounters counters;
205
+ RedisClient redisClient (m_countersDb.get ());
206
+
207
+ for (uint8_t prio = 0 ; prio < port.m_queue_ids .size (); prio++)
208
+ {
209
+ sai_object_id_t queueId = port.m_queue_ids [prio];
210
+ auto queueIdStr = sai_serialize_object_id (queueId);
211
+ auto queueType = redisClient.hget (COUNTERS_QUEUE_TYPE_MAP, queueIdStr);
212
+
213
+ if (queueType.get () == nullptr || *queueType != " SAI_QUEUE_TYPE_MULTICAST" || !m_countersTable->get (queueIdStr, fieldValues))
214
+ {
215
+ continue ;
216
+ }
217
+
218
+ uint64_t pkts = numeric_limits<uint64_t >::max ();
219
+ for (const auto & fv : fieldValues)
220
+ {
221
+ const auto field = fvField (fv);
222
+ const auto value = fvValue (fv);
223
+
224
+ if (field == " SAI_QUEUE_STAT_PACKETS" )
225
+ {
226
+ pkts = stoul (value);
227
+ }
228
+ }
229
+ counters.push_back (pkts);
129
230
}
231
+
232
+ return move (counters);
130
233
}
131
234
235
+
132
236
void CounterCheckOrch::addPort (const Port& port)
133
237
{
134
- m_CountersMap.emplace (port.m_port_id , getQueueMcCounters (port));
238
+ m_mcCountersMap.emplace (port.m_port_id , getQueueMcCounters (port));
239
+ m_pfcFrameCountersMap.emplace (port.m_port_id , getPfcFrameCounters (port.m_port_id ));
135
240
}
136
241
137
242
void CounterCheckOrch::removePort (const Port& port)
138
243
{
139
- m_CountersMap.erase (port.m_port_id );
244
+ m_mcCountersMap.erase (port.m_port_id );
245
+ m_pfcFrameCountersMap.erase (port.m_port_id );
140
246
}
0 commit comments