summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Chadd <adrian@FreeBSD.org>2018-02-02 02:05:14 +0000
committerAdrian Chadd <adrian@FreeBSD.org>2018-02-02 02:05:14 +0000
commit877d73ecb4728d42b5deae19cccb8715d77e6e43 (patch)
tree560d2cde25ff7b18d1b65085e25dc6e732dbee5d
parent26772fefc1c9553d2a3fefbaf035c32f5b2258a5 (diff)
Notes
-rw-r--r--sys/dev/etherswitch/etherswitch.c18
-rw-r--r--sys/dev/etherswitch/etherswitch.h28
-rw-r--r--sys/dev/etherswitch/etherswitch_if.m78
3 files changed, 124 insertions, 0 deletions
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 <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
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;