diff --git a/sys/dev/etherswitch/etherswitch.c b/sys/dev/etherswitch/etherswitch.c index c00c68ea4f5f..903bbc12acd3 100644 --- a/sys/dev/etherswitch/etherswitch.c +++ b/sys/dev/etherswitch/etherswitch.c @@ -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; } diff --git a/sys/dev/etherswitch/etherswitch.h b/sys/dev/etherswitch/etherswitch.h index 0076177ebf99..e6feead456c7 100644 --- a/sys/dev/etherswitch/etherswitch.h +++ b/sys/dev/etherswitch/etherswitch.h @@ -6,6 +6,7 @@ #define __SYS_DEV_ETHERSWITCH_ETHERSWITCH_H #include +#include #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 diff --git a/sys/dev/etherswitch/etherswitch_if.m b/sys/dev/etherswitch/etherswitch_if.m index a2aea02ae376..a13013d77c87 100644 --- a/sys/dev/etherswitch/etherswitch_if.m +++ b/sys/dev/etherswitch/etherswitch_if.m @@ -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;