@@ -2944,29 +2944,17 @@ void mlxsw_core_skb_receive(struct mlxsw_core *mlxsw_core, struct sk_buff *skb,
{
struct mlxsw_rx_listener_item *rxl_item;
const struct mlxsw_rx_listener *rxl;
- u16 local_port;
bool found = false;
- if (rx_info->is_lag) {
- /* Upper layer does not care if the skb came from LAG or not,
- * so just get the local_port for the lag port and push it up.
- */
- local_port = mlxsw_core_lag_mapping_get(mlxsw_core,
- rx_info->u.lag_id,
- rx_info->lag_port_index);
- } else {
- local_port = rx_info->u.sys_port;
- }
-
if ((rx_info->trap_id >= MLXSW_TRAP_ID_MAX) ||
- (local_port >= mlxsw_core->max_ports))
+ (rx_info->local_port >= mlxsw_core->max_ports))
goto drop;
rcu_read_lock();
list_for_each_entry_rcu(rxl_item, &mlxsw_core->rx_listener_list, list) {
rxl = &rxl_item->rxl;
if ((rxl->local_port == MLXSW_PORT_DONT_CARE ||
- rxl->local_port == local_port) &&
+ rxl->local_port == rx_info->local_port) &&
rxl->trap_id == rx_info->trap_id &&
rxl->mirror_reason == rx_info->mirror_reason) {
if (rxl_item->enabled)
@@ -2979,7 +2967,7 @@ void mlxsw_core_skb_receive(struct mlxsw_core *mlxsw_core, struct sk_buff *skb,
goto drop;
}
- rxl->func(skb, local_port, rxl_item->priv);
+ rxl->func(skb, rx_info->local_port, rxl_item->priv);
rcu_read_unlock();
return;
@@ -242,12 +242,7 @@ int mlxsw_reg_write(struct mlxsw_core *mlxsw_core,
const struct mlxsw_reg_info *reg, char *payload);
struct mlxsw_rx_info {
- bool is_lag;
- union {
- u16 sys_port;
- u16 lag_id;
- } u;
- u16 lag_port_index;
+ u16 local_port;
u8 mirror_reason;
int trap_id;
};
@@ -761,6 +761,18 @@ static void mlxsw_pci_cqe_rdq_handle(struct mlxsw_pci *mlxsw_pci,
if (mlxsw_pci_cqe_crc_get(cqe_v, cqe))
byte_count -= ETH_FCS_LEN;
+ if (mlxsw_pci_cqe_lag_get(cqe_v, cqe)) {
+ u16 lag_id, lag_port_index;
+
+ lag_id = mlxsw_pci_cqe_lag_id_get(cqe_v, cqe);
+ lag_port_index = mlxsw_pci_cqe_lag_subport_get(cqe_v, cqe);
+ rx_info.local_port = mlxsw_core_lag_mapping_get(mlxsw_pci->core,
+ lag_id,
+ lag_port_index);
+ } else {
+ rx_info.local_port = mlxsw_pci_cqe_system_port_get(cqe);
+ }
+
err = mlxsw_pci_elem_info_pages_ref_store(q, elem_info, byte_count,
pages, &num_sg_entries);
if (err)
@@ -779,16 +791,6 @@ static void mlxsw_pci_cqe_rdq_handle(struct mlxsw_pci *mlxsw_pci,
skb_mark_for_recycle(skb);
- if (mlxsw_pci_cqe_lag_get(cqe_v, cqe)) {
- rx_info.is_lag = true;
- rx_info.u.lag_id = mlxsw_pci_cqe_lag_id_get(cqe_v, cqe);
- rx_info.lag_port_index =
- mlxsw_pci_cqe_lag_subport_get(cqe_v, cqe);
- } else {
- rx_info.is_lag = false;
- rx_info.u.sys_port = mlxsw_pci_cqe_system_port_get(cqe);
- }
-
rx_info.trap_id = mlxsw_pci_cqe_trap_id_get(cqe);
if (rx_info.trap_id == MLXSW_TRAP_ID_DISCARD_INGRESS_ACL ||