/* Set direction of mirror */ staticvoid sparx5_mirror_dir_set(struct sparx5 *sparx5, u32 idx, u32 dir)
{
spx5_rmw(ANA_AC_PROBE_CFG_PROBE_DIRECTION_SET(dir),
ANA_AC_PROBE_CFG_PROBE_DIRECTION, sparx5,
ANA_AC_PROBE_CFG(idx));
}
/* Set the monitor port for this mirror */ staticvoid sparx5_mirror_monitor_set(struct sparx5 *sparx5, u32 idx,
u32 portno)
{
spx5_rmw(QFWD_FRAME_COPY_CFG_FRMC_PORT_VAL_SET(portno),
QFWD_FRAME_COPY_CFG_FRMC_PORT_VAL, sparx5,
QFWD_FRAME_COPY_CFG(idx + SPX5_QFWD_MP_OFFSET));
}
/* Get the monitor port of this mirror */ static u32 sparx5_mirror_monitor_get(struct sparx5 *sparx5, u32 idx)
{
u32 val = spx5_rd(sparx5,
QFWD_FRAME_COPY_CFG(idx + SPX5_QFWD_MP_OFFSET));
/* Check if port is the monitor port of this mirror */ staticbool sparx5_mirror_has_monitor(struct sparx5 *sparx5, u32 idx,
u32 portno)
{ return sparx5_mirror_monitor_get(sparx5, idx) == portno;
}
/* Get a suitable mirror for this port */ staticint sparx5_mirror_get(struct sparx5_port *sport, struct sparx5_port *mport, u32 dir, u32 *idx)
{ struct sparx5 *sparx5 = sport->sparx5;
u32 i;
/* Check if this port is already used as a monitor port */ for (i = 0; i < SPX5_MIRROR_PROBE_MAX; i++) if (sparx5_mirror_has_monitor(sparx5, i, sport->portno)) return -EINVAL;
/* Check if existing mirror can be reused * (same direction and monitor port).
*/ for (i = 0; i < SPX5_MIRROR_PROBE_MAX; i++) { if (sparx5_mirror_dir_get(sparx5, i) == dir &&
sparx5_mirror_has_monitor(sparx5, i, mport->portno)) {
*idx = i; return 0;
}
}
/* Return free mirror */ for (i = 0; i < SPX5_MIRROR_PROBE_MAX; i++) { if (sparx5_mirror_is_empty(sparx5, i)) {
*idx = i; return 0;
}
}
return -ENOENT;
}
int sparx5_mirror_add(struct sparx5_mall_entry *entry)
{
u32 mirror_idx, dir = sparx5_mirror_to_dir(entry->ingress); struct sparx5_port *sport, *mport; struct sparx5 *sparx5; int err;
/* Source port */
sport = entry->port; /* monitor port */
mport = entry->mirror.port;
sparx5 = sport->sparx5;
if (sport->portno == mport->portno) return -EINVAL;
err = sparx5_mirror_get(sport, mport, dir, &mirror_idx); if (err) return err;
if (sparx5_mirror_contains(sparx5, mirror_idx, sport->portno)) return -EEXIST;
/* Add port to mirror */
sparx5_mirror_port_add(sparx5, mirror_idx, sport->portno);
/* Set direction of mirror */
sparx5_mirror_dir_set(sparx5, mirror_idx, dir);
/* Set monitor port for mirror */
sparx5_mirror_monitor_set(sparx5, mirror_idx, mport->portno);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.