ionic: add generic filter search
In preparation for enhancing vlan filter management, add a filter search routine that can figure out for itself which type of filter search is needed. Signed-off-by: Shannon Nelson <snelson@pensando.io> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4ed642cc65
commit
ff542fbe5d
|
@ -239,6 +239,21 @@ struct ionic_rx_filter *ionic_rx_filter_rxsteer(struct ionic_lif *lif)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct ionic_rx_filter *ionic_rx_filter_find(struct ionic_lif *lif,
|
||||||
|
struct ionic_rx_filter_add_cmd *ac)
|
||||||
|
{
|
||||||
|
switch (le16_to_cpu(ac->match)) {
|
||||||
|
case IONIC_RX_FILTER_MATCH_VLAN:
|
||||||
|
return ionic_rx_filter_by_vlan(lif, le16_to_cpu(ac->vlan.vlan));
|
||||||
|
case IONIC_RX_FILTER_MATCH_MAC:
|
||||||
|
return ionic_rx_filter_by_addr(lif, ac->mac.addr);
|
||||||
|
default:
|
||||||
|
netdev_err(lif->netdev, "unsupported filter match %d",
|
||||||
|
le16_to_cpu(ac->match));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int ionic_lif_list_addr(struct ionic_lif *lif, const u8 *addr, bool mode)
|
int ionic_lif_list_addr(struct ionic_lif *lif, const u8 *addr, bool mode)
|
||||||
{
|
{
|
||||||
struct ionic_rx_filter *f;
|
struct ionic_rx_filter *f;
|
||||||
|
@ -304,7 +319,7 @@ int ionic_lif_addr_add(struct ionic_lif *lif, const u8 *addr)
|
||||||
memcpy(ctx.cmd.rx_filter_add.mac.addr, addr, ETH_ALEN);
|
memcpy(ctx.cmd.rx_filter_add.mac.addr, addr, ETH_ALEN);
|
||||||
|
|
||||||
spin_lock_bh(&lif->rx_filters.lock);
|
spin_lock_bh(&lif->rx_filters.lock);
|
||||||
f = ionic_rx_filter_by_addr(lif, addr);
|
f = ionic_rx_filter_find(lif, &ctx.cmd.rx_filter_add);
|
||||||
if (f) {
|
if (f) {
|
||||||
/* don't bother if we already have it and it is sync'd */
|
/* don't bother if we already have it and it is sync'd */
|
||||||
if (f->state == IONIC_FILTER_STATE_SYNCED) {
|
if (f->state == IONIC_FILTER_STATE_SYNCED) {
|
||||||
|
@ -336,7 +351,7 @@ int ionic_lif_addr_add(struct ionic_lif *lif, const u8 *addr)
|
||||||
spin_lock_bh(&lif->rx_filters.lock);
|
spin_lock_bh(&lif->rx_filters.lock);
|
||||||
if (err && err != -EEXIST) {
|
if (err && err != -EEXIST) {
|
||||||
/* set the state back to NEW so we can try again later */
|
/* set the state back to NEW so we can try again later */
|
||||||
f = ionic_rx_filter_by_addr(lif, addr);
|
f = ionic_rx_filter_find(lif, &ctx.cmd.rx_filter_add);
|
||||||
if (f && f->state == IONIC_FILTER_STATE_SYNCED) {
|
if (f && f->state == IONIC_FILTER_STATE_SYNCED) {
|
||||||
f->state = IONIC_FILTER_STATE_NEW;
|
f->state = IONIC_FILTER_STATE_NEW;
|
||||||
set_bit(IONIC_LIF_F_FILTER_SYNC_NEEDED, lif->state);
|
set_bit(IONIC_LIF_F_FILTER_SYNC_NEEDED, lif->state);
|
||||||
|
@ -355,7 +370,7 @@ int ionic_lif_addr_add(struct ionic_lif *lif, const u8 *addr)
|
||||||
else
|
else
|
||||||
lif->nucast++;
|
lif->nucast++;
|
||||||
|
|
||||||
f = ionic_rx_filter_by_addr(lif, addr);
|
f = ionic_rx_filter_find(lif, &ctx.cmd.rx_filter_add);
|
||||||
if (f && f->state == IONIC_FILTER_STATE_OLD) {
|
if (f && f->state == IONIC_FILTER_STATE_OLD) {
|
||||||
/* Someone requested a delete while we were adding
|
/* Someone requested a delete while we were adding
|
||||||
* so update the filter info with the results from the add
|
* so update the filter info with the results from the add
|
||||||
|
|
Loading…
Reference in New Issue