diff --git a/usr/src/cmd/dladm/dladm.c b/usr/src/cmd/dladm/dladm.c
index f2de0f321a..aea1c826a0 100644
--- a/usr/src/cmd/dladm/dladm.c
+++ b/usr/src/cmd/dladm/dladm.c
@@ -26,6 +26,7 @@
  * Copyright 2020 Peter Tribble.
  * Copyright 2021 OmniOS Community Edition (OmniOSce) Association.
  * Copyright 2021 RackTop Systems, Inc.
+ * Copyright 2024 H. William Welliver <william@welliver.org>
  */
 
 #include <stdio.h>
@@ -5454,6 +5455,7 @@ do_create_simnet(int argc, char *argv[], const char *use)
 	uint32_t flags;
 	char *altroot = NULL;
 	char *media = NULL;
+	char *maddr = NULL;
 	uint32_t mtype = DL_ETHER;
 	int option;
 	dladm_status_t status;
@@ -5463,7 +5465,7 @@ do_create_simnet(int argc, char *argv[], const char *use)
 	flags = DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST;
 
 	opterr = 0;
-	while ((option = getopt_long(argc, argv, ":tR:m:",
+	while ((option = getopt_long(argc, argv, ":tR:m:u:",
 	    simnet_lopts, NULL)) != -1) {
 		switch (option) {
 		case 't':
@@ -5475,31 +5477,37 @@ do_create_simnet(int argc, char *argv[], const char *use)
 		case 'm':
 			media = optarg;
 			break;
+		case 'u':
+			maddr = optarg;
+			break;
 		default:
 			die_opterr(optopt, option, use);
 		}
 	}
-
 	/* the simnet id is the required operand */
 	if (optind != (argc - 1))
 		usage();
 
 	if (strlcpy(name, argv[optind], MAXLINKNAMELEN) >= MAXLINKNAMELEN)
-		die("link name too long '%s'", argv[optind]);
+		die_dlerr(DLADM_STATUS_LINKINVAL,
+		    "link name too long '%s'", argv[optind]);
 
 	if (!dladm_valid_linkname(name))
-		die("invalid link name '%s'", name);
+		die_dlerr(DLADM_STATUS_LINKINVAL,
+		    "invalid link name '%s'", name);
 
 	if (media != NULL) {
 		mtype = dladm_str2media(media);
 		if (mtype != DL_ETHER && mtype != DL_WIFI)
-			die("media type '%s' is not supported", media);
+			die_dlerr(DLADM_STATUS_NOTSUP,
+			    "media type '%s' is not supported", media);
 	}
 
 	if (altroot != NULL)
 		altroot_cmd(altroot, argc, argv);
 
-	status = dladm_simnet_create(handle, name, mtype, flags);
+	status = dladm_simnet_create(handle, name, mtype, maddr, flags);
+
 	if (status != DLADM_STATUS_OK)
 		die_dlerr(status, "simnet creation failed");
 }
diff --git a/usr/src/lib/libdladm/common/libdlsim.c b/usr/src/lib/libdladm/common/libdlsim.c
index a20c982477..1a812e8b79 100644
--- a/usr/src/lib/libdladm/common/libdlsim.c
+++ b/usr/src/lib/libdladm/common/libdlsim.c
@@ -20,6 +20,8 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Copyright 2024 H. William Welliver <william@welliver.org>
  */
 
 #include <sys/types.h>
@@ -178,22 +180,46 @@ done:
 
 dladm_status_t
 dladm_simnet_create(dladm_handle_t handle, const char *simnetname,
-    uint_t media, uint32_t flags)
+    uint_t media, const char *maddr, uint32_t flags)
 {
 	datalink_id_t simnet_id;
 	dladm_status_t status;
 	dladm_simnet_attr_t attr;
+	uchar_t *mac_addr;
+	uint_t maclen;
 
 	if (!(flags & DLADM_OPT_ACTIVE))
 		return (DLADM_STATUS_NOTSUP);
 
+	bzero(&attr, sizeof (attr));
+
+	if (maddr != NULL) {
+		mac_addr = _link_aton(maddr, (int *)&maclen);
+		if (mac_addr == NULL) {
+			if (maclen == (uint_t)-1)
+				return (DLADM_STATUS_INVALIDMACADDR);
+			else
+				return (DLADM_STATUS_NOMEM);
+		} else if (maclen != ETHERADDRL) {
+			free(mac_addr);
+			return (DLADM_STATUS_INVALIDMACADDRLEN);
+		} else if ((mac_addr[0] & 1) || !(mac_addr[0] & 2)) {
+			/* mac address must be unicast and local */
+			free(mac_addr);
+			return (DLADM_STATUS_INVALIDMACADDR);
+		}
+
+		attr.sna_mac_len = maclen;
+		bcopy(mac_addr, attr.sna_mac_addr, maclen);
+		free(mac_addr);
+	}
+
 	flags &= (DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST);
 	if ((status = dladm_create_datalink_id(handle, simnetname,
 	    DATALINK_CLASS_SIMNET, media, flags,
 	    &simnet_id)) != DLADM_STATUS_OK)
 		return (status);
 
-	bzero(&attr, sizeof (attr));
 	attr.sna_link_id = simnet_id;
 	attr.sna_type = media;
 	status = i_dladm_create_simnet(handle, &attr);
diff --git a/usr/src/lib/libdladm/common/libdlsim.h b/usr/src/lib/libdladm/common/libdlsim.h
index b1366f45d0..874c6f866d 100644
--- a/usr/src/lib/libdladm/common/libdlsim.h
+++ b/usr/src/lib/libdladm/common/libdlsim.h
@@ -21,6 +21,8 @@
 /*
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright 2024 H. William Welliver <william@welliver.org>
  */
 
 #ifndef _LIBDLSIM_H
@@ -43,7 +45,7 @@ typedef struct dladm_simnet_attr {
 } dladm_simnet_attr_t;
 
 dladm_status_t dladm_simnet_create(dladm_handle_t, const char *,
-    uint_t, uint32_t);
+    uint_t, const char *, uint32_t);
 dladm_status_t dladm_simnet_delete(dladm_handle_t, datalink_id_t, uint32_t);
 dladm_status_t dladm_simnet_modify(dladm_handle_t, datalink_id_t,
     datalink_id_t, uint32_t);
