diff options
author | 2019-04-11 12:32:46 +0000 | |
---|---|---|
committer | 2019-04-11 12:32:46 +0000 | |
commit | 23a4e4a1e8913390694e35727d2131b2938cb472 (patch) | |
tree | 10460de0a50a2008d1fad0123774f12092d1c381 | |
parent | print transceiver information inline with standard interface details (diff) | |
download | wireguard-openbsd-23a4e4a1e8913390694e35727d2131b2938cb472.tar.xz wireguard-openbsd-23a4e4a1e8913390694e35727d2131b2938cb472.zip |
print transceiver supported distances, ok deraadt
-rw-r--r-- | sbin/ifconfig/sff.c | 44 |
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, " "); |