freebsd-skq/sys/dev/etherswitch/etherswitch_if.m
adrian a07554bea5 [etherswitch] add the first pass of a simple API to flush and fetch the L2 address table from the ethernet switch.
This stuff may be a bit fluid during this -HEAD cycle as various other
switch features are added, but the current stuff is enough to drive
initial development and features on the atheros range of integrated
and external switches.

* add a method to flush the whole address table;
* add a method to flush all addresses on a given port;
* add a method to download the address table;
* .. and then a method to fetch entries from the address table.

The table fetch/read methods pass through to the drivers for now since
the drivers may implement different ways of fetching/caching the address
table data.  The atheros devices for example fetch the table by
iterating over the table through a set of registers and so you need
to keep that locked whilst you iterate otherwise you may have the table
flushed half way by a port status change.

This is a no-op until the userland and arswitch code shows up.
2018-02-02 02:05:14 +00:00

222 lines
3.1 KiB
Objective-C

# $FreeBSD$
#include <sys/bus.h>
# Needed for ifreq/ifmediareq
#include <sys/socket.h>
#include <net/if.h>
#include <dev/etherswitch/etherswitch.h>
INTERFACE etherswitch;
#
# Default implementation
#
CODE {
static void
null_etherswitch_lock(device_t dev)
{
}
static void
null_etherswitch_unlock(device_t dev)
{
}
static int
null_etherswitch_getconf(device_t dev, etherswitch_conf_t *conf)
{
return (0);
}
static int
null_etherswitch_setconf(device_t dev, etherswitch_conf_t *conf)
{
return (0);
}
static int
null_etherswitch_flush_all(device_t dev)
{
return (ENXIO);
}
static int
null_etherswitch_flush_port(device_t dev, int port)
{
return (ENXIO);
}
static int
null_etherswitch_flush_mac(device_t dev,
etherswitch_atu_flush_macentry_t *e)
{
return (ENXIO);
}
static int
null_etherswitch_fetch_table(device_t dev,
etherswitch_atu_table_t *table)
{
table->es_nitems = 0;
return (ENXIO);
}
static int
null_etherswitch_fetch_entry(device_t dev,
etherswitch_atu_entry_t *e)
{
return (ENXIO);
}
};
#
# Return device info
#
METHOD etherswitch_info_t* getinfo {
device_t dev;
}
#
# Lock access to switch registers
#
METHOD void lock {
device_t dev;
} DEFAULT null_etherswitch_lock;
#
# Unlock access to switch registers
#
METHOD void unlock {
device_t dev;
} DEFAULT null_etherswitch_unlock;
#
# Read switch register
#
METHOD int readreg {
device_t dev;
int reg;
};
#
# Write switch register
#
METHOD int writereg {
device_t dev;
int reg;
int value;
};
#
# Read PHY register
#
METHOD int readphyreg {
device_t dev;
int phy;
int reg;
};
#
# Write PHY register
#
METHOD int writephyreg {
device_t dev;
int phy;
int reg;
int value;
};
#
# Get port configuration
#
METHOD int getport {
device_t dev;
etherswitch_port_t *vg;
}
#
# Set port configuration
#
METHOD int setport {
device_t dev;
etherswitch_port_t *vg;
}
#
# Get VLAN group configuration
#
METHOD int getvgroup {
device_t dev;
etherswitch_vlangroup_t *vg;
}
#
# Set VLAN group configuration
#
METHOD int setvgroup {
device_t dev;
etherswitch_vlangroup_t *vg;
}
#
# Get the Switch configuration
#
METHOD int getconf {
device_t dev;
etherswitch_conf_t *conf;
} DEFAULT null_etherswitch_getconf;
#
# Set the Switch configuration
#
METHOD int setconf {
device_t dev;
etherswitch_conf_t *conf;
} DEFAULT null_etherswitch_setconf;
#
# Flush all of the programmed/learnt MAC addresses
#
METHOD int flush_all {
device_t dev;
} DEFAULT null_etherswitch_flush_all;
#
# Flush a single MAC address entry
#
METHOD int flush_mac {
device_t dev;
etherswitch_atu_flush_macentry_t *entry;
} DEFAULT null_etherswitch_flush_mac;
#
# Flush all of the dynamic MAC addresses on a given port
#
METHOD int flush_port {
device_t dev;
int port;
} DEFAULT null_etherswitch_flush_port;
#
# Fetch the address table from the ethernet switch.
#
METHOD int fetch_table {
device_t dev;
etherswitch_atu_table_t *table;
} DEFAULT null_etherswitch_fetch_table;
#
# Fetch a single entry from the ethernet switch table.
#
METHOD int fetch_table_entry {
device_t dev;
etherswitch_atu_entry_t *entry;
} DEFAULT null_etherswitch_fetch_entry;