forked from sonic-net/sonic-sairedis
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSwitchStateBase.h
More file actions
639 lines (452 loc) · 22.5 KB
/
SwitchStateBase.h
File metadata and controls
639 lines (452 loc) · 22.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
#pragma once
#include "SwitchState.h"
#include "FdbInfo.h"
#include "HostInterfaceInfo.h"
#include "WarmBootState.h"
#include "SwitchConfig.h"
#include "RealObjectIdManager.h"
#include "EventPayloadNetLinkMsg.h"
#include "MACsecManager.h"
#include <set>
#include <unordered_set>
#include <vector>
#define SAI_VS_FDB_INFO "SAI_VS_FDB_INFO"
#define DEFAULT_VLAN_NUMBER 1
#define MAX_OBJLIST_LEN 128
#define CHECK_STATUS(status) { \
sai_status_t _status = (status); \
if (_status != SAI_STATUS_SUCCESS) { return _status; } }
namespace saivs
{
class SwitchStateBase:
public SwitchState
{
public:
typedef std::map<sai_object_id_t, std::shared_ptr<SwitchStateBase>> SwitchStateMap;
public:
SwitchStateBase(
_In_ sai_object_id_t switch_id,
_In_ std::shared_ptr<RealObjectIdManager> manager,
_In_ std::shared_ptr<SwitchConfig> config);
SwitchStateBase(
_In_ sai_object_id_t switch_id,
_In_ std::shared_ptr<RealObjectIdManager> manager,
_In_ std::shared_ptr<SwitchConfig> config,
std::shared_ptr<WarmBootState> warmBootState);
virtual ~SwitchStateBase();
protected:
virtual sai_status_t set_switch_mac_address();
virtual sai_status_t set_switch_supported_object_types();
virtual sai_status_t set_switch_default_attributes();
virtual sai_status_t create_default_vlan();
virtual sai_status_t create_cpu_port();
virtual sai_status_t create_default_1q_bridge();
virtual sai_status_t create_ports();
virtual sai_status_t set_port_list();
virtual sai_status_t create_fabric_ports();
virtual sai_status_t set_fabric_port_list();
virtual sai_status_t create_default_virtual_router();
virtual sai_status_t create_default_stp_instance();
virtual sai_status_t create_default_trap_group();
virtual sai_status_t create_ingress_priority_groups_per_port(
_In_ sai_object_id_t port_id);
virtual sai_status_t create_ingress_priority_groups();
virtual sai_status_t create_vlan_members();
virtual sai_status_t create_bridge_ports();
virtual sai_status_t set_acl_entry_min_prio();
virtual sai_status_t set_acl_capabilities();
virtual sai_status_t set_maximum_number_of_childs_per_scheduler_group();
virtual sai_status_t set_number_of_ecmp_groups();
virtual sai_status_t set_static_crm_values();
virtual sai_status_t set_static_acl_resource_list(
_In_ sai_switch_attr_t acl_resource,
_In_ int max_count);
sai_status_t create_system_ports(
_In_ int32_t voq_switch_id,
_In_ uint32_t sys_port_count,
_In_ const sai_system_port_config_t *sys_port_cfg_list);
sai_status_t set_system_port_list();
public:
virtual sai_status_t initialize_default_objects(
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
virtual sai_status_t create_port_dependencies(
_In_ sai_object_id_t port_id);
sai_status_t initialize_voq_switch_objects(
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
protected : // refresh
virtual sai_status_t refresh_ingress_priority_group(
_In_ const sai_attr_metadata_t *meta,
_In_ sai_object_id_t port_id);
virtual sai_status_t refresh_qos_queues(
_In_ const sai_attr_metadata_t *meta,
_In_ sai_object_id_t port_id);
virtual sai_status_t refresh_scheduler_groups(
_In_ const sai_attr_metadata_t *meta,
_In_ sai_object_id_t port_id);
virtual sai_status_t refresh_bridge_port_list(
_In_ const sai_attr_metadata_t *meta,
_In_ sai_object_id_t bridge_id);
virtual sai_status_t refresh_vlan_member_list(
_In_ const sai_attr_metadata_t *meta,
_In_ sai_object_id_t vlan_id);
virtual sai_status_t refresh_port_list(
_In_ const sai_attr_metadata_t *meta);
virtual sai_status_t refresh_system_port_list(
_In_ const sai_attr_metadata_t *meta);
virtual sai_status_t refresh_macsec_sci_in_ingress_macsec_acl(
_In_ sai_object_id_t object_id);
virtual sai_status_t refresh_queue_pause_status(
_In_ sai_object_id_t object_id);
virtual sai_status_t refresh_macsec_sa_stat(
_In_ sai_object_id_t object_id);
public:
virtual sai_status_t warm_boot_initialize_objects();
virtual sai_status_t refresh_read_only(
_In_ const sai_attr_metadata_t *meta,
_In_ sai_object_id_t object_id);
protected:
virtual sai_status_t warm_update_queues();
virtual sai_status_t warm_update_scheduler_groups();
virtual sai_status_t warm_update_ingress_priority_groups();
virtual sai_status_t warm_update_switch();
virtual sai_status_t warm_update_cpu_queues();
protected: // TODO should be pure
virtual sai_status_t create_cpu_qos_queues(
_In_ sai_object_id_t port_id);
virtual sai_status_t create_qos_queues_per_port(
_In_ sai_object_id_t port_id);
virtual sai_status_t create_qos_queues();
virtual sai_status_t create_scheduler_group_tree(
_In_ const std::vector<sai_object_id_t>& sgs,
_In_ sai_object_id_t port_id);
virtual sai_status_t create_scheduler_groups_per_port(
_In_ sai_object_id_t port_id);
virtual sai_status_t create_scheduler_groups();
protected: // will generate new OID
virtual sai_status_t create(
_In_ sai_object_type_t object_type,
_Out_ sai_object_id_t *object_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
virtual sai_status_t remove(
_In_ sai_object_type_t object_type,
_In_ sai_object_id_t object_id);
virtual sai_status_t set(
_In_ sai_object_type_t objectType,
_In_ sai_object_id_t objectId,
_In_ const sai_attribute_t* attr);
virtual sai_status_t get(
_In_ sai_object_type_t object_type,
_In_ sai_object_id_t object_id,
_In_ uint32_t attr_count,
_Out_ sai_attribute_t *attr_list);
public:
virtual sai_status_t create(
_In_ sai_object_type_t object_type,
_In_ const std::string &serializedObjectId,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
virtual sai_status_t remove(
_In_ sai_object_type_t object_type,
_In_ const std::string &serializedObjectId);
virtual sai_status_t set(
_In_ sai_object_type_t objectType,
_In_ const std::string &serializedObjectId,
_In_ const sai_attribute_t* attr);
virtual sai_status_t get(
_In_ sai_object_type_t object_type,
_In_ const std::string &serializedObjectId,
_In_ uint32_t attr_count,
_Out_ sai_attribute_t *attr_list);
virtual sai_status_t bulkCreate(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ const std::vector<std::string> &serialized_object_ids,
_In_ const uint32_t *attr_count,
_In_ const sai_attribute_t **attr_list,
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_status_t *object_statuses);
virtual sai_status_t bulkRemove(
_In_ sai_object_type_t object_type,
_In_ const std::vector<std::string> &serialized_object_ids,
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_status_t *object_statuses);
virtual sai_status_t bulkSet(
_In_ sai_object_type_t object_type,
_In_ const std::vector<std::string> &serialized_object_ids,
_In_ const sai_attribute_t *attr_list,
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_status_t *object_statuses);
protected:
virtual sai_status_t remove_internal(
_In_ sai_object_type_t object_type,
_In_ const std::string &serializedObjectId);
virtual sai_status_t create_internal(
_In_ sai_object_type_t object_type,
_In_ const std::string &serializedObjectId,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
virtual sai_status_t set_internal(
_In_ sai_object_type_t objectType,
_In_ const std::string &serializedObjectId,
_In_ const sai_attribute_t* attr);
private:
sai_object_type_t objectTypeQuery(
_In_ sai_object_id_t objectId);
sai_object_id_t switchIdQuery(
_In_ sai_object_id_t objectId);
public:
void processFdbEntriesForAging();
private: // fdb related
void updateLocalDB(
_In_ const sai_fdb_event_notification_data_t &data,
_In_ sai_fdb_event_t fdb_event);
void processFdbInfo(
_In_ const FdbInfo &fi,
_In_ sai_fdb_event_t fdb_event);
void findBridgeVlanForPortVlan(
_In_ sai_object_id_t port_id,
_In_ sai_vlan_id_t vlan_id,
_Inout_ sai_object_id_t &bv_id,
_Inout_ sai_object_id_t &bridge_port_id);
bool getLagFromPort(
_In_ sai_object_id_t port_id,
_Inout_ sai_object_id_t& lag_id);
bool isLagOrPortRifBased(
_In_ sai_object_id_t lag_or_port_id);
public:
void process_packet_for_fdb_event(
_In_ sai_object_id_t portId,
_In_ const std::string& name,
_In_ const uint8_t *buffer,
_In_ size_t size);
void debugSetStats(
_In_ sai_object_id_t oid,
_In_ const std::map<sai_stat_id_t, uint64_t>& stats);
protected: // custom port
sai_status_t createPort(
_In_ sai_object_id_t object_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
sai_status_t removePort(
_In_ sai_object_id_t objectId);
sai_status_t setPort(
_In_ sai_object_id_t objectId,
_In_ const sai_attribute_t* attr);
bool isPortReadyToBeRemove(
_In_ sai_object_id_t portId);
std::vector<sai_object_id_t> getPortDependencies(
_In_ sai_object_id_t portId);
sai_status_t check_port_dependencies(
_In_ sai_object_id_t port_id,
_Out_ std::vector<sai_object_id_t>& dep);
bool check_port_reference_count(
_In_ sai_object_id_t port_id);
bool get_object_list(
_In_ sai_object_id_t object_id,
_In_ sai_attr_id_t attr_id,
_Out_ std::vector<sai_object_id_t>& objlist);
bool get_port_queues(
_In_ sai_object_id_t port_id,
_Out_ std::vector<sai_object_id_t>& queues);
bool get_port_ipgs(
_In_ sai_object_id_t port_id,
_Out_ std::vector<sai_object_id_t>& ipgs);
bool get_port_sg(
_In_ sai_object_id_t port_id,
_Out_ std::vector<sai_object_id_t>& sg);
bool check_object_default_state(
_In_ sai_object_id_t object_id);
bool check_object_list_default_state(
_Out_ const std::vector<sai_object_id_t>& objlist);
sai_status_t createVoqSystemNeighborEntry(
_In_ const std::string &serializedObjectId,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
protected: // custom debug counter
uint32_t getNewDebugCounterIndex();
void releaseDebugCounterIndex(
_In_ uint32_t index);
sai_status_t createDebugCounter(
_In_ sai_object_id_t object_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
sai_status_t removeDebugCounter(
_In_ sai_object_id_t objectId);
public:
static int promisc(
_In_ const char *dev);
protected: // custom hostif
sai_status_t createHostif(
_In_ sai_object_id_t object_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
sai_status_t removeHostif(
_In_ sai_object_id_t objectId);
sai_status_t vs_remove_hostif_tap_interface(
_In_ sai_object_id_t hostif_id);
sai_status_t vs_create_hostif_tap_interface(
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
bool hostif_create_tap_veth_forwarding(
_In_ const std::string &tapname,
_In_ int tapfd,
_In_ sai_object_id_t port_id);
static int vs_create_tap_device(
_In_ const char *dev,
_In_ int flags);
static int vs_set_dev_mac_address(
_In_ const char *dev,
_In_ const sai_mac_t& mac);
static int get_default_gw_mac_address(
_Out_ sai_mac_t& mac);
int vs_set_dev_mtu(
_In_ const char*name,
_In_ int mtu);
int ifup(
_In_ const char *dev,
_In_ sai_object_id_t port_id,
_In_ bool up,
_In_ bool explicitNotification);
std::string vs_get_veth_name(
_In_ const std::string& tapname,
_In_ sai_object_id_t port_id);
void send_port_oper_status_notification(
_In_ sai_object_id_t port_id,
_In_ sai_port_oper_status_t status,
_In_ bool force);
bool hasIfIndex(
_In_ int ifIndex) const;
public: // TODO move inside warm boot load state
sai_status_t vs_recreate_hostif_tap_interfaces();
void update_port_oper_status(
_In_ sai_object_id_t port_id,
_In_ sai_port_oper_status_t port_oper_status);
std::string dump_switch_database_for_warm_restart() const;
void syncOnLinkMsg(
_In_ std::shared_ptr<EventPayloadNetLinkMsg> payload);
void send_fdb_event_notification(
_In_ const sai_fdb_event_notification_data_t& data);
protected:
void findObjects(
_In_ sai_object_type_t object_type,
_In_ const sai_attribute_t &expect,
_Out_ std::vector<sai_object_id_t> &objects);
bool dumpObject(
_In_ const sai_object_id_t object_id,
_Out_ std::vector<sai_attribute_t> &attrs);
protected:
sai_status_t setAclEntry(
_In_ sai_object_id_t entry_id,
_In_ const sai_attribute_t* attr);
sai_status_t setAclEntryMACsecFlowActive(
_In_ sai_object_id_t entry_id,
_In_ const sai_attribute_t* attr);
sai_status_t createMACsecPort(
_In_ sai_object_id_t macsec_sa_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
sai_status_t createMACsecSA(
_In_ sai_object_id_t macsec_sa_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
sai_status_t createMACsecSC(
_In_ sai_object_id_t macsec_sa_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
sai_status_t removeMACsecPort(
_In_ sai_object_id_t macsec_port_id);
sai_status_t removeMACsecSC(
_In_ sai_object_id_t macsec_sc_id);
sai_status_t removeMACsecSA(
_In_ sai_object_id_t macsec_sa_id);
sai_status_t getACLTable(
_In_ sai_object_id_t entry_id,
_Out_ sai_object_id_t &table_id);
sai_status_t findPortByMACsecFlow(
_In_ sai_object_id_t macsec_flow_id,
_Out_ sai_object_id_t &line_port_id);
std::shared_ptr<HostInterfaceInfo> findHostInterfaceInfoByPort(
_In_ sai_object_id_t line_port_id);
sai_status_t loadMACsecAttrFromMACsecPort(
_In_ sai_object_id_t object_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list,
_Out_ MACsecAttr &macsec_attr);
sai_status_t loadMACsecAttrFromMACsecSC(
_In_ sai_object_id_t object_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list,
_Out_ MACsecAttr &macsec_attr);
sai_status_t loadMACsecAttrFromMACsecSA(
_In_ sai_object_id_t object_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list,
_Out_ MACsecAttr &macsec_attr);
sai_status_t loadMACsecAttr(
_In_ sai_object_type_t object_type,
_In_ sai_object_id_t object_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list,
_Out_ MACsecAttr &macsec_attr);
sai_status_t loadMACsecAttr(
_In_ sai_object_type_t object_type,
_In_ sai_object_id_t object_id,
_Out_ MACsecAttr &macsec_attr);
sai_status_t loadMACsecAttrsFromACLEntry(
_In_ sai_object_id_t entry_id,
_In_ const sai_attribute_t* entry_attr,
_In_ sai_object_type_t object_type,
_Out_ std::vector<MACsecAttr> &macsec_attrs);
sai_status_t getMACsecSAPacketNumber(
_In_ sai_object_id_t macsec_sa_id,
_Out_ sai_attribute_t &attr);
MACsecManager m_macsecManager;
protected:
constexpr static const int maxDebugCounters = 32;
std::unordered_set<uint32_t> m_indices;
protected:
std::vector<sai_object_id_t> m_port_list;
std::vector<sai_object_id_t> m_bridge_port_list_port_based;
std::vector<sai_object_id_t> m_fabric_port_list;
std::vector<sai_acl_action_type_t> m_ingress_acl_action_list;
std::vector<sai_acl_action_type_t> m_egress_acl_action_list;
sai_object_id_t m_cpu_port_id;
sai_object_id_t m_default_1q_bridge;
sai_object_id_t m_default_bridge_port_1q_router;
sai_object_id_t m_default_vlan_id;
std::vector<sai_object_id_t> m_system_port_list;
protected:
constexpr static const int m_maxIPv4RouteEntries = 100000;
constexpr static const int m_maxIPv6RouteEntries = 10000;
constexpr static const int m_maxIPv4NextHopEntries = 32000;
constexpr static const int m_maxIPv6NextHopEntries = 32000;
constexpr static const int m_maxIPv4NeighborEntries = 4000;
constexpr static const int m_maxIPv6NeighborEntries = 2000;
constexpr static const int m_maxNextHopGroupMemberEntries = 16000;
constexpr static const int m_maxNextHopGroupEntries = 400;
constexpr static const int m_maxFdbEntries = 800;
constexpr static const int m_maxSNATEntries = 100;
constexpr static const int m_maxDNATEntries = 100;
constexpr static const int m_maxIPMCEntries = 100;
constexpr static const int m_maxDoubleNATEntries = 50; /* Half of single NAT entry */
constexpr static const int m_maxAclTables = 3;
constexpr static const int m_maxAclTableGroups = 200;
public: // TODO private
std::set<FdbInfo> m_fdb_info_set;
std::map<std::string, std::shared_ptr<HostInterfaceInfo>> m_hostif_info_map;
std::shared_ptr<RealObjectIdManager> m_realObjectIdManager;
};
}