drivers/net/dsa/microchip/ksz9477_tc_flower.c
Source file repositories/reference/linux-study-clean/drivers/net/dsa/microchip/ksz9477_tc_flower.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/dsa/microchip/ksz9477_tc_flower.c- Extension
.c- Size
- 8807 bytes
- Lines
- 285
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
ksz9477.hksz9477_reg.hksz_common.h
Detected Declarations
function ksz9477_flower_parse_key_l2function ksz9477_flower_parse_keyfunction ksz9477_flower_parse_actionfunction flow_action_for_eachfunction ksz9477_cls_flower_addfunction ksz9477_cls_flower_del
Annotated Snippet
if (match.key->n_proto) {
if (match.mask->n_proto != ETHER_TYPE_FULL_MASK) {
NL_SET_ERR_MSG_MOD(extack,
"ethernet type mask must be a full mask");
return -EINVAL;
}
ethtype = be16_to_cpu(match.key->n_proto);
}
}
if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
flow_rule_match_eth_addrs(rule, &ematch);
if (!is_zero_ether_addr(ematch.key->src)) {
if (!is_broadcast_ether_addr(ematch.mask->src))
goto not_full_mask_err;
src_mac = ematch.key->src;
}
if (!is_zero_ether_addr(ematch.key->dst)) {
if (!is_broadcast_ether_addr(ematch.mask->dst))
goto not_full_mask_err;
dst_mac = ematch.key->dst;
}
}
acles = &acl->acles;
/* ACL supports only one MAC per entry */
required_entries = src_mac && dst_mac ? 2 : 1;
/* Check if there are enough available entries */
if (acles->entries_count + required_entries > KSZ9477_ACL_MAX_ENTRIES) {
NL_SET_ERR_MSG_MOD(extack, "ACL entry limit reached");
return -EOPNOTSUPP;
}
ksz9477_acl_match_process_l2(dev, port, ethtype, src_mac, dst_mac,
cookie, prio);
return 0;
not_full_mask_err:
NL_SET_ERR_MSG_MOD(extack, "MAC address mask must be a full mask");
return -EOPNOTSUPP;
}
/**
* 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)
{
struct flow_dissector *dissector = rule->match.dissector;
int ret;
if (dissector->used_keys &
~(BIT_ULL(FLOW_DISSECTOR_KEY_BASIC) |
BIT_ULL(FLOW_DISSECTOR_KEY_ETH_ADDRS) |
BIT_ULL(FLOW_DISSECTOR_KEY_CONTROL))) {
NL_SET_ERR_MSG_MOD(extack,
"Unsupported keys used");
return -EOPNOTSUPP;
}
if (flow_rule_match_has_control_flags(rule, extack))
return -EOPNOTSUPP;
if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_BASIC) ||
flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
ret = ksz9477_flower_parse_key_l2(dev, port, extack, rule,
cookie, prio);
if (ret)
Annotation
- Immediate include surface: `ksz9477.h`, `ksz9477_reg.h`, `ksz_common.h`.
- Detected declarations: `function ksz9477_flower_parse_key_l2`, `function ksz9477_flower_parse_key`, `function ksz9477_flower_parse_action`, `function flow_action_for_each`, `function ksz9477_cls_flower_add`, `function ksz9477_cls_flower_del`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.