summaryrefslogtreecommitdiff
path: root/usr/src/lib/varpd
diff options
context:
space:
mode:
authorRobert Mustacchi <rm@joyent.com>2015-04-09 22:58:13 +0000
committerRobert Mustacchi <rm@joyent.com>2015-04-15 22:38:00 +0000
commitcacad459d9f965c72c230297b502a4dacfc196a3 (patch)
tree239a62d77366c08bd1da1efaab2187ab2d62b7a6 /usr/src/lib/varpd
parent111e3e8e70d0358526a5bc114eeb6d3b089e0d3b (diff)
downloadillumos-joyent-cacad459d9f965c72c230297b502a4dacfc196a3.tar.gz
OS-3958 want documentation for overlay devices
OS-4182 need dladm create-overlay -t OS-4174 long options for dladm *-overlay OS-4179 want search plugin in overlay property list OS-4181 Clean up duplicate VXLAN_MAGIC definition
Diffstat (limited to 'usr/src/lib/varpd')
-rw-r--r--usr/src/lib/varpd/libvarpd/common/libvarpd.c1
-rw-r--r--usr/src/lib/varpd/libvarpd/common/libvarpd_impl.h1
-rw-r--r--usr/src/lib/varpd/libvarpd/common/libvarpd_prop.c74
3 files changed, 72 insertions, 4 deletions
diff --git a/usr/src/lib/varpd/libvarpd/common/libvarpd.c b/usr/src/lib/varpd/libvarpd/common/libvarpd.c
index b08bd629e0..62bf9cc14c 100644
--- a/usr/src/lib/varpd/libvarpd/common/libvarpd.c
+++ b/usr/src/lib/varpd/libvarpd/common/libvarpd.c
@@ -57,7 +57,6 @@ libvarpd_instance_lcomparator(const void *lp, const void *rp)
return (0);
}
-
int
libvarpd_create(varpd_handle_t **vphp)
{
diff --git a/usr/src/lib/varpd/libvarpd/common/libvarpd_impl.h b/usr/src/lib/varpd/libvarpd/common/libvarpd_impl.h
index c273b800f7..7ecd3a952f 100644
--- a/usr/src/lib/varpd/libvarpd/common/libvarpd_impl.h
+++ b/usr/src/lib/varpd/libvarpd/common/libvarpd_impl.h
@@ -193,6 +193,7 @@ extern void libvarpd_plugin_postfork(void);
extern void libvarpd_plugin_fini(void);
extern int libvarpd_plugin_comparator(const void *, const void *);
extern varpd_plugin_t *libvarpd_plugin_lookup(varpd_impl_t *, const char *);
+
extern varpd_instance_t *libvarpd_instance_lookup_by_dlid(varpd_impl_t *,
datalink_id_t);
diff --git a/usr/src/lib/varpd/libvarpd/common/libvarpd_prop.c b/usr/src/lib/varpd/libvarpd/common/libvarpd_prop.c
index 4d50fb372d..ebd40bdfa7 100644
--- a/usr/src/lib/varpd/libvarpd/common/libvarpd_prop.c
+++ b/usr/src/lib/varpd/libvarpd/common/libvarpd_prop.c
@@ -35,6 +35,26 @@ typedef struct varpd_prop_info {
uint8_t vprop_poss[LIBVARPD_PROP_SIZEMAX];
} varpd_prop_info_t;
+/* Internal Properties */
+static int varpd_nintprops = 1;
+static const char *varpd_intprops[] = {
+ "search"
+};
+
+static int
+libvarpd_prop_get_search(varpd_prop_info_t *infop, void *buf, uint32_t *sizep)
+{
+ varpd_plugin_t *vpp = infop->vprop_instance->vri_plugin;
+ size_t nlen;
+
+ nlen = strlen(vpp->vpp_name) + 1;
+ if (nlen > *sizep)
+ return (EOVERFLOW);
+ *sizep = nlen;
+ (void) strlcpy(buf, vpp->vpp_name, *sizep);
+ return (0);
+}
+
void
libvarpd_prop_set_name(varpd_prop_handle_t *phdl, const char *name)
{
@@ -151,9 +171,38 @@ libvarpd_prop_handle_free(varpd_prop_handle_t *phdl)
int
libvarpd_prop_nprops(varpd_instance_handle_t *ihdl, uint_t *np)
{
+ int ret;
varpd_instance_t *instp = (varpd_instance_t *)ihdl;
- return (instp->vri_plugin->vpp_ops->vpo_nprops(instp->vri_private, np));
+ ret = instp->vri_plugin->vpp_ops->vpo_nprops(instp->vri_private, np);
+ if (ret != 0)
+ return (ret);
+ *np += varpd_nintprops;
+ return (0);
+}
+
+static int
+libvarpd_prop_info_fill_int_cb(varpd_handle_t *handle, const char *name,
+ void *arg)
+{
+ varpd_prop_handle_t *vph = arg;
+ libvarpd_prop_set_range_str(vph, name);
+ return (0);
+}
+
+static int
+libvarpd_prop_info_fill_int(varpd_prop_handle_t *vph, uint_t propid)
+{
+ varpd_prop_info_t *infop = (varpd_prop_info_t *)vph;
+ if (propid >= varpd_nintprops)
+ abort();
+ libvarpd_prop_set_name(vph, varpd_intprops[0]);
+ libvarpd_prop_set_prot(vph, OVERLAY_PROP_PERM_READ);
+ libvarpd_prop_set_type(vph, OVERLAY_PROP_T_STRING);
+ libvarpd_prop_set_nodefault(vph);
+ libvarpd_plugin_walk((varpd_handle_t *)infop->vprop_instance->vri_impl,
+ libvarpd_prop_info_fill_int_cb, vph);
+ return (0);
}
int
@@ -164,9 +213,15 @@ libvarpd_prop_info_fill(varpd_prop_handle_t *phdl, uint_t propid)
mac_propval_range_t *rangep = (mac_propval_range_t *)infop->vprop_poss;
infop->vprop_psize = sizeof (mac_propval_range_t);
+
bzero(rangep, sizeof (mac_propval_range_t));
- return (instp->vri_plugin->vpp_ops->vpo_propinfo(instp->vri_private,
- propid, phdl));
+ if (propid < varpd_nintprops) {
+ return (libvarpd_prop_info_fill_int(phdl, propid));
+ } else {
+ varpd_plugin_t *vpp = instp->vri_plugin;
+ return (vpp->vpp_ops->vpo_propinfo(instp->vri_private,
+ propid - varpd_nintprops, phdl));
+ }
}
int
@@ -193,12 +248,18 @@ libvarpd_prop_info(varpd_prop_handle_t *phdl, const char **namep,
int
libvarpd_prop_get(varpd_prop_handle_t *phdl, void *buf, uint32_t *sizep)
{
+ int i;
varpd_prop_info_t *infop = (varpd_prop_info_t *)phdl;
varpd_instance_t *instp = infop->vprop_instance;
if (infop->vprop_name[0] == '\0')
return (EINVAL);
+ if (strcmp(varpd_intprops[0], infop->vprop_name) == 0) {
+ /* search property */
+ return (libvarpd_prop_get_search(infop, buf, sizep));
+ }
+
return (instp->vri_plugin->vpp_ops->vpo_getprop(instp->vri_private,
infop->vprop_name, buf, sizep));
}
@@ -206,12 +267,19 @@ libvarpd_prop_get(varpd_prop_handle_t *phdl, void *buf, uint32_t *sizep)
int
libvarpd_prop_set(varpd_prop_handle_t *phdl, const void *buf, uint32_t size)
{
+ int i;
varpd_prop_info_t *infop = (varpd_prop_info_t *)phdl;
varpd_instance_t *instp = infop->vprop_instance;
if (infop->vprop_name[0] == '\0')
return (EINVAL);
+ for (i = 0; i < varpd_nintprops; i++) {
+ if (strcmp(infop->vprop_name, varpd_intprops[i]) == 0) {
+ return (EPERM);
+ }
+ }
+
return (instp->vri_plugin->vpp_ops->vpo_setprop(instp->vri_private,
infop->vprop_name, buf, size));
}