diff options
author | Rishi Srivatsavai <Rishi.Srivatsavai@Sun.COM> | 2010-07-29 02:14:42 -0400 |
---|---|---|
committer | Rishi Srivatsavai <Rishi.Srivatsavai@Sun.COM> | 2010-07-29 02:14:42 -0400 |
commit | f689bed18bbb72c93b14a451e959b18f7ccfb7d1 (patch) | |
tree | 75009110395e119436b5ea6209106e019776a371 | |
parent | d10eddf70e75478ac778e9b04d3d711fe8c3273b (diff) | |
download | illumos-joyent-f689bed18bbb72c93b14a451e959b18f7ccfb7d1.tar.gz |
6936702 dlmgmtd restart in global zone leaves exclusive stack zones in down state
6942573 stale dlmgmtd door handle may result in unusable networking features
6938483 NWAM should not ignore VNICs in non-global zones
6931751 DATALINK_CLASS_IPTUN should be 0x80 not 0x60
6939454 dladm show_linkprop -p <private property> truncates DEFAULT value by one character
6928716 dladm delete-secobj passing uninitialized memory
6896251 dladm show-linkprop -P always exits with 1
-rw-r--r-- | usr/src/cmd/cmd-inet/lib/nwamd/ncu.c | 9 | ||||
-rw-r--r-- | usr/src/cmd/dladm/dladm.c | 35 | ||||
-rw-r--r-- | usr/src/cmd/dlmgmtd/dlmgmt_db.c | 26 | ||||
-rw-r--r-- | usr/src/cmd/dlmgmtd/dlmgmt_util.c | 7 | ||||
-rw-r--r-- | usr/src/lib/libdladm/common/libdlmgmt.c | 17 | ||||
-rw-r--r-- | usr/src/uts/common/io/mac/mac_provider.c | 4 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dls_mgmt.h | 2 |
7 files changed, 73 insertions, 27 deletions
diff --git a/usr/src/cmd/cmd-inet/lib/nwamd/ncu.c b/usr/src/cmd/cmd-inet/lib/nwamd/ncu.c index 439ae35f35..52d03076f7 100644 --- a/usr/src/cmd/cmd-inet/lib/nwamd/ncu.c +++ b/usr/src/cmd/cmd-inet/lib/nwamd/ncu.c @@ -37,6 +37,7 @@ #include <sys/time.h> #include <sys/types.h> #include <values.h> +#include <zone.h> #include "conditions.h" #include "events.h" @@ -1562,6 +1563,8 @@ void nwamd_walk_physical_configuration(void) { nwam_ncp_handle_t ncph; + datalink_class_t dlclass = DATALINK_CLASS_PHYS; + zoneid_t zoneid = getzoneid(); (void) pthread_mutex_lock(&active_ncp_mutex); if (strcmp(active_ncp, NWAM_NCP_NAME_AUTOMATIC) == 0 && @@ -1580,9 +1583,13 @@ nwamd_walk_physical_configuration(void) NWAM_FLAG_NCU_TYPE_LINK, NULL); } + /* In non-global zones NWAM can support VNICs */ + if (zoneid != GLOBAL_ZONEID) + dlclass |= DATALINK_CLASS_VNIC; + /* create NCUs for interfaces without NCUs */ (void) dladm_walk(ncu_create_link_action_event, dld_handle, ncph, - DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); + dlclass, DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE); if (strcmp(active_ncp, NWAM_NCP_NAME_AUTOMATIC) != 0 || active_ncph == NULL) { diff --git a/usr/src/cmd/dladm/dladm.c b/usr/src/cmd/dladm/dladm.c index c6c19724a4..8efdb32d0e 100644 --- a/usr/src/cmd/dladm/dladm.c +++ b/usr/src/cmd/dladm/dladm.c @@ -6580,8 +6580,15 @@ print_linkprop_cb(ofmt_arg_t *ofarg, char *buf, uint_t bufsize) * the persistent value of a non-persistable link property, * simply skip the output. */ - if (statep->ls_status != DLADM_STATUS_OK) + if (statep->ls_status != DLADM_STATUS_OK) { + /* + * Ignore the temponly error when we skip printing + * link properties to avoid returning failure on exit. + */ + if (statep->ls_retstatus == DLADM_STATUS_TEMPONLY) + statep->ls_retstatus = DLADM_STATUS_OK; goto skip; + } ptr = statep->ls_line; break; case LINKPROP_PERM: @@ -7230,8 +7237,6 @@ audit_secobj(char *auth, char *class, char *obj, (void) adt_end_session(ah); } -#define MAX_SECOBJS 32 -#define MAX_SECOBJ_NAMELEN 32 static void do_create_secobj(int argc, char **argv, const char *use) { @@ -7370,19 +7375,17 @@ do_delete_secobj(int argc, char **argv, const char *use) } } - if (optind == (argc - 1)) { - token = argv[optind]; - if (token == NULL) - die("secure object name required"); - while ((c = *token++) != NULL) { - if (c == ',') - nfields++; - } - token = strdup(argv[optind]); - if (token == NULL) - die("no memory"); - } else if (optind != argc) - usage(); + if (optind != (argc - 1)) + die("secure object name required"); + + token = argv[optind]; + while ((c = *token++) != NULL) { + if (c == ',') + nfields++; + } + token = strdup(argv[optind]); + if (token == NULL) + die("no memory"); success = check_auth(LINK_SEC_AUTH); audit_secobj(LINK_SEC_AUTH, "unknown", argv[optind], success, B_FALSE); diff --git a/usr/src/cmd/dlmgmtd/dlmgmt_db.c b/usr/src/cmd/dlmgmtd/dlmgmt_db.c index 7cb9e2ce78..99307dbc03 100644 --- a/usr/src/cmd/dlmgmtd/dlmgmt_db.c +++ b/usr/src/cmd/dlmgmtd/dlmgmt_db.c @@ -814,6 +814,12 @@ parse_linkprops(char *buf, dlmgmt_link_t *linkp) curr = buf + i + 1; } + /* Correct any erroneous IPTUN datalink class constant in the file */ + if (linkp->ll_class == 0x60) { + linkp->ll_class = DATALINK_CLASS_IPTUN; + rewrite_needed = B_TRUE; + } + return (0); parse_fail: @@ -1119,8 +1125,8 @@ process_db_read(dlmgmt_db_req_t *req, FILE *fp) } link_in_file.ll_zoneid = req->ls_zoneid; - link_in_db = avl_find(&dlmgmt_name_avl, &link_in_file, - &name_where); + link_in_db = link_by_name(link_in_file.ll_link, + link_in_file.ll_zoneid); if (link_in_db != NULL) { /* * If the link in the database already has the flag @@ -1166,9 +1172,13 @@ process_db_read(dlmgmt_db_req_t *req, FILE *fp) newlink->ll_linkid = dlmgmt_nextlinkid; if (avl_find(&dlmgmt_id_avl, newlink, &id_where) != NULL) { + dlmgmt_log(LOG_WARNING, "Link ID %d is already" + " in use, destroying link %s", + newlink->ll_linkid, newlink->ll_link); link_destroy(newlink); continue; } + if ((req->ls_flags & DLMGMT_ACTIVE) && link_activate(newlink) != 0) { dlmgmt_log(LOG_WARNING, "Unable to activate %s", @@ -1176,8 +1186,18 @@ process_db_read(dlmgmt_db_req_t *req, FILE *fp) link_destroy(newlink); continue; } - avl_insert(&dlmgmt_name_avl, newlink, name_where); + avl_insert(&dlmgmt_id_avl, newlink, id_where); + /* + * link_activate call above can insert newlink in + * dlmgmt_name_avl tree when activating a link that is + * assigned to a NGZ. + */ + if (avl_find(&dlmgmt_name_avl, newlink, + &name_where) == NULL) + avl_insert(&dlmgmt_name_avl, newlink, + name_where); + dlmgmt_advance(newlink); newlink->ll_flags |= req->ls_flags; } diff --git a/usr/src/cmd/dlmgmtd/dlmgmt_util.c b/usr/src/cmd/dlmgmtd/dlmgmt_util.c index 96b2b3b826..004c8f257b 100644 --- a/usr/src/cmd/dlmgmtd/dlmgmt_util.c +++ b/usr/src/cmd/dlmgmtd/dlmgmt_util.c @@ -367,7 +367,7 @@ int link_activate(dlmgmt_link_t *linkp) { int err = 0; - zoneid_t zoneid; + zoneid_t zoneid = ALL_ZONES; if (zone_check_datalink(&zoneid, linkp->ll_linkid) == 0) { /* @@ -379,7 +379,10 @@ link_activate(dlmgmt_link_t *linkp) err = EEXIST; goto done; } - avl_remove(&dlmgmt_name_avl, linkp); + + if (avl_find(&dlmgmt_name_avl, linkp, NULL) != NULL) + avl_remove(&dlmgmt_name_avl, linkp); + linkp->ll_zoneid = zoneid; avl_add(&dlmgmt_name_avl, linkp); avl_add(&dlmgmt_loan_avl, linkp); diff --git a/usr/src/lib/libdladm/common/libdlmgmt.c b/usr/src/lib/libdladm/common/libdlmgmt.c index 49c70b4c6e..4b0753417c 100644 --- a/usr/src/lib/libdladm/common/libdlmgmt.c +++ b/usr/src/lib/libdladm/common/libdlmgmt.c @@ -56,7 +56,8 @@ dladm_door_call(dladm_handle_t handle, void *arg, size_t asize, void *rbuf, { door_arg_t darg; int door_fd; - dladm_status_t status = DLADM_STATUS_OK; + dladm_status_t status; + boolean_t reopen = B_FALSE; darg.data_ptr = arg; darg.data_size = asize; @@ -65,11 +66,23 @@ dladm_door_call(dladm_handle_t handle, void *arg, size_t asize, void *rbuf, darg.rbuf = rbuf; darg.rsize = *rsizep; +reopen: /* The door descriptor is opened if it isn't already */ if ((status = dladm_door_fd(handle, &door_fd)) != DLADM_STATUS_OK) return (status); - if (door_call(door_fd, &darg) == -1) + if (door_call(door_fd, &darg) == -1) { + /* + * Stale door descriptor is possible if dlmgmtd was re-started + * since last door_fd open so try re-opening door file. + */ + if (!reopen && errno == EBADF) { + (void) close(handle->door_fd); + handle->door_fd = -1; + reopen = B_TRUE; + goto reopen; + } status = dladm_errno2status(errno); + } if (status != DLADM_STATUS_OK) return (status); diff --git a/usr/src/uts/common/io/mac/mac_provider.c b/usr/src/uts/common/io/mac/mac_provider.c index 98faffef47..2c9affa22e 100644 --- a/usr/src/uts/common/io/mac/mac_provider.c +++ b/usr/src/uts/common/io/mac/mac_provider.c @@ -1357,10 +1357,10 @@ mac_prop_info_set_default_str(mac_prop_info_handle_t ph, const char *str) if (pr->pr_default == NULL) return; - if (strlen(str) > pr->pr_default_size) + if (strlen(str) >= pr->pr_default_size) pr->pr_errno = ENOBUFS; else - (void) strlcpy(pr->pr_default, str, strlen(str)); + (void) strlcpy(pr->pr_default, str, pr->pr_default_size); pr->pr_flags |= MAC_PROP_INFO_DEFAULT; } diff --git a/usr/src/uts/common/sys/dls_mgmt.h b/usr/src/uts/common/sys/dls_mgmt.h index 8cf04ea9f7..b4032c24d6 100644 --- a/usr/src/uts/common/sys/dls_mgmt.h +++ b/usr/src/uts/common/sys/dls_mgmt.h @@ -45,7 +45,7 @@ typedef enum { DATALINK_CLASS_ETHERSTUB = 0x10, DATALINK_CLASS_SIMNET = 0x20, DATALINK_CLASS_BRIDGE = 0x40, - DATALINK_CLASS_IPTUN = 0x60, + DATALINK_CLASS_IPTUN = 0x80, DATALINK_CLASS_PART = 0x100 } datalink_class_t; |