6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * CDDL HEADER START
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * The contents of this file are subject to the terms of the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Common Development and Distribution License (the "License").
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * You may not use this file except in compliance with the License.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * or http://www.opensolaris.org/os/licensing.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * See the License for the specific language governing permissions
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * and limitations under the License.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * When distributing Covered Code, include this CDDL HEADER in each
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * If applicable, add the following below this CDDL HEADER, with the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * fields enclosed by brackets "[]" replaced with your own identifying
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * information: Portions Copyright [yyyy] [name of copyright owner]
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * CDDL HEADER END
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
8b88711aa8fd0a7b5c9ea1947bc568831e46190cGirish Moodalbail * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
7bc878958fba2b44705c85efbc07b747ef0eeed1Yuri Pankov * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <arpa/inet.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <errno.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <getopt.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <inet/ip.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <inet/iptun.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <inet/tunables.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <libdladm.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <libdliptun.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <libdllink.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <libinetutil.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <libipadm.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <locale.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <netdb.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <netinet/in.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <ofmt.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <stdarg.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <stddef.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <stdio.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <stdlib.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <string.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <strings.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/stat.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <sys/types.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <zone.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#define STR_UNKNOWN_VAL "?"
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#define LIFC_DEFAULT (LIFC_NOXMIT | LIFC_TEMPORARY | LIFC_ALLZONES |\
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LIFC_UNDER_IPMP)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef void cmdfunc_t(int, char **, const char *);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic cmdfunc_t do_create_if, do_delete_if, do_enable_if, do_disable_if;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic cmdfunc_t do_show_if;
8887b57dc579de11464fc6c74163d2595ce073afGirish Moodalbailstatic cmdfunc_t do_set_prop, do_show_prop, do_set_ifprop;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic cmdfunc_t do_show_ifprop, do_reset_ifprop, do_reset_prop;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic cmdfunc_t do_show_addrprop, do_set_addrprop, do_reset_addrprop;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic cmdfunc_t do_create_addr, do_delete_addr, do_show_addr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic cmdfunc_t do_enable_addr, do_disable_addr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic cmdfunc_t do_up_addr, do_down_addr, do_refresh_addr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct cmd {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *c_name;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cmdfunc_t *c_fn;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail const char *c_usage;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} cmd_t;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic cmd_t cmds[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* interface management related sub-commands */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "create-if", do_create_if, "\tcreate-if\t[-t] <interface>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "disable-if", do_disable_if, "\tdisable-if\t-t <interface>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "enable-if", do_enable_if, "\tenable-if\t-t <interface>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "delete-if", do_delete_if, "\tdelete-if\t<interface>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "show-if", do_show_if,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\tshow-if\t\t[[-p] -o <field>,...] [<interface>]\n" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "set-ifprop", do_set_ifprop,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\tset-ifprop\t[-t] -p <prop>=<value[,...]> -m <protocol> "
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "<interface>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "reset-ifprop", do_reset_ifprop,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\treset-ifprop\t[-t] -p <prop> -m <protocol> <interface>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "show-ifprop", do_show_ifprop,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\tshow-ifprop\t[[-c] -o <field>,...] [-p <prop>,...]\n"
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\t\t\t[-m <protocol>] [interface]\n" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* address management related sub-commands */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "create-addr", do_create_addr,
7bc878958fba2b44705c85efbc07b747ef0eeed1Yuri Pankov "\tcreate-addr\t[-t] -T static [-d] "
7bc878958fba2b44705c85efbc07b747ef0eeed1Yuri Pankov "-a{local|remote}=addr[/prefixlen]\n\t\t\t<addrobj>\n"
7bc878958fba2b44705c85efbc07b747ef0eeed1Yuri Pankov "\tcreate-addr\t[-t] -T dhcp [-w <seconds> | forever] <addrobj>\n"
7bc878958fba2b44705c85efbc07b747ef0eeed1Yuri Pankov "\tcreate-addr\t[-t] -T addrconf [-i interface-id]\n"
7bc878958fba2b44705c85efbc07b747ef0eeed1Yuri Pankov "\t\t\t[-p {stateful|stateless}={yes|no}] <addrobj>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "down-addr", do_down_addr, "\tdown-addr\t[-t] <addrobj>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "up-addr", do_up_addr, "\tup-addr\t\t[-t] <addrobj>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "disable-addr", do_disable_addr, "\tdisable-addr\t-t <addrobj>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "enable-addr", do_enable_addr, "\tenable-addr\t-t <addrobj>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "refresh-addr", do_refresh_addr, "\trefresh-addr\t[-i] <addrobj>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "delete-addr", do_delete_addr, "\tdelete-addr\t[-r] <addrobj>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "show-addr", do_show_addr,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\tshow-addr\t[[-p] -o <field>,...] [<addrobj>]\n" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "set-addrprop", do_set_addrprop,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\tset-addrprop\t[-t] -p <prop>=<value[,...]> <addrobj>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "reset-addrprop", do_reset_addrprop,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\treset-addrprop\t[-t] -p <prop> <addrobj>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "show-addrprop", do_show_addrprop,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\tshow-addrprop\t[[-c] -o <field>,...] [-p <prop>,...] "
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "<addrobj>\n" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* protocol properties related sub-commands */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "set-prop", do_set_prop,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\tset-prop\t[-t] -p <prop>[+|-]=<value[,...]> <protocol>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "reset-prop", do_reset_prop,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\treset-prop\t[-t] -p <prop> <protocol>" },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "show-prop", do_show_prop,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "\tshow-prop\t[[-c] -o <field>,...] [-p <prop>,...]"
8887b57dc579de11464fc6c74163d2595ce073afGirish Moodalbail " [protocol]" }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic const struct option if_longopts[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"temporary", no_argument, 0, 't' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { 0, 0, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic const struct option show_prop_longopts[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"parsable", no_argument, 0, 'c' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"prop", required_argument, 0, 'p' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"output", required_argument, 0, 'o' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { 0, 0, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic const struct option show_ifprop_longopts[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"module", required_argument, 0, 'm' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"parsable", no_argument, 0, 'c' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"prop", required_argument, 0, 'p' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"output", required_argument, 0, 'o' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { 0, 0, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic const struct option set_prop_longopts[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"prop", required_argument, 0, 'p' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"temporary", no_argument, 0, 't' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { 0, 0, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic const struct option set_ifprop_longopts[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"module", required_argument, 0, 'm' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"prop", required_argument, 0, 'p' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"temporary", no_argument, 0, 't' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { 0, 0, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic const struct option addr_misc_longopts[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"inform", no_argument, 0, 'i' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"release", no_argument, 0, 'r' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"temporary", no_argument, 0, 't' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { 0, 0, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic const struct option addr_longopts[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"address", required_argument, 0, 'a' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"down", no_argument, 0, 'd' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"interface-id", required_argument, 0, 'i' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"prop", required_argument, 0, 'p' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"temporary", no_argument, 0, 't' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"type", required_argument, 0, 'T' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"wait", required_argument, 0, 'w' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { 0, 0, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic const struct option show_addr_longopts[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"parsable", no_argument, 0, 'p' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"output", required_argument, 0, 'o' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { 0, 0, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic const struct option show_if_longopts[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"parsable", no_argument, 0, 'p' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {"output", required_argument, 0, 'o' },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { 0, 0, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* callback functions to print show-* subcommands output */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic ofmt_cb_t print_prop_cb;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic ofmt_cb_t print_sa_cb;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic ofmt_cb_t print_si_cb;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* structures for 'ipadm show-*' subcommands */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef enum {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_PROPFIELD_IFNAME,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_PROPFIELD_PROTO,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_PROPFIELD_ADDROBJ,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_PROPFIELD_PROPERTY,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_PROPFIELD_PERM,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_PROPFIELD_CURRENT,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_PROPFIELD_PERSISTENT,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_PROPFIELD_DEFAULT,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_PROPFIELD_POSSIBLE
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} ipadm_propfield_index_t;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic ofmt_field_t intfprop_fields[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* name, field width, index, callback */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "IFNAME", 12, IPADM_PROPFIELD_IFNAME, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PROPERTY", 16, IPADM_PROPFIELD_PROPERTY, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PROTO", 6, IPADM_PROPFIELD_PROTO, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PERM", 5, IPADM_PROPFIELD_PERM, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "CURRENT", 11, IPADM_PROPFIELD_CURRENT, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PERSISTENT", 11, IPADM_PROPFIELD_PERSISTENT, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "DEFAULT", 11, IPADM_PROPFIELD_DEFAULT, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "POSSIBLE", 16, IPADM_PROPFIELD_POSSIBLE, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ NULL, 0, 0, NULL}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic ofmt_field_t modprop_fields[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* name, field width, index, callback */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PROTO", 6, IPADM_PROPFIELD_PROTO, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PROPERTY", 22, IPADM_PROPFIELD_PROPERTY, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PERM", 5, IPADM_PROPFIELD_PERM, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "CURRENT", 13, IPADM_PROPFIELD_CURRENT, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PERSISTENT", 13, IPADM_PROPFIELD_PERSISTENT, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "DEFAULT", 13, IPADM_PROPFIELD_DEFAULT, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "POSSIBLE", 15, IPADM_PROPFIELD_POSSIBLE, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ NULL, 0, 0, NULL}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic ofmt_field_t addrprop_fields[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* name, field width, index, callback */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "ADDROBJ", 18, IPADM_PROPFIELD_ADDROBJ, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PROPERTY", 11, IPADM_PROPFIELD_PROPERTY, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PERM", 5, IPADM_PROPFIELD_PERM, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "CURRENT", 16, IPADM_PROPFIELD_CURRENT, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PERSISTENT", 16, IPADM_PROPFIELD_PERSISTENT, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "DEFAULT", 16, IPADM_PROPFIELD_DEFAULT, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "POSSIBLE", 15, IPADM_PROPFIELD_POSSIBLE, print_prop_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ NULL, 0, 0, NULL}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct show_prop_state {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char sps_ifname[LIFNAMSIZ];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char sps_aobjname[IPADM_AOBJSIZ];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail const char *sps_pname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t sps_proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *sps_propval;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nvlist_t *sps_proplist;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t sps_parsable;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t sps_addrprop;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t sps_ifprop;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t sps_modprop;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t sps_status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t sps_retstatus;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_handle_t sps_ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} show_prop_state_t;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct show_addr_state {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t sa_parsable;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t sa_persist;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_handle_t sa_ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} show_addr_state_t;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct show_if_state {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t si_parsable;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_handle_t si_ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} show_if_state_t;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct show_addr_args_s {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_addr_state_t *sa_state;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_addr_info_t *sa_info;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} show_addr_args_t;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct show_if_args_s {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_if_state_t *si_state;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_if_info_t *si_info;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} show_if_args_t;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef enum {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail SA_ADDROBJ,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail SA_TYPE,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail SA_STATE,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail SA_CURRENT,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail SA_PERSISTENT,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail SA_ADDR
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} sa_field_index_t;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef enum {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail SI_IFNAME,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail SI_STATE,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail SI_CURRENT,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail SI_PERSISTENT
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} si_field_index_t;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic ofmt_field_t show_addr_fields[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* name, field width, id, callback */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "ADDROBJ", 18, SA_ADDROBJ, print_sa_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "TYPE", 9, SA_TYPE, print_sa_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "STATE", 13, SA_STATE, print_sa_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "CURRENT", 8, SA_CURRENT, print_sa_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PERSISTENT", 11, SA_PERSISTENT, print_sa_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "ADDR", 46, SA_ADDR, print_sa_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ NULL, 0, 0, NULL}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic ofmt_field_t show_if_fields[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* name, field width, id, callback */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "IFNAME", 11, SI_IFNAME, print_si_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "STATE", 9, SI_STATE, print_si_cb},
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan{ "CURRENT", 13, SI_CURRENT, print_si_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ "PERSISTENT", 11, SI_PERSISTENT, print_si_cb},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{ NULL, 0, 0, NULL}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#define IPADM_ALL_BITS ((uint_t)-1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailtypedef struct intf_mask {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *name;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint64_t bits;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint64_t mask;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} fmask_t;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Handle to libipadm. Opened in main() before the sub-command specific
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * function is called and is closed before the program exits.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailipadm_handle_t iph = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Opaque ipadm address object. Used by all the address management subcommands.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailipadm_addrobj_t ipaddr = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic char *progname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void die(const char *, ...);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void die_opterr(int, int, const char *);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void warn_ipadmerr(ipadm_status_t, const char *, ...);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void ipadm_ofmt_check(ofmt_status_t, boolean_t, ofmt_handle_t);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void ipadm_check_propstr(const char *, boolean_t, const char *);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void process_misc_addrargs(int, char **, const char *, int *,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t *);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailusage(void)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int i;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cmd_t *cmdp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) fprintf(stderr,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail gettext("usage: ipadm <subcommand> <args> ...\n"));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (i = 0; i < sizeof (cmds) / sizeof (cmds[0]); i++) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cmdp = &cmds[i];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (cmdp->c_usage != NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) fprintf(stderr, "%s\n", gettext(cmdp->c_usage));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_destroy_addrobj(ipaddr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_close(iph);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail exit(1);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailint
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailmain(int argc, char *argv[])
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int i;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cmd_t *cmdp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) setlocale(LC_ALL, "");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) textdomain(TEXT_DOMAIN);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((progname = strrchr(argv[0], '/')) == NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail progname = argv[0];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail progname++;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (argc < 2)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail usage();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_open(&iph, 0);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Could not open handle to library - %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (i = 0; i < sizeof (cmds) / sizeof (cmds[0]); i++) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cmdp = &cmds[i];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (strcmp(argv[1], cmdp->c_name) == 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cmdp->c_fn(argc - 1, &argv[1], gettext(cmdp->c_usage));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_destroy_addrobj(ipaddr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_close(iph);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail exit(0);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) fprintf(stderr, gettext("%s: unknown subcommand '%s'\n"),
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail progname, argv[1]);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail usage();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (0);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Create an IP interface for which no saved configuration exists in the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * persistent store.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_create_if(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags = IPADM_OPT_PERSIST|IPADM_OPT_ACTIVE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":t", if_longopts,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 't':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * "ifconfig" mode - plumb interface, but do not
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * restore settings that may exist in db.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags &= ~IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (optind != (argc - 1))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_create_if(iph, argv[optind], AF_UNSPEC, flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Could not create %s : %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail argv[optind], ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Enable an IP interface based on the persistent configuration for
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * that interface.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_enable_if(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int index;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags = IPADM_OPT_ACTIVE|IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail process_misc_addrargs(argc, argv, use, &index, &flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (flags & IPADM_OPT_PERSIST)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("persistent operation not supported for enable-if");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_enable_if(iph, argv[index], flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status == IPADM_ALL_ADDRS_NOT_ENABLED) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail warn_ipadmerr(status, "");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Could not enable %s : %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail argv[optind], ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Remove an IP interface from both active and persistent configuration.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_delete_if(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags = IPADM_OPT_ACTIVE|IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (argc != 2)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_delete_if(iph, argv[1], AF_UNSPEC, flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Could not delete %s: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail argv[optind], ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Disable an IP interface by removing it from active configuration.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_disable_if(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int index;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags = IPADM_OPT_ACTIVE|IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail process_misc_addrargs(argc, argv, use, &index, &flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (flags & IPADM_OPT_PERSIST)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("persistent operation not supported for disable-if");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_disable_if(iph, argv[index], flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Could not disable %s: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail argv[optind], ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * called in from print_prop_cb() and does the job of printing each
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * individual column in the 'ipadm show-*prop' output.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprint_prop(show_prop_state_t *statep, uint_t flags, char *buf, size_t bufsize)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail const char *prop_name = statep->sps_pname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *ifname = statep->sps_ifname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *propval = statep->sps_propval;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t proto = statep->sps_proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail size_t propsize = MAXPROPVALLEN;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *object;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (statep->sps_ifprop) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_get_ifprop(iph, ifname, prop_name, propval,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail &propsize, proto, flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail object = ifname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if (statep->sps_modprop) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_get_prop(iph, prop_name, propval, &propsize,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail proto, flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail object = ipadm_proto2str(proto);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_get_addrprop(iph, prop_name, propval, &propsize,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail statep->sps_aobjname, flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail object = statep->sps_aobjname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status == IPADM_PROP_UNKNOWN ||
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status == IPADM_INVALID_ARG) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail warn_ipadmerr(status, "cannot get property '%s' for "
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "'%s'", prop_name, object);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if (status == IPADM_NOTSUP) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail warn_ipadmerr(status, "'%s'", object);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if (status == IPADM_NOTFOUND) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (flags & IPADM_OPT_PERSIST) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail propval[0] = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail goto cont;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail warn_ipadmerr(status, "no such object '%s'",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail object);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if (status == IPADM_ENXIO) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* the interface is probably disabled */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail propval[0] = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail goto cont;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail statep->sps_status = status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail statep->sps_retstatus = status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailcont:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail statep->sps_status = IPADM_SUCCESS;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s", propval);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * callback function which displays output for set-prop, set-ifprop and
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * set-addrprop subcommands.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic boolean_t
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprint_prop_cb(ofmt_arg_t *ofarg, char *buf, size_t bufsize)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_prop_state_t *statep = ofarg->ofmt_cbarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail const char *propname = statep->sps_pname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t proto = statep->sps_proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t cont = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Fail retrieving remaining fields, if you fail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * to retrieve a field.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (statep->sps_status != IPADM_SUCCESS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (_B_FALSE);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (ofarg->ofmt_id) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case IPADM_PROPFIELD_IFNAME:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s", statep->sps_ifname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case IPADM_PROPFIELD_PROTO:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s", ipadm_proto2str(proto));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case IPADM_PROPFIELD_ADDROBJ:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s", statep->sps_aobjname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case IPADM_PROPFIELD_PROPERTY:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s", propname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case IPADM_PROPFIELD_PERM:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail print_prop(statep, IPADM_OPT_PERM, buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case IPADM_PROPFIELD_CURRENT:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail print_prop(statep, IPADM_OPT_ACTIVE, buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case IPADM_PROPFIELD_PERSISTENT:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail print_prop(statep, IPADM_OPT_PERSIST, buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case IPADM_PROPFIELD_DEFAULT:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail print_prop(statep, IPADM_OPT_DEFAULT, buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case IPADM_PROPFIELD_POSSIBLE:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail print_prop(statep, IPADM_OPT_POSSIBLE, buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (statep->sps_status != IPADM_SUCCESS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cont = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (cont);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Callback function called by the property walker (ipadm_walk_prop() or
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * ipadm_walk_proptbl()), for every matched property. This function in turn
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * calls ofmt_print() to print property information.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailboolean_t
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailshow_property(void *arg, const char *pname, uint_t proto)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_prop_state_t *statep = arg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail statep->sps_pname = pname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail statep->sps_proto = proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail statep->sps_status = IPADM_SUCCESS;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_print(statep->sps_ofmt, arg);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * if an object is not found or operation is not supported then
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * stop the walker.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (statep->sps_status == IPADM_NOTFOUND ||
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail statep->sps_status == IPADM_NOTSUP)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (_B_FALSE);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (_B_TRUE);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Properties to be displayed is in `statep->sps_proplist'. If it is NULL,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * for all the properties for the specified object, relavant information, will
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * be displayed. Otherwise, for the selected property set, display relevant
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * information
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailshow_properties(void *arg, int prop_class)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_prop_state_t *statep = arg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nvlist_t *nvl = statep->sps_proplist;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t proto = statep->sps_proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nvpair_t *curr_nvp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *buf, *name;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* allocate sufficient buffer to hold a property value */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((buf = malloc(MAXPROPVALLEN)) == NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("insufficient memory");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail statep->sps_propval = buf;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* if no properties were specified, display all the properties */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (nvl == NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) ipadm_walk_proptbl(proto, prop_class, show_property,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail statep);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (curr_nvp = nvlist_next_nvpair(nvl, NULL); curr_nvp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail curr_nvp = nvlist_next_nvpair(nvl, curr_nvp)) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail name = nvpair_name(curr_nvp);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_walk_prop(name, proto, prop_class,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_property, statep);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status == IPADM_PROP_UNKNOWN)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) show_property(statep, name, proto);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail free(buf);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Display information for all or specific interface properties, either for a
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * given interface or for all the interfaces in the system.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_show_ifprop(int argc, char **argv, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nvlist_t *proplist = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *fields_str = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *ifname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_handle_t ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_status_t oferr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t ofmtflags = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t m_arg = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *protostr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_if_info_t *ifinfo, *ifp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_prop_state_t state;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bzero(&state, sizeof (state));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_propval = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_parsable = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_ifprop = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_status = state.sps_retstatus = IPADM_SUCCESS;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":p:m:co:",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_ifprop_longopts, NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'p':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ipadm_str2nvlist(optarg, &proplist,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_NORVAL) != 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("invalid interface properties specified");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'c':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_parsable = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'o':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fields_str = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'm':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (m_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("cannot specify more than one -m");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail m_arg = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail protostr = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (optind == argc - 1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ifname = argv[optind];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else if (optind != argc)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ifname = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (!m_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail protostr = "ip";
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((proto = ipadm_str2proto(protostr)) == MOD_PROTO_NONE)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("invalid protocol '%s' specified", protostr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_proto = proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_proplist = proplist;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (state.sps_parsable)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmtflags |= OFMT_PARSABLE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail oferr = ofmt_open(fields_str, intfprop_fields, ofmtflags, 0, &ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_ofmt_check(oferr, state.sps_parsable, ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_ofmt = ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* retrieve interface(s) and print the properties */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_if_info(iph, ifname, &ifinfo, 0, LIFC_DEFAULT);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ifname != NULL && status == IPADM_ENXIO)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("no such object '%s': %s", ifname,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error retrieving interface(s): %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (ifp = ifinfo; ifp; ifp = ifp->ifi_next) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strlcpy(state.sps_ifname, ifp->ifi_name, LIFNAMSIZ);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_proto = proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_properties(&state, IPADMPROP_CLASS_IF);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ifinfo)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_free_if_info(ifinfo);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nvlist_free(proplist);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_close(ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (state.sps_retstatus != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_close(iph);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail exit(EXIT_FAILURE);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * set/reset the interface property for a given interface.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailset_ifprop(int argc, char **argv, boolean_t reset, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status = IPADM_SUCCESS;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t p_arg = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t m_arg = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *ifname, *nv, *protostr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *prop_name, *prop_val;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t flags = IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":m:p:t",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail set_ifprop_longopts, NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'p':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (p_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("-p must be specified once only");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail p_arg = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_check_propstr(optarg, reset, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nv = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'm':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (m_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("-m must be specified once only");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail m_arg = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail protostr = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 't':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags &= ~IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (!m_arg || !p_arg || optind != argc - 1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ifname = argv[optind];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prop_name = nv;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prop_val = strchr(nv, '=');
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (prop_val != NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *prop_val++ = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((proto = ipadm_str2proto(protostr)) == MOD_PROTO_NONE)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("invalid protocol '%s' specified", protostr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (reset)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags |= IPADM_OPT_DEFAULT;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags |= IPADM_OPT_ACTIVE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_set_ifprop(iph, ifname, prop_name, prop_val, proto,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildone:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (reset)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("reset-ifprop: %s: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prop_name, ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("set-ifprop: %s: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prop_name, ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_set_ifprop(int argc, char **argv, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail set_ifprop(argc, argv, _B_FALSE, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_reset_ifprop(int argc, char **argv, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail set_ifprop(argc, argv, _B_TRUE, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Display information for all or specific protocol properties, either for a
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * given protocol or for supported protocols (IP/IPv4/IPv6/TCP/UDP/SCTP)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_show_prop(int argc, char **argv, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nvlist_t *proplist = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *fields_str = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *protostr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_prop_state_t state;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_handle_t ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_status_t oferr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t ofmtflags = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t p_arg = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bzero(&state, sizeof (state));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_propval = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_parsable = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_modprop = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_status = state.sps_retstatus = IPADM_SUCCESS;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":p:co:", show_prop_longopts,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'p':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (p_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("-p must be specified once only");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail p_arg = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ipadm_str2nvlist(optarg, &proplist,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_NORVAL) != 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("invalid protocol properties specified");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'c':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_parsable = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'o':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fields_str = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (optind == argc - 1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail protostr = argv[optind];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((proto = ipadm_str2proto(protostr)) == MOD_PROTO_NONE)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("invalid protocol '%s' specified", protostr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_proto = proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if (optind != argc) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (p_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("protocol must be specified when "
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "property name is used");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_proto = MOD_PROTO_NONE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_proplist = proplist;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (state.sps_parsable)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmtflags |= OFMT_PARSABLE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmtflags |= OFMT_WRAP;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail oferr = ofmt_open(fields_str, modprop_fields, ofmtflags, 0, &ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_ofmt_check(oferr, state.sps_parsable, ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_ofmt = ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* handles all the errors */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_properties(&state, IPADMPROP_CLASS_MODULE);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nvlist_free(proplist);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_close(ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (state.sps_retstatus != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_close(iph);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail exit(EXIT_FAILURE);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Checks to see if there are any modifiers, + or -. If there are modifiers
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * then sets IPADM_OPT_APPEND or IPADM_OPT_REMOVE, accordingly.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
8b88711aa8fd0a7b5c9ea1947bc568831e46190cGirish Moodalbailparse_modifiers(const char *pstr, uint_t *flags, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *p;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
8b88711aa8fd0a7b5c9ea1947bc568831e46190cGirish Moodalbail if ((p = strchr(pstr, '=')) == NULL)
8b88711aa8fd0a7b5c9ea1947bc568831e46190cGirish Moodalbail return;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
8b88711aa8fd0a7b5c9ea1947bc568831e46190cGirish Moodalbail if (p == pstr)
8b88711aa8fd0a7b5c9ea1947bc568831e46190cGirish Moodalbail die("Invalid prop=val specified\n%s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
8b88711aa8fd0a7b5c9ea1947bc568831e46190cGirish Moodalbail --p;
8b88711aa8fd0a7b5c9ea1947bc568831e46190cGirish Moodalbail if (*p == '+')
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *flags |= IPADM_OPT_APPEND;
8b88711aa8fd0a7b5c9ea1947bc568831e46190cGirish Moodalbail else if (*p == '-')
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *flags |= IPADM_OPT_REMOVE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * set/reset the protocol property for a given protocol.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailset_prop(int argc, char **argv, boolean_t reset, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status = IPADM_SUCCESS;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *protostr, *nv, *prop_name, *prop_val;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t p_arg = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t proto;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t flags = IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":p:t", set_prop_longopts,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'p':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (p_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("-p must be specified once only");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail p_arg = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_check_propstr(optarg, reset, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nv = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 't':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags &= ~IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (!p_arg || optind != argc - 1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail parse_modifiers(nv, &flags, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prop_name = nv;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prop_val = strchr(nv, '=');
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (prop_val != NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (flags & (IPADM_OPT_APPEND|IPADM_OPT_REMOVE))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *(prop_val - 1) = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *prop_val++ = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail protostr = argv[optind];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((proto = ipadm_str2proto(protostr)) == MOD_PROTO_NONE)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("invalid protocol '%s' specified", protostr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (reset)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags |= IPADM_OPT_DEFAULT;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags |= IPADM_OPT_ACTIVE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_set_prop(iph, prop_name, prop_val, proto, flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildone:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (reset)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("reset-prop: %s: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prop_name, ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("set-prop: %s: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prop_name, ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_set_prop(int argc, char **argv, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail set_prop(argc, argv, _B_FALSE, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_reset_prop(int argc, char **argv, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail set_prop(argc, argv, _B_TRUE, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* PRINTFLIKE1 */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailwarn(const char *format, ...)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail va_list alist;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail format = gettext(format);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) fprintf(stderr, gettext("%s: warning: "), progname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail va_start(alist, format);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) vfprintf(stderr, format, alist);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail va_end(alist);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) fprintf(stderr, "\n");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* PRINTFLIKE1 */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildie(const char *format, ...)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail va_list alist;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail format = gettext(format);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) fprintf(stderr, "%s: ", progname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail va_start(alist, format);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) vfprintf(stderr, format, alist);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail va_end(alist);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) putchar('\n');
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_destroy_addrobj(ipaddr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_close(iph);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail exit(EXIT_FAILURE);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildie_opterr(int opt, int opterr, const char *usage)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (opterr) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case ':':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("option '-%c' requires a value\nusage: %s", opt,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail gettext(usage));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case '?':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("unrecognized option '-%c'\nusage: %s", opt,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail gettext(usage));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* PRINTFLIKE2 */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailwarn_ipadmerr(ipadm_status_t err, const char *format, ...)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail va_list alist;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail format = gettext(format);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) fprintf(stderr, gettext("%s: warning: "), progname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail va_start(alist, format);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) vfprintf(stderr, format, alist);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail va_end(alist);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) fprintf(stderr, "%s\n", ipadm_status2str(err));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprocess_static_addrargs(const char *use, char *addrarg, const char *aobjname)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *val;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *laddr = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *raddr = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *save_input_arg = addrarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t found_mismatch = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail enum { A_LOCAL, A_REMOTE };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail static char *addr_optstr[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "local",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "remote",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while (*addrarg != '\0') {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail option = getsubopt(&addrarg, addr_optstr, &val);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case A_LOCAL:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (laddr != NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Multiple local addresses provided");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail laddr = val;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case A_REMOTE:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (raddr != NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Multiple remote addresses provided");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail raddr = val;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (found_mismatch)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid address provided\nusage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail found_mismatch = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (raddr != NULL && laddr == NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Missing local address\nusage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* If only one address is provided, it is assumed a local address. */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (laddr == NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (found_mismatch)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail laddr = save_input_arg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Missing local address\nusage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* Initialize the addrobj for static addresses. */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_create_addrobj(IPADM_ADDR_STATIC, aobjname, &ipaddr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error in creating address object: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* Set the local and remote addresses */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_set_addr(ipaddr, laddr, AF_UNSPEC);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error in setting local address: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (raddr != NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_set_dst_addr(ipaddr, raddr, AF_UNSPEC);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error in setting remote address: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprocess_addrconf_addrargs(const char *use, char *addrarg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *val;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail enum { P_STATELESS, P_STATEFUL };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail static char *addr_optstr[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "stateless",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "stateful",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t stateless;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t stateless_arg = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t stateful;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t stateful_arg = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while (*addrarg != '\0') {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail option = getsubopt(&addrarg, addr_optstr, &val);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case P_STATELESS:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (stateless_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Duplicate option");
7bc878958fba2b44705c85efbc07b747ef0eeed1Yuri Pankov if (val == NULL)
7bc878958fba2b44705c85efbc07b747ef0eeed1Yuri Pankov die("Invalid argument");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (strcmp(val, "yes") == 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail stateless = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else if (strcmp(val, "no") == 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail stateless = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid argument");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail stateless_arg = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case P_STATEFUL:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (stateful_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Duplicate option");
7bc878958fba2b44705c85efbc07b747ef0eeed1Yuri Pankov if (val == NULL)
7bc878958fba2b44705c85efbc07b747ef0eeed1Yuri Pankov die("Invalid argument");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (strcmp(val, "yes") == 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail stateful = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else if (strcmp(val, "no") == 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail stateful = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid argument");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail stateful_arg = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (!stateless_arg && !stateful_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid arguments for option -p");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* Set the addrobj fields for addrconf */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (stateless_arg) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_set_stateless(ipaddr, stateless);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error in setting stateless option: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (stateful_arg) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_set_stateful(ipaddr, stateful);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error in setting stateful option: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Creates static, dhcp or addrconf addresses and associates the created
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * addresses with the specified address object name.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_create_addr(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags =
f6da83d4178694e7113b71d1e452f15b296f73d8Anurag S. Maskey IPADM_OPT_PERSIST|IPADM_OPT_ACTIVE|IPADM_OPT_UP|IPADM_OPT_V46;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *cp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *atype = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *static_arg = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *addrconf_arg = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *interface_id = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *wait = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t s_opt = _B_FALSE; /* static addr options */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t auto_opt = _B_FALSE; /* Addrconf options */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t dhcp_opt = _B_FALSE; /* dhcp options */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":T:a:di:p:w:t",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail addr_longopts, NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'T':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail atype = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'a':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail static_arg = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail s_opt = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'd':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags &= ~IPADM_OPT_UP;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail s_opt = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'i':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail interface_id = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail auto_opt = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'p':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail addrconf_arg = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail auto_opt = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'w':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail wait = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail dhcp_opt = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 't':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags &= ~IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (atype == NULL || optind != (argc - 1)) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid arguments\nusage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if ((cp = strchr(argv[optind], '/')) == NULL ||
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail strlen(++cp) == 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("invalid address object name: %s\nusage: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail argv[optind], use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Allocate and initialize the addrobj based on the address type.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (strcmp(atype, "static") == 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (static_arg == NULL || auto_opt || dhcp_opt) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid arguments for type %s\nusage: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail atype, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail process_static_addrargs(use, static_arg, argv[optind]);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if (strcmp(atype, "dhcp") == 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (auto_opt || s_opt) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid arguments for type %s\nusage: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail atype, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* Initialize the addrobj for dhcp addresses. */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_create_addrobj(IPADM_ADDR_DHCP, argv[optind],
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail &ipaddr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error in creating address object: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (wait != NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int32_t ipadm_wait;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (strcmp(wait, "forever") == 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_wait = IPADM_DHCP_WAIT_FOREVER;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *end;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail long timeout = strtol(wait, &end, 10);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (*end != '\0' || timeout < 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid argument");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_wait = (int32_t)timeout;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_set_wait_time(ipaddr, ipadm_wait);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error in setting wait time: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if (strcmp(atype, "addrconf") == 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (dhcp_opt || s_opt) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid arguments for type %s\nusage: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail atype, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* Initialize the addrobj for dhcp addresses. */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_create_addrobj(IPADM_ADDR_IPV6_ADDRCONF,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail argv[optind], &ipaddr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error in creating address object: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (interface_id != NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_set_interface_id(ipaddr, interface_id);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error in setting interface ID: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (addrconf_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail process_addrconf_addrargs(use, addrconf_arg);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid address type %s", atype);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_create_addr(iph, ipaddr, flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status == IPADM_DHCP_IPC_TIMEOUT)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail warn_ipadmerr(status, "");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else if (status != IPADM_SUCCESS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Could not create address: %s", ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Used by some address management functions to parse the command line
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * arguments and create `ipaddr' address object.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprocess_misc_addrargs(int argc, char *argv[], const char *use, int *index,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t *flags)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":t", addr_misc_longopts,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 't':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *flags &= ~IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (optind != (argc - 1))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *index = optind;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Remove an addrobj from both active and persistent configuration.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_delete_addr(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags = IPADM_OPT_ACTIVE|IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":r", addr_misc_longopts,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'r':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags |= IPADM_OPT_RELEASE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (optind != (argc - 1))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_delete_addr(iph, argv[optind], flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("could not delete address: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Enable an IP address based on the persistent configuration for that
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * IP address
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_enable_addr(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int index;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags = IPADM_OPT_ACTIVE|IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail process_misc_addrargs(argc, argv, use, &index, &flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (flags & IPADM_OPT_PERSIST)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("persistent operation not supported for enable-addr");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_enable_addr(iph, argv[index], flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("could not enable address: %s", ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Mark the address identified by addrobj 'up'
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_up_addr(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int index;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags = IPADM_OPT_ACTIVE|IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail process_misc_addrargs(argc, argv, use, &index, &flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_up_addr(iph, argv[index], flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Could not mark the address up: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Disable the specified addrobj by removing it from active cofiguration
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_disable_addr(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int index;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags = IPADM_OPT_ACTIVE|IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail process_misc_addrargs(argc, argv, use, &index, &flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (flags & IPADM_OPT_PERSIST)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("persistent operation not supported for disable-addr");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_disable_addr(iph, argv[index], flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("could not disable address: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Mark the address identified by addrobj 'down'
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_down_addr(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int index;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags = IPADM_OPT_ACTIVE|IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail process_misc_addrargs(argc, argv, use, &index, &flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_down_addr(iph, argv[index], flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Could not mark the address down: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Restart DAD for static address. Extend lease duration for DHCP addresses
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_refresh_addr(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t flags = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":i", addr_misc_longopts,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'i':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags |= IPADM_OPT_INFORM;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (optind != (argc - 1))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_refresh_addr(iph, argv[optind], flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status == IPADM_DHCP_IPC_TIMEOUT)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail warn_ipadmerr(status, "");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else if (status != IPADM_SUCCESS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("could not refresh address %s", ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailsockaddr2str(const struct sockaddr_storage *ssp, char *buf, uint_t bufsize)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail socklen_t socklen;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail struct sockaddr *sp = (struct sockaddr *)ssp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (ssp->ss_family) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case AF_INET:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail socklen = sizeof (struct sockaddr_in);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case AF_INET6:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail socklen = sizeof (struct sockaddr_in6);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strlcpy(buf, STR_UNKNOWN_VAL, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) getnameinfo(sp, socklen, buf, bufsize, NULL, 0,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (NI_NOFQDN | NI_NUMERICHOST));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailflags2str(uint64_t flags, fmask_t *tbl, boolean_t is_bits,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *buf, uint_t bufsize)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int i;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t first = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (is_bits) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (i = 0; tbl[i].name; i++) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((flags & tbl[i].mask) == tbl[i].bits)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strlcat(buf, tbl[i].name, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strlcat(buf, "-", bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (i = 0; tbl[i].name; i++) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((flags & tbl[i].mask) == tbl[i].bits) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (!first)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strlcat(buf, ",", bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strlcat(buf, tbl[i].name, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail first = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan/*
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan * return true if the address for lifname comes to us from the global zone
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan * with 'allowed-ips' constraints.
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan */
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhanstatic boolean_t
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhanis_from_gz(const char *lifname)
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan{
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan ipadm_if_info_t *if_info;
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan char phyname[LIFNAMSIZ], *cp;
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan boolean_t ret = _B_FALSE;
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan ipadm_status_t status;
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan zoneid_t zoneid;
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan ushort_t zflags;
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan if ((zoneid = getzoneid()) == GLOBAL_ZONEID)
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan return (_B_FALSE); /* from-gz only makes sense in a NGZ */
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan if (zone_getattr(zoneid, ZONE_ATTR_FLAGS, &zflags, sizeof (zflags)) < 0)
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan return (_B_FALSE);
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan if (!(zflags & ZF_NET_EXCL))
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan return (_B_TRUE); /* everything is from the GZ for shared-ip */
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan (void) strncpy(phyname, lifname, sizeof (phyname));
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan if ((cp = strchr(phyname, ':')) != NULL)
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan *cp = '\0';
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan status = ipadm_if_info(iph, phyname, &if_info, 0, LIFC_DEFAULT);
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan if (status != IPADM_SUCCESS)
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan return (ret);
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan if (if_info->ifi_cflags & IFIF_L3PROTECT)
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan ret = _B_TRUE;
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan if (if_info)
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan ipadm_free_if_info(if_info);
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan return (ret);
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan}
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic boolean_t
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprint_sa_cb(ofmt_arg_t *ofarg, char *buf, uint_t bufsize)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_addr_args_t *arg = ofarg->ofmt_cbarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_addr_info_t *ainfo = arg->sa_info;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char interface[LIFNAMSIZ];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char addrbuf[MAXPROPVALLEN];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char dstbuf[MAXPROPVALLEN];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char prefixlenstr[MAXPROPVALLEN];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int prefixlen;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail struct sockaddr_in *sin;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail struct sockaddr_in6 *sin6;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sa_family_t af;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *phyname = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail struct ifaddrs *ifa = &ainfo->ia_ifa;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fmask_t cflags_mask[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "U", IA_UP, IA_UP },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "u", IA_UNNUMBERED, IA_UNNUMBERED },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "p", IA_PRIVATE, IA_PRIVATE },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "t", IA_TEMPORARY, IA_TEMPORARY },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "d", IA_DEPRECATED, IA_DEPRECATED },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { NULL, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fmask_t pflags_mask[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "U", IA_UP, IA_UP },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "p", IA_PRIVATE, IA_PRIVATE },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "d", IA_DEPRECATED, IA_DEPRECATED },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { NULL, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fmask_t type[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "static", IPADM_ADDR_STATIC, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "addrconf", IPADM_ADDR_IPV6_ADDRCONF, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "dhcp", IPADM_ADDR_DHCP, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { NULL, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fmask_t addr_state[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "disabled", IFA_DISABLED, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "duplicate", IFA_DUPLICATE, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "down", IFA_DOWN, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "tentative", IFA_TENTATIVE, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "ok", IFA_OK, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "inaccessible", IFA_INACCESSIBLE, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { NULL, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail buf[0] = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (ofarg->ofmt_id) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SA_ADDROBJ:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ainfo->ia_aobjname[0] == '\0') {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strncpy(interface, ifa->ifa_name, LIFNAMSIZ);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail phyname = strrchr(interface, ':');
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (phyname)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *phyname = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s/%s", interface,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail STR_UNKNOWN_VAL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s", ainfo->ia_aobjname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SA_STATE:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags2str(ainfo->ia_state, addr_state, _B_FALSE,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SA_TYPE:
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan if (is_from_gz(ifa->ifa_name))
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan (void) snprintf(buf, bufsize, "from-gz");
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan else
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan flags2str(ainfo->ia_atype, type, _B_FALSE, buf,
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SA_CURRENT:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags2str(ainfo->ia_cflags, cflags_mask, _B_TRUE, buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SA_PERSISTENT:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags2str(ainfo->ia_pflags, pflags_mask, _B_TRUE, buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SA_ADDR:
64639aaf7beb84086b88f186ea1fa9ccf0be8c57Darren Reed af = ifa->ifa_addr->sa_family;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * If the address is 0.0.0.0 or :: and the origin is DHCP,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * print STR_UNKNOWN_VAL.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ainfo->ia_atype == IPADM_ADDR_DHCP) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sin = (struct sockaddr_in *)ifa->ifa_addr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((af == AF_INET &&
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sin->sin_addr.s_addr == INADDR_ANY) ||
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (af == AF_INET6 &&
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, STR_UNKNOWN_VAL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ifa->ifa_netmask == NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prefixlen = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prefixlen = mask2plen(ifa->ifa_netmask);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bzero(prefixlenstr, sizeof (prefixlenstr));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (prefixlen > 0) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(prefixlenstr, sizeof (prefixlenstr),
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "/%d", prefixlen);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bzero(addrbuf, sizeof (addrbuf));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bzero(dstbuf, sizeof (dstbuf));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ainfo->ia_atype == IPADM_ADDR_STATIC) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Print the hostname fields if the address is not
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * in active configuration.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ainfo->ia_state == IFA_DISABLED) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ainfo->ia_sname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ainfo->ia_dname[0] != '\0') {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(dstbuf, sizeof (dstbuf),
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "->%s", ainfo->ia_dname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strlcat(buf, dstbuf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strlcat(buf, prefixlenstr,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
08ed54f365d20ed6ea7275787e853c359aa9385bVasumathi Sundaram /*
08ed54f365d20ed6ea7275787e853c359aa9385bVasumathi Sundaram * For the non-persistent case, we need to show the
08ed54f365d20ed6ea7275787e853c359aa9385bVasumathi Sundaram * currently configured addresses for source and
08ed54f365d20ed6ea7275787e853c359aa9385bVasumathi Sundaram * destination.
08ed54f365d20ed6ea7275787e853c359aa9385bVasumathi Sundaram */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sockaddr2str((struct sockaddr_storage *)ifa->ifa_addr,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail addrbuf, sizeof (addrbuf));
08ed54f365d20ed6ea7275787e853c359aa9385bVasumathi Sundaram if (ifa->ifa_flags & IFF_POINTOPOINT) {
08ed54f365d20ed6ea7275787e853c359aa9385bVasumathi Sundaram sockaddr2str(
08ed54f365d20ed6ea7275787e853c359aa9385bVasumathi Sundaram (struct sockaddr_storage *)ifa->ifa_dstaddr,
08ed54f365d20ed6ea7275787e853c359aa9385bVasumathi Sundaram dstbuf, sizeof (dstbuf));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s->%s", addrbuf,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail dstbuf);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s%s", addrbuf,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prefixlenstr);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("invalid input");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (_B_TRUE);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Display address information, either for the given address or
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * for all the addresses managed by ipadm.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_show_addr(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_addr_state_t state;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *def_fields_str = "addrobj,type,state,addr";
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *fields_str = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_addr_info_t *ainfo;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_addr_info_t *ptr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_addr_args_t sargs;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_handle_t ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_status_t oferr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t ofmtflags = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *aname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *ifname = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *cp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t found = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sa_parsable = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sa_persist = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, "po:", show_addr_longopts,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'p':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sa_parsable = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'o':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fields_str = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (state.sa_parsable && fields_str == NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("-p requires -o");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (optind == argc - 1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aname = argv[optind];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if ((cp = strchr(aname, '/')) == NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid address object name provided");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (*(cp + 1) == '\0') {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ifname = aname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *cp = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aname = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if (optind == argc) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aname = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (state.sa_parsable)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmtflags |= OFMT_PARSABLE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (fields_str == NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fields_str = def_fields_str;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail oferr = ofmt_open(fields_str, show_addr_fields, ofmtflags, 0, &ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_ofmt_check(oferr, state.sa_parsable, ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sa_ofmt = ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_addr_info(iph, ifname, &ainfo, 0, LIFC_DEFAULT);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Return without printing any error, if no addresses were found,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * for the case where all addresses are requested.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Could not get address: %s", ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ainfo == NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_close(ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bzero(&sargs, sizeof (sargs));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sargs.sa_state = &state;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (ptr = ainfo; ptr != NULL; ptr = IA_NEXT(ptr)) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sargs.sa_info = ptr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (aname != NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (strcmp(sargs.sa_info->ia_aobjname, aname) != 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail continue;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail found = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_print(state.sa_ofmt, &sargs);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ainfo)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_free_addr_info(ainfo);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (aname != NULL && !found)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Address object not found");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic boolean_t
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprint_si_cb(ofmt_arg_t *ofarg, char *buf, uint_t bufsize)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_if_args_t *arg = ofarg->ofmt_cbarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_if_info_t *ifinfo = arg->si_info;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *ifname = ifinfo->ifi_name;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fmask_t intf_state[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "ok", IFIS_OK, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "down", IFIS_DOWN, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "disabled", IFIS_DISABLED, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "failed", IFIS_FAILED, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "offline", IFIS_OFFLINE, IPADM_ALL_BITS},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { NULL, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fmask_t intf_pflags[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "s", IFIF_STANDBY, IFIF_STANDBY },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "4", IFIF_IPV4, IFIF_IPV4 },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "6", IFIF_IPV6, IFIF_IPV6 },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { NULL, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fmask_t intf_cflags[] = {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "b", IFIF_BROADCAST, IFIF_BROADCAST },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "m", IFIF_MULTICAST, IFIF_MULTICAST },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "p", IFIF_POINTOPOINT, IFIF_POINTOPOINT},
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "v", IFIF_VIRTUAL, IFIF_VIRTUAL },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "I", IFIF_IPMP, IFIF_IPMP },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "s", IFIF_STANDBY, IFIF_STANDBY },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "i", IFIF_INACTIVE, IFIF_INACTIVE },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "V", IFIF_VRRP, IFIF_VRRP },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "a", IFIF_NOACCEPT, IFIF_NOACCEPT },
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhan { "Z", IFIF_L3PROTECT, IFIF_L3PROTECT },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "4", IFIF_IPV4, IFIF_IPV4 },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { "6", IFIF_IPV6, IFIF_IPV6 },
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { NULL, 0, 0 }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail };
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail buf[0] = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (ofarg->ofmt_id) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SI_IFNAME:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) snprintf(buf, bufsize, "%s", ifname);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SI_STATE:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags2str(ifinfo->ifi_state, intf_state, _B_FALSE,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SI_CURRENT:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags2str(ifinfo->ifi_cflags, intf_cflags, _B_TRUE,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case SI_PERSISTENT:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags2str(ifinfo->ifi_pflags, intf_pflags, _B_TRUE,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail buf, bufsize);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("invalid input");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return (_B_TRUE);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Display interface information, either for the given interface or
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * for all the interfaces in the system.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_show_if(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_if_state_t state;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *fields_str = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_if_info_t *if_info, *ptr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_if_args_t sargs;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_handle_t ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_status_t oferr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t ofmtflags = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *ifname = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.si_parsable = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, "po:", show_if_longopts,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'p':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.si_parsable = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'o':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fields_str = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (optind == argc - 1)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ifname = argv[optind];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else if (optind != argc)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (state.si_parsable)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmtflags |= OFMT_PARSABLE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail oferr = ofmt_open(fields_str, show_if_fields, ofmtflags, 0, &ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_ofmt_check(oferr, state.si_parsable, ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.si_ofmt = ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bzero(&sargs, sizeof (sargs));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sargs.si_state = &state;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_if_info(iph, ifname, &if_info, 0, LIFC_DEFAULT);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Return without printing any error, if no addresses were found.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Could not get interface(s): %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (ptr = if_info; ptr; ptr = ptr->ifi_next) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sargs.si_info = ptr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_print(state.si_ofmt, &sargs);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (if_info)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_free_if_info(if_info);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * set/reset the address property for a given address
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailset_addrprop(int argc, char **argv, boolean_t reset, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status = IPADM_SUCCESS;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail boolean_t p_arg = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *nv, *aobjname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *prop_name, *prop_val;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t flags = IPADM_OPT_ACTIVE|IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":i:p:t", set_ifprop_longopts,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'p':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (p_arg)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("-p must be specified once only");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail p_arg = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_check_propstr(optarg, reset, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nv = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 't':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags &= ~IPADM_OPT_PERSIST;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (!p_arg || optind != (argc - 1))
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prop_name = nv;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail prop_val = strchr(nv, '=');
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (prop_val != NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *prop_val++ = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aobjname = argv[optind];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (reset)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail flags |= IPADM_OPT_DEFAULT;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_set_addrprop(iph, prop_name, prop_val, aobjname, flags);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (reset)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("reset-addrprop: %s: %s", prop_name,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("set-addrprop: %s: %s", prop_name,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Sets a property on an address object.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_set_addrprop(int argc, char **argv, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail set_addrprop(argc, argv, _B_FALSE, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Resets a property to its default value on an address object.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_reset_addrprop(int argc, char **argv, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail set_addrprop(argc, argv, _B_TRUE, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Display information for all or specific address properties, either for a
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * given address or for all the addresses in the system.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbaildo_show_addrprop(int argc, char *argv[], const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail int option;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nvlist_t *proplist = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *fields_str = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_prop_state_t state;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_handle_t ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_status_t oferr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint_t ofmtflags = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *aobjname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *ifname = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *cp;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail opterr = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bzero(&state, sizeof (state));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_propval = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_parsable = _B_FALSE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_addrprop = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_proto = MOD_PROTO_NONE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_status = state.sps_retstatus = IPADM_SUCCESS;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail while ((option = getopt_long(argc, argv, ":p:i:cPo:",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_prop_longopts, NULL)) != -1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail switch (option) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'p':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (ipadm_str2nvlist(optarg, &proplist,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail IPADM_NORVAL) != 0)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("invalid interface properties specified");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'c':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_parsable = _B_TRUE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail case 'o':
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail fields_str = optarg;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail default:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die_opterr(optopt, option, use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail break;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (optind == argc - 1) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aobjname = argv[optind];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cp = strchr(aobjname, '/');
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (cp == NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Invalid address object name provided");
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (*(cp + 1) == '\0') {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ifname = aobjname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *cp = '\0';
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aobjname = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else if (optind == argc) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aobjname = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Usage: %s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_proplist = proplist;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (state.sps_parsable)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmtflags |= OFMT_PARSABLE;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail oferr = ofmt_open(fields_str, addrprop_fields, ofmtflags, 0, &ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_ofmt_check(oferr, state.sps_parsable, ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail state.sps_ofmt = ofmt;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (aobjname != NULL) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strlcpy(state.sps_aobjname, aobjname,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sizeof (state.sps_aobjname));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_properties(&state, IPADMPROP_CLASS_ADDR);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_addr_info_t *ainfop = NULL;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_addr_info_t *ptr;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status_t status;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail status = ipadm_addr_info(iph, ifname, &ainfop, 0, LIFC_DEFAULT);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Return without printing any error, if no addresses were
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * found.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status == IPADM_NOTFOUND)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (status != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("Error retrieving address: %s",
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_status2str(status));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail for (ptr = ainfop; ptr; ptr = IA_NEXT(ptr)) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aobjname = ptr->ia_aobjname;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (aobjname[0] == '\0' ||
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ptr->ia_atype == IPADM_ADDR_IPV6_ADDRCONF) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail continue;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) strlcpy(state.sps_aobjname, aobjname,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail sizeof (state.sps_aobjname));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail show_properties(&state, IPADMPROP_CLASS_ADDR);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_free_addr_info(ainfop);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nvlist_free(proplist);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_close(ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (state.sps_retstatus != IPADM_SUCCESS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ipadm_close(iph);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail exit(EXIT_FAILURE);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailipadm_ofmt_check(ofmt_status_t oferr, boolean_t parsable,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_handle_t ofmt)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char buf[OFMT_BUFSIZE];
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (oferr == OFMT_SUCCESS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail (void) ofmt_strerror(ofmt, oferr, buf, sizeof (buf));
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * All errors are considered fatal in parsable mode.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * NOMEM errors are always fatal, regardless of mode.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * For other errors, we print diagnostics in human-readable
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * mode and processs what we can.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (parsable || oferr == OFMT_ENOFIELDS) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail ofmt_close(ofmt);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die(buf);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail warn(buf);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * check if the `pstr' adheres to following syntax
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * - prop=<value[,...]> (for set)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * - prop (for reset)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailstatic void
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailipadm_check_propstr(const char *pstr, boolean_t reset, const char *use)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail char *nv;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nv = strchr(pstr, '=');
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (reset) {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (nv != NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("incorrect syntax used for -p.\n%s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail } else {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (nv == NULL || *++nv == '\0')
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("please specify the value to be set.\n%s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail nv = strchr(nv, '=');
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /* cannot have multiple 'prop=val' for single -p */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail if (nv != NULL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail die("cannot specify more than one prop=val at "
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail "a time.\n%s", use);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail}