summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdladm
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2020-03-09 12:13:17 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2020-03-09 12:13:17 +0000
commit7986d0138f7b2fc2fe4a12dce758b443d9aa448f (patch)
treea90f1cd8b010f8cd18408a0441514b36ca7a1f22 /usr/src/lib/libdladm
parentc9d5215bf1b67592fb838367435fe20cfd079dd2 (diff)
parent4e4d1bad19e83eed004cbbbec13ba7d42ae7d17a (diff)
downloadillumos-joyent-7986d0138f7b2fc2fe4a12dce758b443d9aa448f.tar.gz
[illumos-gate merge]
commit 4e4d1bad19e83eed004cbbbec13ba7d42ae7d17a 12356 Update hwdata to 2020.02.22 commit 86b2c59a1c0693176ce8e6e5347f533716a6fcb0 12354 It should not be possible to create persistent VNICs over temporary objects commit f11c6b604a17df4ddc8c4987e50f5b8d8a945516 12364 mdb trips assertion related to autowrap commit ebb7c6fd4f966f94af3e235242b8a39b7a53664a 12204 want driver for Mellanox ConnectX-4/5/6 NICs commit da40b2648878aa9434c7199422846fe5a7032714 12203 FMA fault ASRUs missing FMRI annotations commit 12eb87fbfbcd9e0abde89898daa0a87c695807e4 12205 want generic NIC transceiver fault events commit a23b3b1bb4e08abaac9fb78fea486e678ce6d6de 12319 ipsecah/ipsecesp: smatch errors commit ab82c29b6e890d0f1241f9cd0cefda3430f46bd5 12173 ip: variable may be used uninitialized in this function Conflicts: usr/src/lib/libdladm/common/libdladm.h usr/src/lib/libdladm/common/libdladm.c
Diffstat (limited to 'usr/src/lib/libdladm')
-rw-r--r--usr/src/lib/libdladm/common/libdladm.c3
-rw-r--r--usr/src/lib/libdladm/common/libdladm.h5
-rw-r--r--usr/src/lib/libdladm/common/libdlvnic.c27
3 files changed, 26 insertions, 9 deletions
diff --git a/usr/src/lib/libdladm/common/libdladm.c b/usr/src/lib/libdladm/common/libdladm.c
index 5f98de4e70..446a15893b 100644
--- a/usr/src/lib/libdladm/common/libdladm.c
+++ b/usr/src/lib/libdladm/common/libdladm.c
@@ -456,6 +456,9 @@ dladm_status2str(dladm_status_t status, char *buf)
case DLADM_STATUS_BAD_ENCAP:
s = "invalid encapsulation protocol";
break;
+ case DLADM_STATUS_PERSIST_ON_TEMP:
+ s = "can't create persistent object on top of temporary object";
+ break;
default:
s = "<unknown error>";
break;
diff --git a/usr/src/lib/libdladm/common/libdladm.h b/usr/src/lib/libdladm/common/libdladm.h
index f5ae0e6ace..685356fa64 100644
--- a/usr/src/lib/libdladm/common/libdladm.h
+++ b/usr/src/lib/libdladm/common/libdladm.h
@@ -24,7 +24,7 @@
*/
/*
- * Copyright 2019 OmniOS Community Edition (OmniOSce) Association
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association
*/
#ifndef _LIBDLADM_H
@@ -185,7 +185,8 @@ typedef enum {
DLADM_STATUS_INVALID_PKEY_TBL_SIZE,
DLADM_STATUS_PORT_NOPROTO,
DLADM_STATUS_INVALID_MTU,
- DLADM_STATUS_BAD_ENCAP
+ DLADM_STATUS_BAD_ENCAP,
+ DLADM_STATUS_PERSIST_ON_TEMP
} dladm_status_t;
typedef enum {
diff --git a/usr/src/lib/libdladm/common/libdlvnic.c b/usr/src/lib/libdladm/common/libdlvnic.c
index 47d007a1e2..7ff0cd5530 100644
--- a/usr/src/lib/libdladm/common/libdlvnic.c
+++ b/usr/src/lib/libdladm/common/libdlvnic.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2015, Joyent Inc.
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
*/
#include <stdio.h>
@@ -406,6 +407,7 @@ dladm_vnic_create(dladm_handle_t handle, const char *vnic, datalink_id_t linkid,
datalink_id_t vnic_id;
datalink_class_t class;
uint32_t media = DL_ETHER;
+ uint32_t link_flags;
char name[MAXLINKNAMELEN];
uchar_t tmp_addr[MAXMACADDRLEN];
dladm_status_t status;
@@ -421,6 +423,15 @@ dladm_vnic_create(dladm_handle_t handle, const char *vnic, datalink_id_t linkid,
if ((flags & DLADM_OPT_ACTIVE) == 0)
return (DLADM_STATUS_NOTSUP);
+ /*
+ * It's an anchor VNIC - linkid must be set to DATALINK_INVALID_LINKID
+ * and the VLAN id must be 0
+ */
+ if ((flags & DLADM_OPT_ANCHOR) != 0 &&
+ (linkid != DATALINK_INVALID_LINKID || vid != 0)) {
+ return (DLADM_STATUS_BADARG);
+ }
+
is_vlan = ((flags & DLADM_OPT_VLAN) != 0);
if (is_vlan && ((vid < 1 || vid > 4094)))
return (DLADM_STATUS_VIDINVAL);
@@ -430,18 +441,20 @@ dladm_vnic_create(dladm_handle_t handle, const char *vnic, datalink_id_t linkid,
if (!dladm_vnic_macaddrtype2str(mac_addr_type))
return (DLADM_STATUS_INVALIDMACADDRTYPE);
- if ((flags & DLADM_OPT_ANCHOR) == 0) {
- if ((status = dladm_datalink_id2info(handle, linkid, NULL,
- &class, &media, NULL, 0)) != DLADM_STATUS_OK)
+ if (!is_etherstub) {
+ if ((status = dladm_datalink_id2info(handle, linkid,
+ &link_flags, &class, &media, NULL, 0)) != DLADM_STATUS_OK)
return (status);
+ /* Disallow persistent objects on top of temporary ones */
+ if ((flags & DLADM_OPT_PERSIST) != 0 &&
+ (link_flags & DLMGMT_PERSIST) == 0)
+ 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)
return (DLADM_STATUS_BADARG);
- } else {
- /* it's an anchor VNIC */
- if (linkid != DATALINK_INVALID_LINKID || vid != 0)
- return (DLADM_STATUS_BADARG);
}
/*