annotate usr/src/lib/libipadm/common/ipadm_if.c @ 12016:0248e987199b

PSARC 2009/306 Brussels II - ipadm and libipadm PSARC 2010/080 Brussels II addendum 6827318 Brussels Phase II aka ipadm(1m) 6731945 need BSD getifaddrs() API 6909065 explicitly disallow non-contiguous netmasks in the next minor release 6853922 ifconfig dumps core when ether address is non-hexadecimal. 6815806 ipReasmTimeout value should be variable 6567083 nd_getset has some dead and confusing code. 6884466 remove unused tcp/sctp ndd tunables 6928813 Comments at odds with default value of tcp_time_wait_interval 6236982 ifconfig usesrc lets adapter use itself as source address 6936855 modifying the ip6_strict_src_multihoming to non-zero value will unbind V4 IREs
author Girish Moodalbail <Girish.Moodalbail@Sun.COM>
date Fri, 26 Mar 2010 17:53:11 -0400
parents
children 162e93ccf12f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12016
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
2 * CDDL HEADER START
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
3 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
5 * Common Development and Distribution License (the "License").
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
6 * You may not use this file except in compliance with the License.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
7 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
10 * See the License for the specific language governing permissions
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
11 * and limitations under the License.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
12 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
18 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
19 * CDDL HEADER END
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
20 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
21 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
23 * Use is subject to license terms.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
24 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
25
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
26 #include <errno.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
27 #include <sys/sockio.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
28 #include <string.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
29 #include <assert.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
30 #include <unistd.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
31 #include <stropts.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
32 #include <strings.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
33 #include <libdlpi.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
34 #include <libdllink.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
35 #include <libinetutil.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
36 #include <inet/ip.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
37 #include <limits.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
38 #include <zone.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
39 #include <ipadm_ndpd.h>
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
40 #include "libipadm_impl.h"
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
41
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
42 static ipadm_status_t i_ipadm_slifname_arp(char *, uint64_t, int);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
43 static ipadm_status_t i_ipadm_slifname(ipadm_handle_t, char *, char *,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
44 uint64_t, int, uint32_t);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
45 static ipadm_status_t i_ipadm_create_ipmp_peer(ipadm_handle_t, char *,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
46 sa_family_t);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
47 static ipadm_status_t i_ipadm_persist_if(ipadm_handle_t, const char *,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
48 sa_family_t);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
49
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
50 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
51 * Returns B_FALSE if the interface in `ifname' has at least one address that is
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
52 * IFF_UP in the addresses in `ifa'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
53 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
54 static boolean_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
55 i_ipadm_is_if_down(char *ifname, struct ifaddrs *ifa)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
56 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
57 struct ifaddrs *ifap;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
58 char cifname[LIFNAMSIZ];
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
59 char *sep;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
60
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
61 for (ifap = ifa; ifap != NULL; ifap = ifap->ifa_next) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
62 (void) strlcpy(cifname, ifap->ifa_name, sizeof (cifname));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
63 if ((sep = strrchr(cifname, IPADM_LOGICAL_SEP)) != NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
64 *sep = '\0';
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
65 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
66 * If this condition is true, there is at least one
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
67 * address that is IFF_UP. So, we need to return B_FALSE.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
68 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
69 if (strcmp(cifname, ifname) == 0 &&
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
70 (ifap->ifa_flags & IFF_UP)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
71 return (B_FALSE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
72 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
73 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
74 /* We did not find any IFF_UP addresses. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
75 return (B_TRUE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
76 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
77
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
78 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
79 * Retrieves the information for the interface `ifname' from active
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
80 * config if `ifname' is specified and returns the result in the list `if_info'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
81 * Otherwise, it retrieves the information for all the interfaces in
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
82 * the active config and returns the result in the list `if_info'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
83 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
84 static ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
85 i_ipadm_active_if_info(ipadm_handle_t iph, const char *ifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
86 ipadm_if_info_t **if_info, int64_t lifc_flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
87 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
88 struct lifreq *buf;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
89 struct lifreq *lifrp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
90 struct lifreq lifrl;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
91 ipadm_if_info_t *last = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
92 ipadm_if_info_t *ifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
93 int s;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
94 int n;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
95 int numifs;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
96 ipadm_status_t status;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
97
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
98 *if_info = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
99 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
100 * Get information for all interfaces.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
101 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
102 if (getallifs(iph->iph_sock, 0, &buf, &numifs, lifc_flags) != 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
103 return (ipadm_errno2status(errno));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
104
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
105 lifrp = buf;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
106 for (n = 0; n < numifs; n++, lifrp++) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
107 /* Skip interfaces with logical num != 0 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
108 if (i_ipadm_get_lnum(lifrp->lifr_name) != 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
109 continue;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
110 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
111 * Skip the current interface if a specific `ifname' has
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
112 * been requested and current interface does not match
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
113 * `ifname'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
114 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
115 if (ifname != NULL && strcmp(lifrp->lifr_name, ifname) != 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
116 continue;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
117 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
118 * Check if the interface already exists in our list.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
119 * If it already exists, we need to update its flags.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
120 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
121 for (ifp = *if_info; ifp != NULL; ifp = ifp->ifi_next) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
122 if (strcmp(lifrp->lifr_name, ifp->ifi_name) == 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
123 break;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
124 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
125 if (ifp == NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
126 ifp = calloc(1, sizeof (ipadm_if_info_t));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
127 if (ifp == NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
128 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
129 goto fail;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
130 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
131 (void) strlcpy(ifp->ifi_name, lifrp->lifr_name,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
132 sizeof (ifp->ifi_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
133 /* Update the `ifi_next' pointer for this new node */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
134 if (*if_info == NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
135 *if_info = ifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
136 else
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
137 last->ifi_next = ifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
138 last = ifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
139 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
140
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
141 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
142 * Retrieve the flags for the interface by doing a
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
143 * SIOCGLIFFLAGS to populate the `ifi_cflags' field.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
144 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
145 (void) strlcpy(lifrl.lifr_name,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
146 lifrp->lifr_name, sizeof (lifrl.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
147 s = (lifrp->lifr_addr.ss_family == AF_INET) ?
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
148 iph->iph_sock : iph->iph_sock6;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
149 if (ioctl(s, SIOCGLIFFLAGS, (caddr_t)&lifrl) < 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
150 continue;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
151 if (lifrl.lifr_flags & IFF_BROADCAST)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
152 ifp->ifi_cflags |= IFIF_BROADCAST;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
153 if (lifrl.lifr_flags & IFF_MULTICAST)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
154 ifp->ifi_cflags |= IFIF_MULTICAST;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
155 if (lifrl.lifr_flags & IFF_POINTOPOINT)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
156 ifp->ifi_cflags |= IFIF_POINTOPOINT;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
157 if (lifrl.lifr_flags & IFF_VIRTUAL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
158 ifp->ifi_cflags |= IFIF_VIRTUAL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
159 if (lifrl.lifr_flags & IFF_IPMP)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
160 ifp->ifi_cflags |= IFIF_IPMP;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
161 if (lifrl.lifr_flags & IFF_STANDBY)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
162 ifp->ifi_cflags |= IFIF_STANDBY;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
163 if (lifrl.lifr_flags & IFF_INACTIVE)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
164 ifp->ifi_cflags |= IFIF_INACTIVE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
165 if (lifrl.lifr_flags & IFF_VRRP)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
166 ifp->ifi_cflags |= IFIF_VRRP;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
167 if (lifrl.lifr_flags & IFF_NOACCEPT)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
168 ifp->ifi_cflags |= IFIF_NOACCEPT;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
169 if (lifrl.lifr_flags & IFF_IPV4)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
170 ifp->ifi_cflags |= IFIF_IPV4;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
171 if (lifrl.lifr_flags & IFF_IPV6)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
172 ifp->ifi_cflags |= IFIF_IPV6;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
173 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
174 free(buf);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
175 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
176 fail:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
177 free(buf);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
178 ipadm_free_if_info(*if_info);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
179 *if_info = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
180 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
181 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
182
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
183 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
184 * Returns the interface information for `ifname' in `if_info' from persistent
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
185 * config if `ifname' is non-null. Otherwise, it returns all the interfaces
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
186 * from persistent config in `if_info'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
187 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
188 static ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
189 i_ipadm_persist_if_info(ipadm_handle_t iph, const char *ifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
190 ipadm_if_info_t **if_info)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
191 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
192 ipadm_status_t status = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
193 ipmgmt_getif_arg_t getif;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
194 ipmgmt_getif_rval_t *rvalp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
195 ipadm_if_info_t *ifp, *curr, *prev = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
196 int i = 0, err = 0;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
197
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
198 bzero(&getif, sizeof (getif));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
199 if (ifname != NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
200 (void) strlcpy(getif.ia_ifname, ifname, LIFNAMSIZ);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
201 getif.ia_cmd = IPMGMT_CMD_GETIF;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
202
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
203 *if_info = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
204
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
205 if ((rvalp = malloc(sizeof (ipmgmt_getif_rval_t))) == NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
206 return (ipadm_errno2status(errno));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
207 err = ipadm_door_call(iph, &getif, sizeof (getif), (void **)&rvalp,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
208 sizeof (*rvalp), B_TRUE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
209 if (err == ENOENT) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
210 free(rvalp);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
211 if (ifname != NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
212 return (ipadm_errno2status(err));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
213 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
214 } else if (err != 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
215 free(rvalp);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
216 return (ipadm_errno2status(err));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
217 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
218
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
219 ifp = rvalp->ir_ifinfo;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
220 for (i = 0; i < rvalp->ir_ifcnt; i++) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
221 ifp = rvalp->ir_ifinfo + i;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
222 if ((curr = malloc(sizeof (*curr))) == NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
223 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
224 ipadm_free_if_info(prev);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
225 break;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
226 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
227 (void) bcopy(ifp, curr, sizeof (*curr));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
228 curr->ifi_next = prev;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
229 prev = curr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
230 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
231 *if_info = curr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
232 free(rvalp);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
233 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
234 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
235
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
236 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
237 * Collects information for `ifname' if one is specified from both
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
238 * active and persistent config in `if_info'. If no `ifname' is specified,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
239 * this returns all the interfaces in active and persistent config in
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
240 * `if_info'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
241 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
242 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
243 i_ipadm_get_all_if_info(ipadm_handle_t iph, const char *ifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
244 ipadm_if_info_t **if_info, int64_t lifc_flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
245 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
246 ipadm_status_t status;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
247 ipadm_if_info_t *aifinfo = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
248 ipadm_if_info_t *pifinfo = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
249 ipadm_if_info_t *aifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
250 ipadm_if_info_t *pifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
251 ipadm_if_info_t *last = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
252 struct ifaddrs *ifa;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
253 struct ifaddrs *ifap;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
254
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
255 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
256 * Retrive the information for the requested `ifname' or all
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
257 * interfaces from active configuration.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
258 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
259 retry:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
260 status = i_ipadm_active_if_info(iph, ifname, &aifinfo, lifc_flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
261 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
262 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
263 /* Get the interface state for each interface in `aifinfo'. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
264 if (aifinfo != NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
265 /* We need all addresses to get the interface state */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
266 if (getallifaddrs(AF_UNSPEC, &ifa, (LIFC_NOXMIT|LIFC_TEMPORARY|
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
267 LIFC_ALLZONES|LIFC_UNDER_IPMP)) != 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
268 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
269 goto fail;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
270 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
271 for (aifp = aifinfo; aifp != NULL; aifp = aifp->ifi_next) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
272 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
273 * Find the `ifaddrs' structure from `ifa'
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
274 * for this interface. We need the IFF_* flags
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
275 * to find the interface state.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
276 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
277 for (ifap = ifa; ifap != NULL; ifap = ifap->ifa_next) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
278 if (strcmp(ifap->ifa_name, aifp->ifi_name) == 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
279 break;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
280 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
281 if (ifap == NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
282 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
283 * The interface might have been removed
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
284 * from kernel. Retry getting all the active
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
285 * interfaces.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
286 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
287 freeifaddrs(ifa);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
288 ipadm_free_if_info(aifinfo);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
289 aifinfo = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
290 goto retry;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
291 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
292 if (!(ifap->ifa_flags & IFF_RUNNING) ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
293 (ifap->ifa_flags & IFF_FAILED))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
294 aifp->ifi_state = IFIS_FAILED;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
295 else if (ifap->ifa_flags & IFF_OFFLINE)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
296 aifp->ifi_state = IFIS_OFFLINE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
297 else if (i_ipadm_is_if_down(aifp->ifi_name, ifa))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
298 aifp->ifi_state = IFIS_DOWN;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
299 else
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
300 aifp->ifi_state = IFIS_OK;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
301 if (aifp->ifi_next == NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
302 last = aifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
303 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
304 freeifaddrs(ifa);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
305 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
306 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
307 * Get the persistent interface information in `pifinfo'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
308 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
309 status = i_ipadm_persist_if_info(iph, ifname, &pifinfo);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
310 if (status == IPADM_NOTFOUND) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
311 *if_info = aifinfo;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
312 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
313 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
314 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
315 goto fail;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
316 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
317 * If a persistent interface is also found in `aifinfo', update
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
318 * its entry in `aifinfo' with the persistent information from
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
319 * `pifinfo'. If an interface is found in `pifinfo', but not in
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
320 * `aifinfo', it means that this interface was disabled. We should
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
321 * add this interface to `aifinfo' and set it state to IFIF_DISABLED.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
322 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
323 for (pifp = pifinfo; pifp != NULL; pifp = pifp->ifi_next) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
324 for (aifp = aifinfo; aifp != NULL; aifp = aifp->ifi_next) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
325 if (strcmp(aifp->ifi_name, pifp->ifi_name) == 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
326 aifp->ifi_pflags = pifp->ifi_pflags;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
327 break;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
328 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
329 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
330 if (aifp == NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
331 aifp = malloc(sizeof (ipadm_if_info_t));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
332 if (aifp == NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
333 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
334 goto fail;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
335 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
336 *aifp = *pifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
337 aifp->ifi_next = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
338 aifp->ifi_state = IFIS_DISABLED;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
339 if (last != NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
340 last->ifi_next = aifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
341 else
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
342 aifinfo = aifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
343 last = aifp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
344 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
345 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
346 *if_info = aifinfo;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
347 ipadm_free_if_info(pifinfo);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
348 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
349 fail:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
350 *if_info = NULL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
351 ipadm_free_if_info(aifinfo);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
352 ipadm_free_if_info(pifinfo);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
353 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
354 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
355
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
356 int
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
357 i_ipadm_get_lnum(const char *ifname)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
358 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
359 char *num = strrchr(ifname, IPADM_LOGICAL_SEP);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
360
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
361 if (num == NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
362 return (0);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
363
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
364 return (atoi(++num));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
365 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
366
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
367 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
368 * Sets the output argument `exists' to true or false based on whether
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
369 * any persistent configuration is available for `ifname' and returns
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
370 * IPADM_SUCCESS as status. If the persistent information cannot be retrieved,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
371 * `exists' is unmodified and an error status is returned.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
372 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
373 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
374 i_ipadm_if_pexists(ipadm_handle_t iph, const char *ifname, sa_family_t af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
375 boolean_t *exists)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
376 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
377 ipadm_if_info_t *ifinfo;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
378 ipadm_status_t status;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
379
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
380 status = i_ipadm_persist_if_info(iph, ifname, &ifinfo);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
381 if (status == IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
382 *exists = ((af == AF_INET &&
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
383 (ifinfo->ifi_pflags & IFIF_IPV4)) ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
384 (af == AF_INET6 &&
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
385 (ifinfo->ifi_pflags & IFIF_IPV6)));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
386 free(ifinfo);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
387 } else if (status == IPADM_NOTFOUND) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
388 status = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
389 *exists = B_FALSE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
390 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
391 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
392 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
393
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
394 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
395 * Open "/dev/udp{,6}" for use as a multiplexor to PLINK the interface stream
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
396 * under. We use "/dev/udp" instead of "/dev/ip" since STREAMS will not let
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
397 * you PLINK a driver under itself, and "/dev/ip" is typically the driver at
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
398 * the bottom of the stream for tunneling interfaces.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
399 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
400 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
401 ipadm_open_arp_on_udp(const char *udp_dev_name, int *fd)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
402 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
403 int err;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
404
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
405 if ((*fd = open(udp_dev_name, O_RDWR)) == -1)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
406 return (ipadm_errno2status(errno));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
407
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
408 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
409 * Pop off all undesired modules (note that the user may have
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
410 * configured autopush to add modules above udp), and push the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
411 * arp module onto the resulting stream. This is used to make
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
412 * IP+ARP be able to atomically track the muxid for the I_PLINKed
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
413 * STREAMS, thus it isn't related to ARP running the ARP protocol.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
414 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
415 while (ioctl(*fd, I_POP, 0) != -1)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
416 ;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
417 if (errno == EINVAL && ioctl(*fd, I_PUSH, ARP_MOD_NAME) != -1)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
418 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
419 err = errno;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
420 (void) close(*fd);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
421
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
422 return (ipadm_errno2status(err));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
423 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
424
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
425 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
426 * i_ipadm_create_ipmp() is called from i_ipadm_create_ipmp_peer() when an
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
427 * underlying interface in an ipmp group G is plumbed for an address family,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
428 * but the meta-interface for the other address family `af' does not exist
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
429 * yet for the group G. If `af' is IPv6, we need to bring up the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
430 * link-local address.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
431 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
432 static ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
433 i_ipadm_create_ipmp(ipadm_handle_t iph, char *ifname, sa_family_t af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
434 const char *grname, uint32_t ipadm_flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
435 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
436 ipadm_status_t status;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
437 struct lifreq lifr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
438 int sock;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
439 int err;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
440
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
441 assert(ipadm_flags & IPADM_OPT_IPMP);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
442
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
443 /* Create the ipmp underlying interface */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
444 status = i_ipadm_create_if(iph, ifname, af, ipadm_flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
445 if (status != IPADM_SUCCESS && status != IPADM_IF_EXISTS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
446 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
447
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
448 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
449 * To preserve backward-compatibility, always bring up the link-local
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
450 * address for implicitly-created IPv6 IPMP interfaces.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
451 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
452 if (af == AF_INET6)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
453 (void) i_ipadm_set_flags(iph, ifname, AF_INET6, IFF_UP, 0);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
454
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
455 sock = (af == AF_INET ? iph->iph_sock : iph->iph_sock6);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
456 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
457 * If the caller requested a different group name, issue a
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
458 * SIOCSLIFGROUPNAME on the new IPMP interface.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
459 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
460 bzero(&lifr, sizeof (lifr));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
461 (void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
462 if (strcmp(lifr.lifr_name, grname) != 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
463 (void) strlcpy(lifr.lifr_groupname, grname, LIFGRNAMSIZ);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
464 if (ioctl(sock, SIOCSLIFGROUPNAME, &lifr) == -1) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
465 err = errno;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
466 /* Remove the interface we created. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
467 if (status == IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
468 (void) i_ipadm_delete_if(iph, ifname, af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
469 ipadm_flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
470 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
471 return (ipadm_errno2status(err));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
472 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
473 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
474
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
475 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
476 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
477
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
478 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
479 * Checks if `ifname' is plumbed and in an IPMP group on its "other" address
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
480 * family. If so, create a matching IPMP group for address family `af'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
481 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
482 static ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
483 i_ipadm_create_ipmp_peer(ipadm_handle_t iph, char *ifname, sa_family_t af)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
484 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
485 lifgroupinfo_t lifgr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
486 ipadm_status_t status = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
487 struct lifreq lifr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
488 int other_af_sock;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
489
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
490 assert(af == AF_INET || af == AF_INET6);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
491
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
492 other_af_sock = (af == AF_INET ? iph->iph_sock6 : iph->iph_sock);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
493
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
494 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
495 * iph is the handle for the interface that we are trying to plumb.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
496 * other_af_sock is the socket for the "other" address family.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
497 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
498 bzero(&lifr, sizeof (lifr));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
499 (void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
500 if (ioctl(other_af_sock, SIOCGLIFGROUPNAME, &lifr) != 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
501 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
502
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
503 (void) strlcpy(lifgr.gi_grname, lifr.lifr_groupname, LIFGRNAMSIZ);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
504 if (ioctl(other_af_sock, SIOCGLIFGROUPINFO, &lifgr) != 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
505 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
506
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
507 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
508 * If `ifname' *is* the IPMP group interface, or if the relevant
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
509 * address family is already configured, then there's nothing to do.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
510 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
511 if (strcmp(lifgr.gi_grifname, ifname) == 0 ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
512 (af == AF_INET && lifgr.gi_v4) || (af == AF_INET6 && lifgr.gi_v6)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
513 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
514 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
515
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
516 status = i_ipadm_create_ipmp(iph, lifgr.gi_grifname, af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
517 lifgr.gi_grname, IPADM_OPT_ACTIVE|IPADM_OPT_IPMP);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
518 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
519 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
520
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
521 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
522 * Issues the ioctl SIOCSLIFNAME to kernel on the given ARP stream fd.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
523 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
524 static ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
525 i_ipadm_slifname_arp(char *ifname, uint64_t flags, int fd)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
526 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
527 struct lifreq lifr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
528 ifspec_t ifsp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
529
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
530 bzero(&lifr, sizeof (lifr));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
531 (void) ifparse_ifspec(ifname, &ifsp);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
532 lifr.lifr_ppa = ifsp.ifsp_ppa;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
533 lifr.lifr_flags = flags;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
534 (void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
535 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
536 * Tell ARP the name and unit number for this interface.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
537 * Note that arp has no support for transparent ioctls.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
538 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
539 if (i_ipadm_strioctl(fd, SIOCSLIFNAME, (char *)&lifr,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
540 sizeof (lifr)) == -1) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
541 return (ipadm_errno2status(errno));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
542 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
543 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
544 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
545
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
546 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
547 * Issues the ioctl SIOCSLIFNAME to kernel. If IPADM_OPT_GENPPA is set in
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
548 * `ipadm_flags', then a ppa will be generated. `newif' will be updated
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
549 * with the generated ppa.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
550 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
551 static ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
552 i_ipadm_slifname(ipadm_handle_t iph, char *ifname, char *newif, uint64_t flags,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
553 int fd, uint32_t ipadm_flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
554 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
555 struct lifreq lifr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
556 ipadm_status_t status = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
557 int err = 0;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
558 sa_family_t af;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
559 int ppa;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
560 ifspec_t ifsp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
561 boolean_t valid_if;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
562
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
563 bzero(&lifr, sizeof (lifr));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
564 if (ipadm_flags & IPADM_OPT_GENPPA) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
565 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
566 * We'd like to just set lifr_ppa to UINT_MAX and have the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
567 * kernel pick a PPA. Unfortunately, that would mishandle
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
568 * two cases:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
569 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
570 * 1. If the PPA is available but the groupname is taken
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
571 * (e.g., the "ipmp2" IP interface name is available
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
572 * but the "ipmp2" groupname is taken) then the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
573 * auto-assignment by the kernel will fail.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
574 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
575 * 2. If we're creating (e.g.) an IPv6-only IPMP
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
576 * interface, and there's already an IPv4-only IPMP
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
577 * interface, the kernel will allow us to accidentally
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
578 * reuse the IPv6 IPMP interface name (since
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
579 * SIOCSLIFNAME uniqueness is per-interface-type).
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
580 * This will cause administrative confusion.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
581 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
582 * Thus, we instead take a brute-force approach of checking
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
583 * whether the IPv4 or IPv6 name is already in-use before
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
584 * attempting the SIOCSLIFNAME. As per (1) above, the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
585 * SIOCSLIFNAME may still fail, in which case we just proceed
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
586 * to the next one. If this approach becomes too slow, we
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
587 * can add a new SIOC* to handle this case in the kernel.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
588 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
589 for (ppa = 0; ppa < UINT_MAX; ppa++) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
590 (void) snprintf(lifr.lifr_name, LIFNAMSIZ, "%s%d",
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
591 ifname, ppa);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
592
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
593 if (ioctl(iph->iph_sock, SIOCGLIFFLAGS, &lifr) != -1 ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
594 errno != ENXIO)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
595 continue;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
596
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
597 if (ioctl(iph->iph_sock6, SIOCGLIFFLAGS, &lifr) != -1 ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
598 errno != ENXIO)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
599 continue;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
600
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
601 lifr.lifr_ppa = ppa;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
602 lifr.lifr_flags = flags;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
603
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
604 err = ioctl(fd, SIOCSLIFNAME, &lifr);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
605 if (err != -1 || errno != EEXIST)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
606 break;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
607 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
608 if (err == -1) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
609 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
610 } else {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
611 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
612 * PPA has been successfully established.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
613 * Update `newif' with the ppa.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
614 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
615 assert(newif != NULL);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
616 if (snprintf(newif, LIFNAMSIZ, "%s%d", ifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
617 ppa) >= LIFNAMSIZ)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
618 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
619 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
620 } else {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
621 /* We should have already validated the interface name. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
622 valid_if = ifparse_ifspec(ifname, &ifsp);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
623 assert(valid_if);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
624
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
625 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
626 * Before we call SIOCSLIFNAME, ensure that the IPMP group
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
627 * interface for this address family exists. Otherwise, the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
628 * kernel will kick the interface out of the group when we do
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
629 * the SIOCSLIFNAME.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
630 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
631 * Example: suppose bge0 is plumbed for IPv4 and in group "a".
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
632 * If we're now plumbing bge0 for IPv6, but the IPMP group
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
633 * interface for "a" is not plumbed for IPv6, the SIOCSLIFNAME
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
634 * will kick bge0 out of group "a", which is undesired.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
635 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
636 if (flags & IFF_IPV4)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
637 af = AF_INET;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
638 else
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
639 af = AF_INET6;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
640 status = i_ipadm_create_ipmp_peer(iph, ifname, af);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
641 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
642 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
643 lifr.lifr_ppa = ifsp.ifsp_ppa;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
644 lifr.lifr_flags = flags;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
645 (void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
646 if (ioctl(fd, SIOCSLIFNAME, &lifr) == -1)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
647 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
648 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
649
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
650 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
651 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
652
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
653 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
654 * Plumbs the interface `ifname' for the address family `af'. It also persists
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
655 * the interface for `af' if IPADM_OPT_PERSIST is set in `ipadm_flags'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
656 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
657 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
658 i_ipadm_plumb_if(ipadm_handle_t iph, char *ifname, sa_family_t af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
659 uint32_t ipadm_flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
660 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
661 int ip_muxid;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
662 int mux_fd = -1, ip_fd, arp_fd;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
663 char *udp_dev_name;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
664 dlpi_handle_t dh_arp = NULL, dh_ip;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
665 uint64_t ifflags;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
666 struct lifreq lifr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
667 uint_t dlpi_flags;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
668 ipadm_status_t status = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
669 char *linkname;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
670 boolean_t legacy = (iph->iph_flags & IPH_LEGACY);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
671 zoneid_t zoneid;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
672 char newif[LIFNAMSIZ];
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
673 char lifname[LIFNAMSIZ];
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
674 datalink_id_t linkid;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
675 int sock;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
676 boolean_t islo;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
677 boolean_t is_persistent =
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
678 ((ipadm_flags & IPADM_OPT_PERSIST) != 0);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
679 uint32_t dlflags;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
680 dladm_status_t dlstatus;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
681
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
682 if (iph->iph_dlh != NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
683 dlstatus = dladm_name2info(iph->iph_dlh, ifname, &linkid,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
684 &dlflags, NULL, NULL);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
685 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
686 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
687 * If we're in the global zone and we're plumbing a datalink, make
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
688 * sure that the datalink is not assigned to a non-global zone. Note
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
689 * that the non-global zones don't need this check, because zoneadm
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
690 * has taken care of this when the zones boot.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
691 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
692 if (getzoneid() == GLOBAL_ZONEID && dlstatus == DLADM_STATUS_OK) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
693 zoneid = ALL_ZONES;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
694 if (zone_check_datalink(&zoneid, linkid) == 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
695 /* interface is in use by a non-global zone. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
696 return (IPADM_IF_INUSE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
697 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
698 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
699
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
700 /* loopback interfaces are just added as logical interface */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
701 bzero(&lifr, sizeof (lifr));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
702 islo = i_ipadm_is_loopback(ifname);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
703 if (islo || i_ipadm_get_lnum(ifname) != 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
704 (void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
705 if (af == AF_INET)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
706 sock = iph->iph_sock;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
707 else
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
708 sock = iph->iph_sock6;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
709 if (islo && ioctl(sock, SIOCGLIFADDR, (caddr_t)&lifr) >= 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
710 return (IPADM_IF_EXISTS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
711 if (ioctl(sock, SIOCLIFADDIF, (caddr_t)&lifr) < 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
712 return (ipadm_errno2status(errno));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
713
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
714 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
715 * By default, kernel configures 127.0.0.1 on the loopback
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
716 * interface. Replace this with 0.0.0.0 to be consistent
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
717 * with interface creation on other physical interfaces.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
718 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
719 if (islo && !legacy) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
720 bzero(&lifr.lifr_addr, sizeof (lifr.lifr_addr));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
721 lifr.lifr_addr.ss_family = af;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
722 if (ioctl(sock, SIOCSLIFADDR, (caddr_t)&lifr) < 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
723 return (ipadm_errno2status(errno));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
724 if (is_persistent) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
725 status = i_ipadm_persist_if(iph, ifname, af);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
726 if (status != IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
727 (void) i_ipadm_delete_if(iph, ifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
728 af, IPADM_OPT_ACTIVE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
729 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
730 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
731 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
732 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
733 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
734
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
735 dlpi_flags = DLPI_NOATTACH;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
736
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
737 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
738 * If IPADM_OPT_IPMP is specified, then this is a request
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
739 * to create an IPMP interface atop /dev/ipmpstub0. (We can't simply
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
740 * pass "ipmpstub0" as devname since an admin *could* have a normal
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
741 * vanity-named link named "ipmpstub0" that they'd like to plumb.)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
742 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
743 if (ipadm_flags & IPADM_OPT_IPMP) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
744 dlpi_flags |= DLPI_DEVONLY;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
745 linkname = "ipmpstub0";
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
746 } else {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
747 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
748 * Verify that the user is not creating a persistent
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
749 * IP interface on a non-persistent data-link.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
750 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
751 if (!i_ipadm_is_vni(ifname) && dlstatus == DLADM_STATUS_OK &&
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
752 is_persistent && !(dlflags & DLADM_OPT_PERSIST)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
753 return (IPADM_TEMPORARY_OBJ);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
754 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
755 linkname = ifname;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
756 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
757
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
758 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
759 * We use DLPI_NOATTACH because the ip module will do the attach
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
760 * itself for DLPI style-2 devices.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
761 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
762 if (dlpi_open(linkname, &dh_ip, dlpi_flags) != DLPI_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
763 return (IPADM_DLPI_FAILURE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
764 ip_fd = dlpi_fd(dh_ip);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
765 if (ioctl(ip_fd, I_PUSH, IP_MOD_NAME) == -1) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
766 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
767 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
768 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
769
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
770 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
771 * Set IFF_IPV4/IFF_IPV6 flags. The kernel only allows modifications
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
772 * to IFF_IPv4, IFF_IPV6, IFF_BROADCAST, IFF_XRESOLV, IFF_NOLINKLOCAL.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
773 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
774 ifflags = 0;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
775
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
776 /* Set the name string and the IFF_IPV* flag */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
777 if (af == AF_INET) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
778 ifflags = IFF_IPV4;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
779 } else {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
780 ifflags = IFF_IPV6;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
781 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
782 * With the legacy method, the link-local address should be
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
783 * configured as part of the interface plumb, using the default
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
784 * token. If IPH_LEGACY is not specified, we want to set :: as
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
785 * the address and require the admin to explicitly call
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
786 * ipadm_create_addr() with the address object type set to
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
787 * IPADM_ADDR_IPV6_ADDRCONF to create the link-local address
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
788 * as well as the autoconfigured addresses.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
789 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
790 if (!legacy && !i_ipadm_is_6to4(iph, ifname))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
791 ifflags |= IFF_NOLINKLOCAL;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
792 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
793 (void) strlcpy(newif, ifname, sizeof (newif));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
794 status = i_ipadm_slifname(iph, ifname, newif, ifflags, ip_fd,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
795 ipadm_flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
796 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
797 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
798
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
799 /* Get the full set of existing flags for this stream */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
800 status = i_ipadm_get_flags(iph, newif, af, &ifflags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
801 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
802 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
803
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
804 udp_dev_name = (af == AF_INET6 ? UDP6_DEV_NAME : UDP_DEV_NAME);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
805 status = ipadm_open_arp_on_udp(udp_dev_name, &mux_fd);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
806 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
807 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
808
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
809 /* Check if arp is not needed */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
810 if (ifflags & (IFF_NOARP|IFF_IPV6)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
811 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
812 * PLINK the interface stream so that the application can exit
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
813 * without tearing down the stream.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
814 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
815 if ((ip_muxid = ioctl(mux_fd, I_PLINK, ip_fd)) == -1)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
816 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
817 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
818 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
819
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
820 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
821 * This interface does use ARP, so set up a separate stream
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
822 * from the interface to ARP.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
823 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
824 * We use DLPI_NOATTACH because the arp module will do the attach
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
825 * itself for DLPI style-2 devices.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
826 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
827 if (dlpi_open(linkname, &dh_arp, dlpi_flags) != DLPI_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
828 status = IPADM_DLPI_FAILURE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
829 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
830 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
831
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
832 arp_fd = dlpi_fd(dh_arp);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
833 if (ioctl(arp_fd, I_PUSH, ARP_MOD_NAME) == -1) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
834 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
835 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
836 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
837
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
838 status = i_ipadm_slifname_arp(newif, ifflags, arp_fd);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
839 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
840 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
841 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
842 * PLINK the IP and ARP streams so that ifconfig can exit
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
843 * without tearing down the stream.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
844 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
845 if ((ip_muxid = ioctl(mux_fd, I_PLINK, ip_fd)) == -1) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
846 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
847 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
848 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
849
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
850 if (ioctl(mux_fd, I_PLINK, arp_fd) < 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
851 status = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
852 (void) ioctl(mux_fd, I_PUNLINK, ip_muxid);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
853 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
854
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
855 done:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
856 dlpi_close(dh_ip);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
857 if (dh_arp != NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
858 dlpi_close(dh_arp);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
859
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
860 if (mux_fd != -1)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
861 (void) close(mux_fd);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
862
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
863 if (status == IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
864 /* copy back new ifname */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
865 (void) strlcpy(ifname, newif, LIFNAMSIZ);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
866 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
867 * If it is a 6to4 tunnel, create a default
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
868 * addrobj name for the default address on the 0'th
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
869 * logical interface and set IFF_UP in the interface flags.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
870 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
871 if (i_ipadm_is_6to4(iph, ifname)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
872 struct ipadm_addrobj_s addr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
873
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
874 i_ipadm_init_addr(&addr, ifname, "", IPADM_ADDR_STATIC);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
875 addr.ipadm_af = af;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
876 status = i_ipadm_lookupadd_addrobj(iph, &addr);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
877 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
878 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
879 status = ipadm_add_aobjname(iph, ifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
880 af, addr.ipadm_aobjname, IPADM_ADDR_STATIC, 0);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
881 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
882 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
883 addr.ipadm_lifnum = 0;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
884 i_ipadm_addrobj2lifname(&addr, lifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
885 sizeof (lifname));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
886 status = i_ipadm_set_flags(iph, lifname, af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
887 IFF_UP, 0);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
888 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
889 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
890 } else {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
891 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
892 * Prevent static IPv6 addresses from triggering
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
893 * autoconf. This does not have to be done for
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
894 * 6to4 tunnel interfaces, since in.ndpd will
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
895 * not autoconfigure those interfaces.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
896 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
897 if (af == AF_INET6 && !legacy)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
898 (void) i_ipadm_disable_autoconf(newif);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
899 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
900
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
901 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
902 * If IPADM_OPT_PERSIST was set in flags, store the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
903 * interface in persistent DB.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
904 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
905 if (is_persistent) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
906 status = i_ipadm_persist_if(iph, newif, af);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
907 if (status != IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
908 (void) i_ipadm_delete_if(iph, newif, af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
909 IPADM_OPT_ACTIVE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
910 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
911 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
912 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
913 if (status == IPADM_EXISTS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
914 status = IPADM_IF_EXISTS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
915 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
916 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
917
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
918 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
919 * Unplumbs the interface in `ifname' of family `af'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
920 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
921 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
922 i_ipadm_unplumb_if(ipadm_handle_t iph, const char *ifname, sa_family_t af)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
923 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
924 int ip_muxid, arp_muxid;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
925 int mux_fd = -1;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
926 int muxid_fd = -1;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
927 char *udp_dev_name;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
928 uint64_t flags;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
929 boolean_t changed_arp_muxid = B_FALSE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
930 int save_errno;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
931 struct lifreq lifr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
932 ipadm_status_t ret = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
933 int sock;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
934 lifgroupinfo_t lifgr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
935 ifaddrlistx_t *ifaddrs, *ifaddrp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
936 boolean_t v6 = (af == AF_INET6);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
937
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
938 /* Just do SIOCLIFREMOVEIF on loopback interfaces */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
939 bzero(&lifr, sizeof (lifr));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
940 if (i_ipadm_is_loopback(ifname) ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
941 (i_ipadm_get_lnum(ifname) != 0 && (iph->iph_flags & IPH_LEGACY))) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
942 (void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
943 if (ioctl((af == AF_INET) ? iph->iph_sock : iph->iph_sock6,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
944 SIOCLIFREMOVEIF, (caddr_t)&lifr) < 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
945 return (ipadm_errno2status(errno));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
946 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
947 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
948 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
949
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
950 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
951 * We used /dev/udp or udp6 to set up the mux. So we have to use
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
952 * the same now for PUNLINK also.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
953 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
954 if (v6) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
955 udp_dev_name = UDP6_DEV_NAME;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
956 sock = iph->iph_sock6;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
957 } else {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
958 udp_dev_name = UDP_DEV_NAME;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
959 sock = iph->iph_sock;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
960 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
961 if ((muxid_fd = open(udp_dev_name, O_RDWR)) == -1) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
962 ret = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
963 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
964 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
965 ret = ipadm_open_arp_on_udp(udp_dev_name, &mux_fd);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
966 if (ret != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
967 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
968 (void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
969 if (ioctl(muxid_fd, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
970 ret = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
971 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
972 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
973 flags = lifr.lifr_flags;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
974 again:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
975 if (flags & IFF_IPMP) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
976 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
977 * There are two reasons the I_PUNLINK can fail with EBUSY:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
978 * (1) if IP interfaces are in the group, or (2) if IPMP data
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
979 * addresses are administratively up. For case (1), we fail
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
980 * here with a specific error message. For case (2), we bring
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
981 * down the addresses prior to doing the I_PUNLINK. If the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
982 * I_PUNLINK still fails with EBUSY then the configuration
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
983 * must have changed after our checks, in which case we branch
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
984 * back up to `again' and rerun this logic. The net effect is
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
985 * that unplumbing an IPMP interface will only fail with EBUSY
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
986 * if IP interfaces are in the group.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
987 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
988 if (ioctl(sock, SIOCGLIFGROUPNAME, &lifr) == -1) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
989 ret = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
990 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
991 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
992 (void) strlcpy(lifgr.gi_grname, lifr.lifr_groupname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
993 LIFGRNAMSIZ);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
994 if (ioctl(sock, SIOCGLIFGROUPINFO, &lifgr) == -1) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
995 ret = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
996 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
997 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
998 if ((v6 && lifgr.gi_nv6 != 0) || (!v6 && lifgr.gi_nv4 != 0)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
999 ret = IPADM_GRP_NOTEMPTY;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1000 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1001 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1002
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1003 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1004 * The kernel will fail the I_PUNLINK if the IPMP interface
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1005 * has administratively up addresses; bring them down.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1006 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1007 if (ifaddrlistx(ifname, IFF_UP|IFF_DUPLICATE,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1008 0, &ifaddrs) == -1) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1009 ret = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1010 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1011 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1012 ifaddrp = ifaddrs;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1013 for (; ifaddrp != NULL; ifaddrp = ifaddrp->ia_next) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1014 int sock = (ifaddrp->ia_flags & IFF_IPV4) ?
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1015 iph->iph_sock : iph->iph_sock6;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1016 struct lifreq lifrl;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1017
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1018 if (((ifaddrp->ia_flags & IFF_IPV6) && !v6) ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1019 (!(ifaddrp->ia_flags & IFF_IPV6) && v6))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1020 continue;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1021
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1022 bzero(&lifrl, sizeof (lifrl));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1023 (void) strlcpy(lifrl.lifr_name, ifaddrp->ia_name,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1024 sizeof (lifrl.lifr_name));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1025 if (ioctl(sock, SIOCGLIFFLAGS, &lifrl) < 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1026 ret = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1027 ifaddrlistx_free(ifaddrs);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1028 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1029 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1030 if (lifrl.lifr_flags & IFF_UP) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1031 ret = i_ipadm_set_flags(iph, lifrl.lifr_name,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1032 ((lifrl.lifr_flags & IFF_IPV4) ? AF_INET :
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1033 AF_INET6), 0, IFF_UP);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1034 if (ret != IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1035 ifaddrlistx_free(ifaddrs);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1036 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1037 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1038 } else if (lifrl.lifr_flags & IFF_DUPLICATE) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1039 if (ioctl(sock, SIOCGLIFADDR, &lifrl) < 0 ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1040 ioctl(sock, SIOCSLIFADDR, &lifrl) < 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1041 ret = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1042 ifaddrlistx_free(ifaddrs);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1043 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1044 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1045 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1046 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1047 ifaddrlistx_free(ifaddrs);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1048 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1049
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1050 if (ioctl(muxid_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1051 ret = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1052 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1053 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1054 arp_muxid = lifr.lifr_arp_muxid;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1055 ip_muxid = lifr.lifr_ip_muxid;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1056
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1057 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1058 * We don't have a good way of knowing whether the arp stream is
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1059 * plumbed. We can't rely on IFF_NOARP because someone could
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1060 * have turned it off later using "ifconfig xxx -arp".
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1061 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1062 if (arp_muxid != 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1063 if (ioctl(mux_fd, I_PUNLINK, arp_muxid) < 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1064 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1065 * See the comment before the SIOCGLIFGROUPNAME call.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1066 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1067 if (errno == EBUSY && (flags & IFF_IPMP))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1068 goto again;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1069
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1070 if ((errno == EINVAL) &&
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1071 (flags & (IFF_NOARP | IFF_IPV6))) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1072 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1073 * Some plumbing utilities set the muxid to
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1074 * -1 or some invalid value to signify that
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1075 * there is no arp stream. Set the muxid to 0
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1076 * before trying to unplumb the IP stream.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1077 * IP does not allow the IP stream to be
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1078 * unplumbed if it sees a non-null arp muxid,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1079 * for consistency of IP-ARP streams.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1080 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1081 lifr.lifr_arp_muxid = 0;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1082 (void) ioctl(muxid_fd, SIOCSLIFMUXID,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1083 (caddr_t)&lifr);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1084 changed_arp_muxid = B_TRUE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1085 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1086 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1087 * In case of any other error, we continue with
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1088 * the unplumb.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1089 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1090 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1091 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1092
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1093 if (ioctl(mux_fd, I_PUNLINK, ip_muxid) < 0) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1094 if (changed_arp_muxid) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1095 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1096 * Some error occurred, and we need to restore
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1097 * everything back to what it was.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1098 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1099 save_errno = errno;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1100 lifr.lifr_arp_muxid = arp_muxid;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1101 lifr.lifr_ip_muxid = ip_muxid;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1102 (void) ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1103 errno = save_errno;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1104 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1105 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1106 * See the comment before the SIOCGLIFGROUPNAME call.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1107 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1108 if (errno == EBUSY && (flags & IFF_IPMP))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1109 goto again;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1110
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1111 ret = ipadm_errno2status(errno);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1112 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1113 done:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1114 if (muxid_fd != -1)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1115 (void) close(muxid_fd);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1116 if (mux_fd != -1)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1117 (void) close(mux_fd);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1118
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1119 if (af == AF_INET6 && ret == IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1120 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1121 * in.ndpd maintains the phyints in its memory even after
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1122 * the interface is plumbed, so that it can be reused when
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1123 * the interface gets plumbed again. The default behavior
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1124 * of in.ndpd is to start autoconfiguration for an interface
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1125 * that gets plumbed. We need to send the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1126 * message IPADM_ENABLE_AUTOCONF to in.ndpd to restore this
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1127 * default behavior on replumb.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1128 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1129 (void) i_ipadm_enable_autoconf(ifname);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1130 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1131 return (ret);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1132 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1133
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1134 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1135 * Saves the given interface name `ifname' with address family `af' in
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1136 * persistent DB.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1137 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1138 static ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1139 i_ipadm_persist_if(ipadm_handle_t iph, const char *ifname, sa_family_t af)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1140 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1141 ipmgmt_if_arg_t ifarg;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1142 int err;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1143
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1144 (void) strlcpy(ifarg.ia_ifname, ifname, sizeof (ifarg.ia_ifname));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1145 ifarg.ia_family = af;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1146 ifarg.ia_cmd = IPMGMT_CMD_SETIF;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1147 ifarg.ia_flags = IPMGMT_PERSIST;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1148 err = ipadm_door_call(iph, &ifarg, sizeof (ifarg), NULL, 0, B_FALSE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1149 return (ipadm_errno2status(err));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1150 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1151
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1152 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1153 * Remove the IP interface from active configuration. If IPADM_OPT_PERSIST
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1154 * is set in `ipadm_flags', it is also removed from persistent configuration.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1155 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1156 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1157 i_ipadm_delete_if(ipadm_handle_t iph, const char *ifname, sa_family_t af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1158 uint32_t ipadm_flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1159 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1160 ipadm_status_t ret = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1161 ipadm_status_t db_status;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1162 char tmp_ifname[LIFNAMSIZ];
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1163 char *cp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1164 struct ipadm_addrobj_s ipaddr;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1165 boolean_t is_persistent =
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1166 (ipadm_flags & IPADM_OPT_PERSIST);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1167
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1168 ret = i_ipadm_unplumb_if(iph, ifname, af);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1169 if (ret != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1170 goto done;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1171
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1172 cp = strrchr(ifname, IPADM_LOGICAL_SEP);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1173 if (cp != NULL) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1174 assert(iph->iph_flags & IPH_LEGACY);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1175 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1176 * This is a non-zero logical interface.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1177 * Find the addrobj and remove it from the daemon's memory.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1178 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1179 (void) strlcpy(tmp_ifname, ifname, sizeof (tmp_ifname));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1180 tmp_ifname[cp - ifname] = '\0';
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1181 *cp++ = '\0';
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1182 ipaddr.ipadm_lifnum = atoi(cp);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1183 (void) strlcpy(ipaddr.ipadm_ifname, tmp_ifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1184 sizeof (ipaddr.ipadm_ifname));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1185 ipaddr.ipadm_af = af;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1186 ret = i_ipadm_get_lif2addrobj(iph, &ipaddr);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1187 if (ret == IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1188 ret = i_ipadm_delete_addrobj(iph, &ipaddr,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1189 IPADM_OPT_ACTIVE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1190 } else if (ret == IPADM_NOTFOUND) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1191 ret = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1192 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1193 return (ret);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1194 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1195 done:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1196 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1197 * Even if interface does not exist, remove all its addresses and
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1198 * properties from the persistent store. If interface does not
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1199 * exist both in kernel and the persistent store, return IPADM_ENXIO.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1200 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1201 if ((ret == IPADM_ENXIO && is_persistent) || ret == IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1202 db_status = i_ipadm_delete_ifobj(iph, ifname, af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1203 is_persistent);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1204 if (db_status == IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1205 ret = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1206 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1207
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1208 return (ret);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1209 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1210
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1211 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1212 * Resets all addresses on interface `ifname' with address family `af'
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1213 * from ipmgmtd daemon. If is_persistent = B_TRUE, all interface properties
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1214 * and address objects of `ifname' for `af' are also removed from the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1215 * persistent DB.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1216 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1217 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1218 i_ipadm_delete_ifobj(ipadm_handle_t iph, const char *ifname, sa_family_t af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1219 boolean_t is_persistent)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1220 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1221 ipmgmt_if_arg_t ifarg;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1222 int err;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1223
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1224 ifarg.ia_cmd = IPMGMT_CMD_RESETIF;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1225 ifarg.ia_flags = IPMGMT_ACTIVE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1226 if (is_persistent)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1227 ifarg.ia_flags |= IPMGMT_PERSIST;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1228 ifarg.ia_family = af;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1229 (void) strlcpy(ifarg.ia_ifname, ifname, LIFNAMSIZ);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1230
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1231 err = ipadm_door_call(iph, &ifarg, sizeof (ifarg), NULL, 0, B_FALSE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1232 return (ipadm_errno2status(err));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1233 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1234
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1235 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1236 * Create the interface by plumbing it for IP.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1237 * This function will check if there is saved configuration information
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1238 * for `ifname' and return IPADM_OP_DISABLE_OBJ if the name-space
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1239 * for `ifname' is taken.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1240 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1241 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1242 i_ipadm_create_if(ipadm_handle_t iph, char *ifname, sa_family_t af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1243 uint32_t ipadm_flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1244 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1245 ipadm_status_t status;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1246 boolean_t p_exists;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1247 sa_family_t other_af;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1248
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1249 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1250 * Return error, if the interface already exists in either the active
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1251 * or the persistent configuration.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1252 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1253 if (ipadm_if_enabled(iph, ifname, af))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1254 return (IPADM_IF_EXISTS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1255
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1256 status = i_ipadm_if_pexists(iph, ifname, af, &p_exists);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1257 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1258 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1259 other_af = (af == AF_INET ? AF_INET6 : AF_INET);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1260 if (p_exists) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1261 if (!ipadm_if_enabled(iph, ifname, other_af))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1262 return (IPADM_OP_DISABLE_OBJ);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1263 else
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1264 ipadm_flags &= ~IPADM_OPT_PERSIST;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1265 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1266
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1267 return (i_ipadm_plumb_if(iph, ifname, af, ipadm_flags));
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1268 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1269
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1270 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1271 * Plumbs an interface. Creates both IPv4 and IPv6 interfaces by
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1272 * default, unless a value in `af' is specified. The interface may be plumbed
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1273 * only if there is no previously saved persistent configuration information
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1274 * for the interface (in which case the ipadm_enable_if() function must
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1275 * be used to enable the interface).
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1276 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1277 * Returns: IPADM_SUCCESS, IPADM_FAILURE, IPADM_IF_EXISTS,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1278 * IPADM_IF_PERSIST_EXISTS, IPADM_DLPI_FAILURE,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1279 * or appropriate ipadm_status_t corresponding to the errno.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1280 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1281 * `ifname' must point to memory that can hold upto LIFNAMSIZ chars. It may
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1282 * be over-written with the actual interface name when a PPA has to be
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1283 * internally generated by the library.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1284 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1285 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1286 ipadm_create_if(ipadm_handle_t iph, char *ifname, sa_family_t af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1287 uint32_t flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1288 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1289 ipadm_status_t status;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1290 boolean_t created_v4 = B_FALSE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1291 char newifname[LIFNAMSIZ];
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1292
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1293 /* Check for the required authorization */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1294 if (!ipadm_check_auth())
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1295 return (IPADM_EAUTH);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1296
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1297 if (flags == 0 || ((flags & IPADM_OPT_PERSIST) &&
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1298 !(flags & IPADM_OPT_ACTIVE)) ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1299 (flags & ~(IPADM_COMMON_OPT_MASK | IPADM_OPT_IPMP |
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1300 IPADM_OPT_GENPPA))) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1301 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1302 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1303 if (flags & IPADM_OPT_GENPPA) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1304 if (snprintf(newifname, LIFNAMSIZ, "%s0", ifname) >=
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1305 LIFNAMSIZ)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1306 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1307 } else {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1308 if (strlcpy(newifname, ifname, LIFNAMSIZ) >= LIFNAMSIZ)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1309 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1310 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1311
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1312 if (!i_ipadm_validate_ifname(iph, newifname))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1313 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1314
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1315 if ((af == AF_INET || af == AF_UNSPEC) &&
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1316 !i_ipadm_is_6to4(iph, ifname)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1317 status = i_ipadm_create_if(iph, ifname, AF_INET, flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1318 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1319 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1320 created_v4 = B_TRUE;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1321 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1322 if (af == AF_INET6 || af == AF_UNSPEC) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1323 status = i_ipadm_create_if(iph, ifname, AF_INET6, flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1324 if (status != IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1325 if (created_v4) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1326 (void) i_ipadm_delete_if(iph, ifname, AF_INET,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1327 IPADM_OPT_ACTIVE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1328 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1329 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1330 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1331 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1332
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1333 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1334 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1335
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1336 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1337 * Deletes the interface in `ifname'. Removes both IPv4 and IPv6 interfaces
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1338 * when `af' = AF_UNSPEC.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1339 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1340 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1341 ipadm_delete_if(ipadm_handle_t iph, const char *ifname, sa_family_t af,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1342 uint32_t flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1343 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1344 ipadm_status_t status1 = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1345 ipadm_status_t status2 = IPADM_SUCCESS;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1346 ipadm_status_t other;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1347
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1348 /* Check for the required authorization */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1349 if (!ipadm_check_auth())
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1350 return (IPADM_EAUTH);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1351
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1352 /* Validate the `ifname' for any logical interface. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1353 if (flags == 0 || (flags & ~(IPADM_COMMON_OPT_MASK)) ||
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1354 !i_ipadm_validate_ifname(iph, ifname))
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1355 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1356
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1357 if (af == AF_INET || af == AF_UNSPEC)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1358 status1 = i_ipadm_delete_if(iph, ifname, AF_INET, flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1359 if (af == AF_INET6 || af == AF_UNSPEC)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1360 status2 = i_ipadm_delete_if(iph, ifname, AF_INET6, flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1361 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1362 * If the family has been uniquely identified, we return the
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1363 * associated status, even if that is ENXIO. Calls from ifconfig
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1364 * which can only unplumb one of IPv4/IPv6 at any time fall under
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1365 * this category.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1366 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1367 if (af == AF_INET)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1368 return (status1);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1369 else if (af == AF_INET6)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1370 return (status2);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1371 else if (af != AF_UNSPEC)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1372 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1373
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1374 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1375 * If af is AF_UNSPEC, then we return the following:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1376 * status1, if status1 == status2
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1377 * IPADM_SUCCESS, if either of status1 or status2 is SUCCESS
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1378 * and the other status is ENXIO
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1379 * IPADM_ENXIO, if both status1 and status2 are ENXIO
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1380 * IPADM_FAILURE otherwise.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1381 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1382 if (status1 == status2) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1383 /* covers the case when both status1 and status2 are ENXIO */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1384 return (status1);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1385 } else if (status1 == IPADM_SUCCESS || status2 == IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1386 if (status1 == IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1387 other = status2;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1388 else
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1389 other = status1;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1390 return (other == IPADM_ENXIO ? IPADM_SUCCESS : IPADM_FAILURE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1391 } else {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1392 return (IPADM_FAILURE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1393 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1394 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1395
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1396 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1397 * Returns information about all interfaces in both active and persistent
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1398 * configuration. If `ifname' is not NULL, it returns only the interface
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1399 * identified by `ifname'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1400 *
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1401 * Return values:
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1402 * On success: IPADM_SUCCESS.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1403 * On error : IPADM_INVALID_ARG, IPADM_ENXIO or IPADM_FAILURE.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1404 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1405 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1406 ipadm_if_info(ipadm_handle_t iph, const char *ifname,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1407 ipadm_if_info_t **if_info, uint32_t flags, int64_t lifc_flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1408 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1409 ipadm_status_t status;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1410 ifspec_t ifsp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1411
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1412 if (if_info == NULL || iph == NULL || flags != 0)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1413 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1414
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1415 if (ifname != NULL &&
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1416 (!ifparse_ifspec(ifname, &ifsp) || ifsp.ifsp_lunvalid)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1417 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1418 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1419
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1420 status = i_ipadm_get_all_if_info(iph, ifname, if_info, lifc_flags);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1421 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1422 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1423 if (ifname != NULL && *if_info == NULL)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1424 return (IPADM_ENXIO);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1425
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1426 return (IPADM_SUCCESS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1427 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1428
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1429 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1430 * Frees the linked list allocated by ipadm_if_info().
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1431 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1432 void
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1433 ipadm_free_if_info(ipadm_if_info_t *ifinfo)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1434 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1435 ipadm_if_info_t *ifinfo_next;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1436
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1437 for (; ifinfo != NULL; ifinfo = ifinfo_next) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1438 ifinfo_next = ifinfo->ifi_next;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1439 free(ifinfo);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1440 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1441 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1442
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1443 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1444 * Re-enable the interface `ifname' based on the saved configuration
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1445 * for `ifname'.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1446 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1447 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1448 ipadm_enable_if(ipadm_handle_t iph, const char *ifname, uint32_t flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1449 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1450 nvlist_t *ifnvl;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1451 ipadm_status_t status;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1452 ifspec_t ifsp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1453
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1454 /* Check for the required authorization */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1455 if (!ipadm_check_auth())
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1456 return (IPADM_EAUTH);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1457
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1458 /* Check for logical interfaces. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1459 if (!ifparse_ifspec(ifname, &ifsp) || ifsp.ifsp_lunvalid)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1460 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1461
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1462 /* Enabling an interface persistently is not supported. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1463 if (flags & IPADM_OPT_PERSIST)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1464 return (IPADM_NOTSUP);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1465
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1466 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1467 * Return early by checking if the interface is already enabled.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1468 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1469 if (ipadm_if_enabled(iph, ifname, AF_INET) &&
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1470 ipadm_if_enabled(iph, ifname, AF_INET6)) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1471 return (IPADM_IF_EXISTS);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1472 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1473 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1474 * Enable the interface and restore all its interface properties
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1475 * and address objects.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1476 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1477 status = i_ipadm_init_ifs(iph, ifname, &ifnvl);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1478 if (status != IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1479 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1480
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1481 assert(ifnvl != NULL);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1482 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1483 * ipadm_enable_if() does exactly what ipadm_init_ifs() does,
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1484 * but only for one interface. We need to set IPH_INIT because
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1485 * ipmgmtd daemon does not have to write the interface to persistent
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1486 * db. The interface is already available in persistent db
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1487 * and we are here to re-enable the persistent configuration.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1488 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1489 iph->iph_flags |= IPH_INIT;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1490 status = i_ipadm_init_ifobj(iph, ifname, ifnvl);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1491 iph->iph_flags &= ~IPH_INIT;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1492 return (status);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1493 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1494
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1495 /*
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1496 * Disable the interface `ifname' by removing it from the active configuration.
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1497 * Error code return values follow the model in ipadm_delete_if()
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1498 */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1499 ipadm_status_t
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1500 ipadm_disable_if(ipadm_handle_t iph, const char *ifname, uint32_t flags)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1501 {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1502 ipadm_status_t status1, status2, other;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1503 ifspec_t ifsp;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1504
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1505 /* Check for the required authorization */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1506 if (!ipadm_check_auth())
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1507 return (IPADM_EAUTH);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1508
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1509 /* Check for logical interfaces. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1510 if (!ifparse_ifspec(ifname, &ifsp) || ifsp.ifsp_lunvalid)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1511 return (IPADM_INVALID_ARG);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1512
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1513 /* Disabling an interface persistently is not supported. */
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1514 if (flags & IPADM_OPT_PERSIST)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1515 return (IPADM_NOTSUP);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1516
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1517 status1 = i_ipadm_unplumb_if(iph, ifname, AF_INET6);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1518 if (status1 == IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1519 status1 = i_ipadm_delete_ifobj(iph, ifname, AF_INET6, B_FALSE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1520 status2 = i_ipadm_unplumb_if(iph, ifname, AF_INET);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1521 if (status2 == IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1522 status2 = i_ipadm_delete_ifobj(iph, ifname, AF_INET, B_FALSE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1523 if (status1 == status2) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1524 return (status2);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1525 } else if (status1 == IPADM_SUCCESS || status2 == IPADM_SUCCESS) {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1526 if (status1 == IPADM_SUCCESS)
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1527 other = status2;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1528 else
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1529 other = status1;
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1530 return (other == IPADM_ENXIO ? IPADM_SUCCESS : IPADM_FAILURE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1531 } else {
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1532 return (IPADM_FAILURE);
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1533 }
0248e987199b PSARC 2009/306 Brussels II - ipadm and libipadm
Girish Moodalbail <Girish.Moodalbail@Sun.COM>
parents:
diff changeset
1534 }