summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsthen <sthen@openbsd.org>2019-04-11 12:32:46 +0000
committersthen <sthen@openbsd.org>2019-04-11 12:32:46 +0000
commit23a4e4a1e8913390694e35727d2131b2938cb472 (patch)
tree10460de0a50a2008d1fad0123774f12092d1c381
parentprint transceiver information inline with standard interface details (diff)
downloadwireguard-openbsd-23a4e4a1e8913390694e35727d2131b2938cb472.tar.xz
wireguard-openbsd-23a4e4a1e8913390694e35727d2131b2938cb472.zip
print transceiver supported distances, ok deraadt
-rw-r--r--sbin/ifconfig/sff.c44
1 files changed, 38 insertions, 6 deletions
diff --git a/sbin/ifconfig/sff.c b/sbin/ifconfig/sff.c
index 8a04501555b..8b99c564e52 100644
--- a/sbin/ifconfig/sff.c
+++ b/sbin/ifconfig/sff.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sff.c,v 1.6 2019/04/11 11:32:24 sthen Exp $ */
+/* $OpenBSD: sff.c,v 1.7 2019/04/11 12:32:46 sthen Exp $ */
/*
* Copyright (c) 2019 David Gwynne <dlg@openbsd.org>
@@ -164,6 +164,12 @@ static const char *sff8024_con_names[] = {
#define SFF8472_EXT_ID_MOD_DEF_6 0x06
#define SFF8472_EXT_ID_MOD_DEF_7 0x07
#define SFF8472_CON 2 /* SFF8027 for connector values */
+#define SFF8472_DIST_SMF_KM 14
+#define SFF8472_DIST_SMF_M 15
+#define SFF8472_DIST_OM2 16
+#define SFF8472_DIST_OM1 17
+#define SFF8472_DIST_CU 18
+#define SFF8472_DIST_OM3 19
#define SFF8472_VENDOR_START 20
#define SFF8472_VENDOR_END 35
#define SFF8472_PRODUCT_START 40
@@ -393,7 +399,6 @@ if_sff_power2dbm(const struct if_sffpage *sff, size_t start)
return (10.0 * log10f((float)power / 10000.0));
}
-
static void
if_sff_printalarm(const char *unit, int range, float actual,
float alrm_high, float alrm_low, float warn_high, float warn_log)
@@ -409,27 +414,54 @@ if_sff_printalarm(const char *unit, int range, float actual,
printf(" [WARNING]");
}
+static void
+if_sff_printdist(const char *type, int value, int scale)
+{
+ int distance = value * scale;
+
+ if (value == 0)
+ return;
+
+ if (distance < 10000)
+ printf (", %s%u%s", value > 254 ? ">" : "", distance, type);
+ else
+ printf (", %s%0.1fk%s", value > 254 ? ">" : "",
+ distance / 1000.0, type);
+}
+
static int
if_sff8472(int s, const char *ifname, int dump, const struct if_sffpage *pg0)
{
struct if_sffpage ddm;
uint8_t con, ddm_types;
- uint16_t wavelength;
+ int i;
con = pg0->sff_data[SFF8472_CON];
printf("%s", sff_con_name(con));
- wavelength = if_sff_int(pg0, SFF8472_WAVELENGTH);
- switch (wavelength) {
+ i = if_sff_int(pg0, SFF8472_WAVELENGTH);
+ switch (i) {
/* Copper Cable */
case 0x0100: /* SFF-8431 Appendix E */
case 0x0400: /* SFF-8431 limiting */
case 0x0c00: /* SFF-8431 limiting and FC-PI-4 limiting */
break;
default:
- printf(", %.02u nm", wavelength);
+ printf(", %.02u nm", i);
}
+ if (pg0->sff_data[SFF8472_DIST_SMF_M] > 0 &&
+ pg0->sff_data[SFF8472_DIST_SMF_M] < 255)
+ if_sff_printdist("m SMF",
+ pg0->sff_data[SFF8472_DIST_SMF_M], 100);
+ else
+ if_sff_printdist("km SMF",
+ pg0->sff_data[SFF8472_DIST_SMF_KM], 1);
+ if_sff_printdist("m OM2", pg0->sff_data[SFF8472_DIST_OM2], 10);
+ if_sff_printdist("m OM1", pg0->sff_data[SFF8472_DIST_OM1], 10);
+ if_sff_printdist("m OM3", pg0->sff_data[SFF8472_DIST_OM3], 10);
+ if_sff_printdist("m", pg0->sff_data[SFF8472_DIST_CU], 1);
+
printf("\n\tmodel: ");
if_sff_ascii_print(pg0, "",
SFF8472_VENDOR_START, SFF8472_VENDOR_END, " ");