Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 385904f8 authored by Ben Hutchings's avatar Ben Hutchings
Browse files

sfc: Don't use efx_filter_{build,hash,increment}() for default MAC filters



These functions happen to work for default MAC filters: they generate
an initial index of 1/0 for unicast/multicast respectively and an
increment of 1 for either, so a search succeeds at depth 2.  But this
is a matter of luck rather than design, and it really won't work well
with the bug fix we're about to do.

Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent e3a699fa
Loading
Loading
Loading
Loading
+19 −16
Original line number Diff line number Diff line
@@ -463,13 +463,6 @@ static u32 efx_filter_build(efx_oword_t *filter, struct efx_filter_spec *spec)
		break;
	}

	case EFX_FILTER_TABLE_RX_DEF:
		/* One filter spec per type */
		BUILD_BUG_ON(EFX_FILTER_INDEX_UC_DEF != 0);
		BUILD_BUG_ON(EFX_FILTER_INDEX_MC_DEF !=
			     EFX_FILTER_MC_DEF - EFX_FILTER_UC_DEF);
		return spec->type - EFX_FILTER_UC_DEF;

	case EFX_FILTER_TABLE_RX_MAC: {
		bool is_wild = spec->type == EFX_FILTER_MAC_WILD;
		EFX_POPULATE_OWORD_7(
@@ -667,18 +660,26 @@ s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
	struct efx_filter_spec *saved_spec;
	efx_oword_t filter;
	unsigned int filter_idx, depth = 0;
	u32 key;
	int rc;

	if (!table || table->size == 0)
		return -EINVAL;

	key = efx_filter_build(&filter, spec);

	netif_vdbg(efx, hw, efx->net_dev,
		   "%s: type %d search_depth=%d", __func__, spec->type,
		   table->search_depth[spec->type]);

	if (table->id == EFX_FILTER_TABLE_RX_DEF) {
		/* One filter spec per type */
		BUILD_BUG_ON(EFX_FILTER_INDEX_UC_DEF != 0);
		BUILD_BUG_ON(EFX_FILTER_INDEX_MC_DEF !=
			     EFX_FILTER_MC_DEF - EFX_FILTER_UC_DEF);
		filter_idx = spec->type - EFX_FILTER_INDEX_UC_DEF;

		spin_lock_bh(&state->lock);
	} else {
		u32 key = efx_filter_build(&filter, spec);

		spin_lock_bh(&state->lock);

		rc = efx_filter_search(table, spec, key, &depth);
@@ -686,6 +687,8 @@ s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
			goto out;
		filter_idx = rc;
		BUG_ON(filter_idx >= table->size);
	}

	saved_spec = &table->spec[filter_idx];

	if (test_bit(filter_idx, table->used_bitmap)) {