Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F132328522
D19905.id57509.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D19905.id57509.diff
View Options
Index: sys/net/ieee_oui.h
===================================================================
--- sys/net/ieee_oui.h
+++ sys/net/ieee_oui.h
@@ -77,4 +77,9 @@
*/
#define OUI_FREEBSD_GENERATED_MASK 0x10ffff
#define OUI_FREEBSD_GENERATED_LOW OUI_FREEBSD(0x100000)
-#define OUI_FREEBSD_GENERATED_HIGH OUI_FREEBSD(OU_FREEBSD_GENERATED_MASK)
+#define OUI_FREEBSD_GENERATED_HIGH OUI_FREEBSD(OUI_FREEBSD_GENERATED_MASK)
+
+/* Allocate 16 bits for emulated NVMe devices */
+#define OUI_FREEBSD_NVME_MASK 0x20ffff
+#define OUI_FREEBSD_NVME_LOW OUI_FREEBSD(0x200000)
+#define OUI_FRREBSD_NVME_HIGH OUI_FREEBSD(OUI_FREEBSD_NVME_MASK)
Index: usr.sbin/bhyve/pci_nvme.c
===================================================================
--- usr.sbin/bhyve/pci_nvme.c
+++ usr.sbin/bhyve/pci_nvme.c
@@ -4,6 +4,9 @@
* Copyright (c) 2017 Shunsuke Mie
* Copyright (c) 2018 Leon Dang
*
+ * Function crc16 Copyright (c) 2017, Fedor Uporov
+ * Obtained from function ext2_crc16() in sys/fs/ext2fs/ext2_csum.c
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -30,7 +33,7 @@
* bhyve PCIe-NVMe device emulation.
*
* options:
- * -s <n>,nvme,devpath,maxq=#,qsz=#,ioslots=#,sectsz=#,ser=A-Z
+ * -s <n>,nvme,devpath,maxq=#,qsz=#,ioslots=#,sectsz=#,ser=A-Z,eui64=#
*
* accepted devpath:
* /dev/blockdev
@@ -42,6 +45,7 @@
* ioslots = max number of concurrent io requests
* sectsz = sector size (defaults to blockif sector size)
* ser = serial number (20-chars max)
+ * eui64 = IEEE Extended Unique Identifier (8 byte value)
*
*/
@@ -54,6 +58,7 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <net/ieee_oui.h>
#include <assert.h>
#include <pthread.h>
@@ -164,6 +169,7 @@
uint64_t size;
uint32_t sectsz;
uint32_t sectsz_bits;
+ uint64_t eui64;
};
struct pci_nvme_ioreq {
@@ -352,12 +358,61 @@
cd->power_state[0].mp = 10;
}
-static void
-pci_nvme_init_nsdata(struct pci_nvme_softc *sc)
+/*
+ * Calculate the CRC-16 of the given buffer
+ * See copyright attribution at top of file
+ */
+static uint16_t
+crc16(uint16_t crc, const void *buffer, unsigned int len)
{
- struct nvme_namespace_data *nd;
+ const unsigned char *cp = buffer;
+ /* CRC table for the CRC-16. The poly is 0x8005 (x16 + x15 + x2 + 1). */
+ static uint16_t const crc16_table[256] = {
+ 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
+ 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
+ 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
+ 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
+ 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
+ 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
+ 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
+ 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
+ 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
+ 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
+ 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
+ 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
+ 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
+ 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
+ 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
+ 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
+ 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
+ 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
+ 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
+ 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
+ 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
+ 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
+ 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
+ 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
+ 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
+ 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
+ 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
+ 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
+ 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
+ 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
+ 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
+ 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
+ };
- nd = &sc->nsdata;
+ while (len--)
+ crc = (((crc >> 8) & 0xffU) ^
+ crc16_table[(crc ^ *cp++) & 0xffU]) & 0x0000ffffU;
+ return crc;
+}
+
+static void
+pci_nvme_init_nsdata(struct pci_nvme_softc *sc,
+ struct nvme_namespace_data *nd, uint32_t nsid,
+ uint64_t eui64)
+{
nd->nsze = sc->nvstore.size / sc->nvstore.sectsz;
nd->ncap = nd->nsze;
@@ -365,10 +420,33 @@
/* Get LBA and backstore information from backing store */
nd->nlbaf = 0; /* NLBAF is a 0's based value (i.e. 1 LBA Format) */
+ nd->flbas = 0;
+
+ /* Create an EUI-64 if user did not provide one */
+ if (eui64 != 0)
+ memcpy(nd->eui64, &eui64, sizeof(nd->eui64));
+ else {
+ uint64_t eui64 = OUI_FREEBSD_NVME_LOW;
+ uint8_t *data, *d;
+ size_t data_len = 0;
+
+ data_len = strlen(vmname) + 3;
+ data = calloc(1, data_len);
+ if (data != NULL) {
+ d = stpcpy(data, vmname);
+ d[0] = sc->nsc_pi->pi_bus;
+ d[1] = sc->nsc_pi->pi_slot;
+ d[2] = sc->nsc_pi->pi_func;
+
+ eui64 |= crc16(0, data, data_len);
+ }
+
+ eui64 = (eui64 << 16) | (nsid & 0xffff);
+ *((uint64_t *)nd->eui64) = htobe64(eui64);
+ }
+
/* LBA data-sz = 2^lbads */
nd->lbaf[0] = sc->nvstore.sectsz_bits << NVME_NS_DATA_LBAF_LBADS_SHIFT;
-
- nd->flbas = 0;
}
static void
@@ -1816,6 +1894,8 @@
free(uopt);
return (-1);
}
+ } else if (!strcmp("eui64", xopts)) {
+ sc->nvstore.eui64 = htobe64(strtoull(config, NULL, 0));
} else if (optidx == 0) {
snprintf(bident, sizeof(bident), "%d:%d",
sc->nsc_pi->pi_slot, sc->nsc_pi->pi_func);
@@ -1936,7 +2016,7 @@
pci_nvme_reset(sc);
pci_nvme_init_ctrldata(sc);
- pci_nvme_init_nsdata(sc);
+ pci_nvme_init_nsdata(sc, &sc->nsdata, 1, sc->nvstore.eui64);
pci_nvme_init_logpages(sc);
pci_lintr_request(pi);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Oct 16, 10:55 PM (12 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
23790973
Default Alt Text
D19905.id57509.diff (6 KB)
Attached To
Mode
D19905: bhyve: Add EUI64 to NVMe device
Attached
Detach File
Event Timeline
Log In to Comment