drivers/net/ethernet/qlogic/qede/qede_filter.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/qlogic/qede/qede_filter.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/qlogic/qede/qede_filter.c- Extension
.c- Size
- 51079 bytes
- Lines
- 2098
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/netdevice.hlinux/etherdevice.hnet/udp_tunnel.hlinux/bitops.hlinux/vmalloc.hlinux/qed/qed_if.hqede.h
Detected Declarations
struct qede_arfs_tuplestruct qede_arfs_fltr_nodestruct qede_arfsfunction qede_configure_arfs_fltrfunction qede_free_arfs_filterfunction qede_enqueue_fltr_and_config_searcherfunction qede_dequeue_fltr_and_config_searcherfunction qede_arfs_filter_opfunction qede_process_arfs_filtersfunction hlist_for_each_entry_safefunction qede_poll_for_freeing_arfs_filtersfunction qede_alloc_arfsfunction qede_free_arfsfunction qede_compare_ip_addrfunction qede_arfs_htbl_key_searchfunction qede_alloc_filterfunction qede_rx_flow_steerfunction qede_udp_ports_updatefunction qede_force_macfunction qede_fill_rss_paramsfunction qede_set_ucast_rx_macfunction qede_set_ucast_rx_vlanfunction qede_config_accept_any_vlanfunction qede_vlan_rx_add_vidfunction qede_del_vlan_from_listfunction qede_configure_vlan_filtersfunction qede_vlan_rx_kill_vidfunction qede_vlan_mark_nonconfiguredfunction list_for_each_entryfunction qede_set_features_reloadfunction qede_fix_featuresfunction qede_set_featuresfunction qede_udp_tunnel_syncfunction qede_set_udp_tunnelsfunction qede_xdp_reload_funcfunction qede_xdp_setfunction qede_xdpfunction qede_set_mcast_rx_macfunction qede_set_mac_addrfunction qede_configure_mcast_filteringfunction netdev_for_each_mc_addrfunction qede_set_rx_modefunction qede_config_rx_modefunction qede_get_arfs_fltr_by_locfunction qede_get_cls_rule_allfunction hlist_for_each_entryfunction qede_get_cls_rule_entryfunction qede_poll_arfs_filter_config
Annotated Snippet
struct qede_arfs_tuple {
union {
__be32 src_ipv4;
struct in6_addr src_ipv6;
};
union {
__be32 dst_ipv4;
struct in6_addr dst_ipv6;
};
__be16 src_port;
__be16 dst_port;
__be16 eth_proto;
u8 ip_proto;
/* Describe filtering mode needed for this kind of filter */
enum qed_filter_config_mode mode;
/* Used to compare new/old filters. Return true if IPs match */
bool (*ip_comp)(struct qede_arfs_tuple *a, struct qede_arfs_tuple *b);
/* Given an address into ethhdr build a header from tuple info */
void (*build_hdr)(struct qede_arfs_tuple *t, void *header);
/* Stringify the tuple for a print into the provided buffer */
void (*stringify)(struct qede_arfs_tuple *t, void *buffer);
};
struct qede_arfs_fltr_node {
#define QEDE_FLTR_VALID 0
unsigned long state;
/* pointer to aRFS packet buffer */
void *data;
/* dma map address of aRFS packet buffer */
dma_addr_t mapping;
/* length of aRFS packet buffer */
int buf_len;
/* tuples to hold from aRFS packet buffer */
struct qede_arfs_tuple tuple;
u32 flow_id;
u64 sw_id;
u16 rxq_id;
u16 next_rxq_id;
u8 vfid;
bool filter_op;
bool used;
u8 fw_rc;
bool b_is_drop;
struct hlist_node node;
};
struct qede_arfs {
#define QEDE_ARFS_BUCKET_HEAD(edev, idx) (&(edev)->arfs->arfs_hl_head[idx])
#define QEDE_ARFS_POLL_COUNT 100
#define QEDE_RFS_FLW_BITSHIFT (4)
#define QEDE_RFS_FLW_MASK ((1 << QEDE_RFS_FLW_BITSHIFT) - 1)
struct hlist_head arfs_hl_head[1 << QEDE_RFS_FLW_BITSHIFT];
/* lock for filter list access */
spinlock_t arfs_list_lock;
unsigned long *arfs_fltr_bmap;
int filter_count;
/* Currently configured filtering mode */
enum qed_filter_config_mode mode;
};
static void qede_configure_arfs_fltr(struct qede_dev *edev,
struct qede_arfs_fltr_node *n,
u16 rxq_id, bool add_fltr)
{
const struct qed_eth_ops *op = edev->ops;
struct qed_ntuple_filter_params params;
if (n->used)
return;
memset(¶ms, 0, sizeof(params));
params.addr = n->mapping;
params.length = n->buf_len;
params.qid = rxq_id;
params.b_is_add = add_fltr;
params.b_is_drop = n->b_is_drop;
if (n->vfid) {
Annotation
- Immediate include surface: `linux/netdevice.h`, `linux/etherdevice.h`, `net/udp_tunnel.h`, `linux/bitops.h`, `linux/vmalloc.h`, `linux/qed/qed_if.h`, `qede.h`.
- Detected declarations: `struct qede_arfs_tuple`, `struct qede_arfs_fltr_node`, `struct qede_arfs`, `function qede_configure_arfs_fltr`, `function qede_free_arfs_filter`, `function qede_enqueue_fltr_and_config_searcher`, `function qede_dequeue_fltr_and_config_searcher`, `function qede_arfs_filter_op`, `function qede_process_arfs_filters`, `function hlist_for_each_entry_safe`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.