From 96ede6d26cfc9abb6aefd3133e49bcfe676efb0a Mon Sep 17 00:00:00 2001 From: Daniel Grau Date: Tue, 10 Oct 2023 17:09:50 +0000 Subject: [PATCH] Support some acl type in ccgen --- dataplane/standalone/apigen/ccgen/ccgen.go | 27 +++- dataplane/standalone/sai/acl.cc | 162 +++++++++++++++++++++ dataplane/standalone/sai/common.cc | 17 +++ dataplane/standalone/sai/common.h | 6 + 4 files changed, 208 insertions(+), 4 deletions(-) diff --git a/dataplane/standalone/apigen/ccgen/ccgen.go b/dataplane/standalone/apigen/ccgen/ccgen.go index b0e9dc7d..cd0f28ec 100644 --- a/dataplane/standalone/apigen/ccgen/ccgen.go +++ b/dataplane/standalone/apigen/ccgen/ccgen.go @@ -150,7 +150,7 @@ func createCCData(meta *saiast.FuncMetadata, apiName string, sai *saiast.SAIAPI, convertFn.ReturnType = opFn.ReqType for _, attr := range info.Attrs[meta.TypeName].CreateFields { name := sanitizeProtoName(attr.MemberName) - smt, err := protoFieldSetter(attr.SaiType, name, "attr_list[i].value", info) + smt, err := protoFieldSetter(attr.SaiType, convertFn.AttrSwitch.ProtoVar, name, "attr_list[i].value", info) if err != nil { fmt.Println("skipping due to error: ", err) continue @@ -194,7 +194,7 @@ func createCCData(meta *saiast.FuncMetadata, apiName string, sai *saiast.SAIAPI, } for _, attr := range info.Attrs[meta.TypeName].SetFields { name := sanitizeProtoName(attr.MemberName) - smt, err := protoFieldSetter(attr.SaiType, name, "attr->value", info) + smt, err := protoFieldSetter(attr.SaiType, opFn.AttrSwitch.ProtoVar, name, "attr->value", info) if err != nil { fmt.Println("skipping due to error: ", err) continue @@ -207,7 +207,7 @@ func createCCData(meta *saiast.FuncMetadata, apiName string, sai *saiast.SAIAPI, opFn.ConvertFunc = strcase.SnakeCase("convert_create " + meta.TypeName) for _, attr := range info.Attrs[meta.TypeName].CreateFields { name := sanitizeProtoName(attr.MemberName) - smt, err := protoFieldSetter(attr.SaiType, name, "attr_list[i].value", info) + smt, err := protoFieldSetter(attr.SaiType, "", name, "attr_list[i].value", info) if err != nil { fmt.Println("skipping due to error: ", err) continue @@ -236,6 +236,7 @@ const ( variableSizedArray convertFunc callbackRPC + acl ) type unionAccessor struct { @@ -342,9 +343,17 @@ var typeToUnionAccessor = map[string]*unionAccessor{ convertFromFunc: "convert_from_acl_capability", convertToFunc: "convert_to_acl_capability", }, + "sai_acl_field_data_t sai_ip4_t": { + accessor: "ip4", + aType: acl, + }, + "sai_acl_action_data_t sai_object_id_t": { + accessor: "oid", + aType: acl, + }, } -func protoFieldSetter(saiType, protoField, varName string, info *docparser.SAIInfo) (*AttrSwitchSmt, error) { +func protoFieldSetter(saiType, protoVar, protoField, varName string, info *docparser.SAIInfo) (*AttrSwitchSmt, error) { smt := &AttrSwitchSmt{ ProtoFunc: fmt.Sprintf("set_%s", protoField), } @@ -380,6 +389,16 @@ func protoFieldSetter(saiType, protoField, varName string, info *docparser.SAIIn smt.ConvertFunc = ua.convertToFunc fnType := strings.Split(saiType, " ")[1] smt.Args = fmt.Sprintf("switch_, reinterpret_cast<%s>(%s.ptr)", fnType, varName) + case acl: + smt.Var = fmt.Sprintf("*%s.mutable_%s()", protoVar, protoField) + smt.ConvertFunc = "convert_from_acl_action_data" + access := "aclaction" + smt.Args = fmt.Sprintf("%s.%s, %s.%s.parameter.%s", varName, access, varName, access, ua.accessor) + if strings.Contains(saiType, "sai_acl_field_data_t") { + access = "aclfield" + smt.ConvertFunc = "convert_from_acl_field_data" + smt.Args = fmt.Sprintf("%s.%s, %s.%s.data.%s, %s.%s.mask.%s", varName, access, varName, access, ua.accessor, varName, access, ua.accessor) + } default: return nil, fmt.Errorf("unknown accessor type %q", ua.aType) } diff --git a/dataplane/standalone/sai/acl.cc b/dataplane/standalone/sai/acl.cc index 5d5be09d..795559c5 100644 --- a/dataplane/standalone/sai/acl.cc +++ b/dataplane/standalone/sai/acl.cc @@ -362,6 +362,94 @@ lemming::dataplane::sai::CreateAclEntryRequest convert_create_acl_entry( case SAI_ACL_ENTRY_ATTR_ADMIN_STATE: msg.set_admin_state(attr_list[i].value.booldata); break; + case SAI_ACL_ENTRY_ATTR_FIELD_SRC_IP: + *msg.mutable_field_src_ip() = convert_from_acl_field_data( + attr_list[i].value.aclfield, attr_list[i].value.aclfield.data.ip4, + attr_list[i].value.aclfield.mask.ip4); + break; + case SAI_ACL_ENTRY_ATTR_FIELD_DST_IP: + *msg.mutable_field_dst_ip() = convert_from_acl_field_data( + attr_list[i].value.aclfield, attr_list[i].value.aclfield.data.ip4, + attr_list[i].value.aclfield.mask.ip4); + break; + case SAI_ACL_ENTRY_ATTR_FIELD_INNER_SRC_IP: + *msg.mutable_field_inner_src_ip() = convert_from_acl_field_data( + attr_list[i].value.aclfield, attr_list[i].value.aclfield.data.ip4, + attr_list[i].value.aclfield.mask.ip4); + break; + case SAI_ACL_ENTRY_ATTR_FIELD_INNER_DST_IP: + *msg.mutable_field_inner_dst_ip() = convert_from_acl_field_data( + attr_list[i].value.aclfield, attr_list[i].value.aclfield.data.ip4, + attr_list[i].value.aclfield.mask.ip4); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT: + *msg.mutable_action_redirect() = convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_COUNTER: + *msg.mutable_action_counter() = convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_POLICER: + *msg.mutable_action_set_policer() = convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_INGRESS_SAMPLEPACKET_ENABLE: + *msg.mutable_action_ingress_samplepacket_enable() = + convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_EGRESS_SAMPLEPACKET_ENABLE: + *msg.mutable_action_egress_samplepacket_enable() = + convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_USER_TRAP_ID: + *msg.mutable_action_set_user_trap_id() = convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_DTEL_INT_SESSION: + *msg.mutable_action_dtel_int_session() = convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_TAM_INT_OBJECT: + *msg.mutable_action_tam_int_object() = convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_ISOLATION_GROUP: + *msg.mutable_action_set_isolation_group() = + convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_MACSEC_FLOW: + *msg.mutable_action_macsec_flow() = convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_LAG_HASH_ID: + *msg.mutable_action_set_lag_hash_id() = convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_ECMP_HASH_ID: + *msg.mutable_action_set_ecmp_hash_id() = convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_VRF: + *msg.mutable_action_set_vrf() = convert_from_acl_action_data( + attr_list[i].value.aclaction, + attr_list[i].value.aclaction.parameter.oid); + break; } } return msg; @@ -877,6 +965,80 @@ sai_status_t l_set_acl_entry_attribute(sai_object_id_t acl_entry_id, case SAI_ACL_ENTRY_ATTR_ADMIN_STATE: req.set_admin_state(attr->value.booldata); break; + case SAI_ACL_ENTRY_ATTR_FIELD_SRC_IP: + *req.mutable_field_src_ip() = convert_from_acl_field_data( + attr->value.aclfield, attr->value.aclfield.data.ip4, + attr->value.aclfield.mask.ip4); + break; + case SAI_ACL_ENTRY_ATTR_FIELD_DST_IP: + *req.mutable_field_dst_ip() = convert_from_acl_field_data( + attr->value.aclfield, attr->value.aclfield.data.ip4, + attr->value.aclfield.mask.ip4); + break; + case SAI_ACL_ENTRY_ATTR_FIELD_INNER_SRC_IP: + *req.mutable_field_inner_src_ip() = convert_from_acl_field_data( + attr->value.aclfield, attr->value.aclfield.data.ip4, + attr->value.aclfield.mask.ip4); + break; + case SAI_ACL_ENTRY_ATTR_FIELD_INNER_DST_IP: + *req.mutable_field_inner_dst_ip() = convert_from_acl_field_data( + attr->value.aclfield, attr->value.aclfield.data.ip4, + attr->value.aclfield.mask.ip4); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT: + *req.mutable_action_redirect() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_COUNTER: + *req.mutable_action_counter() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_POLICER: + *req.mutable_action_set_policer() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_INGRESS_SAMPLEPACKET_ENABLE: + *req.mutable_action_ingress_samplepacket_enable() = + convert_from_acl_action_data(attr->value.aclaction, + attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_EGRESS_SAMPLEPACKET_ENABLE: + *req.mutable_action_egress_samplepacket_enable() = + convert_from_acl_action_data(attr->value.aclaction, + attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_USER_TRAP_ID: + *req.mutable_action_set_user_trap_id() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_DTEL_INT_SESSION: + *req.mutable_action_dtel_int_session() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_TAM_INT_OBJECT: + *req.mutable_action_tam_int_object() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_ISOLATION_GROUP: + *req.mutable_action_set_isolation_group() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_MACSEC_FLOW: + *req.mutable_action_macsec_flow() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_LAG_HASH_ID: + *req.mutable_action_set_lag_hash_id() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_ECMP_HASH_ID: + *req.mutable_action_set_ecmp_hash_id() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; + case SAI_ACL_ENTRY_ATTR_ACTION_SET_VRF: + *req.mutable_action_set_vrf() = convert_from_acl_action_data( + attr->value.aclaction, attr->value.aclaction.parameter.oid); + break; } grpc::Status status = acl->SetAclEntryAttribute(&context, req, &resp); diff --git a/dataplane/standalone/sai/common.cc b/dataplane/standalone/sai/common.cc index 584bbd8c..22669227 100644 --- a/dataplane/standalone/sai/common.cc +++ b/dataplane/standalone/sai/common.cc @@ -131,3 +131,20 @@ void convert_to_acl_capability( } out.action_list.count = in.action_list().size(); } + +lemming::dataplane::sai::AclActionData convert_from_acl_action_data( + const sai_acl_action_data_t& in, sai_object_id_t id) { + lemming::dataplane::sai::AclActionData out; + out.set_enable(in.enable); + out.set_oid(id); + return out; +} + +lemming::dataplane::sai::AclFieldData convert_from_acl_field_data( + const sai_acl_field_data_t& in, sai_ip4_t data, sai_ip4_t mask) { + lemming::dataplane::sai::AclFieldData out; + out.set_enable(in.enable); + *out.mutable_data_ip() = + std::string(reinterpret_cast(&data), sizeof(sai_ip4_t)); + return out; +} diff --git a/dataplane/standalone/sai/common.h b/dataplane/standalone/sai/common.h index f7c6141a..b17033a4 100644 --- a/dataplane/standalone/sai/common.h +++ b/dataplane/standalone/sai/common.h @@ -159,6 +159,12 @@ void convert_to_acl_capability( sai_acl_capability_t &out, const lemming::dataplane::sai::ACLCapability &in); +lemming::dataplane::sai::AclActionData convert_from_acl_action_data( + const sai_acl_action_data_t &in, sai_object_id_t id); + +lemming::dataplane::sai::AclFieldData convert_from_acl_field_data( + const sai_acl_field_data_t &in, sai_ip4_t data, sai_ip4_t mask); + // copy_list copies a scalar proto list to an attribute. // Note: It is expected that the attribute list contains preallocated memory. template