aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/pci/pci_iov_schema.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/pci/pci_iov_schema.c')
-rw-r--r--sys/dev/pci/pci_iov_schema.c64
1 files changed, 62 insertions, 2 deletions
diff --git a/sys/dev/pci/pci_iov_schema.c b/sys/dev/pci/pci_iov_schema.c
index 3cec329d77a1..f60c687f9b87 100644
--- a/sys/dev/pci/pci_iov_schema.c
+++ b/sys/dev/pci/pci_iov_schema.c
@@ -33,8 +33,7 @@
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/queue.h>
-
-#include <machine/stdarg.h>
+#include <sys/stdarg.h>
#include <sys/dnv.h>
#include <sys/nv.h>
@@ -54,11 +53,13 @@ static validate_func pci_iov_schema_validate_bool;
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 +108,11 @@ static struct config_type_validator pci_iov_schema_validators[] = {
.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 +267,26 @@ pci_iov_schema_add_unicast_mac(nvlist_t *schema, const char *name,
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 +346,24 @@ pci_iov_schema_validate_unicast_mac(
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 && vlan != VF_VLAN_TRUNK)
+ return (EINVAL);
+
+ return (0);
+}
+
static void
pci_iov_config_add_default(const nvlist_t *param_schema, const char *name,
nvlist_t *config)
@@ -401,6 +445,22 @@ pci_iov_validate_unicast_mac_default(
}
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 && vlan != VF_VLAN_TRUNK)
+ return (EINVAL);
+
+ return (0);
+}
+
+static int
pci_iov_validate_param_schema(const nvlist_t *schema)
{
const struct config_type_validator *validator;