summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdladm/common
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libdladm/common')
-rw-r--r--usr/src/lib/libdladm/common/libdladm.c12
-rw-r--r--usr/src/lib/libdladm/common/libdladm.h5
-rw-r--r--usr/src/lib/libdladm/common/libdlvnic.c19
3 files changed, 24 insertions, 12 deletions
diff --git a/usr/src/lib/libdladm/common/libdladm.c b/usr/src/lib/libdladm/common/libdladm.c
index 72c4457373..17c4530cd2 100644
--- a/usr/src/lib/libdladm/common/libdladm.c
+++ b/usr/src/lib/libdladm/common/libdladm.c
@@ -20,15 +20,12 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2017, Joyent, Inc.
- */
-
-/*
- * Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
*/
/*
+ * Copyright 2017 Joyent, Inc.
* Copyright 2020 Peter Tribble.
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
*/
#include <unistd.h>
@@ -459,6 +456,9 @@ dladm_status2str(dladm_status_t status, char *buf)
case DLADM_STATUS_BAD_ENCAP:
s = "invalid encapsulation protocol";
break;
+ case DLADM_STATUS_ADDRNOTAVAIL:
+ s = "can't assign requested address";
+ break;
default:
s = "<unknown error>";
break;
@@ -509,6 +509,8 @@ dladm_errno2status(int err)
return (DLADM_STATUS_FLOW_IDENTICAL);
case EADDRINUSE:
return (DLADM_STATUS_ADDRINUSE);
+ case EADDRNOTAVAIL:
+ return (DLADM_STATUS_ADDRNOTAVAIL);
default:
return (DLADM_STATUS_FAILED);
}
diff --git a/usr/src/lib/libdladm/common/libdladm.h b/usr/src/lib/libdladm/common/libdladm.h
index ecbbab0e86..f440916539 100644
--- a/usr/src/lib/libdladm/common/libdladm.h
+++ b/usr/src/lib/libdladm/common/libdladm.h
@@ -25,7 +25,7 @@
/*
* Copyright 2015, Joyent, Inc.
- * Copyright 2020 OmniOS Community Edition (OmniOSce) Association
+ * Copyright 2022 OmniOS Community Edition (OmniOSce) Association
*/
#ifndef _LIBDLADM_H
@@ -187,7 +187,8 @@ typedef enum {
DLADM_STATUS_PORT_NOPROTO,
DLADM_STATUS_INVALID_MTU,
DLADM_STATUS_PERSIST_ON_TEMP,
- DLADM_STATUS_BAD_ENCAP
+ DLADM_STATUS_BAD_ENCAP,
+ DLADM_STATUS_ADDRNOTAVAIL
} dladm_status_t;
typedef enum {
diff --git a/usr/src/lib/libdladm/common/libdlvnic.c b/usr/src/lib/libdladm/common/libdlvnic.c
index 7ff0cd5530..27e856006c 100644
--- a/usr/src/lib/libdladm/common/libdlvnic.c
+++ b/usr/src/lib/libdladm/common/libdlvnic.c
@@ -405,7 +405,7 @@ dladm_vnic_create(dladm_handle_t handle, const char *vnic, datalink_id_t linkid,
{
dladm_vnic_attr_t attr;
datalink_id_t vnic_id;
- datalink_class_t class;
+ datalink_class_t class, pclass;
uint32_t media = DL_ETHER;
uint32_t link_flags;
char name[MAXLINKNAMELEN];
@@ -443,7 +443,7 @@ dladm_vnic_create(dladm_handle_t handle, const char *vnic, datalink_id_t linkid,
if (!is_etherstub) {
if ((status = dladm_datalink_id2info(handle, linkid,
- &link_flags, &class, &media, NULL, 0)) != DLADM_STATUS_OK)
+ &link_flags, &pclass, &media, NULL, 0)) != DLADM_STATUS_OK)
return (status);
/* Disallow persistent objects on top of temporary ones */
@@ -452,8 +452,8 @@ dladm_vnic_create(dladm_handle_t handle, const char *vnic, datalink_id_t linkid,
return (DLADM_STATUS_PERSIST_ON_TEMP);
/* Links cannot be created on top of these object types */
- if (class == DATALINK_CLASS_VNIC ||
- class == DATALINK_CLASS_VLAN)
+ if (pclass == DATALINK_CLASS_VNIC ||
+ pclass == DATALINK_CLASS_VLAN)
return (DLADM_STATUS_BADARG);
}
@@ -548,8 +548,17 @@ dladm_vnic_create(dladm_handle_t handle, const char *vnic, datalink_id_t linkid,
attr.va_force = (flags & DLADM_OPT_FORCE) != 0;
status = i_dladm_vnic_create_sys(handle, &attr);
- if (status != DLADM_STATUS_OK)
+ if (status != DLADM_STATUS_OK) {
+ if (!is_etherstub && pclass == DATALINK_CLASS_OVERLAY &&
+ status == DLADM_STATUS_ADDRNOTAVAIL) {
+ char errmsg[DLADM_STRSIZE];
+ (void) dladm_errlist_append(errs,
+ "failed to start overlay device; "
+ "could not open underlay socket: %s",
+ dladm_status2str(status, errmsg));
+ }
goto done;
+ }
vnic_created = B_TRUE;
/* Save vnic configuration and its properties */