summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorharti <harti@FreeBSD.org>2004-01-26 12:17:49 +0000
committerharti <harti@FreeBSD.org>2004-01-26 12:17:49 +0000
commit5ab2525e7fc4ce22598f99c7898ef74913629610 (patch)
tree1ea6a8d96fe337fd2f64468a121be952d030f11c /sbin
parent2a7fced5d0177332253cee9a1afb122a1f91c7c4 (diff)
downloadFreeBSD-src-5ab2525e7fc4ce22598f99c7898ef74913629610.zip
FreeBSD-src-5ab2525e7fc4ce22598f99c7898ef74913629610.tar.gz
Add support for virtual interfaces. These have no phy chip and, hence, we
need to handle interfaces without phy specially.
Diffstat (limited to 'sbin')
-rw-r--r--sbin/atm/atmconfig/diag.c76
-rw-r--r--sbin/atm/atmconfig/diag.h1
2 files changed, 60 insertions, 17 deletions
diff --git a/sbin/atm/atmconfig/diag.c b/sbin/atm/atmconfig/diag.c
index acd83bb..733c879 100644
--- a/sbin/atm/atmconfig/diag.c
+++ b/sbin/atm/atmconfig/diag.c
@@ -197,6 +197,10 @@ static const char *const print_stats_idt77252[] = {
"tx_load_err:",
NULL
};
+static const char *const print_stats_virtual[] = {
+ "dummy:",
+ NULL
+};
static const char *const *const print_stats[] = {
[ATM_DEVICE_UNKNOWN] = NULL,
[ATM_DEVICE_PCA200E] = print_stats_pca200e,
@@ -212,6 +216,7 @@ static const char *const *const print_stats[] = {
[ATM_DEVICE_IDTABR155] = print_stats_idt77252,
[ATM_DEVICE_PROATM25] = print_stats_idt77252,
[ATM_DEVICE_PROATM155] = print_stats_idt77252,
+ [ATM_DEVICE_VIRTUAL] = print_stats_virtual,
};
struct diagif_list diagif_list = TAILQ_HEAD_INITIALIZER(diagif_list);
@@ -219,16 +224,22 @@ struct diagif_list diagif_list = TAILQ_HEAD_INITIALIZER(diagif_list);
/*
* Fetch a phy sysctl
*/
-static void
-phy_fetch(const char *ifname, const char *var, void *val, size_t len)
+static int
+phy_fetch(const char *ifname, const char *var, void *val, size_t len,
+ int err_fatal)
{
char *str;
if (asprintf(&str, "hw.atm.%s.phy_%s", ifname, var) == -1)
err(1, NULL);
- if (sysctlbyname(str, val, &len, NULL, NULL) == -1)
- err(1, "%s", str);
+ if (sysctlbyname(str, val, &len, NULL, NULL) == -1) {
+ if (err_fatal || errno != ENOENT)
+ err(1, "%s", str);
+ free(str);
+ return (-1);
+ }
free(str);
+ return (0);
}
/*
@@ -283,16 +294,19 @@ diagif_fetch(void)
strcpy(d->ifname, mib.ifmd_name);
TAILQ_INSERT_TAIL(&diagif_list, d, link);
- phy_fetch(d->ifname, "loopback", &d->phy_loopback,
- sizeof(d->phy_loopback));
- phy_fetch(d->ifname, "type", &d->phy_type,
- sizeof(d->phy_type));
- phy_fetch(d->ifname, "name", &d->phy_name,
- sizeof(d->phy_name));
- phy_fetch(d->ifname, "state", &d->phy_state,
- sizeof(d->phy_state));
- phy_fetch(d->ifname, "carrier", &d->phy_carrier,
- sizeof(d->phy_carrier));
+ if (phy_fetch(d->ifname, "type", &d->phy_type,
+ sizeof(d->phy_type), 0) == 0) {
+ d->phy_present = 1;
+ phy_fetch(d->ifname, "loopback",
+ &d->phy_loopback,
+ sizeof(d->phy_loopback), 1);
+ phy_fetch(d->ifname, "name", &d->phy_name,
+ sizeof(d->phy_name), 1);
+ phy_fetch(d->ifname, "state", &d->phy_state,
+ sizeof(d->phy_state), 1);
+ phy_fetch(d->ifname, "carrier", &d->phy_carrier,
+ sizeof(d->phy_carrier), 1);
+ }
}
}
}
@@ -543,9 +557,11 @@ diag_list(int argc, char *argv[])
static void
phy_show_line(const struct diagif *aif)
{
- printf("%-6u%-9s%-5u%-25s0x%-9x\n",
- aif->index, aif->ifname, aif->phy_type, aif->phy_name,
- aif->phy_loopback);
+ printf("%-6u%-9s", aif->index, aif->ifname);
+ if (aif->phy_present)
+ printf("%-5u%-25s0x%-9x", aif->phy_type,
+ aif->phy_name, aif->phy_loopback);
+ printf("\n");
}
static void
@@ -572,6 +588,26 @@ diag_phy_show(int argc, char *argv[])
diag_loop(argc, argv, phy_show_text, phy_show_line);
}
+/*
+ * Make sure the interface exists and has a phy
+ */
+static struct diagif *
+diagif_get_phy(const char *arg)
+{
+ struct diagif *aif;
+
+ diagif_fetch();
+ TAILQ_FOREACH(aif, &diagif_list, link)
+ if (strcmp(aif->ifname, arg) == 0)
+ break;
+ if (aif == NULL)
+ errx(1, "no such interface: %s", arg);
+ if (!aif->phy_present)
+ errx(1, "interface %s has no phy", arg);
+
+ return (aif);
+}
+
static void
diag_phy_set(int argc, char *argv[])
{
@@ -622,6 +658,8 @@ diag_phy_set(int argc, char *argv[])
errx(1, "value too large");
reg[2] = res;
+ (void)diagif_get_phy(argv[0]);
+
if (asprintf(&str, "hw.atm.%s.phy_regs", argv[0]) == -1)
err(1, NULL);
@@ -655,6 +693,8 @@ diag_phy_print(int argc, char *argv[])
if (argc != 1)
errx(1, "need device name for 'diag phy print'");
+ (void)diagif_get_phy(argv[0]);
+
if (asprintf(&str, "hw.atm.%s.phy_regs", argv[0]) == -1)
err(1, NULL);
len = 0;
@@ -779,6 +819,8 @@ diag_phy_stats(int argc, char *argv[])
if (argc != 1)
errx(1, "need device name for 'diag phy stats'");
+ (void)diagif_get_phy(argv[0]);
+
if (asprintf(&str, "hw.atm.%s.phy_stats", argv[0]) == -1)
err(1, NULL);
diff --git a/sbin/atm/atmconfig/diag.h b/sbin/atm/atmconfig/diag.h
index 2ed4f39..8b36cd4 100644
--- a/sbin/atm/atmconfig/diag.h
+++ b/sbin/atm/atmconfig/diag.h
@@ -34,6 +34,7 @@ struct diagif {
char ifname[IFNAMSIZ];
u_int index;
struct ifatm_mib mib;
+ int phy_present : 1;
u_int phy_type;
u_int phy_loopback;
char phy_name[100];
OpenPOWER on IntegriCloud