hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
/* Copyright (c) 2018 Mellanox Technologies. All rights reserved */
 
#ifndef _MLXSW_SPECTRUM_SPAN_H
#define _MLXSW_SPECTRUM_SPAN_H
 
#include <linux/types.h>
#include <linux/if_ether.h>
 
#include "spectrum_router.h"
 
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;
 
   /* Whether this is a directly bound mirror (port-to-port) or an ACL. */
   bool bound;
};
 
struct mlxsw_sp_span_parms {
   struct mlxsw_sp_port *dest_port; /* NULL for unoffloaded SPAN. */
   unsigned int ttl;
   unsigned char dmac[ETH_ALEN];
   unsigned char smac[ETH_ALEN];
   union mlxsw_sp_l3addr daddr;
   union mlxsw_sp_l3addr saddr;
   u16 vid;
};
 
struct mlxsw_sp_span_entry_ops;
 
struct mlxsw_sp_span_entry {
   const struct net_device *to_dev;
   const struct mlxsw_sp_span_entry_ops *ops;
   struct mlxsw_sp_span_parms parms;
   struct list_head bound_ports_list;
   int ref_count;
   int id;
};
 
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);
};
 
int mlxsw_sp_span_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_span_fini(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_span_respin(struct mlxsw_sp *mlxsw_sp);
 
int mlxsw_sp_span_mirror_add(struct mlxsw_sp_port *from,
                const struct net_device *to_dev,
                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,
                 enum mlxsw_sp_span_type type, bool bind);
struct mlxsw_sp_span_entry *
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);
 
int mlxsw_sp_span_port_mtu_update(struct mlxsw_sp_port *port, u16 mtu);
 
#endif