diff options
author | Girish Moodalbail <Girish.Moodalbail@Sun.COM> | 2010-04-07 11:44:20 -0400 |
---|---|---|
committer | Girish Moodalbail <Girish.Moodalbail@Sun.COM> | 2010-04-07 11:44:20 -0400 |
commit | 8b88711aa8fd0a7b5c9ea1947bc568831e46190c (patch) | |
tree | 18b081b6922f7e6ab0acaee9e5b7d975527869ef /usr/src | |
parent | 17d7121191d7d90045353185656b2128127d2178 (diff) | |
download | illumos-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.c | 19 | ||||
-rw-r--r-- | usr/src/lib/libipadm/common/ipadm_addr.c | 39 | ||||
-rw-r--r-- | usr/src/lib/libipadm/common/ipadm_prop.c | 98 | ||||
-rw-r--r-- | usr/src/lib/libipadm/common/libipadm_impl.h | 7 |
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; |