2018-08-09 15:59:11 +07:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
|
|
|
|
/* Copyright (c) 2018 Mellanox Technologies. All rights reserved */
|
2018-02-13 17:27:48 +07:00
|
|
|
|
|
|
|
#ifndef _MLXSW_SPECTRUM_SPAN_H
|
|
|
|
#define _MLXSW_SPECTRUM_SPAN_H
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
2018-02-27 20:53:48 +07:00
|
|
|
#include <linux/if_ether.h>
|
|
|
|
|
|
|
|
#include "spectrum_router.h"
|
2018-02-13 17:27:48 +07:00
|
|
|
|
|
|
|
struct mlxsw_sp;
|
|
|
|
struct mlxsw_sp_port;
|
|
|
|
|
|
|
|
enum mlxsw_sp_span_type {
|
|
|
|
MLXSW_SP_SPAN_EGRESS,
|
|
|
|
MLXSW_SP_SPAN_INGRESS
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mlxsw_sp_span_inspected_port {
|
|
|
|
struct list_head list;
|
|
|
|
enum mlxsw_sp_span_type type;
|
|
|
|
u8 local_port;
|
2018-03-23 22:24:57 +07:00
|
|
|
|
|
|
|
/* Whether this is a directly bound mirror (port-to-port) or an ACL. */
|
|
|
|
bool bound;
|
2018-02-13 17:27:48 +07:00
|
|
|
};
|
|
|
|
|
2018-02-27 20:53:45 +07:00
|
|
|
struct mlxsw_sp_span_parms {
|
|
|
|
struct mlxsw_sp_port *dest_port; /* NULL for unoffloaded SPAN. */
|
2018-02-27 20:53:48 +07:00
|
|
|
unsigned int ttl;
|
|
|
|
unsigned char dmac[ETH_ALEN];
|
|
|
|
unsigned char smac[ETH_ALEN];
|
|
|
|
union mlxsw_sp_l3addr daddr;
|
|
|
|
union mlxsw_sp_l3addr saddr;
|
2018-04-29 14:56:13 +07:00
|
|
|
u16 vid;
|
2018-02-27 20:53:45 +07:00
|
|
|
};
|
|
|
|
|
|
|
|
struct mlxsw_sp_span_entry_ops;
|
|
|
|
|
2018-02-13 17:27:48 +07:00
|
|
|
struct mlxsw_sp_span_entry {
|
2018-02-27 20:53:44 +07:00
|
|
|
const struct net_device *to_dev;
|
2018-02-27 20:53:45 +07:00
|
|
|
const struct mlxsw_sp_span_entry_ops *ops;
|
|
|
|
struct mlxsw_sp_span_parms parms;
|
2018-02-13 17:27:48 +07:00
|
|
|
struct list_head bound_ports_list;
|
|
|
|
int ref_count;
|
|
|
|
int id;
|
|
|
|
};
|
|
|
|
|
2018-02-27 20:53:45 +07:00
|
|
|
struct mlxsw_sp_span_entry_ops {
|
|
|
|
bool (*can_handle)(const struct net_device *to_dev);
|
|
|
|
int (*parms)(const struct net_device *to_dev,
|
|
|
|
struct mlxsw_sp_span_parms *sparmsp);
|
|
|
|
int (*configure)(struct mlxsw_sp_span_entry *span_entry,
|
|
|
|
struct mlxsw_sp_span_parms sparms);
|
|
|
|
void (*deconfigure)(struct mlxsw_sp_span_entry *span_entry);
|
|
|
|
};
|
|
|
|
|
2018-02-13 17:27:48 +07:00
|
|
|
int mlxsw_sp_span_init(struct mlxsw_sp *mlxsw_sp);
|
|
|
|
void mlxsw_sp_span_fini(struct mlxsw_sp *mlxsw_sp);
|
2018-02-27 20:53:46 +07:00
|
|
|
void mlxsw_sp_span_respin(struct mlxsw_sp *mlxsw_sp);
|
2018-02-13 17:27:48 +07:00
|
|
|
|
|
|
|
int mlxsw_sp_span_mirror_add(struct mlxsw_sp_port *from,
|
2018-02-27 20:53:44 +07:00
|
|
|
const struct net_device *to_dev,
|
2018-02-27 20:53:41 +07:00
|
|
|
enum mlxsw_sp_span_type type,
|
|
|
|
bool bind, int *p_span_id);
|
|
|
|
void mlxsw_sp_span_mirror_del(struct mlxsw_sp_port *from, int span_id,
|
2018-02-13 17:27:48 +07:00
|
|
|
enum mlxsw_sp_span_type type, bool bind);
|
|
|
|
struct mlxsw_sp_span_entry *
|
2018-02-27 20:53:44 +07:00
|
|
|
mlxsw_sp_span_entry_find_by_port(struct mlxsw_sp *mlxsw_sp,
|
|
|
|
const struct net_device *to_dev);
|
|
|
|
|
|
|
|
void mlxsw_sp_span_entry_invalidate(struct mlxsw_sp *mlxsw_sp,
|
|
|
|
struct mlxsw_sp_span_entry *span_entry);
|
2018-02-13 17:27:48 +07:00
|
|
|
|
|
|
|
int mlxsw_sp_span_port_mtu_update(struct mlxsw_sp_port *port, u16 mtu);
|
|
|
|
|
|
|
|
#endif
|