diff options
Diffstat (limited to 'usr/src/lib/libdladm')
-rw-r--r-- | usr/src/lib/libdladm/common/libdladm.c | 47 | ||||
-rw-r--r-- | usr/src/lib/libdladm/common/libdladm.h | 5 | ||||
-rw-r--r-- | usr/src/lib/libdladm/common/libdlvnic.c | 27 |
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); } /* |