usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c
author Sowmini Varadhan <Sowmini.Varadhan@oracle.COM>
Thu, 01 Jul 2010 17:10:52 -0400
changeset 12748 40c62600acd3
parent 12641 0d09c6ce3fde
child 12805 288ae711509e
permissions -rw-r--r--
PSARC 2010/166 layer-3 net properties for exclusive-IP zones 6944327 need to support address and defrouter resources for exclusive-IP zones
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
12048
162e93ccf12f 6927499 ipmgmtd will go out of sync when an interface is moved into an IPMP group
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 12016
diff changeset
     2
 * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Copyright (c) 1983 Regents of the University of California.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * All rights reserved.  The Berkeley software License Agreement
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * specifies the terms and conditions for redistribution.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
#include "defs.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
#include "strings.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
#include "ifconfig.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
#include <compat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
#include <libdlpi.h>
8275
7c223a798022 PSARC/2006/357 Crossbow - Network Virtualization and Resource Management
Eric Cheng
parents: 8142
diff changeset
    15
#include <libdllink.h>
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
    16
#include <libdliptun.h>
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
    17
#include <libdllink.h>
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 198
diff changeset
    18
#include <inet/ip.h>
6524
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
    19
#include <inet/ipsec_impl.h>
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
    20
#include <libipadm.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
    21
#include <ifaddrs.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
    22
#include <libsocket_priv.h>
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 198
diff changeset
    23
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
#define	LOOPBACK_IF	"lo0"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
#define	NONE_STR	"none"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#define	ARP_MOD_NAME	"arp"
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
    27
#define	LIFC_DEFAULT	(LIFC_NOXMIT | LIFC_TEMPORARY | LIFC_ALLZONES |\
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
    28
			LIFC_UNDER_IPMP)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
typedef struct if_flags {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
	uint64_t iff_value;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
	char	*iff_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
} if_flags_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
static if_flags_t	if_flags_tbl[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
	{ IFF_UP,		"UP" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
	{ IFF_BROADCAST,	"BROADCAST" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
	{ IFF_DEBUG,		"DEBUG" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
	{ IFF_LOOPBACK,		"LOOPBACK" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
	{ IFF_POINTOPOINT,	"POINTOPOINT" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
	{ IFF_NOTRAILERS,	"NOTRAILERS" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
	{ IFF_RUNNING,		"RUNNING" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
	{ IFF_NOARP,		"NOARP" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
	{ IFF_PROMISC,		"PROMISC" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
	{ IFF_ALLMULTI,		"ALLMULTI" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
	{ IFF_INTELLIGENT,	"INTELLIGENT" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
	{ IFF_MULTICAST,	"MULTICAST" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
	{ IFF_MULTI_BCAST,	"MULTI_BCAST" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
	{ IFF_UNNUMBERED,	"UNNUMBERED" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
	{ IFF_DHCPRUNNING,	"DHCP" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
	{ IFF_PRIVATE,		"PRIVATE" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
	{ IFF_NOXMIT,		"NOXMIT" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	{ IFF_NOLOCAL,		"NOLOCAL" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
	{ IFF_DEPRECATED,	"DEPRECATED" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
	{ IFF_ADDRCONF,		"ADDRCONF" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	{ IFF_ROUTER,		"ROUTER" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	{ IFF_NONUD,		"NONUD" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	{ IFF_ANYCAST,		"ANYCAST" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	{ IFF_NORTEXCH,		"NORTEXCH" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	{ IFF_IPV4,		"IPv4" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	{ IFF_IPV6,		"IPv6" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	{ IFF_NOFAILOVER,	"NOFAILOVER" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	{ IFF_FAILED,		"FAILED" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	{ IFF_STANDBY,		"STANDBY" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	{ IFF_INACTIVE,		"INACTIVE" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	{ IFF_OFFLINE,		"OFFLINE" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	{ IFF_XRESOLV,		"XRESOLV" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	{ IFF_COS_ENABLED,	"CoS" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	{ IFF_PREFERRED,	"PREFERRED" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	{ IFF_TEMPORARY,	"TEMPORARY" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	{ IFF_FIXEDMTU,		"FIXEDMTU" },
2546
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
    72
	{ IFF_VIRTUAL,		"VIRTUAL" },
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    73
	{ IFF_DUPLICATE,	"DUPLICATE" },
11076
445f05f9f7b4 PSARC/2008/693 VRRP
Cathy Zhou <Cathy.Zhou@Sun.COM>
parents: 11042
diff changeset
    74
	{ IFF_IPMP,		"IPMP"},
445f05f9f7b4 PSARC/2008/693 VRRP
Cathy Zhou <Cathy.Zhou@Sun.COM>
parents: 11042
diff changeset
    75
	{ IFF_VRRP,		"VRRP"},
12748
40c62600acd3 PSARC 2010/166 layer-3 net properties for exclusive-IP zones
Sowmini Varadhan <Sowmini.Varadhan@oracle.COM>
parents: 12641
diff changeset
    76
	{ IFF_NOACCEPT,		"NOACCEPT"},
40c62600acd3 PSARC 2010/166 layer-3 net properties for exclusive-IP zones
Sowmini Varadhan <Sowmini.Varadhan@oracle.COM>
parents: 12641
diff changeset
    77
	{ IFF_L3PROTECT,	"L3PROTECT"}
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    78
};
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    79
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    80
typedef struct {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    81
	const char		*ia_app;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    82
	uint64_t		ia_flag;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    83
	uint_t			ia_tries;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    84
} if_appflags_t;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    85
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    86
static const if_appflags_t if_appflags_tbl[] = {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    87
	{ "dhcpagent(1M)",	IFF_DHCPRUNNING,	1 },
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    88
	{ "in.ndpd(1M)",	IFF_ADDRCONF,		3 },
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
    89
	{  NULL,		0,			0 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
    92
static dladm_handle_t	dlh;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
    93
boolean_t		dlh_opened;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
    94
static struct		lifreq lifr;
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
    95
/* current interface name a particular function is accessing */
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
    96
static char		name[LIFNAMSIZ];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
/* foreach interface saved name */
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
    98
static char		origname[LIFNAMSIZ];
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
    99
static int		setaddr;
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   100
static boolean_t	setaddr_done = _B_FALSE;
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   101
static boolean_t	ipsec_policy_set;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   102
static boolean_t	ipsec_auth_covered;
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   103
static ipadm_handle_t	iph;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   104
static ipadm_addrobj_t	ipaddr;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
 * Make sure the algorithm variables hold more than the sizeof an algorithm
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
 * in PF_KEY.  (For now, more than a uint8_t.)  The NO_***_?ALG indicates that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
 * there was no algorithm requested, and in the ipsec_req that service should
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
 * be disabled.  (E.g. if ah_aalg remains NO_AH_AALG, then AH will be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
 * disabled on that tunnel.)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
#define	NO_AH_AALG 256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
#define	NO_ESP_AALG 256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
#define	NO_ESP_EALG 256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   117
int	s, s4, s6;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
int	af = AF_INET;	/* default address family */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
int	debug = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
int	all = 0;	/* setifdhcp() needs to know this */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
int	verbose = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
int	v4compat = 0;	/* Compatible printing format */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
 * Function prototypes for command functions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
static int	addif(char *arg, int64_t param);
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   128
static int	inetipmp(char *arg, int64_t param);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
static int	inetplumb(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
static int	inetunplumb(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
static int	removeif(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
static int	setdebugflag(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
static int	setifaddr(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
static int	setifbroadaddr(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
static int	setifdstaddr(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
static int	setifether(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
static int	setifflags(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
static int	setifindex(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
static int	setifmetric(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
static int	setifmtu(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
static int	setifnetmask(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
static int	setifprefixlen(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
static int	setifrevarp(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
static int	setifsubnet(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
static int	setiftdst(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
static int	setiftoken(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
static int	setiftsrc(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
static int	setverboseflag(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
static int	set_tun_ah_alg(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
static int	set_tun_esp_auth_alg(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
static int	set_tun_esp_encr_alg(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
static int	modlist(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
static int	modinsert(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
static int	modremove(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
static int	setifgroupname(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
static int	configinfo(char *arg, int64_t param);
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   157
static void	print_config_flags(int af, uint64_t flags);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
static void	print_flags(uint64_t flags);
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   159
static void	print_ifether(const char *ifname);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
static int	set_tun_encap_limit(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
static int	clr_tun_encap_limit(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
static int	set_tun_hop_limit(char *arg, int64_t param);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
static int	setzone(char *arg, int64_t param);
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
   164
static int	setallzones(char *arg, int64_t param);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
static int	setifsrc(char *arg, int64_t param);
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   166
static int	lifnum(const char *ifname);
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   167
static void	plumball(int, char **, int64_t, int64_t, int64_t);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
 * Address family specific function prototypes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
static void	in_getaddr(char *s, struct sockaddr *saddr, int *plenp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
static void	in_status(int force, uint64_t flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
static void	in_configinfo(int force, uint64_t flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
static void	in6_getaddr(char *s, struct sockaddr *saddr, int *plenp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
static void	in6_status(int force, uint64_t flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
static void	in6_configinfo(int force, uint64_t flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
 * Misc support functions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
 */
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5240
diff changeset
   182
static boolean_t	ni_entry(const char *, void *);
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   183
static void		foreachinterface(int argc, char *argv[],
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   184
			    int af, int64_t onflags, int64_t offflags,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   185
			    int64_t lifc_flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   186
static void		ifconfig(int argc, char *argv[], int af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   187
			    struct ifaddrs *ifa);
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   188
static boolean_t	in_getmask(struct sockaddr_in *saddr,
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   189
			    boolean_t addr_set);
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   190
static int		in_getprefixlen(char *addr, boolean_t slash, int plen);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
static boolean_t	in_prefixlentomask(int prefixlen, int maxlen,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
			    uchar_t *mask);
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   193
static void		status(void);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   194
static void		ifstatus(const char *ifname);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   195
static void		tun_status(datalink_id_t);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   196
static void		usage(void);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   197
static int		setifdhcp(const char *caller, const char *ifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   198
			    int argc, char *argv[]);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   199
static int		ip_domux2fd(int *, int *, int *, int *, int *);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   200
static int		ip_plink(int, int, int, int, int);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   201
static int		modop(char *arg, char op);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   202
static int		find_all_interfaces(struct lifconf *lifcp, char **buf,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   203
			    int64_t lifc_flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   204
static int		create_ipmp(const char *grname, int af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   205
			    const char *ifname, boolean_t implicit);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   206
static void		start_ipmp_daemon(void);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   207
static boolean_t 	ifaddr_up(ifaddrlistx_t *ifaddrp);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   208
static boolean_t 	ifaddr_down(ifaddrlistx_t *ifaddrp);
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   209
static dladm_status_t	ifconfig_dladm_open(const char *, datalink_class_t,
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   210
			    datalink_id_t *);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   211
static void		dladmerr_exit(dladm_status_t status, const char *str);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   212
static void		ipadmerr_exit(ipadm_status_t status, const char *str);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   213
static boolean_t	ifconfig_use_libipadm(int, const char *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
#define	max(a, b)	((a) < (b) ? (b) : (a))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
 * DHCP_EXIT_IF_FAILURE indicates that the operation failed, but if there
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
 * are more interfaces to act on (i.e., ifconfig was invoked with -a), keep
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
 * on going rather than exit with an error.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
#define	DHCP_EXIT_IF_FAILURE	-1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
#define	NEXTARG		0xffffff	/* command takes an argument */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
#define	OPTARG		0xfffffe 	/* command takes an optional argument */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
#define	AF_ANY		(-1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
/* Refer to the comments in ifconfig() on the netmask "hack" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
#define	NETMASK_CMD	"netmask"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
struct sockaddr_storage	g_netmask;
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   232
enum { G_NETMASK_NIL, G_NETMASK_PENDING, G_NETMASK_SET }
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   233
    g_netmask_set = G_NETMASK_NIL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
struct	cmd {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	char		*c_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	int64_t		c_parameter;	/* NEXTARG means next argv */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	int		(*c_func)(char *, int64_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	int		c_abortonfail;	/* don't continue parsing args */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
					/* for the current interface */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	int	c_af;			/* address family restrictions */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
} cmds[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	{ "up",		IFF_UP,		setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	{ "down",	-IFF_UP,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	{ "trailers",	-IFF_NOTRAILERS, setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	{ "-trailers",	IFF_NOTRAILERS,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	{ "arp",	-IFF_NOARP,	setifflags,	0,	AF_INET },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	{ "-arp",	IFF_NOARP,	setifflags,	0,	AF_INET },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	{ "router",	IFF_ROUTER,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	{ "-router",	-IFF_ROUTER,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	{ "private",	IFF_PRIVATE,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	{ "-private",	-IFF_PRIVATE,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	{ "xmit",	-IFF_NOXMIT,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	{ "-xmit",	IFF_NOXMIT,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	{ "-nud",	IFF_NONUD,	setifflags,	0,	AF_INET6 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	{ "nud",	-IFF_NONUD,	setifflags,	0,	AF_INET6 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	{ "anycast",	IFF_ANYCAST,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	{ "-anycast",	-IFF_ANYCAST,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	{ "local",	-IFF_NOLOCAL,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	{ "-local",	IFF_NOLOCAL,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	{ "deprecated",	IFF_DEPRECATED,	setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	{ "-deprecated", -IFF_DEPRECATED, setifflags,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	{ "preferred",	IFF_PREFERRED,	setifflags,	0,	AF_INET6 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	{ "-preferred",	-IFF_PREFERRED,	setifflags,	0,	AF_INET6 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	{ "debug",	0,		setdebugflag,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	{ "verbose",	0,		setverboseflag,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	{ NETMASK_CMD,	NEXTARG,	setifnetmask,	0,	AF_INET },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	{ "metric",	NEXTARG,	setifmetric,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	{ "mtu",	NEXTARG,	setifmtu,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	{ "index",	NEXTARG,	setifindex,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	{ "broadcast",	NEXTARG,	setifbroadaddr,	0,	AF_INET },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	{ "auto-revarp", 0,		setifrevarp,	1,	AF_INET },
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   273
	{ "ipmp",	0,		inetipmp,	1,	AF_ANY },
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	{ "plumb",	0,		inetplumb,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	{ "unplumb",	0,		inetunplumb,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	{ "subnet",	NEXTARG,	setifsubnet,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	{ "token",	NEXTARG,	setiftoken,	0,	AF_INET6 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	{ "tsrc",	NEXTARG,	setiftsrc,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	{ "tdst",	NEXTARG,	setiftdst,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	{ "encr_auth_algs", NEXTARG,	set_tun_esp_auth_alg, 0, AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	{ "encr_algs",	NEXTARG,	set_tun_esp_encr_alg, 0, AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	{ "auth_algs",	NEXTARG,	set_tun_ah_alg,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	{ "addif",	NEXTARG,	addif,		1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	{ "removeif",	NEXTARG,	removeif,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	{ "modlist",	0,		modlist,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	{ "modinsert",	NEXTARG,	modinsert,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	{ "modremove",	NEXTARG,	modremove,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	{ "failover",	-IFF_NOFAILOVER, setifflags,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	{ "-failover",	IFF_NOFAILOVER, setifflags,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	{ "standby",	IFF_STANDBY,	setifflags,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	{ "-standby",	-IFF_STANDBY,	setifflags,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	{ "failed",	IFF_FAILED,	setifflags,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	{ "-failed",	-IFF_FAILED,	setifflags,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	{ "group",	NEXTARG,	setifgroupname,	1,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	{ "configinfo",	0,		configinfo,	1,	AF_ANY },
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
   296
	{ "encaplimit",	NEXTARG,	set_tun_encap_limit,	0, AF_ANY },
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
   297
	{ "-encaplimit", 0,		clr_tun_encap_limit,	0, AF_ANY },
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
   298
	{ "thoplimit",	NEXTARG,	set_tun_hop_limit,	0, AF_ANY },
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	{ "set",	NEXTARG,	setifaddr,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	{ "destination", NEXTARG,	setifdstaddr,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	{ "zone",	NEXTARG,	setzone,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	{ "-zone",	0,		setzone,	0,	AF_ANY },
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
   303
	{ "all-zones",	0,		setallzones,	0,	AF_ANY },
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	{ "ether",	OPTARG,		setifether,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	{ "usesrc",	NEXTARG,	setifsrc,	0,	AF_ANY },
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
   306
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
   307
	/*
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
   308
	 * NOTE: any additions to this table must also be applied to ifparse
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
   309
	 *	(usr/src/cmd/cmd-inet/sbin/ifparse/ifparse.c)
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
   310
	 */
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
   311
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	{ 0,		0,		setifaddr,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	{ 0,		0,		setifdstaddr,	0,	AF_ANY },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	{ 0,		0,		0,		0,	0 },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
typedef struct if_config_cmd {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	uint64_t	iff_flag;
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   320
	int		iff_af;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	char		*iff_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
} if_config_cmd_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   324
/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   325
 * NOTE: print_config_flags() processes this table in order, so we put "up"
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   326
 * last so that we can be sure "-failover" will take effect first.  Otherwise,
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   327
 * IPMP test addresses will erroneously migrate to the IPMP interface.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   328
 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
static if_config_cmd_t	if_config_cmd_tbl[] = {
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   330
	{ IFF_NOTRAILERS,	AF_UNSPEC,	"-trailers"	},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   331
	{ IFF_PRIVATE,		AF_UNSPEC,	"private"	},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   332
	{ IFF_NOXMIT,		AF_UNSPEC,	"-xmit"		},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   333
	{ IFF_ANYCAST,		AF_INET6,	"anycast"	},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   334
	{ IFF_NOLOCAL,		AF_UNSPEC,	"-local"	},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   335
	{ IFF_DEPRECATED,	AF_UNSPEC,	"deprecated"	},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   336
	{ IFF_NOFAILOVER,	AF_UNSPEC,	"-failover"	},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   337
	{ IFF_STANDBY,		AF_UNSPEC,	"standby"	},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   338
	{ IFF_FAILED,		AF_UNSPEC,	"failed"	},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   339
	{ IFF_PREFERRED,	AF_UNSPEC,	"preferred"	},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   340
	{ IFF_NONUD,		AF_INET6,	"-nud"		},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   341
	{ IFF_NOARP,		AF_INET,	"-arp"		},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   342
	{ IFF_UP,		AF_UNSPEC, 	"up" 		},
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   343
	{ 0,			0,		NULL		},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
typedef struct ni {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	char		ni_name[LIFNAMSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	struct ni	*ni_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
} ni_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
static ni_t	*ni_list = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
static int	num_ni = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
/* End defines and structure definitions for ifconfig -a plumb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
/* Known address families */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
struct afswtch {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	char *af_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	short af_af;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	void (*af_status)();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	void (*af_getaddr)();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	void (*af_configinfo)();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
} afs[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	{ "inet", AF_INET, in_status, in_getaddr, in_configinfo },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	{ "inet6", AF_INET6, in6_status, in6_getaddr, in6_configinfo },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	{ 0, 0,	0, 0, 0 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
#define	SOCKET_AF(af)	(((af) == AF_UNSPEC) ? AF_INET : (af))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
struct afswtch *afp;	/* the address family being set or asked about */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
main(int argc, char *argv[])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   376
	int64_t		lifc_flags;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   377
	char		*default_ip_str;
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   378
	ipadm_status_t	istatus;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   379
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   380
	lifc_flags = LIFC_DEFAULT;
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   381
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	if (argc < 2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
		usage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	argc--, argv++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	if (strlen(*argv) > sizeof (name) - 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
		(void) fprintf(stderr, "%s: interface name too long\n", *argv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	(void) strncpy(name, *argv, sizeof (name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	name[sizeof (name) - 1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	(void) strncpy(origname, name, sizeof (origname));	/* For addif */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	default_ip_str = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	v4compat = get_compat_flag(&default_ip_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	if (v4compat == DEFAULT_PROT_BAD_VALUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
		    "ifconfig: %s: Bad value for %s in %s\n", default_ip_str,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
		    DEFAULT_IP, INET_DEFAULT_FILE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		free(default_ip_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
		exit(2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	free(default_ip_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	argc--, argv++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	if (argc > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
		struct afswtch *myafp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
		for (myafp = afp = afs; myafp->af_name; myafp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
			if (strcmp(myafp->af_name, *argv) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
				afp = myafp; argc--; argv++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
		af = lifr.lifr_addr.ss_family = afp->af_af;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		if (af == AF_INET6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
			v4compat = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	s = socket(SOCKET_AF(af), SOCK_DGRAM, 0);
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   421
	s4 = socket(AF_INET, SOCK_DGRAM, 0);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   422
	s6 = socket(AF_INET6, SOCK_DGRAM, 0);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
   423
	if (s == -1 || s4 == -1 || s6 == -1)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
		Perror0_exit("socket");
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   425
	/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   426
	 * Open the global libipadm handle. The flag IPH_LEGACY has to
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   427
	 * be specified to indicate that logical interface names will
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   428
	 * be used during interface creation and address creation.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   429
	 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   430
	if ((istatus = ipadm_open(&iph, IPH_LEGACY)) != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   431
		ipadmerr_exit(istatus, "unable to open handle to libipadm");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	 * Special interface names is any combination of these flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	 * Note that due to the ifconfig syntax they have to be combined
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	 * as a single '-' option.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	 *	-a	All interfaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	 *	-u	"up" interfaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	 *	-d	"down" interfaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	 *	-D	Interfaces not controlled by DHCP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	 *	-4	IPv4 interfaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	 *	-6	IPv6 interfaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	 *	-X	Turn on debug (not documented)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	 *	-v	Turn on verbose
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	 *	-Z	Only interfaces in caller's zone
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	if (name[0] == '-') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		/* One or more options */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
		int64_t onflags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
		int64_t offflags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
		int c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		char *av[2] = { "ifconfig", name };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		while ((c = getopt(2, av, "audDXZ46v")) != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
			switch ((char)c) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
			case 'a':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
				all = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
			case 'u':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
				onflags |= IFF_UP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
			case 'd':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
				offflags |= IFF_UP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
			case 'D':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
				offflags |= IFF_DHCPRUNNING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
			case 'X':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
				debug += 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
			case 'Z':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
				lifc_flags &= ~LIFC_ALLZONES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
			case '4':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
				 * -4 is not a compatable flag, therefore
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
				 * we assume they want v4compat turned off
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
				v4compat = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
				onflags |= IFF_IPV4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
			case '6':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
				 * If they want IPv6, well then we'll assume
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
				 * they don't want IPv4 compat
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
				v4compat = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
				onflags |= IFF_IPV6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
			case 'v':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
				verbose = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
			case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
				usage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
				exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
		if (!all) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
			(void) fprintf(stderr,
3628
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
   501
			    "ifconfig: %s: no such interface\n", name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
		}
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   504
		foreachinterface(argc, argv, af, onflags, offflags,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
		    lifc_flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
	} else {
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   507
		ifconfig(argc, argv, af, NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
	}
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   509
	ipadm_close(iph);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
/*
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   514
 * For each interface, call ifconfig(argc, argv, af, ifa).
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
 * Only call function if onflags and offflags are set or clear, respectively,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
 * in the interfaces flags field.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
static void
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   519
foreachinterface(int argc, char *argv[], int af,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
    int64_t onflags, int64_t offflags, int64_t lifc_flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
{
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   522
	ipadm_addr_info_t *ainfo, *ainfop;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   523
	struct ifaddrs *ifa;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   524
	ipadm_status_t istatus;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   525
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	 * Special case:
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   528
	 * ifconfig -a plumb should find all network interfaces in the current
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   529
	 * zone.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
	if (argc > 0 && (strcmp(*argv, "plumb") == 0)) {
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   532
		plumball(argc, argv, onflags, offflags, lifc_flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   533
		return;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   534
	}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   535
	/* Get all addresses in kernel including addresses that are zero. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   536
	istatus = ipadm_addr_info(iph, NULL, &ainfo, IPADM_OPT_ZEROADDR,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   537
	    lifc_flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   538
	if (istatus != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   539
		ipadmerr_exit(istatus, "could not get addresses from kernel");
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   540
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   541
	/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   542
	 * For each logical interface, call ifconfig() with the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   543
	 * given arguments.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   544
	 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   545
	for (ainfop = ainfo; ainfop != NULL; ainfop = IA_NEXT(ainfop)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   546
		if (ainfop->ia_state == IFA_DISABLED)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   547
			continue;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   548
		ifa = &ainfop->ia_ifa;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   549
		if (onflags || offflags) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   550
			if ((ifa->ifa_flags & onflags) != onflags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   551
				continue;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   552
			if ((~ifa->ifa_flags & offflags) != offflags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   553
				continue;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
		}
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   555
		s = (ifa->ifa_addr->ss_family == AF_INET ? s4 : s6);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   556
		(void) strncpy(name, ifa->ifa_name, sizeof (name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   557
		(void) strncpy(origname, name, sizeof (origname));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   558
		ifconfig(argc, argv, af, ifa);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	}
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   560
	ipadm_free_addr_info(ainfo);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   561
}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   562
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   563
/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   564
 * Used for `ifconfig -a plumb'. Finds all datalinks and plumbs the interface.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   565
 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   566
static void
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   567
plumball(int argc, char *argv[], int64_t onflags, int64_t offflags,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   568
    int64_t lifc_flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   569
{
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   570
	int n;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   571
	struct lifreq *lifrp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   572
	struct lifconf lifc;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   573
	char *buf;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   574
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   575
	if (onflags != 0 || offflags != 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   576
		(void) fprintf(stderr, "ifconfig: invalid syntax used to "
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   577
		    "plumb all interfaces.\n");
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   578
		exit(1);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   579
	}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   580
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   581
	if (find_all_interfaces(&lifc, &buf, lifc_flags) != 0 ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   582
	    lifc.lifc_len == 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   583
		return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	lifrp = lifc.lifc_req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	for (n = lifc.lifc_len / sizeof (struct lifreq); n > 0; n--, lifrp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		 * Reset global state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		 * setaddr: Used by parser to tear apart source and dest
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		 * name and origname contain the name of the 'current'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		 * interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		setaddr = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		(void) strncpy(name, lifrp->lifr_name, sizeof (name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
		(void) strncpy(origname, name, sizeof (origname));
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   596
		ifconfig(argc, argv, af, NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
/*
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   601
 * Parses the interface name and the command in argv[]. Calls the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   602
 * appropriate callback function for the given command from `cmds[]'
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   603
 * table.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   604
 * If there is no command specified, it prints all addresses.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
static void
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   607
ifconfig(int argc, char *argv[], int af, struct ifaddrs *ifa)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
	static boolean_t scan_netmask = _B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
	int ret;
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   611
	ipadm_status_t istatus;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   612
	struct lifreq lifr;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	if (argc == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
		status();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
	if (strcmp(*argv, "auto-dhcp") == 0 || strcmp(*argv, "dhcp") == 0) {
3431
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   620
		/*
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   621
		 * Some errors are ignored in the case where more than one
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   622
		 * interface is being operated on.
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   623
		 */
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   624
		ret = setifdhcp("ifconfig", name, argc, argv);
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   625
		if (ret == DHCP_EXIT_IF_FAILURE) {
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   626
			if (!all)
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   627
				exit(DHCP_EXIT_FAILURE);
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   628
		} else if (ret != DHCP_EXIT_SUCCESS) {
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   629
			exit(ret);
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
   630
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
	 * The following is a "hack" to get around the existing interface
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
	 * setting mechanism.  Currently, each interface attribute,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
	 * such as address, netmask, broadcast, ... is set separately.  But
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
	 * sometimes two or more attributes must be set together.  For
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
	 * example, setting an address without a netmask does not make sense.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
	 * Yet they can be set separately for IPv4 address using the current
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
	 * ifconfig(1M) syntax.  The kernel then "infers" the correct netmask
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
	 * using the deprecated "IP address classes."  This is simply not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
	 * correct.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
	 * The "hack" below is to go thru the whole command list looking for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
	 * the netmask command first.  Then use this netmask to set the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
	 * address.  This does not provide an extensible way to accommodate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
	 * future need for setting more than one attributes together.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
	 *
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   650
	 * Note that if the "netmask" command argument is a "+", we need
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   651
	 * to save this info and do the query after we know the address to
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   652
	 * be set.  The reason is that if "addif" is used, the working
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   653
	 * interface name will be changed later when the logical interface
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   654
	 * is created.  In in_getmask(), if an address is not provided,
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   655
	 * it will use the working interface's address to do the query.
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   656
	 * It will be wrong now as we don't know the logical interface's name.
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   657
	 *
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
	 * ifconfig(1M) is too overloaded and the code is so convoluted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
	 * that it is "safer" not to re-architect the code to fix the above
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	 * issue, hence this "hack."  We may be better off to have a new
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
	 * command with better syntax for configuring network interface
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
	 * parameters...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
	if (!scan_netmask && afp->af_af == AF_INET) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
		int	largc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
		char	**largv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
		/* Only go thru the command list once to find the netmask. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
		scan_netmask = _B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
		 * Currently, if multiple netmask commands are specified, the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
		 * last one will be used as the final netmask.  So we need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
		 * to scan the whole list to preserve this behavior.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
		for (largc = argc, largv = argv; largc > 0; largc--, largv++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
			if (strcmp(*largv, NETMASK_CMD) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
				if (--largc == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
				largv++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
				if (strcmp(*largv, "+") == 0) {
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   682
					g_netmask_set = G_NETMASK_PENDING;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
					in_getaddr(*largv, (struct sockaddr *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
					    &g_netmask, NULL);
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   686
					g_netmask_set = G_NETMASK_SET;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
				/* Continue the scan. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	while (argc > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
		struct cmd *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
		boolean_t found_cmd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		if (debug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
			(void) printf("ifconfig: argv %s\n", *argv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
		found_cmd = _B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
		for (p = cmds; p->c_func; p++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
			if (p->c_name) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
				if (strcmp(*argv, p->c_name) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
					/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
					 * indicate that the command was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
					 * found and check to see if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
					 * the address family is valid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
					 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
					found_cmd = _B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
					if (p->c_af == AF_ANY ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
					    af == p->c_af)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
						break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
				if (p->c_af == AF_ANY ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
				    af == p->c_af)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
		 * If we found the keyword, but the address family
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
		 * did not match spit out an error
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
		if (found_cmd && p->c_name == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
			(void) fprintf(stderr, "ifconfig: Operation %s not"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
			    " supported for %s\n", *argv, afp->af_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
		 * else (no keyword found), we assume it's an address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
		 * of some sort
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
		 */
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   733
		if (setaddr && ipaddr != NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   734
			/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   735
			 * We must have already filled in a source address in
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   736
			 * `ipaddr' and we now got a destination address.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   737
			 * Fill it in `ipaddr' and call libipadm to create
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   738
			 * the static address.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   739
			 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   740
			if (p->c_name == 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   741
				istatus = ipadm_set_dst_addr(ipaddr, *argv,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   742
				    (p->c_af == AF_ANY ? AF_UNSPEC : af));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   743
				if (istatus != IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   744
					ipadmerr_exit(istatus, "could not "
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   745
					    "set destination address");
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   746
				}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   747
				/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   748
				 * finished processing dstaddr, so reset setaddr
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   749
				 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   750
				setaddr = 0;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   751
			}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   752
			/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   753
			 * Both source and destination address are in `ipaddr'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   754
			 * Add the address by calling libipadm.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   755
			 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   756
			istatus = ipadm_create_addr(iph, ipaddr,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   757
			    IPADM_OPT_ACTIVE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   758
			if (istatus != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   759
				goto createfailed;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   760
			ipadm_destroy_addrobj(ipaddr);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   761
			ipaddr = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   762
			setaddr_done = _B_TRUE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   763
			if (p->c_name == 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   764
				/* move parser along */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   765
				argc--, argv++;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   766
				continue;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   767
			}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   768
		}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   769
		if (p->c_name == 0 && setaddr_done) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   770
			/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   771
			 * catch odd commands like
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   772
			 * "ifconfig <intf> addr1 addr2 addr3 addr4 up"
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   773
			 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   774
			(void) fprintf(stderr, "%s",
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   775
			    "ifconfig: cannot configure more than two "
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   776
			    "addresses in one command\n");
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   777
			exit(1);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   778
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
		if (p->c_func) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
			if (p->c_af == AF_INET6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
				v4compat = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
			if (p->c_parameter == NEXTARG ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
			    p->c_parameter == OPTARG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
				argc--, argv++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
				if (argc == 0 && p->c_parameter == NEXTARG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
					(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
					    "ifconfig: no argument for %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
					    p->c_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
					exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
			 *	Call the function if:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
			 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
			 *		there's no address family
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
			 *		restriction
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
			 *	OR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
			 *		we don't know the address yet
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
			 *		(because we were called from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
			 *		main)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
			 *	OR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
			 *		there is a restriction AND
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
			 *		the address families match
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
			if ((p->c_af == AF_ANY)	||
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   807
			    (ifa == NULL) ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   808
			    (ifa->ifa_addr->ss_family == p->c_af)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
				ret = (*p->c_func)(*argv, p->c_parameter);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
				 *	If c_func failed and we should
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
				 *	abort processing for this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
				 *	interface on failure, return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
				 *	now rather than going on to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
				 *	process other commands for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
				 *	the same interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
				if (ret != 0 && p->c_abortonfail)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
					return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
		argc--, argv++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   825
	if (setaddr && ipaddr != NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   826
		/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   827
		 * Only the source address was provided, which was already
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   828
		 * set in `ipaddr'. Add the address by calling libipadm.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   829
		 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   830
		istatus = ipadm_create_addr(iph, ipaddr, IPADM_OPT_ACTIVE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   831
		if (istatus != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   832
			goto createfailed;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   833
		ipadm_destroy_addrobj(ipaddr);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   834
		ipaddr = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   835
		setaddr_done = _B_TRUE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   836
	}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   837
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
	/* Check to see if there's a security hole in the tunnel setup. */
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   839
	if (ipsec_policy_set && !ipsec_auth_covered) {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   840
		(void) fprintf(stderr, "ifconfig: WARNING: tunnel with only "
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   841
		    "ESP and no authentication.\n");
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
   842
	}
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   843
	return;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   844
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   845
createfailed:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   846
	(void) fprintf(stderr, "ifconfig: could not create address:% s\n",
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   847
	    ipadm_status2str(istatus));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   848
	/* Remove the newly created logical interface. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   849
	if (strcmp(name, origname) != 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   850
		assert(strchr(name, ':') != NULL);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   851
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   852
		(void) ioctl(s, SIOCLIFREMOVEIF, (caddr_t)&lifr);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   853
	}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   854
	exit(1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
setdebugflag(char *val, int64_t arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
	debug++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
setverboseflag(char *val, int64_t arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
	verbose++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
/*
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   874
 * This function fills in the given lifreq's lifr_addr field based on
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   875
 * g_netmask_set.
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   876
 */
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   877
static void
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   878
set_mask_lifreq(struct lifreq *lifr, struct sockaddr_storage *addr,
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   879
    struct sockaddr_storage *mask)
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   880
{
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   881
	assert(addr != NULL);
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   882
	assert(mask != NULL);
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   883
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   884
	switch (g_netmask_set) {
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   885
	case G_NETMASK_SET:
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   886
		lifr->lifr_addr = g_netmask;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   887
		break;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   888
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   889
	case G_NETMASK_PENDING:
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   890
		/*
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   891
		 * "+" is used as the argument to "netmask" command.  Query
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   892
		 * the database on the correct netmask based on the address to
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   893
		 * be set.
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   894
		 */
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   895
		assert(afp->af_af == AF_INET);
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   896
		g_netmask = *addr;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   897
		if (!in_getmask((struct sockaddr_in *)&g_netmask, _B_TRUE)) {
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   898
			lifr->lifr_addr = *mask;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   899
			g_netmask_set = G_NETMASK_NIL;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   900
		} else {
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   901
			lifr->lifr_addr = g_netmask;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   902
			g_netmask_set = G_NETMASK_SET;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   903
		}
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   904
		break;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   905
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   906
	case G_NETMASK_NIL:
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   907
	default:
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   908
		lifr->lifr_addr = *mask;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   909
		break;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   910
	}
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   911
}
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   912
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   913
/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
 * Set the interface address. Handles <addr>, <addr>/<n> as well as /<n>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
 * syntax for setting the address, the address plus netmask, and just
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
 * the netmask respectively.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
setifaddr(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
{
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   922
	ipadm_status_t istatus;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
	int prefixlen = 0;
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   924
	struct  lifreq lifr1;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
	struct	sockaddr_storage laddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
	struct	sockaddr_storage netmask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
	struct	sockaddr_in6 *sin6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
	struct	sockaddr_in *sin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
	struct	sockaddr_storage sav_netmask;
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   930
	char cidraddr[BUFSIZ];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
	if (addr[0] == '/')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
		return (setifprefixlen(addr, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
	(*afp->af_getaddr)(addr, (struct sockaddr *)&laddr, &prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
	(void) memset(&netmask, 0, sizeof (netmask));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
	netmask.ss_family = afp->af_af;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
	switch (prefixlen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
	case NO_PREFIX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
		/* Nothing there - ok */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
	case BAD_ADDR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
		(void) fprintf(stderr, "ifconfig: Bad prefix length in %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
		    addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
		if (afp->af_af == AF_INET6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
			sin6 = (struct sockaddr_in6 *)&netmask;
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
   950
			if (!in_prefixlentomask(prefixlen, IPV6_ABITS,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
			    (uchar_t *)&sin6->sin6_addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
				(void) fprintf(stderr, "ifconfig: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
				    "Bad prefix length: %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
				    prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
				exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
			sin = (struct sockaddr_in *)&netmask;
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
   959
			if (!in_prefixlentomask(prefixlen, IP_ABITS,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
			    (uchar_t *)&sin->sin_addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
				(void) fprintf(stderr, "ifconfig: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
				    "Bad prefix length: %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
				    prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
				exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
		 * Just in case of funny setting of both prefix and netmask,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
		 * prefix should override the netmask command.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
		 */
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
   971
		g_netmask_set = G_NETMASK_NIL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
	}
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   974
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   975
	/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   976
	 * Check and see if any "netmask" command is used and perform the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   977
	 * necessary operation.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   978
	 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   979
	set_mask_lifreq(&lifr, &laddr, &netmask);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   980
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   981
	/* This check is temporary until libipadm supports IPMP interfaces. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   982
	if (ifconfig_use_libipadm(s, name)) {
12193
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   983
		char	addrstr[INET6_ADDRSTRLEN];
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   984
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   985
		if (af == AF_INET) {
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   986
			sin = (struct sockaddr_in *)&laddr;
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   987
			(void) inet_ntop(AF_INET, &sin->sin_addr, addrstr,
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   988
			    sizeof (addrstr));
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   989
		} else {
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   990
			sin6 = (struct sockaddr_in6 *)&laddr;
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   991
			(void) inet_ntop(AF_INET6, &sin6->sin6_addr, addrstr,
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   992
			    sizeof (addrstr));
d2b5034cbcfb 6944560 ifconfig is broken while configuring a hostname that has multiple entries in /etc/inet/ipnodes
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12048
diff changeset
   993
		}
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   994
		istatus = ipadm_create_addrobj(IPADM_ADDR_STATIC, name,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   995
		    &ipaddr);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   996
		if (istatus != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   997
			ipadmerr_exit(istatus, "setifaddr");
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
   998
12453
bca7c0331b06 6952709 'ifconfig <intf> plumb <addr>/<mask>" ignores the mask.
Girish Moodalbail <Girish.Moodalbail@oracle.COM>
parents: 12193
diff changeset
   999
		/*
bca7c0331b06 6952709 'ifconfig <intf> plumb <addr>/<mask>" ignores the mask.
Girish Moodalbail <Girish.Moodalbail@oracle.COM>
parents: 12193
diff changeset
  1000
		 * lifr.lifr_addr, which is updated by set_mask_lifreq()
bca7c0331b06 6952709 'ifconfig <intf> plumb <addr>/<mask>" ignores the mask.
Girish Moodalbail <Girish.Moodalbail@oracle.COM>
parents: 12193
diff changeset
  1001
		 * will contain the right mask to use.
bca7c0331b06 6952709 'ifconfig <intf> plumb <addr>/<mask>" ignores the mask.
Girish Moodalbail <Girish.Moodalbail@oracle.COM>
parents: 12193
diff changeset
  1002
		 */
bca7c0331b06 6952709 'ifconfig <intf> plumb <addr>/<mask>" ignores the mask.
Girish Moodalbail <Girish.Moodalbail@oracle.COM>
parents: 12193
diff changeset
  1003
		prefixlen = mask2plen(&lifr.lifr_addr);
bca7c0331b06 6952709 'ifconfig <intf> plumb <addr>/<mask>" ignores the mask.
Girish Moodalbail <Girish.Moodalbail@oracle.COM>
parents: 12193
diff changeset
  1004
		(void) snprintf(cidraddr, sizeof (cidraddr), "%s/%d",
bca7c0331b06 6952709 'ifconfig <intf> plumb <addr>/<mask>" ignores the mask.
Girish Moodalbail <Girish.Moodalbail@oracle.COM>
parents: 12193
diff changeset
  1005
		    addrstr, prefixlen);
bca7c0331b06 6952709 'ifconfig <intf> plumb <addr>/<mask>" ignores the mask.
Girish Moodalbail <Girish.Moodalbail@oracle.COM>
parents: 12193
diff changeset
  1006
bca7c0331b06 6952709 'ifconfig <intf> plumb <addr>/<mask>" ignores the mask.
Girish Moodalbail <Girish.Moodalbail@oracle.COM>
parents: 12193
diff changeset
  1007
		istatus = ipadm_set_addr(ipaddr, cidraddr, af);
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1008
		if (istatus != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1009
			ipadmerr_exit(istatus, "could not set address");
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1010
		/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1011
		 * let parser know we got a source.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1012
		 * Next address, if given, should be dest
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1013
		 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1014
		setaddr++;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1015
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1016
		/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1017
		 * address will be set by the parser after nextarg has
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1018
		 * been scanned
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1019
		 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1020
		return (0);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1021
	}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1022
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
	/* Tell parser that an address was set */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
	setaddr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
	/* save copy of netmask to restore in case of error */
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1026
	(void) strncpy(lifr1.lifr_name, name, sizeof (lifr1.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1027
	if (ioctl(s, SIOCGLIFNETMASK, (caddr_t)&lifr1) < 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
		Perror0_exit("SIOCGLIFNETMASK");
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1029
	sav_netmask = lifr1.lifr_addr;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
	 * If setting the address and not the mask, clear any existing mask
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
	 * and the kernel will then assign the default (netmask has been set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
	 * to 0 in this case).  If setting both (either by using a prefix or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
	 * using the netmask command), set the mask first, so the address will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
	 * be interpreted correctly.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
	 */
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1038
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1039
	/* lifr.lifr_addr already contains netmask from set_mask_lifreq() */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
	if (ioctl(s, SIOCSLIFNETMASK, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
		Perror0_exit("SIOCSLIFNETMASK");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
	if (debug) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
		char abuf[INET6_ADDRSTRLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
		void *addr = (afp->af_af == AF_INET) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
		    (void *)&((struct sockaddr_in *)&laddr)->sin_addr :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
		    (void *)&((struct sockaddr_in6 *)&laddr)->sin6_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
		(void) printf("Setting %s af %d addr %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
		    lifr.lifr_name, afp->af_af,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
		    inet_ntop(afp->af_af, addr, abuf, sizeof (abuf)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
	lifr.lifr_addr = laddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
	lifr.lifr_addr.ss_family = afp->af_af;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
	if (ioctl(s, SIOCSLIFADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
		 * Restore the netmask
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
		int saverr = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
		lifr.lifr_addr = sav_netmask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
		(void) ioctl(s, SIOCSLIFNETMASK, (caddr_t)&lifr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
		errno = saverr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
		Perror0_exit("SIOCSLIFADDR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
 * The following functions are stolen from the ipseckey(1m) program.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
 * Perhaps they should be somewhere common, but for now, we just maintain
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
 * two versions.  We do this because of the different semantics for which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
 * algorithms we select ("requested" for ifconfig vs. "actual" for key).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
static ulong_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
parsenum(char *num)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
	ulong_t rc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
	char *end = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
	errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
	rc = strtoul(num, &end, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
	if (errno != 0 || end == num || *end != '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
		rc = (ulong_t)-1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
	return (rc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
 * Parse and reverse parse possible algorithm values, include numbers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
 * Mostly stolen from ipseckey.c. See the comments above parsenum() for why
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
 * this isn't common to ipseckey.c.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
 * NOTE: Static buffer in this function for the return value.  Since ifconfig
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1099
 *       isn't multithreaded, this isn't a huge problem.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
#define	NBUF_SIZE 20	/* Enough to print a large integer. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
rparsealg(uint8_t alg_value, int proto_num)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
	struct ipsecalgent *alg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
	static char numprint[128];	/* Enough to hold an algorithm name. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
6524
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1110
	/*
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1111
	 * Special cases for "any" and "none"
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1112
	 * The kernel needs to be able to distinguish between "any"
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1113
	 * and "none" and the APIs are underdefined in this area for auth.
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1114
	 */
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1115
	if (proto_num == IPSEC_PROTO_AH) {
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1116
		if (alg_value == SADB_AALG_NONE)
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1117
			return ("none");
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1118
		if (alg_value == SADB_AALG_ANY)
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1119
			return ("any");
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1120
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
	alg = getipsecalgbynum(alg_value, proto_num, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
	if (alg != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
		(void) strlcpy(numprint, alg->a_names[0], sizeof (numprint));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
		freeipsecalgent(alg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
		(void) snprintf(numprint, sizeof (numprint), "%d", alg_value);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
	return (numprint);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
static uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
parsealg(char *algname, int proto_num)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
	struct ipsecalgent *alg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
	ulong_t invalue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
	if (algname == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
		(void) fprintf(stderr, "ifconfig: Unexpected end of command "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
		    "line.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
	/*
6524
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1146
	 * Special-case "none" and "any".
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1147
	 * Use strcasecmp because its length is bounded.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
	if (strcasecmp("none", algname) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
		return ((proto_num == IPSEC_PROTO_ESP) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
		    NO_ESP_EALG : NO_ESP_AALG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
	}
6524
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1153
	if ((strcasecmp("any", algname) == 0) && (proto_num == IPSEC_PROTO_AH))
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1154
		return (SADB_AALG_ANY);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
	alg = getipsecalgbyname(algname, proto_num, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
	if (alg != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
		invalue = alg->a_alg_num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
		freeipsecalgent(alg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
		return ((uint_t)invalue);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
	 * Since algorithms can be loaded during kernel run-time, check for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	 * numeric algorithm values too.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
	invalue = parsenum(algname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
	if ((invalue & (ulong_t)0xff) == invalue)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
		return ((uint_t)invalue);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
	(void) fprintf(stderr, "ifconfig: %s algorithm type %s unknown.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
	    (proto_num == IPSEC_PROTO_ESP) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
	    "Encryption" : "Authentication", algname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
	exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
	/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
 * Actual ifconfig functions to set tunnel security properties.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
enum ipsec_alg_type { ESP_ENCR_ALG = 1, ESP_AUTH_ALG, AH_AUTH_ALG };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
set_tun_algs(int which_alg, int alg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1187
	boolean_t	encr_alg_set = _B_FALSE;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1188
	iptun_params_t	params;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1189
	dladm_status_t	status;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1190
	ipsec_req_t	*ipsr;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1191
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1192
	if ((status = ifconfig_dladm_open(name, DATALINK_CLASS_IPTUN,
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1193
	    &params.iptun_param_linkid)) != DLADM_STATUS_OK)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1194
		goto done;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1195
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1196
	status = dladm_iptun_getparams(dlh, &params, DLADM_OPT_ACTIVE);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1197
	if (status != DLADM_STATUS_OK)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1198
		goto done;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1199
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1200
	ipsr = &params.iptun_param_secinfo;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
	 * If I'm just starting off this ifconfig, I want a clean slate,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
	 * otherwise, I've captured the current tunnel security settings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
	 * In the case of continuation, I merely add to the settings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
	 */
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1207
	if (!(params.iptun_param_flags & IPTUN_PARAM_SECINFO))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
		(void) memset(ipsr, 0, sizeof (*ipsr));
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1209
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1210
	/* We're only modifying the IPsec information */
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1211
	params.iptun_param_flags = IPTUN_PARAM_SECINFO;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
	switch (which_alg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
	case ESP_ENCR_ALG:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
		if (alg == NO_ESP_EALG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
			if (ipsr->ipsr_esp_auth_alg == SADB_AALG_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
				ipsr->ipsr_esp_req = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
			ipsr->ipsr_esp_alg = SADB_EALG_NONE;
6524
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1219
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1220
			/* Let the user specify NULL encryption implicitly. */
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1221
			if (ipsr->ipsr_esp_auth_alg != SADB_AALG_NONE) {
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1222
				encr_alg_set = _B_TRUE;
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1223
				ipsr->ipsr_esp_alg = SADB_EALG_NULL;
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1224
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
			encr_alg_set = _B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
			ipsr->ipsr_esp_req =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
			    IPSEC_PREF_REQUIRED | IPSEC_PREF_UNIQUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
			ipsr->ipsr_esp_alg = alg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
	case ESP_AUTH_ALG:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
		if (alg == NO_ESP_AALG) {
6524
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1234
			if ((ipsr->ipsr_esp_alg == SADB_EALG_NONE ||
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1235
			    ipsr->ipsr_esp_alg == SADB_EALG_NULL) &&
3609a6f77afc 6657863 ifconfig security params with esp and no auth expands esp_encr_algs to any
pwernau
parents: 6353
diff changeset
  1236
			    !encr_alg_set)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
				ipsr->ipsr_esp_req = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
			ipsr->ipsr_esp_auth_alg = SADB_AALG_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
			ipsr->ipsr_esp_req =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
			    IPSEC_PREF_REQUIRED | IPSEC_PREF_UNIQUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
			ipsr->ipsr_esp_auth_alg = alg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
			/* Let the user specify NULL encryption implicitly. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
			if (ipsr->ipsr_esp_alg == SADB_EALG_NONE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
			    !encr_alg_set)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
				ipsr->ipsr_esp_alg = SADB_EALG_NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
	case AH_AUTH_ALG:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
		if (alg == NO_AH_AALG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
			ipsr->ipsr_ah_req = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
			ipsr->ipsr_auth_alg = SADB_AALG_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
			ipsr->ipsr_ah_req =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
			    IPSEC_PREF_REQUIRED | IPSEC_PREF_UNIQUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
			ipsr->ipsr_auth_alg = alg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
		/* Will never hit DEFAULT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1263
	status = dladm_iptun_modify(dlh, &params, DLADM_OPT_ACTIVE);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1264
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1265
done:
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1266
	if (status != DLADM_STATUS_OK)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1267
		dladmerr_exit(status, name);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1268
	else {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1269
		ipsec_policy_set = _B_TRUE;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1270
		if ((ipsr->ipsr_esp_req != 0 &&
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1271
		    ipsr->ipsr_esp_auth_alg != SADB_AALG_NONE) ||
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1272
		    (ipsr->ipsr_ah_req != 0 &&
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1273
		    ipsr->ipsr_auth_alg != SADB_AALG_NONE))
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1274
			ipsec_auth_covered = _B_TRUE;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
set_tun_esp_encr_alg(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
	return (set_tun_algs(ESP_ENCR_ALG,
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  1284
	    parsealg(addr, IPSEC_PROTO_ESP)));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
set_tun_esp_auth_alg(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
	return (set_tun_algs(ESP_AUTH_ALG,
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  1292
	    parsealg(addr, IPSEC_PROTO_AH)));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
set_tun_ah_alg(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
	return (set_tun_algs(AH_AUTH_ALG,
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  1300
	    parsealg(addr, IPSEC_PROTO_AH)));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
setifrevarp(char *arg, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
	struct sockaddr_in	laddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
	if (afp->af_af == AF_INET6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
		    "ifconfig: revarp not possible on IPv6 interface %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
		    name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
	if (doifrevarp(name, &laddr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
		laddr.sin_family = AF_INET;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
		(void) memcpy(&lifr.lifr_addr, &laddr, sizeof (laddr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
		if (ioctl(s, SIOCSLIFADDR, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
			Perror0_exit("SIOCSLIFADDR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
setifsubnet(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
	int prefixlen = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
	struct	sockaddr_storage subnet;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
	(*afp->af_getaddr)(addr, &subnet, &prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
	switch (prefixlen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
	case NO_PREFIX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
		    "ifconfig: Missing prefix length in subnet %s\n", addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
		/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
	case BAD_ADDR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
		    "ifconfig: Bad prefix length in %s\n", addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
	lifr.lifr_addr = subnet;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
	lifr.lifr_addrlen = prefixlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
	if (ioctl(s, SIOCSLIFSUBNET, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
		Perror0_exit("SIOCSLIFSUBNET");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
setifnetmask(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
	struct sockaddr_in netmask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
	assert(afp->af_af != AF_INET6);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	if (strcmp(addr, "+") == 0) {
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1366
		if (!in_getmask(&netmask, _B_FALSE))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
			return (0);
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1368
		(void) printf("Setting netmask of %s to %s\n", name,
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1369
		    inet_ntoa(netmask.sin_addr));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
		in_getaddr(addr, (struct sockaddr *)&netmask, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
	(void) memcpy(&lifr.lifr_addr, &netmask, sizeof (netmask));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
	if (ioctl(s, SIOCSLIFNETMASK, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
		Perror0_exit("SIOCSLIFNETMASK");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
 * Parse '/<n>' as a netmask.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
setifprefixlen(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
	int prefixlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
	int af = afp->af_af;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
	prefixlen = in_getprefixlen(addr, _B_TRUE,
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
  1391
	    (af == AF_INET) ? IP_ABITS : IPV6_ABITS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
	if (prefixlen < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
		    "ifconfig: Bad prefix length in %s\n", addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
	(void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
	lifr.lifr_addr.ss_family = af;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
	if (af == AF_INET6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
		struct sockaddr_in6 *sin6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
		sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr;
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
  1403
		if (!in_prefixlentomask(prefixlen, IPV6_ABITS,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
		    (uchar_t *)&sin6->sin6_addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
			(void) fprintf(stderr, "ifconfig: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
			    "Bad prefix length: %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
			    prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
	} else if (af == AF_INET) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
		struct sockaddr_in *sin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
		sin = (struct sockaddr_in *)&lifr.lifr_addr;
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
  1414
		if (!in_prefixlentomask(prefixlen, IP_ABITS,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
		    (uchar_t *)&sin->sin_addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
			(void) fprintf(stderr, "ifconfig: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
			    "Bad prefix length: %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
			    prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
		(void) fprintf(stderr, "ifconfig: setting prefix only supported"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
		    " for address family inet or inet6\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
	if (ioctl(s, SIOCSLIFNETMASK, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
		Perror0_exit("SIOCSLIFNETMASK");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
setifbroadaddr(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
	struct	sockaddr_in broadaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
	assert(afp->af_af != AF_INET6);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
	if (strcmp(addr, "+") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
		 * This doesn't set the broadcast address at all. Rather, it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
		 * gets, then sets the interface's address, relying on the fact
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
		 * that resetting the address will reset the broadcast address.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
		(void) strncpy(lifr.lifr_name, name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
		    sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
		if (ioctl(s, SIOCGLIFADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
			if (errno != EADDRNOTAVAIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
				Perror0_exit("SIOCGLIFADDR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
		if (ioctl(s, SIOCSLIFADDR, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
			Perror0_exit("SIOCGLIFADDR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
	in_getaddr(addr, (struct sockaddr *)&broadaddr, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
	(void) memcpy(&lifr.lifr_addr, &broadaddr, sizeof (broadaddr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
	if (ioctl(s, SIOCSLIFBRDADDR, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
		Perror0_exit("SIOCSLIFBRDADDR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
 * set interface destination address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
setifdstaddr(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
	(*afp->af_getaddr)(addr, (struct sockaddr *)&lifr.lifr_addr, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
	if (ioctl(s, SIOCSLIFDSTADDR, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
		Perror0_exit("setifdstaddr: SIOCSLIFDSTADDR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
setifflags(char *val, int64_t value)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
{
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1485
	struct lifreq lifrl;	/* local lifreq struct */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1486
	boolean_t bringup = _B_FALSE;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
	if (ioctl(s, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
		Perror0_exit("setifflags: SIOCGLIFFLAGS");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
	if (value < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
		value = -value;
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1494
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1495
		if ((value & IFF_NOFAILOVER) && (lifr.lifr_flags & IFF_UP)) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1496
			/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1497
			 * The kernel does not allow administratively up test
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1498
			 * addresses to be converted to data addresses.  Bring
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1499
			 * the address down first, then bring it up after it's
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1500
			 * been converted to a data address.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1501
			 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1502
			lifr.lifr_flags &= ~IFF_UP;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1503
			(void) ioctl(s, SIOCSLIFFLAGS, (caddr_t)&lifr);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1504
			bringup = _B_TRUE;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1505
		}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1506
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
		lifr.lifr_flags &= ~value;
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1508
		if ((value & (IFF_UP | IFF_NOFAILOVER)) &&
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1509
		    (lifr.lifr_flags & IFF_DUPLICATE)) {
2546
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  1510
			/*
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  1511
			 * If the user is trying to mark an interface with a
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1512
			 * duplicate address as "down," or convert a duplicate
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1513
			 * test address to a data address, then fetch the
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1514
			 * address and set it.  This will cause IP to clear
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1515
			 * the IFF_DUPLICATE flag and stop the automatic
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1516
			 * recovery timer.
2546
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  1517
			 */
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  1518
			value = lifr.lifr_flags;
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  1519
			if (ioctl(s, SIOCGLIFADDR, (caddr_t)&lifr) >= 0)
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  1520
				(void) ioctl(s, SIOCSLIFADDR, (caddr_t)&lifr);
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  1521
			lifr.lifr_flags = value;
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  1522
		}
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  1523
	} else {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
		lifr.lifr_flags |= value;
2546
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  1525
	}
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1526
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1527
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1528
	 * If we're about to bring up an underlying physical IPv6 interface in
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1529
	 * an IPMP group, ensure the IPv6 IPMP interface is also up.  This is
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1530
	 * for backward compatibility with legacy configurations in which
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1531
	 * there are no explicit hostname files for IPMP interfaces.  (For
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1532
	 * IPv4, this is automatically handled by the kernel when migrating
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1533
	 * the underlying interface's data address to the IPMP interface.)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1534
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1535
	(void) strlcpy(lifrl.lifr_name, name, LIFNAMSIZ);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1536
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1537
	if (lifnum(lifr.lifr_name) == 0 &&
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1538
	    (lifr.lifr_flags & (IFF_UP|IFF_IPV6)) == (IFF_UP|IFF_IPV6) &&
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1539
	    ioctl(s, SIOCGLIFGROUPNAME, &lifrl) == 0 &&
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1540
	    lifrl.lifr_groupname[0] != '\0') {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1541
		lifgroupinfo_t lifgr;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1542
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1543
		(void) strlcpy(lifgr.gi_grname, lifrl.lifr_groupname,
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1544
		    LIFGRNAMSIZ);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1545
		if (ioctl(s, SIOCGLIFGROUPINFO, &lifgr) == -1)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1546
			Perror0_exit("setifflags: SIOCGLIFGROUPINFO");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1547
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1548
		(void) strlcpy(lifrl.lifr_name, lifgr.gi_grifname, LIFNAMSIZ);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1549
		if (ioctl(s, SIOCGLIFFLAGS, &lifrl) == -1)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1550
			Perror0_exit("setifflags: SIOCGLIFFLAGS");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1551
		if (!(lifrl.lifr_flags & IFF_UP)) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1552
			lifrl.lifr_flags |= IFF_UP;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1553
			if (ioctl(s, SIOCSLIFFLAGS, &lifrl) == -1)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1554
				Perror0_exit("setifflags: SIOCSLIFFLAGS");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1555
		}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1556
	}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1557
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1559
	if (ioctl(s, SIOCSLIFFLAGS, (caddr_t)&lifr) < 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
		Perror0_exit("setifflags: SIOCSLIFFLAGS");
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1561
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1562
	if (bringup) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1563
		lifr.lifr_flags |= IFF_UP;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1564
		if (ioctl(s, SIOCSLIFFLAGS, (caddr_t)&lifr) < 0)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1565
			Perror0_exit("setifflags: SIOCSLIFFLAGS IFF_UP");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
	}
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1567
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
setifmetric(char *val, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
	lifr.lifr_metric = atoi(val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
	if (ioctl(s, SIOCSLIFMETRIC, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
		Perror0_exit("setifmetric: SIOCSLIFMETRIC");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
setifmtu(char *val, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
	lifr.lifr_mtu = atoi(val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
	if (ioctl(s, SIOCSLIFMTU, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
		Perror0_exit("setifmtu: SIOCSLIFMTU");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
setifindex(char *val, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
	lifr.lifr_index = atoi(val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
	if (ioctl(s, SIOCSLIFINDEX, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
		Perror0_exit("setifindex: SIOCSLIFINDEX");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
/* ARGSUSED */
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1605
static void
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1606
notifycb(dlpi_handle_t dh, dlpi_notifyinfo_t *dnip, void *arg)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1607
{
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1608
}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1609
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1610
/* ARGSUSED */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
setifether(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
{
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1614
	uchar_t		*hwaddr;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1615
	int		hwaddrlen;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1616
	int		retval;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1617
	ifaddrlistx_t	*ifaddrp, *ifaddrs = NULL;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1618
	dlpi_handle_t	dh;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1619
	dlpi_notifyid_t id;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
	if (addr == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
		ifstatus(name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
		print_ifether(name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
	 * if the IP interface in the arguments is a logical
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
	 * interface, exit with an error now.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
	if (strchr(name, ':') != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
		(void) fprintf(stderr, "ifconfig: cannot change"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
		    " ethernet address of a logical interface\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1637
	if ((hwaddr = _link_aton(addr, &hwaddrlen)) == NULL) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1638
		if (hwaddrlen == -1)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
			(void) fprintf(stderr,
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1640
			    "ifconfig: bad ethernet address\n");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
			(void) fprintf(stderr, "ifconfig: malloc() failed\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1646
	if ((retval = dlpi_open(name, &dh, 0)) != DLPI_SUCCESS)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1647
		Perrdlpi_exit("cannot dlpi_open() link", name, retval);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1648
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1649
	retval = dlpi_enabnotify(dh, DL_NOTE_PHYS_ADDR, notifycb, NULL, &id);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1650
	if (retval == DLPI_SUCCESS) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1651
		(void) dlpi_disabnotify(dh, id, NULL);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1652
	} else {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1653
		/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1654
		 * This link does not support DL_NOTE_PHYS_ADDR: bring down
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1655
		 * all of the addresses to flush the old hardware address
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1656
		 * information out of IP.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1657
		 *
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1658
		 * NOTE: Skipping this when DL_NOTE_PHYS_ADDR is supported is
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1659
		 * more than an optimization: in.mpathd will set IFF_OFFLINE
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1660
		 * if it's notified and the new address is a duplicate of
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1661
		 * another in the group -- but the flags manipulation in
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1662
		 * ifaddr_{down,up}() cannot be atomic and thus might clobber
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1663
		 * IFF_OFFLINE, confusing in.mpathd.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1664
		 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1665
		if (ifaddrlistx(name, IFF_UP, 0, &ifaddrs) == -1)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1666
			Perror2_exit(name, "cannot get address list");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1667
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1668
		ifaddrp = ifaddrs;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1669
		for (; ifaddrp != NULL; ifaddrp = ifaddrp->ia_next) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1670
			if (!ifaddr_down(ifaddrp)) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1671
				Perror2_exit(ifaddrp->ia_name,
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1672
				    "cannot bring down");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1673
			}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1674
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
	/*
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1678
	 * Change the hardware address.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
	 */
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1680
	retval = dlpi_set_physaddr(dh, DL_CURR_PHYS_ADDR, hwaddr, hwaddrlen);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1681
	if (retval != DLPI_SUCCESS) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1682
		(void) fprintf(stderr,
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1683
		    "ifconfig: failed setting mac address on %s\n", name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
	}
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1685
	dlpi_close(dh);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
	/*
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1688
	 * If any addresses were brought down before changing the hardware
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1689
	 * address, bring them up again.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
	 */
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1691
	for (ifaddrp = ifaddrs; ifaddrp != NULL; ifaddrp = ifaddrp->ia_next) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1692
		if (!ifaddr_up(ifaddrp))
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1693
			Perror2_exit(ifaddrp->ia_name, "cannot bring up");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
	}
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1695
	ifaddrlistx_free(ifaddrs);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
 * Print an interface's Ethernet address, if it has one.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
static void
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1704
print_ifether(const char *ifname)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1706
	int fd;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
	fd = socket(AF_INET, SOCK_DGRAM, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
	if (fd == -1 || ioctl(fd, SIOCGLIFFLAGS, &lifr) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
		 * It's possible the interface is only configured for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
		 * IPv6; check again with AF_INET6.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
		(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
		fd = socket(AF_INET6, SOCK_DGRAM, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
		if (fd == -1 || ioctl(fd, SIOCGLIFFLAGS, &lifr) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
			(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
	(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1725
	/* VNI and IPMP interfaces don't have MAC addresses */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  1726
	if (lifr.lifr_flags & (IFF_VIRTUAL|IFF_IPMP))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1729
	/* IP tunnels also don't have Ethernet-like MAC addresses */
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1730
	if (ifconfig_dladm_open(ifname, DATALINK_CLASS_IPTUN, NULL) ==
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1731
	    DLADM_STATUS_OK)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1732
		return;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
	dlpi_print_address(ifname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
/*
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1738
 * static int find_all_interfaces(struct lifconf *lifcp, char **buf,
3448
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1739
 *     int64_t lifc_flags)
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1740
 *
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1741
 * It finds all active data links.
3448
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1742
 *
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1743
 * It takes in input a pointer to struct lifconf to receive interfaces
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1744
 * informations, a **char to hold allocated buffer, and a lifc_flags.
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1745
 *
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1746
 * Return values:
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1747
 *  0 = everything OK
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1748
 * -1 = problem
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1749
 */
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1750
static int
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1751
find_all_interfaces(struct lifconf *lifcp, char **buf, int64_t lifc_flags)
3448
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1752
{
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1753
	unsigned bufsize;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1754
	int n;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1755
	ni_t *nip;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1756
	struct lifreq *lifrp;
8673
c3b43e751053 6793859 ifconfig find_all_global_interfaces() calls dladm_open() for every link
Vasumathi Sundaram - Sun Microsystems <Vasumathi.Sundaram@Sun.COM>
parents: 8485
diff changeset
  1757
	dladm_status_t status;
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1758
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1759
	if (!dlh_opened) {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1760
		status = ifconfig_dladm_open(NULL, 0, NULL);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1761
		if (status != DLADM_STATUS_OK)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1762
			dladmerr_exit(status, "unable to open dladm handle");
8673
c3b43e751053 6793859 ifconfig find_all_global_interfaces() calls dladm_open() for every link
Vasumathi Sundaram - Sun Microsystems <Vasumathi.Sundaram@Sun.COM>
parents: 8485
diff changeset
  1763
	}
c3b43e751053 6793859 ifconfig find_all_global_interfaces() calls dladm_open() for every link
Vasumathi Sundaram - Sun Microsystems <Vasumathi.Sundaram@Sun.COM>
parents: 8485
diff changeset
  1764
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1765
	(void) dlpi_walk(ni_entry, dlh, 0);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1766
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  1767
	/* Now, translate the linked list into a struct lifreq buffer */
3448
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1768
	if (num_ni == 0) {
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1769
		lifcp->lifc_family = AF_UNSPEC;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1770
		lifcp->lifc_flags = lifc_flags;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1771
		lifcp->lifc_len = 0;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1772
		lifcp->lifc_buf = NULL;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1773
		return (0);
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1774
	}
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1775
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1776
	bufsize = num_ni * sizeof (struct lifreq);
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1777
	if ((*buf = malloc(bufsize)) == NULL)
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1778
		Perror0_exit("find_all_interfaces: malloc failed");
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1779
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1780
	lifcp->lifc_family = AF_UNSPEC;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1781
	lifcp->lifc_flags = lifc_flags;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1782
	lifcp->lifc_len = bufsize;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1783
	lifcp->lifc_buf = *buf;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1784
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1785
	for (n = 0, lifrp = lifcp->lifc_req; n < num_ni; n++, lifrp++) {
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1786
		nip = ni_list;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1787
		(void) strncpy(lifrp->lifr_name, nip->ni_name,
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1788
		    sizeof (lifr.lifr_name));
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1789
		ni_list = nip->ni_next;
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1790
		free(nip);
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1791
	}
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1792
	return (0);
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1793
}
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1794
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  1795
/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
 * Create the next unused logical interface using the original name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
 * and assign the address (and mask if '/<n>' is part of the address).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
 * Use the new logical interface for subsequent subcommands by updating
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
 * the name variable.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
 * This allows syntax like:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
 *	ifconfig le0 addif 109.106.86.130 netmask + up \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
 *	addif 109.106.86.131 netmask + up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
addif(char *str, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
	int prefixlen = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
	struct sockaddr_storage laddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
	struct sockaddr_storage mask;
12641
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1812
	struct sockaddr_in6 *sin6;
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1813
	struct sockaddr_in *sin;
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1814
	ipadm_status_t istatus;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1815
	char cidraddr[BUFSIZ];
12641
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1816
	char addrstr[INET6_ADDRSTRLEN];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
	(void) strncpy(name, origname, sizeof (name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
	if (strchr(name, ':') != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
		    "ifconfig: addif: bad physical interface name %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
		    name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
	 * clear so parser will interpret next address as source followed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
	 * by possible dest
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
	setaddr = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
	(*afp->af_getaddr)(str, (struct sockaddr *)&laddr, &prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
	switch (prefixlen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
	case NO_PREFIX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
		/* Nothing there - ok */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
	case BAD_ADDR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
		    "ifconfig: Bad prefix length in %s\n", str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
		(void) memset(&mask, 0, sizeof (mask));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
		mask.ss_family = afp->af_af;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
		if (afp->af_af == AF_INET6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
			sin6 = (struct sockaddr_in6 *)&mask;
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
  1847
			if (!in_prefixlentomask(prefixlen, IPV6_ABITS,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
			    (uchar_t *)&sin6->sin6_addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
				(void) fprintf(stderr, "ifconfig: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
				    "Bad prefix length: %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
				    prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
				exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
			sin = (struct sockaddr_in *)&mask;
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
  1856
			if (!in_prefixlentomask(prefixlen, IP_ABITS,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
			    (uchar_t *)&sin->sin_addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
				(void) fprintf(stderr, "ifconfig: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
				    "Bad prefix length: %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
				    prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
				exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
		}
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1864
		g_netmask_set = G_NETMASK_NIL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1868
	/*
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1869
	 * This is a "hack" to get around the problem of SIOCLIFADDIF.  The
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1870
	 * problem is that this ioctl does not include the netmask when
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1871
	 * adding a logical interface.  This is the same problem described
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1872
	 * in the ifconfig() comments.  To get around this problem, we first
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1873
	 * add the logical interface with a 0 address.  After that, we set
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1874
	 * the netmask if provided.  Finally we set the interface address.
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1875
	 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1877
	(void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
	/* Note: no need to do DAD here since the interface isn't up yet. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
	if (ioctl(s, SIOCLIFADDIF, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
		Perror0_exit("addif: SIOCLIFADDIF");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
	(void) printf("Created new logical interface %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
	    lifr.lifr_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
	(void) strncpy(name, lifr.lifr_name, sizeof (name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1888
	/*
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1889
	 * Check and see if any "netmask" command is used and perform the
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1890
	 * necessary operation.
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1891
	 */
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1892
	set_mask_lifreq(&lifr, &laddr, &mask);
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1893
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1894
	/* This check is temporary until libipadm supports IPMP interfaces. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1895
	if (ifconfig_use_libipadm(s, name)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1896
		/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1897
		 * We added the logical interface above before calling
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1898
		 * ipadm_create_addr(), because, with IPH_LEGACY, we need
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1899
		 * to do an addif for `ifconfig ce0 addif <addr>' but not for
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1900
		 * `ifconfig ce0 <addr>'. libipadm does not have a flag to
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1901
		 * to differentiate between these two cases. To keep it simple,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1902
		 * we always create the logical interface and pass it to
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1903
		 * libipadm instead of requiring libipadm to addif for some
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1904
		 * cases and not do addif for other cases.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1905
		 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1906
		istatus = ipadm_create_addrobj(IPADM_ADDR_STATIC, name,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1907
		    &ipaddr);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1908
		if (istatus != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1909
			ipadmerr_exit(istatus, "addif");
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1910
12641
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1911
		if (af == AF_INET) {
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1912
			sin = (struct sockaddr_in *)&laddr;
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1913
			(void) inet_ntop(AF_INET, &sin->sin_addr, addrstr,
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1914
			    sizeof (addrstr));
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1915
		} else {
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1916
			sin6 = (struct sockaddr_in6 *)&laddr;
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1917
			(void) inet_ntop(AF_INET6, &sin6->sin6_addr, addrstr,
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1918
			    sizeof (addrstr));
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1919
		}
12641
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1920
		/*
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1921
		 * lifr.lifr_addr, which is updated by set_mask_lifreq()
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1922
		 * will contain the right mask to use.
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1923
		 */
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1924
		prefixlen = mask2plen(&lifr.lifr_addr);
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1925
		(void) snprintf(cidraddr, sizeof (cidraddr), "%s/%d",
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1926
		    addrstr, prefixlen);
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1927
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1928
		istatus = ipadm_set_addr(ipaddr, cidraddr, af);
0d09c6ce3fde 6954468 ifconfig is broken while using a hostname that maps to multiple addresses in /etc/hosts (addif case)
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12592
diff changeset
  1929
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1930
		if (istatus != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1931
			ipadmerr_exit(istatus, "could not set address");
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1932
		setaddr++;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1933
		/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1934
		 * address will be set by the parser after nextarg
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1935
		 * has been scanned
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1936
		 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1937
		return (0);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1938
	}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1939
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1940
	/*
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1941
	 * Only set the netmask if "netmask" command is used or a prefix is
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1942
	 * provided.
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1943
	 */
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1944
	if (g_netmask_set == G_NETMASK_SET || prefixlen >= 0) {
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1945
		/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1946
		 * lifr.lifr_addr already contains netmask from
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1947
		 * set_mask_lifreq().
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1948
		 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
		if (ioctl(s, SIOCSLIFNETMASK, (caddr_t)&lifr) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
			Perror0_exit("addif: SIOCSLIFNETMASK");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
	}
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1952
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1953
	/* Finally, we set the interface address. */
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1954
	lifr.lifr_addr = laddr;
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1955
	if (ioctl(s, SIOCSLIFADDR, (caddr_t)&lifr) < 0)
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1956
		Perror0_exit("SIOCSLIFADDR");
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  1957
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
	 * let parser know we got a source.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
	 * Next address, if given, should be dest
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
	setaddr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
 * Remove a logical interface based on its IP address. Unlike addif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
 * there is no '/<n>' here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
 * Verifies that the interface is down before it is removed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
removeif(char *str, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
	struct sockaddr_storage laddr;
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1976
	ipadm_status_t istatus;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1977
	ipadm_addr_info_t *ainfo, *ainfop;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
	if (strchr(name, ':') != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
		    "ifconfig: removeif: bad physical interface name %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
		    name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
	(*afp->af_getaddr)(str, &laddr, NULL);
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1987
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1988
	/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1989
	 * Following check is temporary until libipadm supports
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1990
	 * IPMP interfaces.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1991
	 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1992
	if (!ifconfig_use_libipadm(s, name))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1993
		goto delete;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1994
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1995
	/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1996
	 * Get all addresses and search this address among the active
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1997
	 * addresses. If an address object was found, delete using
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1998
	 * ipadm_delete_addr().
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  1999
	 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2000
	istatus = ipadm_addr_info(iph, name, &ainfo, 0, LIFC_DEFAULT);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2001
	if (istatus != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2002
		ipadmerr_exit(istatus, "removeif");
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2003
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2004
	for (ainfop = ainfo; ainfop != NULL; ainfop = IA_NEXT(ainfop))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2005
		if (sockaddrcmp(ainfop->ia_ifa.ifa_addr, &laddr))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2006
			break;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2007
12592
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2008
	if (ainfop != NULL) {
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2009
		if (strchr(ainfop->ia_ifa.ifa_name, ':') == NULL) {
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2010
			(void) fprintf(stderr,
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2011
			    "ifconfig: removeif: cannot remove interface: %s\n",
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2012
			    name);
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2013
			exit(1);
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2014
		}
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2015
		if (ainfop->ia_aobjname[0] != '\0') {
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2016
			istatus = ipadm_delete_addr(iph, ainfop->ia_aobjname,
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2017
			    IPADM_OPT_ACTIVE);
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2018
			if (istatus != IPADM_SUCCESS) {
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2019
				ipadmerr_exit(istatus,
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2020
				    "could not delete address");
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2021
			}
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2022
			ipadm_free_addr_info(ainfo);
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2023
			return (0);
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2024
		}
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2025
	}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2026
	ipadm_free_addr_info(ainfo);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2027
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2028
delete:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2029
	/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2030
	 * An address object for this address was not found in ipadm.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2031
	 * Delete with SIOCLIFREMOVEIF.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2032
	 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
	lifr.lifr_addr = laddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
	if (ioctl(s, SIOCLIFREMOVEIF, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
		if (errno == EBUSY) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
			/* This can only happen if ipif_id = 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
			(void) fprintf(stderr,
12592
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  2039
			    "ifconfig: removeif: cannot remove interface: %s\n",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
			    name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
		Perror0_exit("removeif: SIOCLIFREMOVEIF");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
 * Set the address token for IPv6.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
setiftoken(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
	int prefixlen = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
	struct sockaddr_in6 token;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
	in6_getaddr(addr, (struct sockaddr *)&token, &prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
	switch (prefixlen) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
	case NO_PREFIX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
		    "ifconfig: Missing prefix length in subnet %s\n", addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
		/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
	case BAD_ADDR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
		    "ifconfig: Bad prefix length in %s\n", addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
	(void) memcpy(&lifr.lifr_addr, &token, sizeof (token));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
	lifr.lifr_addrlen = prefixlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
	if (ioctl(s, SIOCSLIFTOKEN, (caddr_t)&lifr) < 0)  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
		Perror0_exit("setiftoken: SIOCSLIFTOKEN");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
static int
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2083
setifgroupname(char *grname, int64_t param)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
{
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2085
	lifgroupinfo_t		lifgr;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2086
	struct lifreq		lifrl;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2087
	ifaddrlistx_t		*ifaddrp, *nextifaddrp;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2088
	ifaddrlistx_t		*ifaddrs = NULL, *downaddrs = NULL;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2089
	int			af;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2090
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
	if (debug) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
		(void) printf("Setting groupname %s on interface %s\n",
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2093
		    grname, name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
	}
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2095
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2096
	(void) strlcpy(lifrl.lifr_name, name, LIFNAMSIZ);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2097
	(void) strlcpy(lifrl.lifr_groupname, grname, LIFGRNAMSIZ);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2098
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2099
	while (ioctl(s, SIOCSLIFGROUPNAME, &lifrl) == -1) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2100
		switch (errno) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2101
		case ENOENT:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2102
			/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2103
			 * The group doesn't yet exist; create it and repeat.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2104
			 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2105
			af = afp->af_af;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2106
			if (create_ipmp(grname, af, NULL, _B_TRUE) == -1) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2107
				if (errno == EEXIST)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2108
					continue;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2109
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2110
				Perror2(grname, "cannot create IPMP group");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2111
				goto fail;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2112
			}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2113
			continue;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2114
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2115
		case EALREADY:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2116
			/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2117
			 * The interface is already in another group; must
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2118
			 * remove existing membership first.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2119
			 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2120
			lifrl.lifr_groupname[0] = '\0';
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2121
			if (ioctl(s, SIOCSLIFGROUPNAME, &lifrl) == -1) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2122
				Perror2(name, "cannot remove existing "
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2123
				    "IPMP group membership");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2124
				goto fail;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2125
			}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2126
			(void) strlcpy(lifrl.lifr_groupname, grname,
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2127
			    LIFGRNAMSIZ);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2128
			continue;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2129
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2130
		case EAFNOSUPPORT:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2131
			/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2132
			 * The group exists, but it's not configured with the
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2133
			 * address families the interface needs.  Since only
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2134
			 * two address families are currently supported, just
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2135
			 * configure the "other" address family.  Note that we
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2136
			 * may race with group deletion or creation by another
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2137
			 * process (ENOENT or EEXIST); in such cases we repeat
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2138
			 * our original SIOCSLIFGROUPNAME.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2139
			 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2140
			(void) strlcpy(lifgr.gi_grname, grname, LIFGRNAMSIZ);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2141
			if (ioctl(s, SIOCGLIFGROUPINFO, &lifgr) == -1) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2142
				if (errno == ENOENT)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2143
					continue;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2144
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2145
				Perror2(grname, "SIOCGLIFGROUPINFO");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2146
				goto fail;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2147
			}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2148
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2149
			af = lifgr.gi_v4 ? AF_INET6 : AF_INET;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2150
			if (create_ipmp(grname, af, lifgr.gi_grifname,
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2151
			    _B_TRUE) == -1) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2152
				if (errno == EEXIST)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2153
					continue;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2154
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2155
				Perror2(grname, "cannot configure IPMP group");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2156
				goto fail;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2157
			}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2158
			continue;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2159
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2160
		case EADDRINUSE:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2161
			/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2162
			 * Some addresses are in-use (or under control of DAD).
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2163
			 * Bring them down and retry the group join operation.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2164
			 * We will bring them back up after the interface has
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2165
			 * been placed in the group.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2166
			 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2167
			if (ifaddrlistx(lifrl.lifr_name, IFF_UP|IFF_DUPLICATE,
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2168
			    0, &ifaddrs) == -1) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2169
				Perror2(grname, "cannot get address list");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2170
				goto fail;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2171
			}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2172
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2173
			ifaddrp = ifaddrs;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2174
			for (; ifaddrp != NULL; ifaddrp = nextifaddrp) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2175
				if (!ifaddr_down(ifaddrp)) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2176
					ifaddrs = ifaddrp;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2177
					goto fail;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2178
				}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2179
				nextifaddrp = ifaddrp->ia_next;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2180
				ifaddrp->ia_next = downaddrs;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2181
				downaddrs = ifaddrp;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2182
			}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2183
			ifaddrs = NULL;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2184
			continue;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2185
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2186
		case EADDRNOTAVAIL: {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2187
			/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2188
			 * Some data addresses are under application control.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2189
			 * For some of these (e.g., ADDRCONF), the application
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2190
			 * should remove the address, in which case we retry a
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2191
			 * few times (since the application's action is not
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2192
			 * atomic with respect to us) before bailing out and
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2193
			 * informing the user.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2194
			 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2195
			int ntries, nappaddr = 0;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2196
			const if_appflags_t *iap = if_appflags_tbl;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2197
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2198
			for (; iap->ia_app != NULL; iap++) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2199
				ntries = 0;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2200
again:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2201
				if (ifaddrlistx(lifrl.lifr_name, iap->ia_flag,
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2202
				    IFF_NOFAILOVER, &ifaddrs) == -1) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2203
					(void) fprintf(stderr, "ifconfig: %s: "
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2204
					    "cannot get data addresses managed "
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2205
					    "by %s\n", lifrl.lifr_name,
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2206
					    iap->ia_app);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2207
					goto fail;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2208
				}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2209
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2210
				if (ifaddrs == NULL)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2211
					continue;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2212
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2213
				ifaddrlistx_free(ifaddrs);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2214
				ifaddrs = NULL;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2215
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2216
				if (++ntries < iap->ia_tries) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2217
					(void) poll(NULL, 0, 100);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2218
					goto again;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2219
				}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2220
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2221
				(void) fprintf(stderr, "ifconfig: cannot join "
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2222
				    "IPMP group: %s has data addresses managed "
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2223
				    "by %s\n", lifrl.lifr_name, iap->ia_app);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2224
				nappaddr++;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2225
			}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2226
			if (nappaddr > 0)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2227
				goto fail;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2228
			continue;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2229
		}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2230
		default:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2231
			Perror2(name, "SIOCSLIFGROUPNAME");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2232
			goto fail;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2233
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
	/*
12048
162e93ccf12f 6927499 ipmgmtd will go out of sync when an interface is moved into an IPMP group
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 12016
diff changeset
  2237
	 * If the interface being moved is under the control of `ipmgmtd(1M)'
162e93ccf12f 6927499 ipmgmtd will go out of sync when an interface is moved into an IPMP group
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 12016
diff changeset
  2238
	 * dameon then we should inform the daemon about this move, so that
162e93ccf12f 6927499 ipmgmtd will go out of sync when an interface is moved into an IPMP group
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 12016
diff changeset
  2239
	 * the daemon can delete the state associated with this interface.
162e93ccf12f 6927499 ipmgmtd will go out of sync when an interface is moved into an IPMP group
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 12016
diff changeset
  2240
	 *
162e93ccf12f 6927499 ipmgmtd will go out of sync when an interface is moved into an IPMP group
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 12016
diff changeset
  2241
	 * This workaround is needed until the IPMP support in ipadm(1M).
162e93ccf12f 6927499 ipmgmtd will go out of sync when an interface is moved into an IPMP group
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 12016
diff changeset
  2242
	 */
162e93ccf12f 6927499 ipmgmtd will go out of sync when an interface is moved into an IPMP group
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 12016
diff changeset
  2243
	ipadm_if_move(iph, name);
162e93ccf12f 6927499 ipmgmtd will go out of sync when an interface is moved into an IPMP group
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 12016
diff changeset
  2244
162e93ccf12f 6927499 ipmgmtd will go out of sync when an interface is moved into an IPMP group
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 12016
diff changeset
  2245
	/*
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2246
	 * If there were addresses that we had to bring down, it's time to
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2247
	 * bring them up again.  As part of bringing them up, the kernel will
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2248
	 * automatically move them to the new IPMP interface.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
	 */
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2250
	for (ifaddrp = downaddrs; ifaddrp != NULL; ifaddrp = ifaddrp->ia_next) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2251
		if (!ifaddr_up(ifaddrp) && errno != ENXIO) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2252
			(void) fprintf(stderr, "ifconfig: cannot bring back up "
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2253
			    "%s: %s\n", ifaddrp->ia_name, strerror(errno));
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2254
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
	}
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2256
	ifaddrlistx_free(downaddrs);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2257
	return (0);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2258
fail:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2259
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2260
	 * Attempt to bring back up any interfaces that we downed.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2261
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2262
	for (ifaddrp = downaddrs; ifaddrp != NULL; ifaddrp = ifaddrp->ia_next) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2263
		if (!ifaddr_up(ifaddrp) && errno != ENXIO) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2264
			(void) fprintf(stderr, "ifconfig: cannot bring back up "
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2265
			    "%s: %s\n", ifaddrp->ia_name, strerror(errno));
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2266
		}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2267
	}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2268
	ifaddrlistx_free(downaddrs);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2269
	ifaddrlistx_free(ifaddrs);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
	/*
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2272
	 * We'd return -1, but foreachinterface() doesn't propagate the error
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2273
	 * into the exit status, so we're forced to explicitly exit().
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
	 */
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2275
	exit(1);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2276
	/* NOTREACHED */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2277
}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2278
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2279
static boolean_t
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2280
modcheck(const char *ifname)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2281
{
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2282
	(void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2283
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2284
	if (ioctl(s, SIOCGLIFFLAGS, &lifr) < 0) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2285
		Perror0("SIOCGLIFFLAGS");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2286
		return (_B_FALSE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2289
	if (lifr.lifr_flags & IFF_IPMP) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2290
		(void) fprintf(stderr, "ifconfig: %s: module operations not"
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2291
		    " supported on IPMP interfaces\n", ifname);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2292
		return (_B_FALSE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
	}
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2294
	if (lifr.lifr_flags & IFF_VIRTUAL) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2295
		(void) fprintf(stderr, "ifconfig: %s: module operations not"
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2296
		    " supported on virtual IP interfaces\n", ifname);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2297
		return (_B_FALSE);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2298
	}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2299
	return (_B_TRUE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
 * To list all the modules above a given network interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
modlist(char *null, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
{
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2309
	int muxid_fd;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
	int muxfd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
	int ipfd_lowstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
	int arpfd_lowstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
	int num_mods;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
	struct str_list strlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
	int orig_arpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2318
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2319
	 * We'd return -1, but foreachinterface() doesn't propagate the error
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2320
	 * into the exit status, so we're forced to explicitly exit().
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2321
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2322
	if (!modcheck(name))
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2323
		exit(1);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2324
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2325
	if (ip_domux2fd(&muxfd, &muxid_fd, &ipfd_lowstr, &arpfd_lowstr,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
	    &orig_arpid) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
	if ((num_mods = ioctl(ipfd_lowstr, I_LIST, NULL)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
		Perror0("cannot I_LIST to get the number of modules");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
		if (debug > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
			(void) printf("Listing (%d) modules above %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
			    num_mods, name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
		strlist.sl_nmods = num_mods;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
		strlist.sl_modlist = malloc(sizeof (struct str_mlist) *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
		    num_mods);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
		if (strlist.sl_modlist == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
			Perror0("cannot malloc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
			if (ioctl(ipfd_lowstr, I_LIST, (caddr_t)&strlist) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
				Perror0("cannot I_LIST for module names");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
				for (i = 0; i < strlist.sl_nmods; i++) {
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2347
					(void) printf("%d %s\n", i,
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2348
					    strlist.sl_modlist[i].l_name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
			free(strlist.sl_modlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
	}
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2354
	return (ip_plink(muxfd, muxid_fd, ipfd_lowstr, arpfd_lowstr,
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2355
	    orig_arpid));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
#define	MODINSERT_OP	'i'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
#define	MODREMOVE_OP	'r'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
 * To insert a module to the stream of the interface.  It is just a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
 * wrapper.  The real function is modop().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
modinsert(char *arg, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
	return (modop(arg, MODINSERT_OP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
 * To remove a module from the stream of the interface.  It is just a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
 * wrapper.  The real function is modop().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
modremove(char *arg, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
	return (modop(arg, MODREMOVE_OP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
 * Helper function for mod*() functions.  It gets a fd to the lower IP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
 * stream and I_PUNLINK's the lower stream.  It also initializes the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
 * global variable lifr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2387
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
 * Param:
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2389
 *	int *muxfd: fd to /dev/udp{,6} for I_PLINK/I_PUNLINK
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2390
 *	int *muxid_fd: fd to /dev/udp{,6} for LIFMUXID
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2391
 *	int *ipfd_lowstr: fd to the lower IP stream.
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2392
 *	int *arpfd_lowstr: fd to the lower ARP stream.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
 * Return:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
 *	-1 if operation fails, 0 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
 *
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2397
 * Please see the big block comment above ifplumb() for the logic of the
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2398
 * PLINK/PUNLINK
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
static int
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2401
ip_domux2fd(int *muxfd, int *muxid_fd, int *ipfd_lowstr, int *arpfd_lowstr,
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2402
    int *orig_arpid)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
	uint64_t	flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
	char		*udp_dev_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2407
	*orig_arpid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
	if (ioctl(s, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
		Perror0_exit("status: SIOCGLIFFLAGS");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
	flags = lifr.lifr_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
	if (flags & IFF_IPV4) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
		udp_dev_name = UDP_DEV_NAME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
	} else if (flags & IFF_IPV6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
		udp_dev_name = UDP6_DEV_NAME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2421
	if ((*muxid_fd = open(udp_dev_name, O_RDWR)) < 0) {
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2422
		Perror2("open", udp_dev_name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
	}
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2425
	if (ioctl(*muxid_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) {
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2426
		Perror2("SIOCGLIFMUXID", udp_dev_name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
	if (debug > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
		(void) printf("ARP_muxid %d IP_muxid %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
		    lifr.lifr_arp_muxid, lifr.lifr_ip_muxid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2434
	/*
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2435
	 * Use /dev/udp{,6} as the mux to avoid linkcycles.
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2436
	 */
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2437
	if (ipadm_open_arp_on_udp(udp_dev_name, muxfd) != IPADM_SUCCESS)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
	if (lifr.lifr_arp_muxid != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
		if ((*arpfd_lowstr = ioctl(*muxfd, _I_MUXID2FD,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
		    lifr.lifr_arp_muxid)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
			if ((errno == EINVAL) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
			    (flags & (IFF_NOARP | IFF_IPV6))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
				 * Some plumbing utilities set the muxid to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
				 * -1 or some invalid value to signify that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
				 * there is no arp stream. Set the muxid to 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
				 * before trying to unplumb the IP stream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
				 * IP does not allow the IP stream to be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
				 * unplumbed if it sees a non-null arp muxid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
				 * for consistency of IP-ARP streams.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
				*orig_arpid = lifr.lifr_arp_muxid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
				lifr.lifr_arp_muxid = 0;
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2456
				(void) ioctl(*muxid_fd, SIOCSLIFMUXID,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
				    (caddr_t)&lifr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
				*arpfd_lowstr = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
				Perror0("_I_MUXID2FD");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
				return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
		} else if (ioctl(*muxfd, I_PUNLINK,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
		    lifr.lifr_arp_muxid) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
			Perror2("I_PUNLINK", udp_dev_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
		*arpfd_lowstr = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
	if ((*ipfd_lowstr = ioctl(*muxfd, _I_MUXID2FD,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
	    lifr.lifr_ip_muxid)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
		Perror0("_I_MUXID2FD");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
		/* Undo any changes we made */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
		if (*orig_arpid != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
			lifr.lifr_arp_muxid = *orig_arpid;
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2478
			(void) ioctl(*muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
	if (ioctl(*muxfd, I_PUNLINK, lifr.lifr_ip_muxid) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
		Perror2("I_PUNLINK", udp_dev_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
		/* Undo any changes we made */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
		if (*orig_arpid != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
			lifr.lifr_arp_muxid = *orig_arpid;
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2487
			(void) ioctl(*muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
 * Helper function for mod*() functions.  It I_PLINK's back the upper and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
 * lower IP streams.  Note that this function must be called after
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
 * ip_domux2fd().  In ip_domux2fd(), the global variable lifr is initialized
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
 * and ip_plink() needs information in lifr.  So ip_domux2fd() and ip_plink()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
 * must be called in pairs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
 * Param:
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2502
 *	int muxfd: fd to /dev/udp{,6} for I_PLINK/I_PUNLINK
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2503
 *	int muxid_fd: fd to /dev/udp{,6} for LIFMUXID
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2504
 *	int ipfd_lowstr: fd to the lower IP stream.
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2505
 *	int arpfd_lowstr: fd to the lower ARP stream.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
 * Return:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
 *	-1 if operation fails, 0 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
 *
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2510
 * Please see the big block comment above ifplumb() for the logic of the
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2511
 * PLINK/PUNLINK
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
static int
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2514
ip_plink(int muxfd, int muxid_fd, int ipfd_lowstr, int arpfd_lowstr,
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2515
    int orig_arpid)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
	int ip_muxid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
	ip_muxid = ioctl(muxfd, I_PLINK, ipfd_lowstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
	if (ip_muxid < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
		Perror2("I_PLINK", UDP_DEV_NAME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
	 * If there is an arp stream, plink it. If there is no
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
	 * arp stream, then it is possible that the plumbing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
	 * utility could have stored any value in the arp_muxid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
	 * If so, restore it from orig_arpid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
	if (arpfd_lowstr != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
		if (ioctl(muxfd, I_PLINK, arpfd_lowstr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
			Perror2("I_PLINK", UDP_DEV_NAME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
	} else if (orig_arpid != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
		/* Undo the changes we did in ip_domux2fd */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
		lifr.lifr_arp_muxid = orig_arpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
		lifr.lifr_ip_muxid = ip_muxid;
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2540
		(void) ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2543
	(void) close(muxfd);
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2544
	(void) close(muxid_fd);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
 * The real function to perform module insertion/removal.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
 * Param:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
 *	char *arg: the argument string module_name@position
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
 *	char op: operation, either MODINSERT_OP or MODREMOVE_OP.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
 * Return:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
 *	Before doing ip_domux2fd(), this function calls exit(1) in case of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
 *	error.  After ip_domux2fd() is done, it returns -1 for error, 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
 *	otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
modop(char *arg, char op)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
	char *pos_p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
	int muxfd;
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2565
	int muxid_fd;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
	int ipfd_lowstr;  /* IP stream (lower stream of mux) to be plinked */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
	int arpfd_lowstr; /* ARP stream (lower stream of mux) to be plinked */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
	struct strmodconf mod;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
	char *at_char = "@";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
	char *arg_str;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
	int orig_arpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2573
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2574
	 * We'd return -1, but foreachinterface() doesn't propagate the error
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2575
	 * into the exit status, so we're forced to explicitly exit().
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2576
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2577
	if (!modcheck(name))
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  2578
		exit(1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
	/* Need to save the original string for -a option. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
	if ((arg_str = malloc(strlen(arg) + 1)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
		Perror0("cannot malloc");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
	(void) strcpy(arg_str, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
	if (*arg_str == *at_char) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
		    "ifconfig: must supply a module name\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
	mod.mod_name = strtok(arg_str, at_char);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
	if (strlen(mod.mod_name) > FMNAMESZ) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
		(void) fprintf(stderr, "ifconfig: module name too long: %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
		    mod.mod_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
	 * Need to make sure that the core TCP/IP stack modules are not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
	 * removed.  Otherwise, "bad" things can happen.  If a module
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
	 * is removed and inserted back, it loses its old state.  But
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
	 * the modules above it still have the old state.  E.g. IP assumes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
	 * fast data path while tunnel after re-inserted assumes that it can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
	 * receive M_DATA only in fast data path for which it does not have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
	 * any state.  This is a general caveat of _I_REMOVE/_I_INSERT.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
	if (op == MODREMOVE_OP &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
	    (strcmp(mod.mod_name, ARP_MOD_NAME) == 0 ||
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2610
	    strcmp(mod.mod_name, IP_MOD_NAME) == 0)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
		(void) fprintf(stderr, "ifconfig: cannot remove %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
		    mod.mod_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
	if ((pos_p = strtok(NULL, at_char)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
		(void) fprintf(stderr, "ifconfig: must supply a position\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
	mod.pos = atoi(pos_p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2622
	if (ip_domux2fd(&muxfd, &muxid_fd, &ipfd_lowstr, &arpfd_lowstr,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
	    &orig_arpid) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
		free(arg_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
	switch (op) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
	case MODINSERT_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
		if (debug > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
			(void) printf("Inserting module %s at %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
			    mod.mod_name, mod.pos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
		if (ioctl(ipfd_lowstr, _I_INSERT, (caddr_t)&mod) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
			Perror2("fail to insert module", mod.mod_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
	case MODREMOVE_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
		if (debug > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
			(void) printf("Removing module %s at %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
			    mod.mod_name, mod.pos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
		if (ioctl(ipfd_lowstr, _I_REMOVE, (caddr_t)&mod) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
			Perror2("fail to remove module", mod.mod_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2646
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2647
		/* Should never get to here. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
		(void) fprintf(stderr, "Unknown operation\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
	free(arg_str);
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2652
	return (ip_plink(muxfd, muxid_fd, ipfd_lowstr, arpfd_lowstr,
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  2653
	    orig_arpid));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2656
static int
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2657
modify_tun(iptun_params_t *params)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2658
{
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2659
	dladm_status_t status;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2660
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2661
	if ((status = ifconfig_dladm_open(name, DATALINK_CLASS_IPTUN,
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2662
	    &params->iptun_param_linkid)) == DLADM_STATUS_OK)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2663
		status = dladm_iptun_modify(dlh, params, DLADM_OPT_ACTIVE);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2664
	if (status != DLADM_STATUS_OK)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2665
		dladmerr_exit(status, name);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2666
	return (0);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2667
}
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2668
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
 * Set tunnel source address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
setiftsrc(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2676
	iptun_params_t params;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2677
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2678
	params.iptun_param_flags = IPTUN_PARAM_LADDR;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2679
	(void) strlcpy(params.iptun_param_laddr, addr,
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2680
	    sizeof (params.iptun_param_laddr));
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2681
	return (modify_tun(&params));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
 * Set tunnel destination address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
setiftdst(char *addr, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2691
	iptun_params_t params;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2692
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2693
	params.iptun_param_flags = IPTUN_PARAM_RADDR;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2694
	(void) strlcpy(params.iptun_param_raddr, addr,
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2695
	    sizeof (params.iptun_param_raddr));
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2696
	return (modify_tun(&params));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
static int
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2700
set_tun_prop(const char *propname, char *value)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2702
	dladm_status_t	status;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2703
	datalink_id_t	linkid;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2704
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2705
	status = ifconfig_dladm_open(name, DATALINK_CLASS_IPTUN, &linkid);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2706
	if (status == DLADM_STATUS_OK) {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2707
		status = dladm_set_linkprop(dlh, linkid, propname, &value, 1,
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2708
		    DLADM_OPT_ACTIVE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
	}
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2710
	if (status != DLADM_STATUS_OK)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2711
		dladmerr_exit(status, name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2712
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2713
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2715
/* Set tunnel encapsulation limit. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
set_tun_encap_limit(char *arg, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2720
	return (set_tun_prop("encaplimit", arg));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
/* Disable encapsulation limit. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2725
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2726
clr_tun_encap_limit(char *arg, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2727
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2728
	return (set_tun_encap_limit("-1", 0));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2729
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2731
/* Set tunnel hop limit. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2732
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2733
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2734
set_tun_hop_limit(char *arg, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2735
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2736
	return (set_tun_prop("hoplimit", arg));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2737
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2739
/* Set zone ID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2740
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
setzone(char *arg, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
	zoneid_t zoneid = GLOBAL_ZONEID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2745
	if (param == NEXTARG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2746
		/* zone must be active */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2747
		if ((zoneid = getzoneidbyname(arg)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2748
			(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2749
			    "ifconfig: unknown zone '%s'\n", arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2750
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2751
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2752
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2753
	(void) strlcpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2754
	lifr.lifr_zoneid = zoneid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2755
	if (ioctl(s, SIOCSLIFZONE, (caddr_t)&lifr) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2756
		Perror0_exit("SIOCSLIFZONE");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2757
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2758
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2759
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2760
/* Put interface into all zones */
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2761
/* ARGSUSED */
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2762
static int
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2763
setallzones(char *arg, int64_t param)
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2764
{
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2765
	(void) strlcpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2766
	lifr.lifr_zoneid = ALL_ZONES;
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2767
	if (ioctl(s, SIOCSLIFZONE, (caddr_t)&lifr) == -1)
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2768
		Perror0_exit("SIOCSLIFZONE");
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2769
	return (0);
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2770
}
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2771
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2772
/* Set source address to use */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2773
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2774
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2775
setifsrc(char *arg, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2776
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2777
	uint_t ifindex = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2778
	int rval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2779
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2780
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2781
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2782
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2783
	 * Argument can be either an interface name or "none". The latter means
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2784
	 * that any previous selection is cleared.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2785
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2786
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2787
	if (strchr(arg, ':') != NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2788
		(void) fprintf(stderr,
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  2789
		    "ifconfig: Cannot specify logical interface for usesrc \n");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2790
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2791
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2792
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2793
	rval = strcmp(arg, NONE_STR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2794
	if (rval != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2795
		if ((ifindex = if_nametoindex(arg)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2796
			(void) strncpy(lifr.lifr_name, arg, LIFNAMSIZ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2797
			Perror0_exit("Could not get interface index");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2798
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2799
		lifr.lifr_index = ifindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2800
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2801
		if (ioctl(s, SIOCGLIFUSESRC, (caddr_t)&lifr) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2802
			Perror0_exit("Not a valid usesrc consumer");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2803
		lifr.lifr_index = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2804
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2805
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2806
	if (debug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2807
		(void) printf("setifsrc: lifr_name %s, lifr_index %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2808
		    lifr.lifr_name, lifr.lifr_index);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2809
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2810
	if (ioctl(s, SIOCSLIFUSESRC, (caddr_t)&lifr) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2811
		if (rval == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2812
			Perror0_exit("Cannot reset usesrc group");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2813
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2814
			Perror0_exit("Could not set source interface");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2815
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2816
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2817
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2818
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2819
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2820
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2821
 * Print the interface status line associated with `ifname'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2822
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2823
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2824
ifstatus(const char *ifname)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2825
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2826
	uint64_t flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2827
	char if_usesrc_name[LIFNAMSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2828
	char *newbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2829
	int n, numifs, rval = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2830
	struct lifreq *lifrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2831
	struct lifsrcof lifs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2832
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2833
	(void) strncpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2834
	if (ioctl(s, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2835
		Perror0_exit("status: SIOCGLIFFLAGS");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2836
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2837
	flags = lifr.lifr_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2838
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2839
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2840
	 * In V4 compatibility mode, we don't print the IFF_IPV4 flag or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2841
	 * interfaces with IFF_IPV6 set.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2842
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2843
	if (v4compat) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2844
		flags &= ~IFF_IPV4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2845
		if (flags & IFF_IPV6)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2846
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2847
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2848
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2849
	(void) printf("%s: ", ifname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2850
	print_flags(flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2851
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2852
	(void) strncpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2853
	if (ioctl(s, SIOCGLIFMETRIC, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2854
		Perror0_exit("status: SIOCGLIFMETRIC");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2855
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2856
		if (lifr.lifr_metric)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2857
			(void) printf(" metric %d", lifr.lifr_metric);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2858
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2859
	if (ioctl(s, SIOCGLIFMTU, (caddr_t)&lifr) >= 0)
6353
b927a053de8e 6678267 dladm display of MTU is signed but mtu field is unsigned
dr146992
parents: 5978
diff changeset
  2860
		(void) printf(" mtu %u", lifr.lifr_mtu);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2862
	/* don't print index or zone when in compatibility mode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2863
	if (!v4compat) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2864
		if (ioctl(s, SIOCGLIFINDEX, (caddr_t)&lifr) >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2865
			(void) printf(" index %d", lifr.lifr_index);
3448
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  2866
		/*
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  2867
		 * Stack instances use GLOBAL_ZONEID for IP data structures
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  2868
		 * even in the non-global zone.
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  2869
		 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2870
		if (ioctl(s, SIOCGLIFZONE, (caddr_t)&lifr) >= 0 &&
3448
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  2871
		    lifr.lifr_zoneid != getzoneid() &&
aaf16568054b PSARC 2006/366 IP Instances
dh155122
parents: 3431
diff changeset
  2872
		    lifr.lifr_zoneid != GLOBAL_ZONEID) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2873
			char zone_name[ZONENAME_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2874
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2875
			if (lifr.lifr_zoneid == ALL_ZONES) {
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2876
				(void) printf("\n\tall-zones");
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  2877
			} else if (getzonenamebyid(lifr.lifr_zoneid, zone_name,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2878
			    sizeof (zone_name)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2879
				(void) printf("\n\tzone %d", lifr.lifr_zoneid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2880
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2881
				(void) printf("\n\tzone %s", zone_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2882
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2883
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2884
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2885
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2886
	if (ioctl(s, SIOCGLIFINDEX, (caddr_t)&lifr) >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2887
		lifs.lifs_ifindex = lifr.lifr_index;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2888
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2889
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2890
		 * Find the number of interfaces that use this interfaces'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2891
		 * address as a source address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2892
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2893
		lifs.lifs_buf = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2894
		lifs.lifs_maxlen = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2895
		for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2896
			/* The first pass will give the bufsize we need */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2897
			rval = ioctl(s, SIOCGLIFSRCOF, (char *)&lifs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2898
			if (rval < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2899
				if (lifs.lifs_buf != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2900
					free(lifs.lifs_buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2901
					lifs.lifs_buf = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2902
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2903
				lifs.lifs_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2904
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2905
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2906
			if (lifs.lifs_len <= lifs.lifs_maxlen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2907
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2908
			/* Use kernel's size + a small margin to avoid loops */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2909
			lifs.lifs_maxlen = lifs.lifs_len +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2910
			    5 * sizeof (struct lifreq);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2911
			/* For the first pass, realloc acts like malloc */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2912
			newbuf = realloc(lifs.lifs_buf, lifs.lifs_maxlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2913
			if (newbuf == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2914
				if (lifs.lifs_buf != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2915
					free(lifs.lifs_buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2916
					lifs.lifs_buf = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2917
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2918
				lifs.lifs_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2919
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2920
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2921
			lifs.lifs_buf = newbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2922
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2923
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2924
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2925
		numifs = lifs.lifs_len / sizeof (struct lifreq);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2926
		if (numifs > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2927
			lifrp = lifs.lifs_req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2928
			(void) printf("\n\tsrcof");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2929
			for (n = numifs; n > 0; n--, lifrp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2930
				(void) printf(" %s", lifrp->lifr_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2931
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2932
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2933
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2934
		if (lifs.lifs_buf != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2935
			free(lifs.lifs_buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2936
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2937
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2938
	/* Find the interface whose source address this interface uses */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2939
	if (ioctl(s, SIOCGLIFUSESRC, (caddr_t)&lifr) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2940
		if (lifr.lifr_index != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2941
			if (if_indextoname(lifr.lifr_index,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2942
			    if_usesrc_name) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2943
				(void) printf("\n\tusesrc ifIndex %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2944
				    lifr.lifr_index);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2945
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2946
				(void) printf("\n\tusesrc %s", if_usesrc_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2947
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2948
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2949
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2950
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2951
	(void) putchar('\n');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2952
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2953
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2954
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2955
 * Print the status of the interface.  If an address family was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2956
 * specified, show it and it only; otherwise, show them all.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2957
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2958
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2959
status(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2960
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2961
	struct afswtch	*p = afp;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2962
	uint64_t	flags;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2963
	datalink_id_t	linkid;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2964
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2965
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2966
	if (ioctl(s, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2967
		Perror0_exit("status: SIOCGLIFFLAGS");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2968
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2969
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2970
	flags = lifr.lifr_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2971
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2972
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2973
	 * Only print the interface status if the address family matches
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2974
	 * the interface family flag.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2975
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2976
	if (p != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2977
		if (((p->af_af == AF_INET6) && (flags & IFF_IPV4)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2978
		    ((p->af_af == AF_INET) && (flags & IFF_IPV6)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2979
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2980
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2981
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2982
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2983
	 * In V4 compatibility mode, don't print IFF_IPV6 interfaces.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2984
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2985
	if (v4compat && (flags & IFF_IPV6))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2986
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2988
	ifstatus(name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2989
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2990
	if (ifconfig_dladm_open(name, DATALINK_CLASS_IPTUN, &linkid) ==
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2991
	    DLADM_STATUS_OK)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2992
		tun_status(linkid);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  2993
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2994
	if (p != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2995
		(*p->af_status)(1, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2996
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2997
		for (p = afs; p->af_name; p++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2998
			/* set global af for use in p->af_status */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2999
			af = p->af_af;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3000
			(*p->af_status)(0, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3001
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3002
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3003
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3004
		 * Historically, 'ether' has been an address family,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3005
		 * so print it here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3006
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3007
		print_ifether(name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3008
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3009
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3010
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3011
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3012
 * Print the status of the interface in a format that can be used to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3013
 * reconfigure the interface later. Code stolen from status() above.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3014
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3015
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3016
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3017
configinfo(char *null, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3018
{
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3019
	char *cp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3020
	struct afswtch *p = afp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3021
	uint64_t flags;
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3022
	char lifname[LIFNAMSIZ];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3023
	char if_usesrc_name[LIFNAMSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3025
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3026
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3027
	if (ioctl(s, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3028
		Perror0_exit("status: SIOCGLIFFLAGS");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3029
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3030
	flags = lifr.lifr_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3031
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3032
	if (debug) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3033
		(void) printf("configinfo: name %s flags  0x%llx af_af %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3034
		    name, flags, p != NULL ? p->af_af : -1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3035
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3036
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3037
	/*
12592
40d4395b2cd4 6954959 libipadm now allows 'ifconfig bge0 removeif <address>' to succeed.
Vasumathi Sundaram <Vasumathi.Sundaram@oracle.COM>
parents: 12453
diff changeset
  3038
	 * Build the interface name to print (we cannot directly use `name'
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3039
	 * because one cannot "plumb" ":0" interfaces).
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3040
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3041
	(void) strlcpy(lifname, name, LIFNAMSIZ);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3042
	if ((cp = strchr(lifname, ':')) != NULL && atoi(cp + 1) == 0)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3043
		*cp = '\0';
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3044
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3045
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3046
	 * if the interface is IPv4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3047
	 *	if we have a IPv6 address family restriction return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3048
	 *		so it won't print
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3049
	 *	if we are in IPv4 compatibility mode, clear out IFF_IPV4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3050
	 *		so we don't print it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3051
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3052
	if (flags & IFF_IPV4) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3053
		if (p && p->af_af == AF_INET6)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3054
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3055
		if (v4compat)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3056
			flags &= ~IFF_IPV4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3057
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3058
		(void) printf("%s inet plumb", lifname);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3059
	} else if (flags & IFF_IPV6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3060
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3061
		 * else if the interface is IPv6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3062
		 *	if we have a IPv4 address family restriction return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3063
		 *	or we are in IPv4 compatibiltiy mode, return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3064
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3065
		if (p && p->af_af == AF_INET)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3066
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3067
		if (v4compat)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3068
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3069
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3070
		(void) printf("%s inet6 plumb", lifname);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3071
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3072
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3073
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3074
	if (ioctl(s, SIOCGLIFMETRIC, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3075
		Perror0_exit("configinfo: SIOCGLIFMETRIC");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3076
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3077
		if (lifr.lifr_metric)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3078
			(void) printf(" metric %d ", lifr.lifr_metric);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3079
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3080
	if (((flags & (IFF_VIRTUAL|IFF_LOOPBACK)) != IFF_VIRTUAL) &&
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  3081
	    ioctl(s, SIOCGLIFMTU, (caddr_t)&lifr) >= 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3082
		(void) printf(" mtu %d", lifr.lifr_metric);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3083
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3084
	/* Index only applies to the zeroth interface */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3085
	if (lifnum(name) == 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3086
		if (ioctl(s, SIOCGLIFINDEX, (caddr_t)&lifr) >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3087
			(void) printf(" index %d", lifr.lifr_index);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3088
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3089
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3090
	if (ioctl(s, SIOCGLIFUSESRC, (caddr_t)&lifr) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3091
		if (lifr.lifr_index != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3092
			if (if_indextoname(lifr.lifr_index,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3093
			    if_usesrc_name) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3094
				(void) printf(" usesrc %s", if_usesrc_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3095
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3096
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3097
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3098
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3099
	if (p != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3100
		(*p->af_configinfo)(1, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3101
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3102
		for (p = afs; p->af_name; p++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3103
			(void) close(s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3104
			s = socket(SOCKET_AF(p->af_af), SOCK_DGRAM, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3105
			/* set global af for use in p->af_configinfo */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3106
			af = p->af_af;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3107
			if (s == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3108
				Perror0_exit("socket");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3109
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3110
			(*p->af_configinfo)(0, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3111
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3112
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3113
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3114
	(void) putchar('\n');
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3115
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3116
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3118
static void
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3119
print_tsec(iptun_params_t *params)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3120
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3121
	ipsec_req_t *ipsr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3123
	(void) printf("\ttunnel security settings  ");
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3124
	if (!(params->iptun_param_flags & IPTUN_PARAM_SECINFO)) {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3125
		(void) printf("-->  use 'ipsecconf -ln -i %s'", name);
3055
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3126
	} else {
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3127
		ipsr = &params->iptun_param_secinfo;
3055
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3128
		if (ipsr->ipsr_ah_req & IPSEC_PREF_REQUIRED) {
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3129
			(void) printf("ah (%s)  ",
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3130
			    rparsealg(ipsr->ipsr_auth_alg, IPSEC_PROTO_AH));
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3131
		}
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3132
		if (ipsr->ipsr_esp_req & IPSEC_PREF_REQUIRED) {
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3133
			(void) printf("esp (%s",
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3134
			    rparsealg(ipsr->ipsr_esp_alg, IPSEC_PROTO_ESP));
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3135
			(void) printf("/%s)",
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3136
			    rparsealg(ipsr->ipsr_esp_auth_alg, IPSEC_PROTO_AH));
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2546
diff changeset
  3137
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3138
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3139
	(void) printf("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3140
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3142
static void
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3143
tun_status(datalink_id_t linkid)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3144
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3145
	iptun_params_t	params;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3146
	char		propval[DLADM_PROP_VAL_MAX];
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3147
	char		*valptr[1];
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3148
	uint_t		valcnt = 1;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3149
	boolean_t	tabbed = _B_FALSE;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3150
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3151
	params.iptun_param_linkid = linkid;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3152
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3153
	/* If dladm_iptun_getparams() fails, assume we are not a tunnel. */
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3154
	assert(dlh_opened);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3155
	if (dladm_iptun_getparams(dlh, &params, DLADM_OPT_ACTIVE) !=
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3156
	    DLADM_STATUS_OK)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3157
		return;
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3158
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3159
	switch (params.iptun_param_type) {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3160
	case IPTUN_TYPE_IPV4:
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3161
	case IPTUN_TYPE_6TO4:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3162
		(void) printf("\tinet");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3163
		break;
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3164
	case IPTUN_TYPE_IPV6:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3165
		(void) printf("\tinet6");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3166
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3167
	default:
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3168
		dladmerr_exit(DLADM_STATUS_IPTUNTYPE, name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3169
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3170
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3172
	/*
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3173
	 * There is always a source address.  If it hasn't been explicitly
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3174
	 * set, the API will pass back a buffer containing the unspecified
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3175
	 * address.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3176
	 */
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3177
	(void) printf(" tunnel src %s ", params.iptun_param_laddr);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3178
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3179
	if (params.iptun_param_flags & IPTUN_PARAM_RADDR)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3180
		(void) printf("tunnel dst %s\n", params.iptun_param_raddr);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3181
	else
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3182
		(void) putchar('\n');
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3183
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3184
	if (params.iptun_param_flags & IPTUN_PARAM_IPSECPOL)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3185
		print_tsec(&params);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3186
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3187
	valptr[0] = propval;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3188
	if (dladm_get_linkprop(dlh, linkid, DLADM_PROP_VAL_CURRENT, "hoplimit",
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3189
	    (char **)valptr, &valcnt) == DLADM_STATUS_OK) {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3190
		(void) printf("\ttunnel hop limit %s ", propval);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3191
		tabbed = _B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3192
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3193
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3194
	if (dladm_get_linkprop(dlh, linkid, DLADM_PROP_VAL_CURRENT,
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3195
	    "encaplimit", (char **)valptr, &valcnt) == DLADM_STATUS_OK) {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3196
		uint32_t elim;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3197
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3198
		if (!tabbed) {
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3199
			(void) putchar('\t');
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3200
			tabbed = _B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3201
		}
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3202
		elim = strtol(propval, NULL, 10);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3203
		if (elim > 0)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3204
			(void) printf("tunnel encapsulation limit %s", propval);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3205
		else
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3206
			(void) printf("tunnel encapsulation limit disabled");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3207
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3209
	if (tabbed)
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3210
		(void) putchar('\n');
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3211
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3213
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3214
in_status(int force, uint64_t flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3215
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3216
	struct sockaddr_in	*sin, *laddr;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3217
	struct sockaddr_in	netmask = { AF_INET };
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3219
	if (debug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3220
		(void) printf("in_status(%s) flags 0x%llx\n", name, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3222
	/* only print status for IPv4 interfaces */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3223
	if (!(flags & IFF_IPV4))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3224
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3226
	if (!(flags & IFF_NOLOCAL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3227
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3228
		if (ioctl(s, SIOCGLIFADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3229
			if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3230
			    errno == ENXIO) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3231
				if (!force)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3232
					return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3233
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3234
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3235
			} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3236
				Perror0_exit("in_status: SIOCGLIFADDR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3237
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3238
		sin = (struct sockaddr_in *)&lifr.lifr_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3239
		(void) printf("\tinet %s ", inet_ntoa(sin->sin_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3240
		laddr = sin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3241
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3242
		(void) printf("\tinet ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3243
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3245
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3246
	if (ioctl(s, SIOCGLIFSUBNET, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3247
		if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3248
		    errno == ENXIO) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3249
			if (!force)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3250
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3251
			(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3252
			    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3253
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3254
			Perror0_exit("in_status: SIOCGLIFSUBNET");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3255
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3256
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3257
	sin = (struct sockaddr_in *)&lifr.lifr_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3258
	if ((flags & IFF_NOLOCAL) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3259
	    sin->sin_addr.s_addr != laddr->sin_addr.s_addr) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3260
		(void) printf("subnet %s/%d ", inet_ntoa(sin->sin_addr),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3261
		    lifr.lifr_addrlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3262
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3263
	if (sin->sin_family != AF_INET) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3264
		(void) printf("Wrong family: %d\n", sin->sin_family);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3265
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3267
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3268
	if (ioctl(s, SIOCGLIFNETMASK, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3269
		if (errno != EADDRNOTAVAIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3270
			Perror0_exit("in_status: SIOCGLIFNETMASK");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3271
		(void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3272
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3273
		netmask.sin_addr =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3274
		    ((struct sockaddr_in *)&lifr.lifr_addr)->sin_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3275
	if (flags & IFF_POINTOPOINT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3276
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3277
		if (ioctl(s, SIOCGLIFDSTADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3278
			if (errno == EADDRNOTAVAIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3279
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3280
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3281
			else
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  3282
				Perror0_exit("in_status: SIOCGLIFDSTADDR");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3283
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3284
		sin = (struct sockaddr_in *)&lifr.lifr_dstaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3285
		(void) printf("--> %s ", inet_ntoa(sin->sin_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3286
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3287
	(void) printf("netmask %x ", ntohl(netmask.sin_addr.s_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3288
	if (flags & IFF_BROADCAST) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3289
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3290
		if (ioctl(s, SIOCGLIFBRDADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3291
			if (errno == EADDRNOTAVAIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3292
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3293
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3294
			else
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  3295
				Perror0_exit("in_status: SIOCGLIFBRDADDR");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3296
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3297
		sin = (struct sockaddr_in *)&lifr.lifr_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3298
		if (sin->sin_addr.s_addr != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3299
			(void) printf("broadcast %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3300
			    inet_ntoa(sin->sin_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3301
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3302
	}
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3303
	/* If there is a groupname, print it for only the physical interface */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3304
	if (strchr(name, ':') == NULL) {
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3305
		if (ioctl(s, SIOCGLIFGROUPNAME, &lifr) >= 0 &&
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3306
		    lifr.lifr_groupname[0] != '\0') {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3307
			(void) printf("\n\tgroupname %s", lifr.lifr_groupname);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3308
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3309
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3310
	(void) putchar('\n');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3311
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3313
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3314
in6_status(int force, uint64_t flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3315
{
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3316
	char			abuf[INET6_ADDRSTRLEN];
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3317
	struct sockaddr_in6	*sin6, *laddr6;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3319
	if (debug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3320
		(void) printf("in6_status(%s) flags 0x%llx\n", name, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3322
	if (!(flags & IFF_IPV6))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3323
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3325
	if (!(flags & IFF_NOLOCAL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3326
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3327
		if (ioctl(s, SIOCGLIFADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3328
			if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3329
			    errno == ENXIO) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3330
				if (!force)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3331
					return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3332
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3333
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3334
			} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3335
				Perror0_exit("in_status6: SIOCGLIFADDR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3336
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3337
		sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3338
		(void) printf("\tinet6 %s/%d ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3339
		    inet_ntop(AF_INET6, (void *)&sin6->sin6_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3340
		    abuf, sizeof (abuf)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3341
		    lifr.lifr_addrlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3342
		laddr6 = sin6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3343
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3344
		(void) printf("\tinet6 ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3345
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3346
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3347
	if (ioctl(s, SIOCGLIFSUBNET, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3348
		if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3349
		    errno == ENXIO) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3350
			if (!force)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3351
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3352
			(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3353
			    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3354
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3355
			Perror0_exit("in_status6: SIOCGLIFSUBNET");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3356
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3357
	sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3358
	if ((flags & IFF_NOLOCAL) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3359
	    !IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr, &laddr6->sin6_addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3360
		(void) printf("subnet %s/%d ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3361
		    inet_ntop(AF_INET6, (void *)&sin6->sin6_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3362
		    abuf, sizeof (abuf)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3363
		    lifr.lifr_addrlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3364
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3365
	if (sin6->sin6_family != AF_INET6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3366
		(void) printf("Wrong family: %d\n", sin6->sin6_family);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3367
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3368
	if (flags & IFF_POINTOPOINT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3369
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3370
		if (ioctl(s, SIOCGLIFDSTADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3371
			if (errno == EADDRNOTAVAIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3372
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3373
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3374
			else
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  3375
				Perror0_exit("in_status6: SIOCGLIFDSTADDR");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3376
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3377
		sin6 = (struct sockaddr_in6 *)&lifr.lifr_dstaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3378
		(void) printf("--> %s ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3379
		    inet_ntop(AF_INET6, (void *)&sin6->sin6_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3380
		    abuf, sizeof (abuf)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3381
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3382
	if (verbose) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3383
		(void) putchar('\n');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3384
		(void) putchar('\t');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3385
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3386
		if (ioctl(s, SIOCGLIFTOKEN, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3387
			if (errno == EADDRNOTAVAIL || errno == EINVAL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3388
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3389
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3390
			else
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  3391
				Perror0_exit("in_status6: SIOCGLIFTOKEN");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3392
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3393
			sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3394
			(void) printf("token %s/%d ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3395
			    inet_ntop(AF_INET6, (void *)&sin6->sin6_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3396
			    abuf, sizeof (abuf)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3397
			    lifr.lifr_addrlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3398
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3399
		if (ioctl(s, SIOCGLIFLNKINFO, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3400
			if (errno != EINVAL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3401
				Perror0_exit("in_status6: SIOCGLIFLNKINFO");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3402
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3403
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3404
			(void) printf("maxhops %u, reachtime %u ms, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3405
			    "reachretrans %u ms, maxmtu %u ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3406
			    lifr.lifr_ifinfo.lir_maxhops,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3407
			    lifr.lifr_ifinfo.lir_reachtime,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3408
			    lifr.lifr_ifinfo.lir_reachretrans,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3409
			    lifr.lifr_ifinfo.lir_maxmtu);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3410
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3411
	}
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3412
	/* If there is a groupname, print it for only the physical interface */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3413
	if (strchr(name, ':') == NULL) {
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3414
		if (ioctl(s, SIOCGLIFGROUPNAME, &lifr) >= 0 &&
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3415
		    lifr.lifr_groupname[0] != '\0') {
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3416
			(void) printf("\n\tgroupname %s", lifr.lifr_groupname);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3417
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3418
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3419
	(void) putchar('\n');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3420
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3422
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3423
in_configinfo(int force, uint64_t flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3424
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3425
	struct sockaddr_in *sin, *laddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3426
	struct	sockaddr_in netmask = { AF_INET };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3428
	if (debug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3429
		(void) printf("in_configinfo(%s) flags 0x%llx\n", name, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3431
	/* only configinfo info for IPv4 interfaces */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3432
	if (!(flags & IFF_IPV4))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3433
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3434
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3435
	if (!(flags & IFF_NOLOCAL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3436
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3437
		if (ioctl(s, SIOCGLIFADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3438
			if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3439
			    errno == ENXIO) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3440
				if (!force)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3441
					return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3442
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3443
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3444
			} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3445
				Perror0_exit("in_configinfo: SIOCGLIFADDR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3446
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3447
		sin = (struct sockaddr_in *)&lifr.lifr_addr;
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3448
		(void) printf(" set %s ", inet_ntoa(sin->sin_addr));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3449
		laddr = sin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3450
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3451
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3452
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3453
	if (ioctl(s, SIOCGLIFSUBNET, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3454
		if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3455
		    errno == ENXIO) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3456
			if (!force)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3457
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3458
			(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3459
			    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3460
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3461
			Perror0_exit("in_configinfo: SIOCGLIFSUBNET");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3462
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3463
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3464
	sin = (struct sockaddr_in *)&lifr.lifr_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3466
	if ((flags & IFF_NOLOCAL) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3467
	    sin->sin_addr.s_addr != laddr->sin_addr.s_addr) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3468
		(void) printf(" subnet %s/%d ", inet_ntoa(sin->sin_addr),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3469
		    lifr.lifr_addrlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3470
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3471
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3472
	if (ioctl(s, SIOCGLIFNETMASK, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3473
		if (errno != EADDRNOTAVAIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3474
			Perror0_exit("in_configinfo: SIOCGLIFNETMASK");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3475
		(void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3476
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3477
		netmask.sin_addr =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3478
		    ((struct sockaddr_in *)&lifr.lifr_addr)->sin_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3479
	if (flags & IFF_POINTOPOINT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3480
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3481
		if (ioctl(s, SIOCGLIFDSTADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3482
			if (errno == EADDRNOTAVAIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3483
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3484
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3485
			else
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  3486
				Perror0_exit("in_configinfo: SIOCGLIFDSTADDR");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3487
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3488
		sin = (struct sockaddr_in *)&lifr.lifr_dstaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3489
		(void) printf(" destination %s ", inet_ntoa(sin->sin_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3490
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3491
	(void) printf(" netmask 0x%x ", ntohl(netmask.sin_addr.s_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3492
	if (flags & IFF_BROADCAST) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3493
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3494
		if (ioctl(s, SIOCGLIFBRDADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3495
			if (errno == EADDRNOTAVAIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3496
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3497
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3498
			else
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  3499
				Perror0_exit("in_configinfo: SIOCGLIFBRDADDR");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3500
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3501
		sin = (struct sockaddr_in *)&lifr.lifr_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3502
		if (sin->sin_addr.s_addr != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3503
			(void) printf(" broadcast %s ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3504
			    inet_ntoa(sin->sin_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3505
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3506
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3507
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3508
	/* If there is a groupname, print it for only the zeroth interface */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3509
	if (lifnum(name) == 0) {
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3510
		if (ioctl(s, SIOCGLIFGROUPNAME, &lifr) >= 0 &&
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3511
		    lifr.lifr_groupname[0] != '\0') {
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3512
			(void) printf(" group %s ", lifr.lifr_groupname);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3513
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3514
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3516
	/* Print flags to configure */
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3517
	print_config_flags(AF_INET, flags);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3518
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3520
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3521
in6_configinfo(int force, uint64_t flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3522
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3523
	char abuf[INET6_ADDRSTRLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3524
	struct sockaddr_in6 *sin6, *laddr6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3526
	if (debug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3527
		(void) printf("in6_configinfo(%s) flags 0x%llx\n", name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3528
		    flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3530
	if (!(flags & IFF_IPV6))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3531
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3532
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3533
	if (!(flags & IFF_NOLOCAL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3534
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3535
		if (ioctl(s, SIOCGLIFADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3536
			if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3537
			    errno == ENXIO) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3538
				if (!force)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3539
					return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3540
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3541
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3542
			} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3543
				Perror0_exit("in6_configinfo: SIOCGLIFADDR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3544
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3545
		sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr;
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3546
		(void) printf(" set %s/%d ",
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3547
		    inet_ntop(AF_INET6, &sin6->sin6_addr, abuf, sizeof (abuf)),
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3548
		    lifr.lifr_addrlen);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3549
		laddr6 = sin6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3550
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3551
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3552
	if (ioctl(s, SIOCGLIFSUBNET, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3553
		if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3554
		    errno == ENXIO) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3555
			if (!force)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3556
				return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3557
			(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3558
			    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3559
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3560
			Perror0_exit("in6_configinfo: SIOCGLIFSUBNET");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3561
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3562
	sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3563
	if ((flags & IFF_NOLOCAL) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3564
	    !IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr, &laddr6->sin6_addr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3565
		(void) printf(" subnet %s/%d ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3566
		    inet_ntop(AF_INET6, (void *)&sin6->sin6_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3567
		    abuf, sizeof (abuf)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3568
		    lifr.lifr_addrlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3569
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3571
	if (flags & IFF_POINTOPOINT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3572
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3573
		if (ioctl(s, SIOCGLIFDSTADDR, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3574
			if (errno == EADDRNOTAVAIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3575
				(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3576
				    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3577
			else
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  3578
				Perror0_exit("in6_configinfo: SIOCGLIFDSTADDR");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3579
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3580
		sin6 = (struct sockaddr_in6 *)&lifr.lifr_dstaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3581
		(void) printf(" destination %s ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3582
		    inet_ntop(AF_INET6, (void *)&sin6->sin6_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3583
		    abuf, sizeof (abuf)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3584
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3586
	(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3587
	if (ioctl(s, SIOCGLIFTOKEN, (caddr_t)&lifr) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3588
		if (errno == EADDRNOTAVAIL || errno == EINVAL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3589
			(void) memset(&lifr.lifr_addr, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3590
			    sizeof (lifr.lifr_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3591
		else
5240
e7599510dd03 6595449 IP streams plumbing simpification
nordmark
parents: 4823
diff changeset
  3592
			Perror0_exit("in6_configinfo: SIOCGLIFTOKEN");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3593
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3594
		sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3595
		(void) printf(" token %s/%d ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3596
		    inet_ntop(AF_INET6, (void *)&sin6->sin6_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3597
		    abuf, sizeof (abuf)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3598
		    lifr.lifr_addrlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3599
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3600
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3601
	/* If there is a groupname, print it for only the zeroth interface */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3602
	if (lifnum(name) == 0) {
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3603
		if (ioctl(s, SIOCGLIFGROUPNAME, &lifr) >= 0 &&
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3604
		    lifr.lifr_groupname[0] != '\0') {
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3605
			(void) printf(" group %s ", lifr.lifr_groupname);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3606
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3607
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3609
	/* Print flags to configure */
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3610
	print_config_flags(AF_INET6, flags);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3611
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3612
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3613
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3614
 * If this is a physical interface then remove it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3615
 * If it is a logical interface name use SIOCLIFREMOVEIF to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3616
 * remove it. In both cases fail if it doesn't exist.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3617
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3618
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3619
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3620
inetunplumb(char *arg, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3621
{
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3622
	ipadm_status_t	istatus;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3623
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3624
	istatus = ipadm_delete_if(iph, name, afp->af_af, IPADM_OPT_ACTIVE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3625
	if (istatus != IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3626
		(void) fprintf(stderr, "ifconfig: cannot unplumb %s: %s\n",
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3627
		    name, ipadm_status2str(istatus));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3628
		exit(1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3629
	}
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3630
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3631
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3632
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3633
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3634
/*
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3635
 * Create the interface in `name', using ipadm_create_if(). If `name' is a
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3636
 * logical interface or loopback interface, ipadm_create_if() uses
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3637
 * SIOCLIFADDIF to create it.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3638
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3639
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3640
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3641
inetplumb(char *arg, int64_t param)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3642
{
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3643
	ipadm_status_t	istatus;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3644
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3645
	istatus = ipadm_create_if(iph, name, afp->af_af, IPADM_OPT_ACTIVE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3646
	if (istatus != IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3647
		(void) fprintf(stderr, "ifconfig: cannot plumb %s: %s\n",
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3648
		    name, ipadm_status2str(istatus));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3649
		if (istatus != IPADM_IF_EXISTS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3650
			exit(1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3651
	}
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3652
	return (0);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3653
}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3654
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3655
/* ARGSUSED */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3656
static int
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3657
inetipmp(char *arg, int64_t param)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3658
{
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3659
	int retval;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3660
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3661
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3662
	 * Treat e.g. "ifconfig ipmp0:2 ipmp" as "ifconfig ipmp0:2 plumb".
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3663
	 * Otherwise, try to create the requested IPMP interface.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3664
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3665
	if (strchr(name, ':') != NULL)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3666
		retval = inetplumb(arg, param);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3667
	else
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3668
		retval = create_ipmp(name, afp->af_af, name, _B_FALSE);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3669
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3670
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3671
	 * We'd return -1, but foreachinterface() doesn't propagate the error
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3672
	 * into the exit status, so we're forced to explicitly exit().
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3673
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3674
	if (retval == -1)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3675
		exit(1);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3676
	return (0);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3677
}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3678
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3679
/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3680
 * Create an IPMP group `grname' with address family `af'.  If `ifname' is
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3681
 * non-NULL, it specifies the interface name to use.  Otherwise, use the name
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3682
 * ipmpN, where N corresponds to the lowest available integer.  If `implicit'
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3683
 * is set, then the group is being created as a side-effect of placing an
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3684
 * underlying interface in a group.  Also start in.mpathd if necessary.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3685
 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3686
static int
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3687
create_ipmp(const char *grname, int af, const char *ifname, boolean_t implicit)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3688
{
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3689
	static int ipmp_daemon_started;
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3690
	uint32_t flags = IPADM_OPT_IPMP|IPADM_OPT_ACTIVE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3691
	ipadm_status_t istatus;
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3692
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3693
	if (debug) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3694
		(void) printf("create_ipmp: ifname %s grname %s af %d\n",
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3695
		    ifname != NULL ? ifname : "NULL", grname, af);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3696
	}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3697
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3698
	/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3699
	 * ipadm_create_if() creates the IPMP interface and fills in the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3700
	 * ppa in lifr.lifr_name, if `ifname'="ipmp".
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3701
	 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3702
	(void) strlcpy(lifr.lifr_name, (ifname ? ifname : "ipmp"),
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3703
	    sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3704
	if (ifname == NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3705
		flags |= IPADM_OPT_GENPPA;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3706
	istatus = ipadm_create_if(iph, lifr.lifr_name, af, flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3707
	if (istatus != IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3708
		(void) fprintf(stderr, "ifconfig: cannot create IPMP interface "
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3709
		    "%s: %s\n", grname, ipadm_status2str(istatus));
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3710
		return (-1);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3711
	}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3712
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3713
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3714
	 * To preserve backward-compatibility, always bring up the link-local
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3715
	 * address for implicitly-created IPv6 IPMP interfaces.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3716
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3717
	if (implicit && af == AF_INET6) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3718
		if (ioctl(s6, SIOCGLIFFLAGS, &lifr) == 0) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3719
			lifr.lifr_flags |= IFF_UP;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3720
			(void) ioctl(s6, SIOCSLIFFLAGS, &lifr);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3721
		}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3722
	}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3723
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3724
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3725
	 * If the caller requested a different group name, issue a
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3726
	 * SIOCSLIFGROUPNAME on the new IPMP interface.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3727
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3728
	if (strcmp(lifr.lifr_name, grname) != 0) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3729
		(void) strlcpy(lifr.lifr_groupname, grname, LIFGRNAMSIZ);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3730
		if (ioctl(s, SIOCSLIFGROUPNAME, &lifr) == -1) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3731
			Perror0("SIOCSLIFGROUPNAME");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3732
			return (-1);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3733
		}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3734
	}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3735
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3736
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3737
	 * If we haven't done so yet, ensure in.mpathd is started.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3738
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3739
	if (ipmp_daemon_started++ == 0)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3740
		start_ipmp_daemon();
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3741
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3742
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3743
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3744
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3745
/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3746
 * Start in.mpathd if it's not already running.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3747
 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3748
static void
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3749
start_ipmp_daemon(void)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3750
{
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3751
	int retval;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3752
	ipmp_handle_t ipmp_handle;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3753
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3754
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3755
	 * Ping in.mpathd to see if it's running already.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3756
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3757
	if ((retval = ipmp_open(&ipmp_handle)) != IPMP_SUCCESS) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3758
		(void) fprintf(stderr, "ifconfig: cannot create IPMP handle: "
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3759
		    "%s\n", ipmp_errmsg(retval));
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3760
		return;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3761
	}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3762
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3763
	retval = ipmp_ping_daemon(ipmp_handle);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3764
	ipmp_close(ipmp_handle);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3765
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3766
	switch (retval) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3767
	case IPMP_ENOMPATHD:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3768
		break;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3769
	case IPMP_SUCCESS:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3770
		return;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3771
	default:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3772
		(void) fprintf(stderr, "ifconfig: cannot ping in.mpathd: %s\n",
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3773
		    ipmp_errmsg(retval));
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3774
		break;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3775
	}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3776
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3777
	/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3778
	 * Start in.mpathd.  Note that in.mpathd will handle multiple
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3779
	 * incarnations (ipmp_ping_daemon() is just an optimization) so we
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3780
	 * don't need to worry about racing with another ifconfig process.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3781
	 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3782
	switch (fork()) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3783
	case -1:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3784
		Perror0_exit("start_ipmp_daemon: fork");
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3785
		/* NOTREACHED */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3786
	case 0:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3787
		(void) execl(MPATHD_PATH, MPATHD_PATH, NULL);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3788
		_exit(1);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3789
		/* NOTREACHED */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3790
	default:
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3791
		break;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3792
	}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3793
}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3794
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3795
/*
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3796
 * Bring the address named by `ifaddrp' up or down.  Doesn't trust any mutable
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3797
 * values in ia_flags since they may be stale.
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3798
 */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3799
static boolean_t
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3800
ifaddr_op(ifaddrlistx_t *ifaddrp, boolean_t up)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3801
{
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3802
	struct lifreq	lifrl;	/* Local lifreq struct */
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3803
	int		fd = (ifaddrp->ia_flags & IFF_IPV4) ? s4 : s6;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3804
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3805
	(void) memset(&lifrl, 0, sizeof (lifrl));
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3806
	(void) strlcpy(lifrl.lifr_name, ifaddrp->ia_name, LIFNAMSIZ);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3807
	if (ioctl(fd, SIOCGLIFFLAGS, &lifrl) == -1)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3808
		return (_B_FALSE);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3809
9772
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3810
	if (up)
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3811
		lifrl.lifr_flags |= IFF_UP;
9772
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3812
	else
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3813
		lifrl.lifr_flags &= ~IFF_UP;
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3814
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3815
	if (ioctl(fd, SIOCSLIFFLAGS, &lifrl) == -1)
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3816
		return (_B_FALSE);
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3817
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3818
	/*
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3819
	 * If we're trying to bring the address down, ensure that DAD activity
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3820
	 * (observable by IFF_DUPLICATE) has also been stopped.
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3821
	 */
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3822
	if (!up && ioctl(fd, SIOCGLIFFLAGS, &lifrl) != -1 &&
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3823
	    lifrl.lifr_flags & IFF_DUPLICATE) {
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3824
		if (ioctl(fd, SIOCGLIFADDR, &lifrl) == -1 ||
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3825
		    ioctl(fd, SIOCSLIFADDR, &lifrl) == -1) {
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3826
			return (_B_FALSE);
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3827
		}
9772
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3828
	}
0d374397c147 6487457 device_policy contains redundant network device priv sets
meem <Peter.Memishian@Sun.COM>
parents: 9001
diff changeset
  3829
	return (_B_TRUE);
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3830
}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3831
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3832
static boolean_t
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3833
ifaddr_up(ifaddrlistx_t *ifaddrp)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3834
{
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3835
	return (ifaddr_op(ifaddrp, _B_TRUE));
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3836
}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3837
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3838
static boolean_t
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3839
ifaddr_down(ifaddrlistx_t *ifaddrp)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3840
{
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3841
	return (ifaddr_op(ifaddrp, _B_FALSE));
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3842
}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  3843
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3844
/*
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3845
 * Open the global libdladm handle "dlh" if it isn't already opened.  The
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3846
 * caller may optionally supply a link name to obtain its linkid.  If a link
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3847
 * of a specific class or classes is required, reqclass specifies the class
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3848
 * mask.
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3849
 */
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3850
static dladm_status_t
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3851
ifconfig_dladm_open(const char *name, datalink_class_t reqclass,
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3852
    datalink_id_t *linkid)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3853
{
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3854
	dladm_status_t status = DLADM_STATUS_OK;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3855
	datalink_class_t class;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3856
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3857
	if (!dlh_opened) {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3858
		if ((status = dladm_open(&dlh)) != DLADM_STATUS_OK)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3859
			return (status);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3860
		dlh_opened = _B_TRUE;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3861
	}
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3862
	if (name != NULL) {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3863
		status = dladm_name2info(dlh, name, linkid, NULL, &class, NULL);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3864
		if (status == DLADM_STATUS_OK) {
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3865
			if (!(class & reqclass))
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3866
				status = DLADM_STATUS_LINKINVAL;
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3867
		}
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3868
	}
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3869
	return (status);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3870
}
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3871
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3872
/*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3873
 * This function checks if we can use libipadm API's. We will only
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3874
 * call libipadm functions for non-IPMP interfaces. This check is
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3875
 * temporary until libipadm supports IPMP interfaces.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3876
 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3877
static boolean_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3878
ifconfig_use_libipadm(int s, const char *lifname)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3879
{
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3880
	struct lifreq lifr1;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3881
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3882
	(void) strlcpy(lifr1.lifr_name, lifname, sizeof (lifr1.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3883
	if (ioctl(s, SIOCGLIFGROUPNAME, (caddr_t)&lifr1) < 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3884
		(void) strncpy(lifr.lifr_name, lifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3885
		    sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3886
		Perror0_exit("error");
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3887
	}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3888
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3889
	return (lifr1.lifr_groupname[0] == '\0');
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3890
}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3891
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3892
static void
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3893
ipadmerr_exit(ipadm_status_t status, const char *str)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3894
{
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3895
	(void) fprintf(stderr, "ifconfig: %s: %s\n", str,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3896
	    ipadm_status2str(status));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3897
	exit(1);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3898
}
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3899
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11262
diff changeset
  3900
static void
10616
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3901
dladmerr_exit(dladm_status_t status, const char *str)
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3902
{
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3903
	char errstr[DLADM_STRSIZE];
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3904
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3905
	(void) fprintf(stderr, "%s: %s\n", str,
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3906
	    dladm_status2str(status, errstr));
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3907
	exit(1);
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3908
}
3be00c4a6835 PSARC 2009/373 Clearview IP Tunneling
Sebastien Roy <Sebastien.Roy@Sun.COM>
parents: 10471
diff changeset
  3909
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3910
void
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3911
Perror0(const char *cmd)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3912
{
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3913
	Perror2(cmd, lifr.lifr_name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3914
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3915
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3916
void
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3917
Perror0_exit(const char *cmd)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3918
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3919
	Perror0(cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3920
	exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3921
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3922
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3923
void
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3924
Perror2(const char *cmd, const char *str)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3925
{
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3926
	int error = errno;
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3927
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3928
	(void) fprintf(stderr, "ifconfig: %s: ", cmd);
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3929
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3930
	switch (error) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3931
	case ENXIO:
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3932
		(void) fprintf(stderr, "%s: no such interface\n", str);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3933
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3934
	case EPERM:
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3935
		(void) fprintf(stderr, "%s: permission denied\n", str);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3936
		break;
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3937
	case EEXIST:
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3938
		(void) fprintf(stderr, "%s: already exists\n", str);
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3939
		break;
11220
41c5df5d6f31 6871708 LIFNAMSIZ not accounting for logical numbers are pathway for ip panics
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11076
diff changeset
  3940
	case ENAMETOOLONG:
41c5df5d6f31 6871708 LIFNAMSIZ not accounting for logical numbers are pathway for ip panics
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11076
diff changeset
  3941
		(void) fprintf(stderr, "%s: interface name too long\n", str);
41c5df5d6f31 6871708 LIFNAMSIZ not accounting for logical numbers are pathway for ip panics
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11076
diff changeset
  3942
		break;
41c5df5d6f31 6871708 LIFNAMSIZ not accounting for logical numbers are pathway for ip panics
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11076
diff changeset
  3943
	case ERANGE:
41c5df5d6f31 6871708 LIFNAMSIZ not accounting for logical numbers are pathway for ip panics
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11076
diff changeset
  3944
		(void) fprintf(stderr, "%s: logical interface id is outside "
41c5df5d6f31 6871708 LIFNAMSIZ not accounting for logical numbers are pathway for ip panics
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11076
diff changeset
  3945
		    "allowed range\n", str);
41c5df5d6f31 6871708 LIFNAMSIZ not accounting for logical numbers are pathway for ip panics
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents: 11076
diff changeset
  3946
		break;
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3947
	default:
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3948
		errno = error;
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3949
		perror(str);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3950
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3951
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3952
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3953
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3954
 * Print out error message (Perror2()) and exit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3955
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3956
void
5978
f182d580ff05 6522970 ifparse (ifconfig cousin) should also known about DHCPv6
meem
parents: 5895
diff changeset
  3957
Perror2_exit(const char *cmd, const char *str)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3958
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3959
	Perror2(cmd, str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3960
	exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3961
	/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3962
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3963
3628
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3964
void
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3965
Perrdlpi(const char *cmd, const char *linkname, int err)
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3966
{
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3967
	(void) fprintf(stderr, "ifconfig: %s \"%s\": %s\n", cmd,
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3968
	    linkname, dlpi_strerror(err));
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3969
}
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3970
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3971
/*
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3972
 * Print out error message (Perrdlpi()) and exit
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3973
 */
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3974
void
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3975
Perrdlpi_exit(const char *cmd, const char *linkname, int err)
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3976
{
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3977
	Perrdlpi(cmd, linkname, err);
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3978
	exit(1);
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3979
}
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  3980
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3981
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3982
 * If the last argument is non-NULL allow a <addr>/<n> syntax and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3983
 * pass out <n> in *plenp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3984
 * If <n> doesn't parse return BAD_ADDR as *plenp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3985
 * If no /<n> is present return NO_PREFIX as *plenp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3986
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3987
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3988
in_getaddr(char *s, struct sockaddr *saddr, int *plenp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3989
{
2546
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  3990
	/* LINTED: alignment */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3991
	struct sockaddr_in *sin = (struct sockaddr_in *)saddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3992
	struct hostent *hp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3993
	struct netent *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3994
	char str[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3995
	int error_num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3996
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3997
	(void) strncpy(str, s, sizeof (str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3998
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3999
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4000
	 * Look for '/'<n> is plenp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4001
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4002
	if (plenp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4003
		char *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4004
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
  4005
		*plenp = in_getprefixlen(str, _B_TRUE, IP_ABITS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4006
		if (*plenp == BAD_ADDR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4007
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4008
		cp = strchr(str, '/');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4009
		if (cp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4010
			*cp = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4011
	} else if (strchr(str, '/') != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4012
		(void) fprintf(stderr, "ifconfig: %s: unexpected '/'\n", str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4013
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4014
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4015
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4016
	(void) memset(sin, 0, sizeof (*sin));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4017
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4018
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4019
	 *	Try to catch attempts to set the broadcast address to all 1's.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4020
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4021
	if (strcmp(str, "255.255.255.255") == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4022
	    (strtoul(str, (char **)NULL, 0) == 0xffffffffUL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4023
		sin->sin_family = AF_INET;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4024
		sin->sin_addr.s_addr = 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4025
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4026
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4027
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4028
	hp = getipnodebyname(str, AF_INET, 0, &error_num);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4029
	if (hp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4030
		sin->sin_family = hp->h_addrtype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4031
		(void) memcpy(&sin->sin_addr, hp->h_addr, hp->h_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4032
		freehostent(hp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4033
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4034
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4035
	np = getnetbyname(str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4036
	if (np) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4037
		sin->sin_family = np->n_addrtype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4038
		sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4039
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4040
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4041
	if (error_num == TRY_AGAIN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4042
		(void) fprintf(stderr, "ifconfig: %s: bad address "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4043
		    "(try again later)\n", s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4044
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4045
		(void) fprintf(stderr, "ifconfig: %s: bad address\n", s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4046
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4047
	exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4048
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4049
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4050
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4051
 * If the last argument is non-NULL allow a <addr>/<n> syntax and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4052
 * pass out <n> in *plenp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4053
 * If <n> doesn't parse return BAD_ADDR as *plenp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4054
 * If no /<n> is present return NO_PREFIX as *plenp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4055
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4056
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4057
in6_getaddr(char *s, struct sockaddr *saddr, int *plenp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4058
{
2546
3e3e9857b7e6 PSARC 2005/314 IP Duplicate Address Detection
carlsonj
parents: 2346
diff changeset
  4059
	/* LINTED: alignment */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4060
	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)saddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4061
	struct hostent *hp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4062
	char str[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4063
	int error_num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4064
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4065
	(void) strncpy(str, s, sizeof (str));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4066
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4067
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4068
	 * Look for '/'<n> is plenp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4069
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4070
	if (plenp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4071
		char *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4072
2346
040228f83c6b 6446742 glaring cruft in ifconfig should be hauled out
meem
parents: 1676
diff changeset
  4073
		*plenp = in_getprefixlen(str, _B_TRUE, IPV6_ABITS);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4074
		if (*plenp == BAD_ADDR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4075
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4076
		cp = strchr(str, '/');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4077
		if (cp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4078
			*cp = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4079
	} else if (strchr(str, '/') != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4080
		(void) fprintf(stderr, "ifconfig: %s: unexpected '/'\n", str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4081
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4082
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4083
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4084
	(void) memset(sin6, 0, sizeof (*sin6));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4085
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4086
	hp = getipnodebyname(str, AF_INET6, 0, &error_num);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4087
	if (hp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4088
		sin6->sin6_family = hp->h_addrtype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4089
		(void) memcpy(&sin6->sin6_addr, hp->h_addr, hp->h_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4090
		freehostent(hp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4091
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4092
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4093
	if (error_num == TRY_AGAIN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4094
		(void) fprintf(stderr, "ifconfig: %s: bad address "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4095
		    "(try again later)\n", s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4096
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4097
		(void) fprintf(stderr, "ifconfig: %s: bad address\n", s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4098
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4099
	exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4100
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4102
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4103
 * If "slash" is zero this parses the whole string as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4104
 * an integer. With "slash" non zero it parses the tail part as an integer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4105
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4106
 * If it is not a valid integer this returns BAD_ADDR.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4107
 * If there is /<n> present this returns NO_PREFIX.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4108
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4109
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4110
in_getprefixlen(char *addr, boolean_t slash, int max_plen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4111
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4112
	int prefixlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4113
	char *str, *end;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4115
	if (slash) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4116
		str = strchr(addr, '/');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4117
		if (str == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4118
			return (NO_PREFIX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4119
		str++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4120
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4121
		str = addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4123
	prefixlen = strtol(str, &end, 10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4124
	if (prefixlen < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4125
		return (BAD_ADDR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4126
	if (str == end)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4127
		return (BAD_ADDR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4128
	if (max_plen != 0 && max_plen < prefixlen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4129
		return (BAD_ADDR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4130
	return (prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4131
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4133
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4134
 * Convert a prefix length to a mask.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4135
 * Returns 1 if ok. 0 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4136
 * Assumes the mask array is zero'ed by the caller.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4137
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4138
static boolean_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4139
in_prefixlentomask(int prefixlen, int maxlen, uchar_t *mask)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4140
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4141
	if (prefixlen < 0 || prefixlen > maxlen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4142
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4144
	while (prefixlen > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4145
		if (prefixlen >= 8) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4146
			*mask++ = 0xFF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4147
			prefixlen -= 8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4148
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4149
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4150
		*mask |= 1 << (8 - prefixlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4151
		prefixlen--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4152
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4153
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4154
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4156
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4157
print_flags(uint64_t flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4158
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4159
	boolean_t first = _B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4160
	int cnt, i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4161
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4162
	(void) printf("flags=%llx", flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4163
	cnt = sizeof (if_flags_tbl) / sizeof (if_flags_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4164
	for (i = 0; i < cnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4165
		if (flags & if_flags_tbl[i].iff_value) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4166
			if (first) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4167
				(void) printf("<");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4168
				first = _B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4169
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4170
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4171
				 * It has to be here and not with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4172
				 * printf below because for the last one,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4173
				 * we don't want a comma before the ">".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4174
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4175
				(void) printf(",");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4176
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4177
			(void) printf("%s", if_flags_tbl[i].iff_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4178
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4179
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4180
	if (!first)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4181
		(void) printf(">");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4182
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4184
static void
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4185
print_config_flags(int af, uint64_t flags)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4186
{
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4187
	if_config_cmd_t *cmdp;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4188
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4189
	for (cmdp = if_config_cmd_tbl; cmdp->iff_flag != 0; cmdp++) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4190
		if ((flags & cmdp->iff_flag) &&
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4191
		    (cmdp->iff_af == AF_UNSPEC || cmdp->iff_af == af)) {
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4192
			(void) printf("%s ", cmdp->iff_name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4193
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4194
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4195
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4196
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4197
/*
11262
b7ebfbf2359e 6874309 Remove NIS+ from Solaris
Raja Andra <Rajagopal.Andra@Sun.COM>
parents: 11220
diff changeset
  4198
 * Use the configured directory lookup mechanism (e.g. files/NIS/...)
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4199
 * to find the network mask.  Returns true if we found one to set.
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4200
 *
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4201
 * The parameter addr_set controls whether we should get the address of
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4202
 * the working interface for the netmask query.  If addr_set is true,
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4203
 * we will use the address provided.  Otherwise, we will find the working
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4204
 * interface's address and use it instead.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4205
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4206
static boolean_t
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4207
in_getmask(struct sockaddr_in *saddr, boolean_t addr_set)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4208
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4209
	struct sockaddr_in ifaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4211
	/*
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4212
	 * Read the address from the interface if it is not passed in.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4213
	 */
198
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4214
	if (!addr_set) {
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4215
		(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4216
		if (ioctl(s, SIOCGLIFADDR, (caddr_t)&lifr) < 0) {
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4217
			if (errno != EADDRNOTAVAIL) {
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4218
				(void) fprintf(stderr, "Need net number for "
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4219
				    "mask\n");
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4220
			}
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4221
			return (_B_FALSE);
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4222
		}
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4223
		ifaddr = *((struct sockaddr_in *)&lifr.lifr_addr);
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4224
	} else {
93f223a7d535 6249405 CIDR support does not work for logical interface
kcpoon
parents: 0
diff changeset
  4225
		ifaddr.sin_addr = saddr->sin_addr;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4226
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4227
	if (getnetmaskbyaddr(ifaddr.sin_addr, &saddr->sin_addr) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4228
		saddr->sin_family = AF_INET;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4229
		return (_B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4230
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4231
	return (_B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4232
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4234
static int
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4235
lifnum(const char *ifname)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4236
{
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4237
	const char *cp;
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4238
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4239
	if ((cp = strchr(ifname, ':')) == NULL)
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4240
		return (0);
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4241
	else
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4242
		return (atoi(cp + 1));
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4243
}
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4244
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4245
static void
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5240
diff changeset
  4246
add_ni(const char *name)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4247
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4248
	ni_t **pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4249
	ni_t *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4251
	for (pp = &ni_list; (p = *pp) != NULL; pp = &(p->ni_next)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4252
		if (strcmp(p->ni_name, name) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4253
			if (debug > 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4254
				(void) fprintf(stderr, "'%s' is a duplicate\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4255
				    name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4256
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4257
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4258
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4260
	if (debug > 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4261
		(void) fprintf(stderr, "adding '%s'\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4262
		    name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4263
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4264
	if ((p = malloc(sizeof (ni_t))) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4265
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4267
	(void) strlcpy(p->ni_name, name, sizeof (p->ni_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4268
	p->ni_next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4270
	*pp = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4271
	num_ni++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4272
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4273
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5240
diff changeset
  4274
static boolean_t
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5240
diff changeset
  4275
ni_entry(const char *linkname, void *arg)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4276
{
3628
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  4277
	dlpi_handle_t	dh;
8275
7c223a798022 PSARC/2006/357 Crossbow - Network Virtualization and Resource Management
Eric Cheng
parents: 8142
diff changeset
  4278
	datalink_class_t class;
7c223a798022 PSARC/2006/357 Crossbow - Network Virtualization and Resource Management
Eric Cheng
parents: 8142
diff changeset
  4279
8673
c3b43e751053 6793859 ifconfig find_all_global_interfaces() calls dladm_open() for every link
Vasumathi Sundaram - Sun Microsystems <Vasumathi.Sundaram@Sun.COM>
parents: 8485
diff changeset
  4280
	(void) dladm_name2info(arg, linkname, NULL, NULL, &class, NULL);
8453
15fa4bb77d8c 6745288 libdladm is executing open() of dld control device everywhere
Anurag S. Maskey <Anurag.Maskey@Sun.COM>
parents: 8275
diff changeset
  4281
8275
7c223a798022 PSARC/2006/357 Crossbow - Network Virtualization and Resource Management
Eric Cheng
parents: 8142
diff changeset
  4282
	if (class == DATALINK_CLASS_ETHERSTUB)
7c223a798022 PSARC/2006/357 Crossbow - Network Virtualization and Resource Management
Eric Cheng
parents: 8142
diff changeset
  4283
		return (_B_FALSE);
3628
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  4284
	if (dlpi_open(linkname, &dh, 0) != DLPI_SUCCESS)
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5240
diff changeset
  4285
		return (_B_FALSE);
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5240
diff changeset
  4286
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5240
diff changeset
  4287
	add_ni(linkname);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4288
3628
98d9a6c27bd3 PSARC/2006/436 Public DLPI Library
ss150715
parents: 3448
diff changeset
  4289
	dlpi_close(dh);
5895
f251acdd9bdc PSARC/2006/499 Clearview Nemo unification and vanity naming
yz147064
parents: 5240
diff changeset
  4290
	return (_B_FALSE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4291
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4293
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4294
 * dhcp-related routines
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4295
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4297
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4298
setifdhcp(const char *caller, const char *ifname, int argc, char *argv[])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4299
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4300
	dhcp_ipc_request_t	*request;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4301
	dhcp_ipc_reply_t	*reply	= NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4302
	int			timeout = DHCP_IPC_WAIT_DEFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4303
	dhcp_ipc_type_t		type	= DHCP_START;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4304
	int			error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4305
	boolean_t		is_primary = _B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4306
	boolean_t		started = _B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4308
	for (argv++; --argc > 0; argv++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4310
		if (strcmp(*argv, "primary") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4311
			is_primary = _B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4312
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4313
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4315
		if (strcmp(*argv, "wait") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4316
			if (--argc <= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4317
				usage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4318
				return (DHCP_EXIT_BADARGS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4319
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4320
			argv++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4322
			if (strcmp(*argv, "forever") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4323
				timeout = DHCP_IPC_WAIT_FOREVER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4324
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4325
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4326
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4327
			if (sscanf(*argv, "%d", &timeout) != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4328
				usage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4329
				return (DHCP_EXIT_BADARGS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4330
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4332
			if (timeout < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4333
				usage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4334
				return (DHCP_EXIT_BADARGS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4335
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4336
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4337
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4338
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4339
		type = dhcp_string_to_request(*argv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4340
		if (type == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4341
			usage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4342
			return (DHCP_EXIT_BADARGS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4343
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4344
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4346
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4347
	 * Only try to start agent on start or inform; in all other cases it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4348
	 * has to already be running for anything to make sense.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4349
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4350
	if (type == DHCP_START || type == DHCP_INFORM) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4351
		if (dhcp_start_agent(DHCP_IPC_MAX_WAIT) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4352
			(void) fprintf(stderr, "%s: unable to start %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4353
			    caller, DHCP_AGENT_PATH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4354
			return (DHCP_EXIT_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4355
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4356
		started = _B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4357
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4359
	if (is_primary)
3431
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
  4360
		type |= DHCP_PRIMARY;
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
  4361
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
  4362
	if (af != AF_INET)
9f2d277dcffa PSARC 2006/597 DHCPv6 Client
carlsonj
parents: 3055
diff changeset
  4363
		type |= DHCP_V6;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4365
	request = dhcp_ipc_alloc_request(type, ifname, NULL, 0, DHCP_TYPE_NONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4366
	if (request == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4367
		(void) fprintf(stderr, "%s: out of memory\n", caller);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4368
		return (DHCP_EXIT_SYSTEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4369
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4371
	error = dhcp_ipc_make_request(request, &reply, timeout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4372
	if (error != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4373
		free(request);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4374
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4375
		 * Re-map connect error to not under control if we didn't try a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4376
		 * start operation, as this has to be true and results in a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4377
		 * clearer message, not to mention preserving compatibility
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4378
		 * with the days when we always started dhcpagent for every
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4379
		 * request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4380
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4381
		if (error == DHCP_IPC_E_CONNECT && !started)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4382
			error = DHCP_IPC_E_UNKIF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4383
		(void) fprintf(stderr, "%s: %s: %s\n", caller, ifname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4384
		    dhcp_ipc_strerror(error));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4385
		return (DHCP_EXIT_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4386
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4388
	error = reply->return_code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4389
	if (error != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4390
		free(request);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4391
		free(reply);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4393
		if (error == DHCP_IPC_E_TIMEOUT && timeout == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4394
			return (DHCP_EXIT_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4396
		(void) fprintf(stderr, "%s: %s: %s\n", caller, ifname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4397
		    dhcp_ipc_strerror(error));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4399
		if (error == DHCP_IPC_E_TIMEOUT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4400
			return (DHCP_EXIT_TIMEOUT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4401
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4402
			return (DHCP_EXIT_IF_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4403
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4405
	if (DHCP_IPC_CMD(type) == DHCP_STATUS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4406
		(void) printf("%s", dhcp_status_hdr_string());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4407
		(void) printf("%s", dhcp_status_reply_to_string(reply));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4408
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4409
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4410
	free(request);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4411
	free(reply);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4412
	return (DHCP_EXIT_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4413
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4414
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4415
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4416
usage(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4417
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4418
	(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4419
	    "usage: ifconfig <interface> | -a[ 4 | 6 | D ][ u | d ][ Z ]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4421
	(void) fprintf(stderr, "%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4422
	    "\t[ <addr_family> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4423
	    "\t[ <address>[/<prefix_length>] [ <dest_address> ] ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4424
	    "\t[ set [ <address>][/<prefix_length>] ]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4425
	    " [ <address>/<prefix_length>] ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4426
	    "\t[ destination <dest_address> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4427
	    "\t[ addif <address>[/<prefix_length>]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4428
	    "  [ <dest_address> ] ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4429
	    "\t[ removeif <address>[/<prefix_length>] ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4430
	    "\t[ arp | -arp ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4431
	    "\t[ auto-revarp ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4432
	    "\t[ broadcast <broad_addr> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4433
	    "\t[ index <if_index> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4434
	    "\t[ metric <n> ] [ mtu <n> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4435
	    "\t[ netmask <mask> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4436
	    "\t[ plumb ] [ unplumb ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4437
	    "\t[ preferred | -preferred ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4438
	    "\t[ private | -private ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4439
	    "\t[ local | -local ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4440
	    "\t[ router | -router ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4441
	    "\t[ subnet <subnet_address>]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4442
	    "\t[ trailers | -trailers ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4443
	    "\t[ token <address>/<prefix_length> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4444
	    "\t[ tsrc <tunnel_src_address> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4445
	    "\t[ tdst <tunnel_dest_address> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4446
	    "\t[ auth_algs <tunnel_AH_authentication_algorithm> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4447
	    "\t[ encr_algs <tunnel_ESP_encryption_algorithm> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4448
	    "\t[ encr_auth_algs <tunnel_ESP_authentication_algorithm> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4449
	    "\t[ up ] [ down ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4450
	    "\t[ xmit | -xmit ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4451
	    "\t[ modlist ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4452
	    "\t[ modinsert <module_name@position> ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4453
	    "\t[ modremove <module_name@position> ]\n"
8485
633e5b5eb268 PSARC/2007/272 Project Clearview: IPMP Rearchitecture
meem <Peter.Memishian@Sun.COM>
parents: 8453
diff changeset
  4454
	    "\t[ ipmp ]\n"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4455
	    "\t[ group <groupname>] | [ group \"\"]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4456
	    "\t[ deprecated | -deprecated ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4457
	    "\t[ standby | -standby ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4458
	    "\t[ failover | -failover ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4459
	    "\t[ zone <zonename> | -zone ]\n"
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  4460
	    "\t[ usesrc <interface> ]\n"
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 741
diff changeset
  4461
	    "\t[ all-zones ]\n");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4463
	(void) fprintf(stderr, "or\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4464
	(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4465
	    "\tifconfig <interface> |  -a[ 4 | 6 | D ] [ u | d ]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4466
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4467
	(void) fprintf(stderr, "%s", "\tauto-dhcp | dhcp\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4468
	    "\t[ wait <time> | forever ]\n\t[ primary ]\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4469
	    "\tstart | drop | ping | release | status | inform\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4470
}