Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F161589123
D45402.id139201.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D45402.id139201.diff
View Options
diff --git a/sys/dev/cxgbe/t4_iov.c b/sys/dev/cxgbe/t4_iov.c
--- a/sys/dev/cxgbe/t4_iov.c
+++ b/sys/dev/cxgbe/t4_iov.c
@@ -29,8 +29,11 @@
#include <sys/bus.h>
#include <sys/kernel.h>
#include <sys/module.h>
+#include <sys/socket.h>
#include <sys/systm.h>
#include <dev/pci/pcivar.h>
+#include <net/if.h>
+#include <net/if_vlan_var.h>
#ifdef PCI_IOV
#include <sys/nv.h>
@@ -257,6 +260,8 @@
pf_schema = pci_iov_schema_alloc_node();
vf_schema = pci_iov_schema_alloc_node();
pci_iov_schema_add_unicast_mac(vf_schema, "mac-addr", 0, NULL);
+ pci_iov_schema_add_vlan(vf_schema, "vlan", IOV_SCHEMA_HASDEFAULT,
+ DOT1Q_VID_NULL);
error = pci_iov_attach_name(dev, pf_schema, vf_schema, "%s",
device_get_nameunit(pdev));
if (error) {
@@ -336,14 +341,15 @@
size_t size;
int rc;
+ sc = device_get_softc(dev);
+ MPASS(sc->sc_attached);
+ MPASS(sc->sc_main != NULL);
+ adap = device_get_softc(sc->sc_main);
+
if (nvlist_exists_binary(config, "mac-addr")) {
mac = nvlist_get_binary(config, "mac-addr", &size);
bcopy(mac, ma, ETHER_ADDR_LEN);
- sc = device_get_softc(dev);
- MPASS(sc->sc_attached);
- MPASS(sc->sc_main != NULL);
- adap = device_get_softc(sc->sc_main);
if (begin_synchronized_op(adap, NULL, SLEEP_OK | INTR_OK,
"t4vfma") != 0)
return (ENXIO);
@@ -358,6 +364,22 @@
}
}
+ if (nvlist_exists_number(config, "vlan")) {
+ uint16_t vlan = nvlist_get_number(config, "vlan");
+
+ if (begin_synchronized_op(adap, NULL, SLEEP_OK | INTR_OK,
+ "t4vfma") != 0)
+ return (ENXIO);
+ rc = t4_set_vlan_acl(adap, adap->mbox, vfnum + 1, vlan);
+ end_synchronized_op(adap, 0);
+ if (rc != 0) {
+ device_printf(dev,
+ "Failed to set VF%d VLAN to %d, rc = %d\n",
+ vfnum, vlan, rc);
+ return (rc);
+ }
+ }
+
return (0);
}
#endif
diff --git a/sys/dev/mlx5/mlx5_core/mlx5_main.c b/sys/dev/mlx5/mlx5_core/mlx5_main.c
--- a/sys/dev/mlx5/mlx5_core/mlx5_main.c
+++ b/sys/dev/mlx5/mlx5_core/mlx5_main.c
@@ -52,8 +52,11 @@
#include <dev/mlx5/mlx5_core/diag_cnt.h>
#ifdef PCI_IOV
#include <sys/nv.h>
+#include <sys/socket.h>
#include <dev/pci/pci_iov.h>
#include <sys/iov_schema.h>
+#include <net/if.h>
+#include <net/if_vlan_var.h>
#endif
static const char mlx5_version[] = "Mellanox Core driver "
@@ -225,6 +228,7 @@
#ifdef PCI_IOV
static const char iov_mac_addr_name[] = "mac-addr";
+static const char iov_vlan_name[] = "vlan";
static const char iov_node_guid_name[] = "node-guid";
static const char iov_port_guid_name[] = "port-guid";
#endif
@@ -1714,6 +1718,9 @@
vf_schema = pci_iov_schema_alloc_node();
pci_iov_schema_add_unicast_mac(vf_schema,
iov_mac_addr_name, 0, NULL);
+ pci_iov_schema_add_vlan(vf_schema,
+ iov_vlan_name, IOV_SCHEMA_HASDEFAULT,
+ DOT1Q_VID_NULL);
pci_iov_schema_add_uint64(vf_schema, iov_node_guid_name,
0, 0);
pci_iov_schema_add_uint64(vf_schema, iov_port_guid_name,
@@ -1950,6 +1957,18 @@
}
}
+ if (nvlist_exists_number(vf_config, iov_vlan_name)) {
+ uint16_t vlan = nvlist_get_number(vf_config, iov_vlan_name);
+
+ error = -mlx5_eswitch_set_vport_vlan(priv->eswitch,
+ vfnum + 1, vlan, 0);
+ if (error != 0) {
+ mlx5_core_err(core_dev,
+ "setting VLAN for VF %d failed, error %d\n",
+ vfnum + 1, error);
+ }
+ }
+
if (nvlist_exists_number(vf_config, iov_node_guid_name)) {
node_guid = nvlist_get_number(vf_config, iov_node_guid_name);
error = -mlx5_modify_nic_vport_node_guid(core_dev, vfnum + 1,
diff --git a/sys/dev/pci/pci_iov_schema.c b/sys/dev/pci/pci_iov_schema.c
--- a/sys/dev/pci/pci_iov_schema.c
+++ b/sys/dev/pci/pci_iov_schema.c
@@ -54,11 +54,13 @@
static validate_func pci_iov_schema_validate_string;
static validate_func pci_iov_schema_validate_uint;
static validate_func pci_iov_schema_validate_unicast_mac;
+static validate_func pci_iov_schema_validate_vlan;
static default_validate_t pci_iov_validate_bool_default;
static default_validate_t pci_iov_validate_string_default;
static default_validate_t pci_iov_validate_uint_default;
static default_validate_t pci_iov_validate_unicast_mac_default;
+static default_validate_t pci_iov_validate_vlan_default;
struct config_type_validator {
const char *type_name;
@@ -107,6 +109,11 @@
.validate = pci_iov_schema_validate_unicast_mac,
.default_validate = pci_iov_validate_unicast_mac_default,
},
+ {
+ .type_name = "vlan",
+ .validate = pci_iov_schema_validate_vlan,
+ .default_validate = pci_iov_validate_vlan_default,
+ },
};
static const struct config_type_validator *
@@ -261,6 +268,26 @@
nvlist_move_nvlist(schema, name, entry);
}
+void
+pci_iov_schema_add_vlan(nvlist_t *schema, const char *name,
+ uint32_t flags, const uint16_t defaultVal)
+{
+ nvlist_t *entry;
+
+ entry = nvlist_create(NV_FLAG_IGNORE_CASE);
+ if (entry == NULL) {
+ nvlist_set_error(schema, ENOMEM);
+ return;
+ }
+
+ pci_iov_schema_add_type(entry, "vlan");
+ if (flags & IOV_SCHEMA_HASDEFAULT)
+ nvlist_add_number(entry, "default", defaultVal);
+ pci_iov_schema_add_required(entry, flags);
+
+ nvlist_move_nvlist(schema, name, entry);
+}
+
static int
pci_iov_schema_validate_bool(const struct config_type_validator * validator,
const nvlist_t *config, const char *name)
@@ -320,6 +347,24 @@
return (0);
}
+static int
+pci_iov_schema_validate_vlan(
+ const struct config_type_validator * validator,
+ const nvlist_t *config, const char *name)
+{
+ uint16_t vlan;
+
+ if (!nvlist_exists_number(config, name))
+ return (EINVAL);
+
+ vlan = nvlist_get_number(config, name);
+
+ if (vlan > 4095)
+ return (EINVAL);
+
+ return (0);
+}
+
static void
pci_iov_config_add_default(const nvlist_t *param_schema, const char *name,
nvlist_t *config)
@@ -400,6 +445,22 @@
return (0);
}
+static int
+pci_iov_validate_vlan_default(
+ const struct config_type_validator * validator, const nvlist_t *param)
+{
+ uint16_t vlan;
+
+ if (! nvlist_exists_number(param, DEFAULT_SCHEMA_NAME))
+ return (EINVAL);
+
+ vlan = nvlist_get_number(param, DEFAULT_SCHEMA_NAME);
+ if (vlan > 4095)
+ return (EINVAL);
+
+ return (0);
+}
+
static int
pci_iov_validate_param_schema(const nvlist_t *schema)
{
diff --git a/sys/sys/iov_schema.h b/sys/sys/iov_schema.h
--- a/sys/sys/iov_schema.h
+++ b/sys/sys/iov_schema.h
@@ -48,5 +48,6 @@
uint32_t flags, uint64_t defaultVal);
void pci_iov_schema_add_unicast_mac(nvlist_t *schema, const char *name,
uint32_t flags, const uint8_t * defaultVal);
-
+void pci_iov_schema_add_vlan(nvlist_t *schema, const char *name,
+ uint32_t flags, const uint16_t defaultVal);
#endif
diff --git a/usr.sbin/iovctl/iovctl.c b/usr.sbin/iovctl/iovctl.c
--- a/usr.sbin/iovctl/iovctl.c
+++ b/usr.sbin/iovctl/iovctl.c
@@ -345,6 +345,9 @@
mac = nvlist_get_binary(parameter, DEFAULT_SCHEMA_NAME, &size);
printf(" (default = %02x:%02x:%02x:%02x:%02x:%02x)", mac[0],
mac[1], mac[2], mac[3], mac[4], mac[5]);
+ } else if (strcasecmp(type, "vlan") == 0) {
+ uint16_t vlan = nvlist_get_number(parameter, DEFAULT_SCHEMA_NAME);
+ printf(" (default = %d)", vlan);
} else
errx(1, "Unexpected type in schema: '%s'", type);
}
diff --git a/usr.sbin/iovctl/iovctl.conf.5 b/usr.sbin/iovctl/iovctl.conf.5
--- a/usr.sbin/iovctl/iovctl.conf.5
+++ b/usr.sbin/iovctl/iovctl.conf.5
@@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd May 29, 2020
+.Dd May 30, 2024
.Dt IOVCTL.CONF 5
.Os
.Sh NAME
@@ -95,6 +95,8 @@
.Bl -tag -width indent
.It boolean
Accepts a boolean value of true or false.
+.It vlan
+Accepts a VLAN number, 0 indicates no VLAN tag.
.It mac-addr
Accepts a unicast MAC address specified as a string of the form
xx:xx:xx:xx:xx:xx, where xx is one or two hexadecimal digits.
@@ -159,6 +161,7 @@
VF-0 {
mac-addr : "02:56:48:7e:d9:f7";
passthrough : false;
+ vlan: 1;
}
.Ed
.Sh SEE ALSO
diff --git a/usr.sbin/iovctl/parse.c b/usr.sbin/iovctl/parse.c
--- a/usr.sbin/iovctl/parse.c
+++ b/usr.sbin/iovctl/parse.c
@@ -186,6 +186,8 @@
add_uint_config(key, obj, config, type, UINT64_MAX);
else if (strcasecmp(type, "unicast-mac") == 0)
add_unicast_mac_config(key, obj, config);
+ else if (strcasecmp(type, "vlan") == 0)
+ add_uint_config(key, obj, config, type, 4095);
else
errx(1, "Unexpected type '%s' in schema", type);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Jul 6, 3:49 AM (10 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34734423
Default Alt Text
D45402.id139201.diff (8 KB)
Attached To
Mode
D45402: iovctl: allow vlan restrictions to be passed to the driver
Attached
Detach File
Event Timeline
Log In to Comment