[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.
This commit is contained in:
parent
26772fefc1
commit
877d73ecb4
@ -144,6 +144,7 @@ etherswitchioctl(struct cdev *cdev, u_long cmd, caddr_t data, int flags, struct
|
||||
etherswitch_info_t *info;
|
||||
etherswitch_reg_t *reg;
|
||||
etherswitch_phyreg_t *phyreg;
|
||||
etherswitch_portid_t *portid;
|
||||
int error = 0;
|
||||
|
||||
switch (cmd) {
|
||||
@ -202,6 +203,23 @@ etherswitchioctl(struct cdev *cdev, u_long cmd, caddr_t data, int flags, struct
|
||||
error = ETHERSWITCH_SETCONF(etherswitch, (etherswitch_conf_t *)data);
|
||||
break;
|
||||
|
||||
case IOETHERSWITCHFLUSHALL:
|
||||
error = ETHERSWITCH_FLUSH_ALL(etherswitch);
|
||||
break;
|
||||
|
||||
case IOETHERSWITCHFLUSHPORT:
|
||||
portid = (etherswitch_portid_t *)data;
|
||||
error = ETHERSWITCH_FLUSH_PORT(etherswitch, portid->es_port);
|
||||
break;
|
||||
|
||||
case IOETHERSWITCHGETTABLE:
|
||||
error = ETHERSWITCH_FETCH_TABLE(etherswitch, (void *) data);
|
||||
break;
|
||||
|
||||
case IOETHERSWITCHGETTABLEENTRY:
|
||||
error = ETHERSWITCH_FETCH_TABLE_ENTRY(etherswitch, (void *) data);
|
||||
break;
|
||||
|
||||
default:
|
||||
error = ENOTTY;
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
#define __SYS_DEV_ETHERSWITCH_ETHERSWITCH_H
|
||||
|
||||
#include <sys/ioccom.h>
|
||||
#include <net/ethernet.h>
|
||||
|
||||
#ifdef _KERNEL
|
||||
extern devclass_t etherswitch_devclass;
|
||||
@ -101,6 +102,28 @@ typedef struct etherswitch_vlangroup etherswitch_vlangroup_t;
|
||||
|
||||
#define ETHERSWITCH_PORTMASK(_port) (1 << (_port))
|
||||
|
||||
struct etherswitch_portid {
|
||||
int es_port;
|
||||
};
|
||||
typedef struct etherswitch_portid etherswitch_portid_t;
|
||||
|
||||
struct etherswitch_atu_entry {
|
||||
int id;
|
||||
int es_portmask;
|
||||
uint8_t es_macaddr[ETHER_ADDR_LEN];
|
||||
};
|
||||
typedef struct etherswitch_atu_entry etherswitch_atu_entry_t;
|
||||
|
||||
struct etherswitch_atu_table {
|
||||
uint32_t es_nitems;
|
||||
};
|
||||
typedef struct etherswitch_atu_table etherswitch_atu_table_t;
|
||||
|
||||
struct etherswitch_atu_flush_macentry {
|
||||
uint8_t es_macaddr[ETHER_ADDR_LEN];
|
||||
};
|
||||
typedef struct etherswitch_atu_flush_macentry etherswitch_atu_flush_macentry_t;
|
||||
|
||||
#define IOETHERSWITCHGETINFO _IOR('i', 1, etherswitch_info_t)
|
||||
#define IOETHERSWITCHGETREG _IOWR('i', 2, etherswitch_reg_t)
|
||||
#define IOETHERSWITCHSETREG _IOW('i', 3, etherswitch_reg_t)
|
||||
@ -112,5 +135,10 @@ typedef struct etherswitch_vlangroup etherswitch_vlangroup_t;
|
||||
#define IOETHERSWITCHSETPHYREG _IOW('i', 9, etherswitch_phyreg_t)
|
||||
#define IOETHERSWITCHGETCONF _IOR('i', 10, etherswitch_conf_t)
|
||||
#define IOETHERSWITCHSETCONF _IOW('i', 11, etherswitch_conf_t)
|
||||
#define IOETHERSWITCHFLUSHALL _IOW('i', 12, etherswitch_portid_t) /* Dummy */
|
||||
#define IOETHERSWITCHFLUSHPORT _IOW('i', 13, etherswitch_portid_t)
|
||||
#define IOETHERSWITCHFLUSHMAC _IOW('i', 14, etherswitch_atu_flush_macentry_t)
|
||||
#define IOETHERSWITCHGETTABLE _IOWR('i', 15, etherswitch_atu_table_t)
|
||||
#define IOETHERSWITCHGETTABLEENTRY _IOWR('i', 16, etherswitch_atu_entry_t)
|
||||
|
||||
#endif
|
||||
|
@ -35,6 +35,45 @@ CODE {
|
||||
{
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
#
|
||||
@ -141,3 +180,42 @@ 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;
|
||||
|
Loading…
Reference in New Issue
Block a user