Skip to content

Commit

Permalink
PSARC/2010/142 libinetcfg removal
Browse files Browse the repository at this point in the history
6949257 libinetcfg removal
6944403 nwe_if_state structure misses the netmask info
6951482 stale ipmgmtd door handle can cause libipadm interfaces to fail
  • Loading branch information
Anurag S. Maskey authored and Anurag S. Maskey committed Jun 7, 2010
1 parent ccd81fd commit f6da83d
Show file tree
Hide file tree
Showing 42 changed files with 1,152 additions and 4,086 deletions.
11 changes: 0 additions & 11 deletions exception_lists/packaging
Expand Up @@ -258,17 +258,6 @@ usr/lib/llib-linstzones.ln
usr/lib/llib-lpkg
usr/lib/llib-lpkg.ln
#
# These files are installed in the proto area by the build of libinetcfg.
# Only the shared object is shipped.
#
lib/libinetcfg.so
lib/llib-linetcfg
lib/llib-linetcfg.ln
usr/include/inetcfg.h
usr/lib/libinetcfg.so
usr/lib/llib-linetcfg
usr/lib/llib-linetcfg.ln
#
# Don't ship header files private to libipmp and in.mpathd
#
usr/include/ipmp_query_impl.h
Expand Down
1 change: 0 additions & 1 deletion usr/src/Makefile.lint
Expand Up @@ -371,7 +371,6 @@ COMMON_SUBDIRS = \
lib/libhotplug \
lib/libidmap \
lib/libilb \
lib/libinetcfg \
lib/libinetsvc \
lib/libinetutil \
lib/libinstzones \
Expand Down
8 changes: 0 additions & 8 deletions usr/src/Targetdirs
Expand Up @@ -870,8 +870,6 @@ $(ROOT)/usr/lib/libfdisk.so.1:= REALPATH=../../lib/libfdisk.so.1
$(ROOT)/usr/lib/libfdisk.so:= REALPATH=../../lib/libfdisk.so.1
$(ROOT)/usr/lib/libgen.so.1:= REALPATH=../../lib/libgen.so.1
$(ROOT)/usr/lib/libgen.so:= REALPATH=../../lib/libgen.so.1
$(ROOT)/usr/lib/libinetcfg.so.1:= REALPATH=../../lib/libinetcfg.so.1
$(ROOT)/usr/lib/libinetcfg.so:= REALPATH=../../lib/libinetcfg.so.1
$(ROOT)/usr/lib/libinetutil.so.1:= REALPATH=../../lib/libinetutil.so.1
$(ROOT)/usr/lib/libinetutil.so:= REALPATH=../../lib/libinetutil.so.1
$(ROOT)/usr/lib/libintl.so.1:= REALPATH=../../lib/libintl.so.1
Expand Down Expand Up @@ -994,8 +992,6 @@ $(ROOT)/usr/lib/llib-lfdisk.ln:= REALPATH=../../lib/llib-lfdisk.ln
$(ROOT)/usr/lib/llib-lfdisk:= REALPATH=../../lib/llib-lfdisk
$(ROOT)/usr/lib/llib-lgen.ln:= REALPATH=../../lib/llib-lgen.ln
$(ROOT)/usr/lib/llib-lgen:= REALPATH=../../lib/llib-lgen
$(ROOT)/usr/lib/llib-linetcfg.ln:= REALPATH=../../lib/llib-linetcfg.ln
$(ROOT)/usr/lib/llib-linetcfg:= REALPATH=../../lib/llib-linetcfg
$(ROOT)/usr/lib/llib-linetutil.ln:= REALPATH=../../lib/llib-linetutil.ln
$(ROOT)/usr/lib/llib-linetutil:= REALPATH=../../lib/llib-linetutil
$(ROOT)/usr/lib/llib-lintl.ln:= REALPATH=../../lib/llib-lintl.ln
Expand Down Expand Up @@ -1470,8 +1466,6 @@ SYM.USRLIB= \
/usr/lib/libelf.so.1 \
/usr/lib/libgen.so \
/usr/lib/libgen.so.1 \
/usr/lib/libinetcfg.so \
/usr/lib/libinetcfg.so.1 \
/usr/lib/libinetutil.so \
/usr/lib/libinetutil.so.1 \
/usr/lib/libintl.so \
Expand Down Expand Up @@ -1588,8 +1582,6 @@ SYM.USRLIB= \
/usr/lib/llib-lelf.ln \
/usr/lib/llib-lgen \
/usr/lib/llib-lgen.ln \
/usr/lib/llib-linetcfg \
/usr/lib/llib-linetcfg.ln \
/usr/lib/llib-linetutil \
/usr/lib/llib-linetutil.ln \
/usr/lib/llib-lintl \
Expand Down
2 changes: 1 addition & 1 deletion usr/src/cmd/cmd-inet/lib/nwamd/Makefile
Expand Up @@ -52,7 +52,7 @@ $(ROOTCFGFILES) := FILEMODE= 644
ROOTCMDDIR= $(ROOTFS_LIBDIR)/inet

LDLIBS += -ldhcpagent -ldhcputil -ldladm -ldlpi -lgen \
-linetcfg -linetutil -lkstat -lnsl -lnvpair -lnwam \
-linetutil -lipadm -lkstat -lnsl -lnvpair -lnwam \
-lsecdb -lscf -lsocket -lsysevent -lumem -luutil

#
Expand Down
96 changes: 57 additions & 39 deletions usr/src/cmd/cmd-inet/lib/nwamd/conditions.c
Expand Up @@ -20,25 +20,20 @@
*/

/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/

#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>
#include <inet/ip.h>
#include <inetcfg.h>
#include <libdladm.h>
#include <libdllink.h>
#include <libdlwlan.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>

#include <libnwam.h>
#include "conditions.h"
Expand Down Expand Up @@ -405,6 +400,36 @@ prefixmatch(uchar_t *addr1, uchar_t *addr2, int prefixlen)
return (B_TRUE);
}

/*
* Given a string representation of an IPv4 or IPv6 address returns the
* sockaddr representation. Note that 'sockaddr' should point at the correct
* sockaddr structure for the address family (sockaddr_in for AF_INET or
* sockaddr_in6 for AF_INET6) or alternatively at a sockaddr_storage
* structure.
*/
static struct sockaddr_storage *
nwamd_str2sockaddr(sa_family_t af, const char *straddr,
struct sockaddr_storage *addr)
{
struct sockaddr_in *sin;
struct sockaddr_in6 *sin6;
int err;

if (af == AF_INET) {
sin = (struct sockaddr_in *)addr;
sin->sin_family = AF_INET;
err = inet_pton(AF_INET, straddr, &sin->sin_addr);
} else if (af == AF_INET6) {
sin6 = (struct sockaddr_in6 *)addr;
sin6->sin6_family = AF_INET6;
err = inet_pton(AF_INET6, straddr, &sin6->sin6_addr);
} else {
errno = EINVAL;
return (NULL);
}
return (err == 1 ? addr : NULL);
}

struct nwamd_ipaddr_condition_walk_arg {
nwam_condition_t condition;
struct sockaddr_storage sockaddr;
Expand All @@ -413,41 +438,25 @@ struct nwamd_ipaddr_condition_walk_arg {
};

static int
check_ipaddr(icfg_if_t *intf, void *arg)
check_ipaddr(sa_family_t family, struct ifaddrs *ifa, void *arg)
{
struct nwamd_ipaddr_condition_walk_arg *wa = arg;
struct sockaddr_storage sockaddr;
icfg_handle_t h;
socklen_t addrlen = intf->if_protocol == AF_INET ?
sizeof (struct sockaddr_in) : sizeof (struct sockaddr_in6);
int prefixlen = 0;
boolean_t match = B_FALSE;
uchar_t *addr1, *addr2;

if (icfg_open(&h, intf) != ICFG_SUCCESS)
return (0);

if (icfg_get_addr(h, (struct sockaddr *)&sockaddr, &addrlen,
&prefixlen, B_TRUE) != ICFG_SUCCESS) {
nlog(LOG_ERR, "check_ipaddr: icfg_get_addr: %s",
strerror(errno));
return (0);
}

if (intf->if_protocol == AF_INET) {
if (family == AF_INET) {
addr1 = (uchar_t *)&(((struct sockaddr_in *)
&sockaddr)->sin_addr.s_addr);
ifa->ifa_addr)->sin_addr.s_addr);
addr2 = (uchar_t *)&(((struct sockaddr_in *)
&(wa->sockaddr))->sin_addr.s_addr);
} else {
addr1 = (uchar_t *)&(((struct sockaddr_in6 *)
&sockaddr)->sin6_addr.s6_addr);
ifa->ifa_addr)->sin6_addr.s6_addr);
addr2 = (uchar_t *)&(((struct sockaddr_in6 *)
&(wa->sockaddr))->sin6_addr.s6_addr);
}

match = prefixmatch(addr1, addr2, wa->prefixlen);
icfg_close(h);

nlog(LOG_DEBUG, "check_ipaddr: match %d\n", match);
switch (wa->condition) {
Expand All @@ -470,11 +479,10 @@ static boolean_t
test_condition_ip_address(nwam_condition_t condition,
const char *ip_address_string)
{
int proto;
sa_family_t family;
char *copy, *ip_address, *prefixlen_string, *lasts;
socklen_t addrlen = sizeof (struct sockaddr_in);
socklen_t addr6len = sizeof (struct sockaddr_in6);
struct nwamd_ipaddr_condition_walk_arg wa;
struct ifaddrs *ifap, *ifa;

if ((copy = strdup(ip_address_string)) == NULL)
return (B_FALSE);
Expand All @@ -486,17 +494,17 @@ test_condition_ip_address(nwam_condition_t condition,

prefixlen_string = strtok_r(NULL, " \t", &lasts);

if (icfg_str_to_sockaddr(AF_INET, ip_address,
(struct sockaddr *)&(wa.sockaddr), &addrlen) == ICFG_SUCCESS) {
proto = AF_INET;
if (nwamd_str2sockaddr(AF_INET, ip_address, &wa.sockaddr) != NULL) {
family = AF_INET;
wa.prefixlen = IP_ABITS;
} else if (icfg_str_to_sockaddr(AF_INET6, ip_address,
(struct sockaddr *)&(wa.sockaddr), &addr6len) == ICFG_SUCCESS) {
proto = AF_INET6;
} else if (nwamd_str2sockaddr(AF_INET6, ip_address, &wa.sockaddr)
!= NULL) {
family = AF_INET6;
wa.prefixlen = IPV6_ABITS;
} else {
nlog(LOG_ERR, "test_condition_ip_address: "
"icfg_str_to_sockaddr: %s", strerror(errno));
"nwamd_str2sockaddr failed for %s: %s", ip_address,
strerror(errno));
free(copy);
return (B_FALSE);
}
Expand All @@ -519,11 +527,21 @@ test_condition_ip_address(nwam_condition_t condition,
free(copy);
return (B_FALSE);
}

(void) icfg_iterate_if(proto, ICFG_PLUMBED, &wa, check_ipaddr);

free(copy);

if (getifaddrs(&ifa) == -1) {
nlog(LOG_ERR, "test_condition_ip_address: "
"getifaddrs failed: %s", strerror(errno));
return (wa.res);
}
for (ifap = ifa; ifap != NULL; ifap = ifap->ifa_next) {
if (ifap->ifa_addr->ss_family != family)
continue;
if (check_ipaddr(family, ifap, &wa) == 1)
break;
}
freeifaddrs(ifa);

return (wa.res);
}

Expand Down
18 changes: 8 additions & 10 deletions usr/src/cmd/cmd-inet/lib/nwamd/dlpi_events.c
Expand Up @@ -20,8 +20,7 @@
*/

/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/

#include <arpa/inet.h>
Expand Down Expand Up @@ -106,7 +105,7 @@ nwamd_dlpi_add_link(nwamd_object_t obj)

assert(ncu != NULL && ncu->ncu_type == NWAM_NCU_TYPE_LINK);

link = &ncu->ncu_node.u_link;
link = &ncu->ncu_link;

/* Already running? */
if (link->nwamd_link_dlpi_thread != 0) {
Expand Down Expand Up @@ -157,16 +156,15 @@ nwamd_dlpi_delete_link(nwamd_object_t obj)
nlog(LOG_DEBUG, "nwamd_dlpi_delete_link: ncu %p (%s) type %d",
ncu, obj->nwamd_object_name, ncu != NULL ? ncu->ncu_type : -1);

if (ncu->ncu_node.u_link.nwamd_link_dlpi_thread != 0) {
if (ncu->ncu_link.nwamd_link_dlpi_thread != 0) {
(void) pthread_cancel(
ncu->ncu_node.u_link.nwamd_link_dlpi_thread);
(void) pthread_join(ncu->ncu_node.u_link.nwamd_link_dlpi_thread,
NULL);
ncu->ncu_node.u_link.nwamd_link_dlpi_thread = 0;
ncu->ncu_link.nwamd_link_dlpi_thread);
(void) pthread_join(ncu->ncu_link.nwamd_link_dlpi_thread, NULL);
ncu->ncu_link.nwamd_link_dlpi_thread = 0;
/* Unset properties before closing */
nwamd_set_unset_link_properties(ncu, B_FALSE);
}

dlpi_close(ncu->ncu_node.u_link.nwamd_link_dhp);
ncu->ncu_node.u_link.nwamd_link_dhp = NULL;
dlpi_close(ncu->ncu_link.nwamd_link_dhp);
ncu->ncu_link.nwamd_link_dhp = NULL;
}
5 changes: 2 additions & 3 deletions usr/src/cmd/cmd-inet/lib/nwamd/door_if.c
Expand Up @@ -20,8 +20,7 @@
*/

/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/

#include <auth_attr.h>
Expand Down Expand Up @@ -188,7 +187,7 @@ nwamd_door_req_wlan_scan_results(nwamd_door_arg_t *req, ucred_t *ucr,
}

ncu = obj->nwamd_object_data;
link = &ncu->ncu_node.u_link;
link = &ncu->ncu_link;
num_wlans = link->nwamd_link_wifi_scan.nwamd_wifi_scan_curr_num;

if (num_wlans > 0) {
Expand Down
4 changes: 1 addition & 3 deletions usr/src/cmd/cmd-inet/lib/nwamd/enm.c
Expand Up @@ -20,14 +20,12 @@
*/

/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/

#include <arpa/inet.h>
#include <errno.h>
#include <inet/ip.h>
#include <inetcfg.h>
#include <libdladm.h>
#include <libdllink.h>
#include <libdlwlan.h>
Expand Down
12 changes: 8 additions & 4 deletions usr/src/cmd/cmd-inet/lib/nwamd/events.c
Expand Up @@ -20,8 +20,7 @@
*/

/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
*/

#include <atomic.h>
Expand Down Expand Up @@ -369,7 +368,7 @@ nwamd_event_init_link_state(const char *name, boolean_t up)

nwamd_event_t
nwamd_event_init_if_state(const char *linkname, uint32_t flags,
uint32_t addr_added, uint32_t index, struct sockaddr *addr)
uint32_t addr_added, struct sockaddr *addr, struct sockaddr *netmask)
{
nwamd_event_t event;
nwam_error_t err;
Expand All @@ -394,7 +393,6 @@ nwamd_event_init_if_state(const char *linkname, uint32_t flags,
linkname,
sizeof (event->event_msg->nwe_data.nwe_if_state.nwe_name));
event->event_msg->nwe_data.nwe_if_state.nwe_flags = flags;
event->event_msg->nwe_data.nwe_if_state.nwe_index = index;
event->event_msg->nwe_data.nwe_if_state.nwe_addr_added = addr_added;
event->event_msg->nwe_data.nwe_if_state.nwe_addr_valid = (addr != NULL);

Expand All @@ -403,6 +401,12 @@ nwamd_event_init_if_state(const char *linkname, uint32_t flags,
addr->sa_family == AF_INET ? sizeof (struct sockaddr_in) :
sizeof (struct sockaddr_in6));
}
if (netmask != NULL) {
bcopy(netmask,
&(event->event_msg->nwe_data.nwe_if_state.nwe_netmask),
netmask->sa_family == AF_INET ?
sizeof (struct sockaddr_in) : sizeof (struct sockaddr_in6));
}

return (event);
}
Expand Down
5 changes: 2 additions & 3 deletions usr/src/cmd/cmd-inet/lib/nwamd/events.h
Expand Up @@ -20,8 +20,7 @@
*/

/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/

#ifndef _EVENTS_H
Expand Down Expand Up @@ -102,7 +101,7 @@ extern nwamd_event_t nwamd_event_init_priority_group_change(int64_t);
extern nwamd_event_t nwamd_event_init_link_action(const char *, nwam_action_t);
extern nwamd_event_t nwamd_event_init_link_state(const char *, boolean_t);
extern nwamd_event_t nwamd_event_init_if_state(const char *, uint32_t,
uint32_t, uint32_t, struct sockaddr *);
uint32_t, struct sockaddr *, struct sockaddr *);
extern nwamd_event_t nwamd_event_init_wlan(const char *, int32_t, boolean_t,
nwam_wlan_t *, uint_t);
extern nwamd_event_t nwamd_event_init_ncu_check(void);
Expand Down
5 changes: 2 additions & 3 deletions usr/src/cmd/cmd-inet/lib/nwamd/known_wlans.c
Expand Up @@ -20,8 +20,7 @@
*/

/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/

#include <ctype.h>
Expand Down Expand Up @@ -501,7 +500,7 @@ nwamd_ncu_known_wlan_committed(nwamd_object_t object, void *data)
return (0);

/* network selection will be done only if possible */
if (ncu_data->ncu_node.u_link.nwamd_link_media == DL_WIFI)
if (ncu_data->ncu_link.nwamd_link_media == DL_WIFI)
(void) nwamd_wlan_scan(ncu_data->ncu_name);
return (0);
}
Expand Down

0 comments on commit f6da83d

Please sign in to comment.