Skip to content

Commit

Permalink
Support some acl type in ccgen
Browse files Browse the repository at this point in the history
  • Loading branch information
DanG100 committed Oct 10, 2023
1 parent 52190cc commit 96ede6d
Show file tree
Hide file tree
Showing 4 changed files with 208 additions and 4 deletions.
27 changes: 23 additions & 4 deletions dataplane/standalone/apigen/ccgen/ccgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -236,6 +236,7 @@ const (
variableSizedArray
convertFunc
callbackRPC
acl
)

type unionAccessor struct {
Expand Down Expand Up @@ -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),
}
Expand Down Expand Up @@ -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)
}
Expand Down
162 changes: 162 additions & 0 deletions dataplane/standalone/sai/acl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
17 changes: 17 additions & 0 deletions dataplane/standalone/sai/common.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<const char*>(&data), sizeof(sai_ip4_t));
return out;
}
6 changes: 6 additions & 0 deletions dataplane/standalone/sai/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <typename T, typename S>
Expand Down

0 comments on commit 96ede6d

Please sign in to comment.