spectrum_span.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
  2. /* Copyright (c) 2018 Mellanox Technologies. All rights reserved */
  3. #ifndef _MLXSW_SPECTRUM_SPAN_H
  4. #define _MLXSW_SPECTRUM_SPAN_H
  5. #include <linux/types.h>
  6. #include <linux/if_ether.h>
  7. #include <linux/refcount.h>
  8. #include "spectrum_router.h"
  9. struct mlxsw_sp;
  10. struct mlxsw_sp_port;
  11. /* SPAN session identifiers that correspond to MLXSW_TRAP_ID_MIRROR_SESSION<i>
  12. * trap identifiers. The session identifier is an attribute of the SPAN agent,
  13. * which determines the trap identifier of packets that are mirrored to the
  14. * CPU. Packets that are trapped to the CPU for the same logical reason (e.g.,
  15. * buffer drops) should use the same session identifier.
  16. */
  17. enum mlxsw_sp_span_session_id {
  18. MLXSW_SP_SPAN_SESSION_ID_BUFFER,
  19. MLXSW_SP_SPAN_SESSION_ID_SAMPLING,
  20. __MLXSW_SP_SPAN_SESSION_ID_MAX = 8,
  21. };
  22. struct mlxsw_sp_span_parms {
  23. struct mlxsw_sp_port *dest_port; /* NULL for unoffloaded SPAN. */
  24. unsigned int ttl;
  25. unsigned char dmac[ETH_ALEN];
  26. unsigned char smac[ETH_ALEN];
  27. union mlxsw_sp_l3addr daddr;
  28. union mlxsw_sp_l3addr saddr;
  29. u16 vid;
  30. u16 policer_id;
  31. bool policer_enable;
  32. enum mlxsw_sp_span_session_id session_id;
  33. };
  34. enum mlxsw_sp_span_trigger {
  35. MLXSW_SP_SPAN_TRIGGER_INGRESS,
  36. MLXSW_SP_SPAN_TRIGGER_EGRESS,
  37. MLXSW_SP_SPAN_TRIGGER_TAIL_DROP,
  38. MLXSW_SP_SPAN_TRIGGER_EARLY_DROP,
  39. MLXSW_SP_SPAN_TRIGGER_ECN,
  40. };
  41. struct mlxsw_sp_span_trigger_parms {
  42. int span_id;
  43. u32 probability_rate;
  44. };
  45. struct mlxsw_sp_span_agent_parms {
  46. const struct net_device *to_dev;
  47. u16 policer_id;
  48. bool policer_enable;
  49. enum mlxsw_sp_span_session_id session_id;
  50. };
  51. struct mlxsw_sp_span_entry_ops;
  52. struct mlxsw_sp_span_ops {
  53. int (*init)(struct mlxsw_sp *mlxsw_sp);
  54. int (*policer_id_base_set)(struct mlxsw_sp *mlxsw_sp,
  55. u16 policer_id_base);
  56. };
  57. struct mlxsw_sp_span_entry {
  58. const struct net_device *to_dev;
  59. const struct mlxsw_sp_span_entry_ops *ops;
  60. struct mlxsw_sp_span_parms parms;
  61. refcount_t ref_count;
  62. int id;
  63. };
  64. struct mlxsw_sp_span_entry_ops {
  65. bool is_static;
  66. bool (*can_handle)(const struct net_device *to_dev);
  67. int (*parms_set)(struct mlxsw_sp *mlxsw_sp,
  68. const struct net_device *to_dev,
  69. struct mlxsw_sp_span_parms *sparmsp);
  70. int (*configure)(struct mlxsw_sp_span_entry *span_entry,
  71. struct mlxsw_sp_span_parms sparms);
  72. void (*deconfigure)(struct mlxsw_sp_span_entry *span_entry);
  73. };
  74. int mlxsw_sp_span_init(struct mlxsw_sp *mlxsw_sp);
  75. void mlxsw_sp_span_fini(struct mlxsw_sp *mlxsw_sp);
  76. void mlxsw_sp_span_respin(struct mlxsw_sp *mlxsw_sp);
  77. struct mlxsw_sp_span_entry *
  78. mlxsw_sp_span_entry_find_by_port(struct mlxsw_sp *mlxsw_sp,
  79. const struct net_device *to_dev);
  80. void mlxsw_sp_span_entry_invalidate(struct mlxsw_sp *mlxsw_sp,
  81. struct mlxsw_sp_span_entry *span_entry);
  82. int mlxsw_sp_span_agent_get(struct mlxsw_sp *mlxsw_sp, int *p_span_id,
  83. const struct mlxsw_sp_span_agent_parms *parms);
  84. void mlxsw_sp_span_agent_put(struct mlxsw_sp *mlxsw_sp, int span_id);
  85. int mlxsw_sp_span_analyzed_port_get(struct mlxsw_sp_port *mlxsw_sp_port,
  86. bool ingress);
  87. void mlxsw_sp_span_analyzed_port_put(struct mlxsw_sp_port *mlxsw_sp_port,
  88. bool ingress);
  89. int mlxsw_sp_span_agent_bind(struct mlxsw_sp *mlxsw_sp,
  90. enum mlxsw_sp_span_trigger trigger,
  91. struct mlxsw_sp_port *mlxsw_sp_port,
  92. const struct mlxsw_sp_span_trigger_parms *parms);
  93. void
  94. mlxsw_sp_span_agent_unbind(struct mlxsw_sp *mlxsw_sp,
  95. enum mlxsw_sp_span_trigger trigger,
  96. struct mlxsw_sp_port *mlxsw_sp_port,
  97. const struct mlxsw_sp_span_trigger_parms *parms);
  98. int mlxsw_sp_span_trigger_enable(struct mlxsw_sp_port *mlxsw_sp_port,
  99. enum mlxsw_sp_span_trigger trigger, u8 tc);
  100. void mlxsw_sp_span_trigger_disable(struct mlxsw_sp_port *mlxsw_sp_port,
  101. enum mlxsw_sp_span_trigger trigger, u8 tc);
  102. bool mlxsw_sp_span_trigger_is_ingress(enum mlxsw_sp_span_trigger trigger);
  103. extern const struct mlxsw_sp_span_ops mlxsw_sp1_span_ops;
  104. extern const struct mlxsw_sp_span_ops mlxsw_sp2_span_ops;
  105. extern const struct mlxsw_sp_span_ops mlxsw_sp3_span_ops;
  106. #endif