summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdladm
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libdladm')
-rw-r--r--usr/src/lib/libdladm/common/libdladm.c47
-rw-r--r--usr/src/lib/libdladm/common/libdladm.h5
-rw-r--r--usr/src/lib/libdladm/common/libdlvnic.c27
3 files changed, 48 insertions, 31 deletions
diff --git a/usr/src/lib/libdladm/common/libdladm.c b/usr/src/lib/libdladm/common/libdladm.c
index d0a34ef23d..446a15893b 100644
--- a/usr/src/lib/libdladm/common/libdladm.c
+++ b/usr/src/lib/libdladm/common/libdladm.c
@@ -27,6 +27,10 @@
* Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
*/
+/*
+ * Copyright 2020 Peter Tribble.
+ */
+
#include <unistd.h>
#include <errno.h>
#include <ctype.h>
@@ -70,23 +74,23 @@ static media_type_t media_type_table[] = {
{ DL_HDLC, "HDLC" },
{ DL_CHAR, "SyncCharacter" },
{ DL_CTCA, "CTCA" },
- { DL_FDDI, "FDDI" },
- { DL_FC, "FiberChannel" },
- { DL_ATM, "ATM" },
- { DL_IPATM, "ATM(ClassicIP)" },
- { DL_X25, "X.25" },
- { DL_IPX25, "X.25(ClassicIP)" },
- { DL_ISDN, "ISDN" },
- { DL_HIPPI, "HIPPI" },
- { DL_100VG, "100BaseVGEthernet" },
- { DL_100VGTPR, "100BaseVGTokenRing" },
- { DL_ETH_CSMA, "IEEE802.3" },
- { DL_100BT, "100BaseT" },
- { DL_FRAME, "FrameRelay" },
- { DL_MPFRAME, "MPFrameRelay" },
- { DL_ASYNC, "AsyncCharacter" },
- { DL_IPNET, "IPNET" },
- { DL_OTHER, "Other" }
+ { DL_FDDI, "FDDI" },
+ { DL_FC, "FiberChannel" },
+ { DL_ATM, "ATM" },
+ { DL_IPATM, "ATM(ClassicIP)" },
+ { DL_X25, "X.25" },
+ { DL_IPX25, "X.25(ClassicIP)" },
+ { DL_ISDN, "ISDN" },
+ { DL_HIPPI, "HIPPI" },
+ { DL_100VG, "100BaseVGEthernet" },
+ { DL_100VGTPR, "100BaseVGTokenRing" },
+ { DL_ETH_CSMA, "IEEE802.3" },
+ { DL_100BT, "100BaseT" },
+ { DL_FRAME, "FrameRelay" },
+ { DL_MPFRAME, "MPFrameRelay" },
+ { DL_ASYNC, "AsyncCharacter" },
+ { DL_IPNET, "IPNET" },
+ { DL_OTHER, "Other" }
};
#define MEDIATYPECOUNT (sizeof (media_type_table) / sizeof (media_type_t))
@@ -452,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;
@@ -594,11 +601,7 @@ dladm_bw2str(int64_t bw, char *buf)
kbps = (bw%1000000)/1000;
mbps = bw/1000000;
if (kbps != 0) {
- if (mbps == 0)
- (void) snprintf(buf, DLADM_STRSIZE, "0.%03u", kbps);
- else
- (void) snprintf(buf, DLADM_STRSIZE, "%5u.%03u", mbps,
- kbps);
+ (void) snprintf(buf, DLADM_STRSIZE, "%5u.%03u", mbps, kbps);
} else {
(void) snprintf(buf, DLADM_STRSIZE, "%5u", mbps);
}
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);
}
/*