// SPDX-License-Identifier: GPL-2.0 // Copyright (c) 2023 Pengutronix, Oleksij Rempel <[email protected]> #include "ksz9477.h" #include "ksz9477_reg.h" #include "ksz_common.h" #define ETHER_TYPE_FULL_MASK … #define KSZ9477_MAX_TC … /** * ksz9477_flower_parse_key_l2 - Parse Layer 2 key from flow rule and configure * ACL entries accordingly. * @dev: Pointer to the ksz_device. * @port: Port number. * @extack: Pointer to the netlink_ext_ack. * @rule: Pointer to the flow_rule. * @cookie: The cookie to associate with the entry. * @prio: The priority of the entry. * * This function parses the Layer 2 key from the flow rule and configures * the corresponding ACL entries. It checks for unsupported offloads and * available entries before proceeding with the configuration. * * Returns: 0 on success or a negative error code on failure. */ static int ksz9477_flower_parse_key_l2(struct ksz_device *dev, int port, struct netlink_ext_ack *extack, struct flow_rule *rule, unsigned long cookie, u32 prio) { … } /** * ksz9477_flower_parse_key - Parse flow rule keys for a specified port on a * ksz_device. * @dev: The ksz_device instance. * @port: The port number to parse the flow rule keys for. * @extack: The netlink extended ACK for reporting errors. * @rule: The flow_rule to parse. * @cookie: The cookie to associate with the entry. * @prio: The priority of the entry. * * This function checks if the used keys in the flow rule are supported by * the device and parses the L2 keys if they match. If unsupported keys are * used, an error message is set in the extended ACK. * * Returns: 0 on success or a negative error code on failure. */ static int ksz9477_flower_parse_key(struct ksz_device *dev, int port, struct netlink_ext_ack *extack, struct flow_rule *rule, unsigned long cookie, u32 prio) { … } /** * ksz9477_flower_parse_action - Parse flow rule actions for a specified port * on a ksz_device. * @dev: The ksz_device instance. * @port: The port number to parse the flow rule actions for. * @extack: The netlink extended ACK for reporting errors. * @cls: The flow_cls_offload instance containing the flow rule. * @entry_idx: The index of the ACL entry to store the action. * * This function checks if the actions in the flow rule are supported by * the device. Currently, only actions that change priorities are supported. * If unsupported actions are encountered, an error message is set in the * extended ACK. * * Returns: 0 on success or a negative error code on failure. */ static int ksz9477_flower_parse_action(struct ksz_device *dev, int port, struct netlink_ext_ack *extack, struct flow_cls_offload *cls, int entry_idx) { … } /** * ksz9477_cls_flower_add - Add a flow classification rule for a specified port * on a ksz_device. * @ds: The DSA switch instance. * @port: The port number to add the flow classification rule to. * @cls: The flow_cls_offload instance containing the flow rule. * @ingress: A flag indicating if the rule is applied on the ingress path. * * This function adds a flow classification rule for a specified port on a * ksz_device. It checks if the ACL offloading is supported and parses the flow * keys and actions. If the ACL is not supported, it returns an error. If there * are unprocessed entries, it parses the action for the rule. * * Returns: 0 on success or a negative error code on failure. */ int ksz9477_cls_flower_add(struct dsa_switch *ds, int port, struct flow_cls_offload *cls, bool ingress) { … } /** * ksz9477_cls_flower_del - Remove a flow classification rule for a specified * port on a ksz_device. * @ds: The DSA switch instance. * @port: The port number to remove the flow classification rule from. * @cls: The flow_cls_offload instance containing the flow rule. * @ingress: A flag indicating if the rule is applied on the ingress path. * * This function removes a flow classification rule for a specified port on a * ksz_device. It checks if the ACL is initialized, and if not, returns an * error. If the ACL is initialized, it removes entries with the specified * cookie and rewrites the ACL list. * * Returns: 0 on success or a negative error code on failure. */ int ksz9477_cls_flower_del(struct dsa_switch *ds, int port, struct flow_cls_offload *cls, bool ingress) { … }