@@ -50,7 +50,8 @@ class DbTables(int, Enum):
50
50
class IfTypes (int , Enum ):
51
51
""" IANA ifTypes """
52
52
ethernetCsmacd = 6
53
- ieee8023adLag = 161
53
+ l3ipvlan = 136
54
+ ieee8023adLag = 161
54
55
55
56
class ArpUpdater (MIBUpdater ):
56
57
def __init__ (self ):
@@ -192,8 +193,13 @@ def __init__(self):
192
193
self .lag_name_if_name_map = {}
193
194
self .if_name_lag_name_map = {}
194
195
self .oid_lag_name_map = {}
196
+ self .lag_sai_map = {}
195
197
self .mgmt_oid_name_map = {}
196
198
self .mgmt_alias_map = {}
199
+ self .vlan_oid_name_map = {}
200
+ self .vlan_name_map = {}
201
+ self .rif_port_map = {}
202
+ self .port_rif_map = {}
197
203
198
204
# cache of interface counters
199
205
self .if_counters = {}
@@ -202,6 +208,8 @@ def __init__(self):
202
208
self .if_alias_map = {}
203
209
self .if_id_map = {}
204
210
self .oid_name_map = {}
211
+ self .rif_counters = {}
212
+
205
213
self .namespace_db_map = Namespace .get_namespace_db_map (self .db_conn )
206
214
207
215
def reinit_data (self ):
@@ -220,26 +228,56 @@ def reinit_data(self):
220
228
self .mgmt_oid_name_map , \
221
229
self .mgmt_alias_map = mibs .init_mgmt_interface_tables (self .db_conn [0 ])
222
230
231
+ self .vlan_name_map , \
232
+ self .vlan_oid_sai_map , \
233
+ self .vlan_oid_name_map = Namespace .get_sync_d_from_all_namespace (mibs .init_sync_d_vlan_tables , self .db_conn )
234
+
235
+ self .rif_port_map , \
236
+ self .port_rif_map = Namespace .get_sync_d_from_all_namespace (mibs .init_sync_d_rif_tables , self .db_conn )
237
+
223
238
def update_data (self ):
224
239
"""
225
240
Update redis (caches config)
226
241
Pulls the table references for each interface.
227
242
"""
228
- for sai_id_key in self . if_id_map :
229
- namespace , sai_id = mibs . split_sai_id_key ( sai_id_key )
230
- if_idx = mibs . get_index_from_str ( self .if_id_map [ sai_id_key ] )
231
- self . if_counters [ if_idx ] = self . namespace_db_map [ namespace ]. get_all ( mibs . COUNTERS_DB , \
232
- mibs . counter_table ( sai_id ), blocking = True )
243
+
244
+ self . update_if_counters ( )
245
+ self .update_rif_counters ( )
246
+
247
+ self . aggregate_counters ( )
233
248
234
249
self .lag_name_if_name_map , \
235
250
self .if_name_lag_name_map , \
236
- self .oid_lag_name_map , _ = Namespace .get_sync_d_from_all_namespace (mibs .init_sync_d_lag_tables , self .db_conn )
251
+ self .oid_lag_name_map , \
252
+ self .lag_sai_map = Namespace .get_sync_d_from_all_namespace (mibs .init_sync_d_lag_tables , self .db_conn )
237
253
238
254
self .if_range = sorted (list (self .oid_name_map .keys ()) +
239
255
list (self .oid_lag_name_map .keys ()) +
240
- list (self .mgmt_oid_name_map .keys ()))
256
+ list (self .mgmt_oid_name_map .keys ()) +
257
+ list (self .vlan_oid_name_map .keys ()))
241
258
self .if_range = [(i ,) for i in self .if_range ]
242
259
260
+ def update_if_counters (self ):
261
+ for sai_id_key in self .if_id_map :
262
+ namespace , sai_id = mibs .split_sai_id_key (sai_id_key )
263
+ if_idx = mibs .get_index_from_str (self .if_id_map [sai_id_key ])
264
+ counters_db_data = self .namespace_db_map [namespace ].get_all (mibs .COUNTERS_DB ,
265
+ mibs .counter_table (sai_id ),
266
+ blocking = True )
267
+ self .if_counters [if_idx ] = {
268
+ counter : int (value ) for counter , value in counters_db_data .items ()
269
+ }
270
+
271
+ def update_rif_counters (self ):
272
+ rif_sai_ids = list (self .rif_port_map ) + list (self .vlan_name_map )
273
+ for sai_id in rif_sai_ids :
274
+ counters_db_data = Namespace .dbs_get_all (self .db_conn , mibs .COUNTERS_DB ,
275
+ mibs .counter_table (mibs .split_sai_id_key (sai_id )[1 ]),
276
+ blocking = False )
277
+ self .rif_counters [sai_id ] = {
278
+ counter : int (value ) for counter , value in counters_db_data .items ()
279
+ }
280
+
243
281
def get_next (self , sub_id ):
244
282
"""
245
283
:param sub_id: The 1-based sub-identifier query.
@@ -281,6 +319,8 @@ def interface_description(self, sub_id):
281
319
return self .oid_lag_name_map [oid ]
282
320
elif oid in self .mgmt_oid_name_map :
283
321
return self .mgmt_alias_map [self .mgmt_oid_name_map [oid ]]
322
+ elif oid in self .vlan_oid_name_map :
323
+ return self .vlan_oid_name_map [oid ]
284
324
285
325
return self .if_alias_map [self .oid_name_map [oid ]]
286
326
@@ -296,13 +336,38 @@ def _get_counter(self, oid, table_name):
296
336
try :
297
337
counter_value = self .if_counters [oid ][_table_name ]
298
338
# truncate to 32-bit counter (database implements 64-bit counters)
299
- counter_value = int ( counter_value ) & 0x00000000ffffffff
339
+ counter_value = counter_value & 0x00000000ffffffff
300
340
# done!
301
341
return counter_value
302
342
except KeyError as e :
303
343
mibs .logger .warning ("SyncD 'COUNTERS_DB' missing attribute '{}'." .format (e ))
304
344
return None
305
345
346
+ def aggregate_counters (self ):
347
+ """
348
+ For ports with l3 router interfaces l3 drops may be counted separately (RIF counters)
349
+ add l3 drops to l2 drop counters cache according to mapping
350
+
351
+ For l3vlan map l3 counters to l2 counters
352
+ """
353
+ for rif_sai_id , port_sai_id in self .rif_port_map .items ():
354
+ if port_sai_id in self .if_id_map :
355
+ port_idx = mibs .get_index_from_str (self .if_id_map [port_sai_id ])
356
+ for port_counter_name , rif_counter_name in mibs .RIF_DROPS_AGGR_MAP .items ():
357
+ self .if_counters [port_idx ][port_counter_name ] = \
358
+ self .if_counters [port_idx ][port_counter_name ] + \
359
+ self .rif_counters [rif_sai_id ][rif_counter_name ]
360
+
361
+ for vlan_sai_id , vlan_name in self .vlan_name_map .items ():
362
+ for port_counter_name , rif_counter_name in mibs .RIF_COUNTERS_AGGR_MAP .items ():
363
+ vlan_idx = mibs .get_index_from_str (vlan_name )
364
+ vlan_rif_counters = self .rif_counters [vlan_sai_id ]
365
+ if rif_counter_name in vlan_rif_counters :
366
+ self .if_counters .setdefault (vlan_idx , {})
367
+ self .if_counters [vlan_idx ][port_counter_name ] = \
368
+ vlan_rif_counters [rif_counter_name ]
369
+
370
+
306
371
def get_counter (self , sub_id , table_name ):
307
372
"""
308
373
:param sub_id: The 1-based sub-identifier query.
@@ -322,7 +387,13 @@ def get_counter(self, sub_id, table_name):
322
387
counter_value = 0
323
388
for lag_member in self .lag_name_if_name_map [self .oid_lag_name_map [oid ]]:
324
389
counter_value += self ._get_counter (mibs .get_index_from_str (lag_member ), table_name )
325
-
390
+ sai_lag_id = self .lag_sai_map [self .oid_lag_name_map [oid ]]
391
+ sai_lag_rif_id = self .port_rif_map [sai_lag_id ]
392
+ if sai_lag_rif_id in self .rif_port_map :
393
+ table_name = getattr (table_name , 'name' , table_name )
394
+ if table_name in mibs .RIF_DROPS_AGGR_MAP :
395
+ rif_table_name = mibs .RIF_DROPS_AGGR_MAP [table_name ]
396
+ counter_value += self .rif_counters [sai_lag_rif_id ].get (rif_table_name , 0 )
326
397
# truncate to 32-bit counter
327
398
return counter_value & 0x00000000ffffffff
328
399
else :
@@ -352,6 +423,8 @@ def _get_if_entry(self, sub_id):
352
423
elif oid in self .mgmt_oid_name_map :
353
424
if_table = mibs .mgmt_if_entry_table (self .mgmt_oid_name_map [oid ])
354
425
db = mibs .CONFIG_DB
426
+ elif oid in self .vlan_oid_name_map :
427
+ if_table = mibs .vlan_entry_table (self .vlan_oid_name_map [oid ])
355
428
elif oid in self .oid_name_map :
356
429
if_table = mibs .if_entry_table (self .oid_name_map [oid ])
357
430
else :
@@ -456,6 +529,7 @@ def get_if_type(self, sub_id):
456
529
457
530
ethernetCsmacd(6), -- for all ethernet-like interfaces,
458
531
-- regardless of speed, as per RFC3635
532
+ l3ipvlan(136) -- Layer 3 Virtual LAN using IP
459
533
ieee8023adLag(161) -- IEEE 802.3ad Link Aggregate
460
534
"""
461
535
oid = self .get_oid (sub_id )
@@ -464,6 +538,8 @@ def get_if_type(self, sub_id):
464
538
465
539
if oid in self .oid_lag_name_map :
466
540
return IfTypes .ieee8023adLag
541
+ elif oid in self .vlan_oid_name_map :
542
+ return IfTypes .l3ipvlan
467
543
else :
468
544
return IfTypes .ethernetCsmacd
469
545
0 commit comments