summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorGirish Moodalbail <Girish.Moodalbail@Sun.COM>2010-04-07 11:44:20 -0400
committerGirish Moodalbail <Girish.Moodalbail@Sun.COM>2010-04-07 11:44:20 -0400
commit8b88711aa8fd0a7b5c9ea1947bc568831e46190c (patch)
tree18b081b6922f7e6ab0acaee9e5b7d975527869ef /usr/src
parent17d7121191d7d90045353185656b2128127d2178 (diff)
downloadillumos-gate-8b88711aa8fd0a7b5c9ea1947bc568831e46190c.tar.gz
6939396 the qualifiers + & - should only work for applicable protocol properties
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c19
-rw-r--r--usr/src/lib/libipadm/common/ipadm_addr.c39
-rw-r--r--usr/src/lib/libipadm/common/ipadm_prop.c98
-rw-r--r--usr/src/lib/libipadm/common/libipadm_impl.h7
4 files changed, 90 insertions, 73 deletions
diff --git a/usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c b/usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c
index 75833cf5b5..597f50ac7b 100644
--- a/usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c
+++ b/usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <arpa/inet.h>
#include <errno.h>
@@ -946,20 +945,20 @@ do_show_prop(int argc, char **argv, const char *use)
* then sets IPADM_OPT_APPEND or IPADM_OPT_REMOVE, accordingly.
*/
static void
-parse_modifiers(char *pstr, uint_t *flags, const char *use)
+parse_modifiers(const char *pstr, uint_t *flags, const char *use)
{
char *p;
- p = strpbrk(pstr, "+-");
- if (p == NULL)
- return; /* Nothing to parse, return */
+ if ((p = strchr(pstr, '=')) == NULL)
+ return;
- if (p[1] != '=')
- die("badly used modifier.\n%s", use);
+ if (p == pstr)
+ die("Invalid prop=val specified\n%s", use);
- if (p[0] == '+')
+ --p;
+ if (*p == '+')
*flags |= IPADM_OPT_APPEND;
- else
+ else if (*p == '-')
*flags |= IPADM_OPT_REMOVE;
}
diff --git a/usr/src/lib/libipadm/common/ipadm_addr.c b/usr/src/lib/libipadm/common/ipadm_addr.c
index fb39cb1a24..065b6ae24d 100644
--- a/usr/src/lib/libipadm/common/ipadm_addr.c
+++ b/usr/src/lib/libipadm/common/ipadm_addr.c
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
@@ -97,31 +96,31 @@ static ipadm_pd_setf_t i_ipadm_set_prefixlen, i_ipadm_set_addr_flag,
/* address properties description table */
ipadm_prop_desc_t ipadm_addrprop_table[] = {
- { "broadcast", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE,
+ { "broadcast", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE, 0,
NULL, NULL, i_ipadm_get_broadcast },
- { "deprecated", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE,
+ { "deprecated", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE, 0,
i_ipadm_set_addr_flag, i_ipadm_get_onoff,
i_ipadm_get_addr_flag },
- { "prefixlen", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE,
+ { "prefixlen", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE, 0,
i_ipadm_set_prefixlen, i_ipadm_get_prefixlen,
i_ipadm_get_prefixlen },
- { "private", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE,
+ { "private", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE, 0,
i_ipadm_set_addr_flag, i_ipadm_get_onoff, i_ipadm_get_addr_flag },
- { "transmit", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE,
+ { "transmit", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE, 0,
i_ipadm_set_addr_flag, i_ipadm_get_onoff, i_ipadm_get_addr_flag },
- { "zone", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE,
+ { "zone", IPADMPROP_CLASS_ADDR, MOD_PROTO_NONE, 0,
i_ipadm_set_zone, NULL, i_ipadm_get_zone },
- { NULL, 0, 0, NULL, NULL, NULL }
+ { NULL, 0, 0, 0, NULL, NULL, NULL }
};
static ipadm_prop_desc_t up_addrprop = { "up", IPADMPROP_CLASS_ADDR,
- MOD_PROTO_NONE, NULL, NULL, NULL };
+ MOD_PROTO_NONE, 0, NULL, NULL, NULL };
/*
* Helper function that initializes the `ipadm_ifname', `ipadm_aobjname', and
@@ -1489,6 +1488,11 @@ ipadm_set_addrprop(ipadm_handle_t iph, const char *pname,
if (pdp->ipd_set == NULL || (reset && pdp->ipd_get == NULL))
return (IPADM_NOTSUP);
+ if (!(pdp->ipd_flags & IPADMPROP_MULVAL) &&
+ (pflags & (IPADM_OPT_APPEND|IPADM_OPT_REMOVE))) {
+ return (IPADM_INVALID_ARG);
+ }
+
/*
* For the given aobjname, get the addrobj it represents and
* set the property value for that object.
@@ -2163,13 +2167,14 @@ ipadm_create_addrobj(ipadm_addr_type_t type, const char *aobjname,
newaddr->ipadm_af = AF_INET;
break;
- case IPADM_ADDR_STATIC:
- newaddr->ipadm_af = AF_UNSPEC;
- newaddr->ipadm_static_prefixlen = 0;
- break;
- default:
- status = IPADM_INVALID_ARG;
- goto fail;
+ case IPADM_ADDR_STATIC:
+ newaddr->ipadm_af = AF_UNSPEC;
+ newaddr->ipadm_static_prefixlen = 0;
+ break;
+
+ default:
+ status = IPADM_INVALID_ARG;
+ goto fail;
}
newaddr->ipadm_atype = type;
*ipaddr = newaddr;
diff --git a/usr/src/lib/libipadm/common/ipadm_prop.c b/usr/src/lib/libipadm/common/ipadm_prop.c
index 56aba6bb2d..060158cd29 100644
--- a/usr/src/lib/libipadm/common/ipadm_prop.c
+++ b/usr/src/lib/libipadm/common/ipadm_prop.c
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
@@ -88,55 +87,55 @@ static int protocols[] = { MOD_PROTO_IP, MOD_PROTO_RAWIP,
* Supported IP protocol properties.
*/
static ipadm_prop_desc_t ipadm_ip_prop_table[] = {
- { "arp", IPADMPROP_CLASS_IF, MOD_PROTO_IPV4,
+ { "arp", IPADMPROP_CLASS_IF, MOD_PROTO_IPV4, 0,
i_ipadm_set_ifprop_flags, i_ipadm_get_onoff,
i_ipadm_get_ifprop_flags },
- { "forwarding", IPADMPROP_CLASS_MODIF, MOD_PROTO_IPV4,
+ { "forwarding", IPADMPROP_CLASS_MODIF, MOD_PROTO_IPV4, 0,
i_ipadm_set_forwarding, i_ipadm_get_onoff,
i_ipadm_get_forwarding },
- { "metric", IPADMPROP_CLASS_IF, MOD_PROTO_IPV4,
+ { "metric", IPADMPROP_CLASS_IF, MOD_PROTO_IPV4, 0,
i_ipadm_set_metric, NULL, i_ipadm_get_metric },
- { "mtu", IPADMPROP_CLASS_IF, MOD_PROTO_IPV4,
+ { "mtu", IPADMPROP_CLASS_IF, MOD_PROTO_IPV4, 0,
i_ipadm_set_mtu, i_ipadm_get_mtu, i_ipadm_get_mtu },
- { "exchange_routes", IPADMPROP_CLASS_IF, MOD_PROTO_IPV4,
+ { "exchange_routes", IPADMPROP_CLASS_IF, MOD_PROTO_IPV4, 0,
i_ipadm_set_ifprop_flags, i_ipadm_get_onoff,
i_ipadm_get_ifprop_flags },
- { "usesrc", IPADMPROP_CLASS_IF, MOD_PROTO_IPV4,
+ { "usesrc", IPADMPROP_CLASS_IF, MOD_PROTO_IPV4, 0,
i_ipadm_set_usesrc, NULL, i_ipadm_get_usesrc },
- { "ttl", IPADMPROP_CLASS_MODULE, MOD_PROTO_IPV4,
+ { "ttl", IPADMPROP_CLASS_MODULE, MOD_PROTO_IPV4, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "forwarding", IPADMPROP_CLASS_MODIF, MOD_PROTO_IPV6,
+ { "forwarding", IPADMPROP_CLASS_MODIF, MOD_PROTO_IPV6, 0,
i_ipadm_set_forwarding, i_ipadm_get_onoff,
i_ipadm_get_forwarding },
- { "hoplimit", IPADMPROP_CLASS_MODULE, MOD_PROTO_IPV6,
+ { "hoplimit", IPADMPROP_CLASS_MODULE, MOD_PROTO_IPV6, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "metric", IPADMPROP_CLASS_IF, MOD_PROTO_IPV6,
+ { "metric", IPADMPROP_CLASS_IF, MOD_PROTO_IPV6, 0,
i_ipadm_set_metric, NULL, i_ipadm_get_metric },
- { "mtu", IPADMPROP_CLASS_IF, MOD_PROTO_IPV6,
+ { "mtu", IPADMPROP_CLASS_IF, MOD_PROTO_IPV6, 0,
i_ipadm_set_mtu, i_ipadm_get_mtu, i_ipadm_get_mtu },
- { "nud", IPADMPROP_CLASS_IF, MOD_PROTO_IPV6,
+ { "nud", IPADMPROP_CLASS_IF, MOD_PROTO_IPV6, 0,
i_ipadm_set_ifprop_flags, i_ipadm_get_onoff,
i_ipadm_get_ifprop_flags },
- { "exchange_routes", IPADMPROP_CLASS_IF, MOD_PROTO_IPV6,
+ { "exchange_routes", IPADMPROP_CLASS_IF, MOD_PROTO_IPV6, 0,
i_ipadm_set_ifprop_flags, i_ipadm_get_onoff,
i_ipadm_get_ifprop_flags },
- { "usesrc", IPADMPROP_CLASS_IF, MOD_PROTO_IPV6,
+ { "usesrc", IPADMPROP_CLASS_IF, MOD_PROTO_IPV6, 0,
i_ipadm_set_usesrc, NULL, i_ipadm_get_usesrc },
- { NULL, 0, 0, NULL, NULL, NULL }
+ { NULL, 0, 0, 0, NULL, NULL, NULL }
};
/* possible values for TCP properties `ecn' and `sack' */
@@ -144,88 +143,91 @@ static const char *ecn_sack_vals[] = {"never", "passive", "active", NULL};
/* Supported TCP protocol properties */
static ipadm_prop_desc_t ipadm_tcp_prop_table[] = {
- { "ecn", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP,
+ { "ecn", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP, 0,
i_ipadm_set_ecnsack, i_ipadm_get_ecnsack, i_ipadm_get_ecnsack },
{ "extra_priv_ports", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP,
- i_ipadm_set_eprivport, i_ipadm_get_prop, i_ipadm_get_prop },
+ IPADMPROP_MULVAL, i_ipadm_set_eprivport, i_ipadm_get_prop,
+ i_ipadm_get_prop },
- { "largest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP,
+ { "largest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "recv_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP,
+ { "recv_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "sack", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP,
+ { "sack", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP, 0,
i_ipadm_set_ecnsack, i_ipadm_get_ecnsack, i_ipadm_get_ecnsack },
- { "send_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP,
+ { "send_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "smallest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP,
+ { "smallest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "smallest_nonpriv_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP,
+ { "smallest_nonpriv_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_TCP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { NULL, 0, 0, NULL, NULL, NULL }
+ { NULL, 0, 0, 0, NULL, NULL, NULL }
};
/* Supported UDP protocol properties */
static ipadm_prop_desc_t ipadm_udp_prop_table[] = {
{ "extra_priv_ports", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP,
- i_ipadm_set_eprivport, i_ipadm_get_prop, i_ipadm_get_prop },
+ IPADMPROP_MULVAL, i_ipadm_set_eprivport, i_ipadm_get_prop,
+ i_ipadm_get_prop },
- { "largest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP,
+ { "largest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "recv_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP,
+ { "recv_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "send_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP,
+ { "send_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "smallest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP,
+ { "smallest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "smallest_nonpriv_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP,
+ { "smallest_nonpriv_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_UDP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { NULL, 0, 0, NULL, NULL, NULL }
+ { NULL, 0, 0, 0, NULL, NULL, NULL }
};
/* Supported SCTP protocol properties */
static ipadm_prop_desc_t ipadm_sctp_prop_table[] = {
{ "extra_priv_ports", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP,
- i_ipadm_set_eprivport, i_ipadm_get_prop, i_ipadm_get_prop },
+ IPADMPROP_MULVAL, i_ipadm_set_eprivport, i_ipadm_get_prop,
+ i_ipadm_get_prop },
- { "largest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP,
+ { "largest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "recv_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP,
+ { "recv_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "send_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP,
+ { "send_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "smallest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP,
+ { "smallest_anon_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "smallest_nonpriv_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP,
+ { "smallest_nonpriv_port", IPADMPROP_CLASS_MODULE, MOD_PROTO_SCTP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { NULL, 0, 0, NULL, NULL, NULL }
+ { NULL, 0, 0, 0, NULL, NULL, NULL }
};
/* Supported ICMP protocol properties */
static ipadm_prop_desc_t ipadm_icmp_prop_table[] = {
- { "recv_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_RAWIP,
+ { "recv_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_RAWIP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { "send_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_RAWIP,
+ { "send_maxbuf", IPADMPROP_CLASS_MODULE, MOD_PROTO_RAWIP, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop },
- { NULL, 0, 0, NULL, NULL, NULL }
+ { NULL, 0, 0, 0, NULL, NULL, NULL }
};
/*
@@ -233,7 +235,7 @@ static ipadm_prop_desc_t ipadm_icmp_prop_table[] = {
* protocol properties (properties not yet supported by libipadm).
*/
static ipadm_prop_desc_t ipadm_privprop =\
- { NULL, IPADMPROP_CLASS_MODULE, MOD_PROTO_NONE,
+ { NULL, IPADMPROP_CLASS_MODULE, MOD_PROTO_NONE, 0,
i_ipadm_set_prop, i_ipadm_get_prop, i_ipadm_get_prop };
/*
@@ -1262,6 +1264,14 @@ i_ipadm_setprop_common(ipadm_handle_t iph, const char *ifname,
if (!(pdp->ipd_class & IPADMPROP_CLASS_MODULE))
return (IPADM_INVALID_ARG);
}
+ /*
+ * if the property is not multi-valued and IPADM_OPT_APPEND or
+ * IPADM_OPT_REMOVE is specified, return IPADM_INVALID_ARG.
+ */
+ if (!(pdp->ipd_flags & IPADMPROP_MULVAL) && (pflags &
+ (IPADM_OPT_APPEND|IPADM_OPT_REMOVE))) {
+ return (IPADM_INVALID_ARG);
+ }
} else {
/*
* if we matched name, but failed protocol check,
diff --git a/usr/src/lib/libipadm/common/libipadm_impl.h b/usr/src/lib/libipadm/common/libipadm_impl.h
index 6572bc64b7..471f74d52f 100644
--- a/usr/src/lib/libipadm/common/libipadm_impl.h
+++ b/usr/src/lib/libipadm/common/libipadm_impl.h
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _LIBIPADM_IMPL_H
@@ -125,11 +124,15 @@ struct ipadm_prop_desc {
char *ipd_name; /* property name */
uint_t ipd_class; /* prop. class - global/perif/both */
uint_t ipd_proto; /* protocol to which property belongs */
+ uint_t ipd_flags; /* see below */
ipadm_pd_setf_t *ipd_set; /* set callback function */
ipadm_pd_getf_t *ipd_get_range; /* get range callback function */
ipadm_pd_getf_t *ipd_get; /* get value callback function */
};
+/* ipd_flags values */
+#define IPADMPROP_MULVAL 0x00000001 /* property multi-valued */
+
extern ipadm_prop_desc_t ipadm_addrprop_table[];
extern ipadm_pd_getf_t i_ipadm_get_onoff;