@@ -388,6 +388,95 @@ bool PortsOrch::setPortFec(sai_object_id_t id, sai_port_fec_mode_t mode)
388
388
return true ;
389
389
}
390
390
391
+ bool PortsOrch::bindAclTable (sai_object_id_t id, sai_object_id_t table_oid, sai_object_id_t &group_member_oid)
392
+ {
393
+ sai_status_t status;
394
+ sai_object_id_t groupOid;
395
+
396
+ Port p;
397
+ if (!getPort (id, p))
398
+ {
399
+ return false ;
400
+ }
401
+
402
+ auto &port = m_portList.find (p.m_alias )->second ;
403
+
404
+ // If port ACL table group does not exist, create one
405
+ if (port.m_acl_table_group_id == 0 )
406
+ {
407
+ sai_object_id_t bp_list[] = { SAI_ACL_BIND_POINT_TYPE_PORT };
408
+
409
+ vector<sai_attribute_t > group_attrs;
410
+ sai_attribute_t group_attr;
411
+
412
+ group_attr.id = SAI_ACL_TABLE_GROUP_ATTR_ACL_STAGE;
413
+ group_attr.value .s32 = SAI_ACL_STAGE_INGRESS; // TODO: double check
414
+ group_attrs.push_back (group_attr);
415
+
416
+ group_attr.id = SAI_ACL_TABLE_GROUP_ATTR_ACL_BIND_POINT_TYPE_LIST;
417
+ group_attr.value .objlist .count = 1 ;
418
+ group_attr.value .objlist .list = bp_list;
419
+ group_attrs.push_back (group_attr);
420
+
421
+ group_attr.id = SAI_ACL_TABLE_GROUP_ATTR_TYPE;
422
+ group_attr.value .s32 = SAI_ACL_TABLE_GROUP_TYPE_PARALLEL;
423
+ group_attrs.push_back (group_attr);
424
+
425
+ status = sai_acl_api->create_acl_table_group (&groupOid, gSwitchId , (uint32_t )group_attrs.size (), group_attrs.data ());
426
+ if (status != SAI_STATUS_SUCCESS)
427
+ {
428
+ SWSS_LOG_ERROR (" Failed to create ACL table group, rv:%d" , status);
429
+ return false ;
430
+ }
431
+
432
+ port.m_acl_table_group_id = groupOid;
433
+
434
+ // Bind this ACL group to port OID
435
+ sai_attribute_t port_attr;
436
+ port_attr.id = SAI_PORT_ATTR_INGRESS_ACL;
437
+ port_attr.value .oid = groupOid;
438
+
439
+ status = sai_port_api->set_port_attribute (port.m_port_id , &port_attr);
440
+ if (status != SAI_STATUS_SUCCESS)
441
+ {
442
+ SWSS_LOG_ERROR (" Failed to bind port %lx(%s) to ACL table group %lx, rv:%d" ,
443
+ port.m_port_id , port.m_alias .c_str (), groupOid, status);
444
+ return false ;
445
+ }
446
+
447
+ SWSS_LOG_NOTICE (" Create ACL table group and bind port %s to it" , port.m_alias .c_str ());
448
+ }
449
+ else
450
+ {
451
+ groupOid = port.m_acl_table_group_id ;
452
+ }
453
+
454
+ // Create an ACL group member with table_oid and groupOid
455
+ vector<sai_attribute_t > member_attrs;
456
+
457
+ sai_attribute_t member_attr;
458
+ member_attr.id = SAI_ACL_TABLE_GROUP_MEMBER_ATTR_ACL_TABLE_GROUP_ID;
459
+ member_attr.value .oid = groupOid;
460
+ member_attrs.push_back (member_attr);
461
+
462
+ member_attr.id = SAI_ACL_TABLE_GROUP_MEMBER_ATTR_ACL_TABLE_ID;
463
+ member_attr.value .oid = table_oid;
464
+ member_attrs.push_back (member_attr);
465
+
466
+ member_attr.id = SAI_ACL_TABLE_GROUP_MEMBER_ATTR_PRIORITY;
467
+ member_attr.value .u32 = 100 ; // TODO: double check!
468
+ member_attrs.push_back (member_attr);
469
+
470
+ status = sai_acl_api->create_acl_table_group_member (&group_member_oid, gSwitchId , (uint32_t )member_attrs.size (), member_attrs.data ());
471
+ if (status != SAI_STATUS_SUCCESS) {
472
+ SWSS_LOG_ERROR (" Failed to create member in ACL table group %lx for ACL table group %lx, rv:%d" ,
473
+ table_oid, groupOid, status);
474
+ return false ;
475
+ }
476
+
477
+ return true ;
478
+ }
479
+
391
480
bool PortsOrch::setPortPvid (Port &port, sai_uint32_t pvid)
392
481
{
393
482
SWSS_LOG_ENTER ();
0 commit comments