summaryrefslogtreecommitdiffstats
path: root/freebsd/sbin/ifconfig
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sbin/ifconfig')
-rw-r--r--freebsd/sbin/ifconfig/af_inet.c8
-rw-r--r--freebsd/sbin/ifconfig/af_inet6.c38
-rw-r--r--freebsd/sbin/ifconfig/af_nd6.c2
-rw-r--r--freebsd/sbin/ifconfig/ifconfig.c132
-rw-r--r--freebsd/sbin/ifconfig/ifgre.c25
-rw-r--r--freebsd/sbin/ifconfig/ifgroup.c4
-rw-r--r--freebsd/sbin/ifconfig/ifieee80211.c259
-rw-r--r--freebsd/sbin/ifconfig/iflagg.c4
-rw-r--r--freebsd/sbin/ifconfig/ifmedia.c32
-rw-r--r--freebsd/sbin/ifconfig/ifpfsync.c6
-rw-r--r--freebsd/sbin/ifconfig/sfp.c69
11 files changed, 488 insertions, 91 deletions
diff --git a/freebsd/sbin/ifconfig/af_inet.c b/freebsd/sbin/ifconfig/af_inet.c
index 050ceb80..a6e95683 100644
--- a/freebsd/sbin/ifconfig/af_inet.c
+++ b/freebsd/sbin/ifconfig/af_inet.c
@@ -119,16 +119,16 @@ in_status(int s __unused, const struct ifaddrs *ifa)
if (cidr == 0)
break;
}
- printf("/%d ", cidr);
+ printf("/%d", cidr);
} else if (f_inet != NULL && strcmp(f_inet, "dotted") == 0)
- printf(" netmask %s ", inet_ntoa(sin->sin_addr));
+ printf(" netmask %s", inet_ntoa(sin->sin_addr));
else
- printf(" netmask 0x%lx ", (unsigned long)ntohl(sin->sin_addr.s_addr));
+ printf(" netmask 0x%lx", (unsigned long)ntohl(sin->sin_addr.s_addr));
if (ifa->ifa_flags & IFF_BROADCAST) {
sin = (struct sockaddr_in *)ifa->ifa_broadaddr;
if (sin != NULL && sin->sin_addr.s_addr != 0)
- printf("broadcast %s ", inet_ntoa(sin->sin_addr));
+ printf(" broadcast %s", inet_ntoa(sin->sin_addr));
}
print_vhid(ifa, " ");
diff --git a/freebsd/sbin/ifconfig/af_inet6.c b/freebsd/sbin/ifconfig/af_inet6.c
index cae6c326..f3b1b6bc 100644
--- a/freebsd/sbin/ifconfig/af_inet6.c
+++ b/freebsd/sbin/ifconfig/af_inet6.c
@@ -259,49 +259,49 @@ in6_status(int s __unused, const struct ifaddrs *ifa)
if (sin == NULL)
sin = &null_sin;
if (f_inet6 != NULL && strcmp(f_inet6, "cidr") == 0)
- printf("/%d ", prefix(&sin->sin6_addr,
+ printf("/%d", prefix(&sin->sin6_addr,
sizeof(struct in6_addr)));
else
- printf(" prefixlen %d ", prefix(&sin->sin6_addr,
+ printf(" prefixlen %d", prefix(&sin->sin6_addr,
sizeof(struct in6_addr)));
if ((flags6 & IN6_IFF_ANYCAST) != 0)
- printf("anycast ");
+ printf(" anycast");
if ((flags6 & IN6_IFF_TENTATIVE) != 0)
- printf("tentative ");
+ printf(" tentative");
if ((flags6 & IN6_IFF_DUPLICATED) != 0)
- printf("duplicated ");
+ printf(" duplicated");
if ((flags6 & IN6_IFF_DETACHED) != 0)
- printf("detached ");
+ printf(" detached");
if ((flags6 & IN6_IFF_DEPRECATED) != 0)
- printf("deprecated ");
+ printf(" deprecated");
if ((flags6 & IN6_IFF_AUTOCONF) != 0)
- printf("autoconf ");
+ printf(" autoconf");
if ((flags6 & IN6_IFF_TEMPORARY) != 0)
- printf("temporary ");
+ printf(" temporary");
if ((flags6 & IN6_IFF_PREFER_SOURCE) != 0)
- printf("prefer_source ");
+ printf(" prefer_source");
if (((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id)
- printf("scopeid 0x%x ",
+ printf(" scopeid 0x%x",
((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id);
if (ip6lifetime && (lifetime.ia6t_preferred || lifetime.ia6t_expire)) {
- printf("pltime ");
+ printf(" pltime");
if (lifetime.ia6t_preferred) {
- printf("%s ", lifetime.ia6t_preferred < now.tv_sec
+ printf(" %s", lifetime.ia6t_preferred < now.tv_sec
? "0" :
sec2str(lifetime.ia6t_preferred - now.tv_sec));
} else
- printf("infty ");
+ printf(" infty");
- printf("vltime ");
+ printf(" vltime");
if (lifetime.ia6t_expire) {
- printf("%s ", lifetime.ia6t_expire < now.tv_sec
+ printf(" %s", lifetime.ia6t_expire < now.tv_sec
? "0" :
sec2str(lifetime.ia6t_expire - now.tv_sec));
} else
- printf("infty ");
+ printf(" infty");
}
print_vhid(ifa, " ");
@@ -524,6 +524,10 @@ static struct cmd inet6_cmds[] = {
DEF_CMD_ARG("pltime", setip6pltime),
DEF_CMD_ARG("vltime", setip6vltime),
DEF_CMD("eui64", 0, setip6eui64),
+#ifdef EXPERIMENTAL
+ DEF_CMD("ipv6_only", ND6_IFF_IPV6_ONLY_MANUAL,setnd6flags),
+ DEF_CMD("-ipv6_only", -ND6_IFF_IPV6_ONLY_MANUAL,setnd6flags),
+#endif
};
static struct afswtch af_inet6 = {
diff --git a/freebsd/sbin/ifconfig/af_nd6.c b/freebsd/sbin/ifconfig/af_nd6.c
index 964c96b0..c900e787 100644
--- a/freebsd/sbin/ifconfig/af_nd6.c
+++ b/freebsd/sbin/ifconfig/af_nd6.c
@@ -73,7 +73,7 @@ static const char rcsid[] =
#define ND6BITS "\020\001PERFORMNUD\002ACCEPT_RTADV\003PREFER_SOURCE" \
"\004IFDISABLED\005DONT_SET_IFROUTE\006AUTO_LINKLOCAL" \
"\007NO_RADR\010NO_PREFER_IFACE\011NO_DAD" \
- "\012IPV6_ONLY" \
+ "\012IPV6_ONLY\013IPV6_ONLY_MANUAL" \
"\020DEFAULTIF"
#else
#define ND6BITS "\020\001PERFORMNUD\002ACCEPT_RTADV\003PREFER_SOURCE" \
diff --git a/freebsd/sbin/ifconfig/ifconfig.c b/freebsd/sbin/ifconfig/ifconfig.c
index 1e79e0cd..2a04b8cf 100644
--- a/freebsd/sbin/ifconfig/ifconfig.c
+++ b/freebsd/sbin/ifconfig/ifconfig.c
@@ -86,6 +86,7 @@ static const char rcsid[] =
#ifdef JAIL
#include <jail.h>
#endif
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -129,6 +130,8 @@ static void status(const struct afswtch *afp, const struct sockaddr_dl *sdl,
static void tunnel_status(int s);
static _Noreturn void usage(void);
+static int getifflags(const char *ifname, int us);
+
static struct afswtch *af_getbyname(const char *name);
static struct afswtch *af_getbyfamily(int af);
static void af_other_status(int);
@@ -146,6 +149,39 @@ struct ifa_order_elt {
TAILQ_HEAD(ifa_queue, ifa_order_elt);
+static struct module_map_entry {
+ const char *ifname;
+ const char *kldname;
+} module_map[] = {
+ {
+ .ifname = "tun",
+ .kldname = "if_tuntap",
+ },
+ {
+ .ifname = "tap",
+ .kldname = "if_tuntap",
+ },
+ {
+ .ifname = "vmnet",
+ .kldname = "if_tuntap",
+ },
+ {
+ .ifname = "ipsec",
+ .kldname = "ipsec",
+ },
+ {
+ /*
+ * This mapping exists because there is a conflicting enc module
+ * in CAM. ifconfig's guessing behavior will attempt to match
+ * the ifname to a module as well as if_${ifname} and clash with
+ * CAM enc. This is an assertion of the correct module to load.
+ */
+ .ifname = "enc",
+ .kldname = "if_enc",
+ },
+};
+
+
void
opt_register(struct option *p)
{
@@ -437,6 +473,7 @@ main(int argc, char *argv[])
const char *ifname;
struct option *p;
size_t iflen;
+ int flags;
#ifdef __rtems__
struct getopt_data getopt_data;
memset(&getopt_data, 0, sizeof(getopt_data));
@@ -607,6 +644,25 @@ main(int argc, char *argv[])
argc--, argv++;
}
+ /*
+ * Check for a requested configuration action on a single interface,
+ * which doesn't require building, sorting, and searching the entire
+ * system address list
+ */
+ if ((argc > 0) && (ifname != NULL)) {
+ iflen = strlcpy(name, ifname, sizeof(name));
+ if (iflen >= sizeof(name)) {
+ warnx("%s: interface name too long, skipping", ifname);
+ } else {
+ flags = getifflags(name, -1);
+ if (!(((flags & IFF_CANTCONFIG) != 0) ||
+ (downonly && (flags & IFF_UP) != 0) ||
+ (uponly && (flags & IFF_UP) == 0)))
+ ifconfig(argc, argv, 0, afp);
+ }
+ goto done;
+ }
+
if (getifaddrs(&ifap) != 0)
err(EXIT_FAILURE, "getifaddrs");
@@ -690,6 +746,7 @@ main(int argc, char *argv[])
printf("\n");
freeifaddrs(ifap);
+done:
freeformat();
exit(exit_code);
}
@@ -1101,6 +1158,28 @@ setifdstaddr(const char *addr, int param __unused, int s,
afp->af_getaddr(addr, DSTADDR);
}
+static int
+getifflags(const char *ifname, int us)
+{
+ struct ifreq my_ifr;
+ int s;
+
+ memset(&my_ifr, 0, sizeof(my_ifr));
+ (void) strlcpy(my_ifr.ifr_name, ifname, sizeof(my_ifr.ifr_name));
+ if (us < 0) {
+ if ((s = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0)
+ err(1, "socket(family AF_LOCAL,SOCK_DGRAM");
+ } else
+ s = us;
+ if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&my_ifr) < 0) {
+ Perror("ioctl (SIOCGIFFLAGS)");
+ exit(1);
+ }
+ if (us < 0)
+ close(s);
+ return ((my_ifr.ifr_flags & 0xffff) | (my_ifr.ifr_flagshigh << 16));
+}
+
/*
* Note: doing an SIOCIGIFFLAGS scribbles on the union portion
* of the ifreq structure, which may confuse other parts of ifconfig.
@@ -1112,20 +1191,14 @@ setifflags(const char *vname, int value, int s, const struct afswtch *afp)
struct ifreq my_ifr;
int flags;
- memset(&my_ifr, 0, sizeof(my_ifr));
- (void) strlcpy(my_ifr.ifr_name, name, sizeof(my_ifr.ifr_name));
-
- if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&my_ifr) < 0) {
- Perror("ioctl (SIOCGIFFLAGS)");
- exit(1);
- }
- flags = (my_ifr.ifr_flags & 0xffff) | (my_ifr.ifr_flagshigh << 16);
-
+ flags = getifflags(name, s);
if (value < 0) {
value = -value;
flags &= ~value;
} else
flags |= value;
+ memset(&my_ifr, 0, sizeof(my_ifr));
+ (void) strlcpy(my_ifr.ifr_name, name, sizeof(my_ifr.ifr_name));
my_ifr.ifr_flags = flags & 0xffff;
my_ifr.ifr_flagshigh = flags >> 16;
if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&my_ifr) < 0)
@@ -1265,7 +1338,7 @@ unsetifdescr(const char *val, int value, int s, const struct afswtch *afp)
"\020\1RXCSUM\2TXCSUM\3NETCONS\4VLAN_MTU\5VLAN_HWTAGGING\6JUMBO_MTU\7POLLING" \
"\10VLAN_HWCSUM\11TSO4\12TSO6\13LRO\14WOL_UCAST\15WOL_MCAST\16WOL_MAGIC" \
"\17TOE4\20TOE6\21VLAN_HWFILTER\23VLAN_HWTSO\24LINKSTATE\25NETMAP" \
-"\26RXCSUM_IPV6\27TXCSUM_IPV6\31TXRTLMT\32HWRXTSTMP"
+"\26RXCSUM_IPV6\27TXCSUM_IPV6\31TXRTLMT\32HWRXTSTMP\33NOMAP\34TXTLS4\35TXTLS6"
/*
* Print the status of the interface. If an address family was
@@ -1451,7 +1524,7 @@ print_vhid(const struct ifaddrs *ifa, const char *s)
if (ifd->ifi_vhid == 0)
return;
- printf("vhid %d ", ifd->ifi_vhid);
+ printf(" vhid %d", ifd->ifi_vhid);
}
void
@@ -1460,9 +1533,11 @@ ifmaybeload(const char *name)
#ifndef __rtems__
#define MOD_PREFIX_LEN 3 /* "if_" */
struct module_stat mstat;
- int fileid, modid;
+ int i, fileid, modid;
char ifkind[IFNAMSIZ + MOD_PREFIX_LEN], ifname[IFNAMSIZ], *dp;
const char *cp;
+ struct module_map_entry *mme;
+ bool found;
/* loading suppressed by the user */
if (noload)
@@ -1476,9 +1551,24 @@ ifmaybeload(const char *name)
break;
}
- /* turn interface and unit into module name */
- strlcpy(ifkind, "if_", sizeof(ifkind));
- strlcat(ifkind, ifname, sizeof(ifkind));
+ /* Either derive it from the map or guess otherwise */
+ *ifkind = '\0';
+ found = false;
+ for (i = 0; i < nitems(module_map); ++i) {
+ mme = &module_map[i];
+ if (strcmp(mme->ifname, ifname) == 0) {
+ strlcpy(ifkind, mme->kldname, sizeof(ifkind));
+ found = true;
+ break;
+ }
+ }
+
+ /* We didn't have an alias for it... we'll guess. */
+ if (!found) {
+ /* turn interface and unit into module name */
+ strlcpy(ifkind, "if_", sizeof(ifkind));
+ strlcat(ifkind, ifname, sizeof(ifkind));
+ }
/* scan files in kernel */
mstat.version = sizeof(struct module_stat);
@@ -1494,8 +1584,12 @@ ifmaybeload(const char *name)
} else {
cp = mstat.name;
}
- /* already loaded? */
- if (strcmp(ifname, cp) == 0 ||
+ /*
+ * Is it already loaded? Don't compare with ifname if
+ * we were specifically told which kld to use. Doing
+ * so could lead to conflicts not trivially solved.
+ */
+ if ((!found && strcmp(ifname, cp) == 0) ||
strcmp(ifkind, cp) == 0)
return;
}
@@ -1550,6 +1644,8 @@ static struct cmd basic_cmds[] = {
DEF_CMD("-link2", -IFF_LINK2, setifflags),
DEF_CMD("monitor", IFF_MONITOR, setifflags),
DEF_CMD("-monitor", -IFF_MONITOR, setifflags),
+ DEF_CMD("nomap", IFCAP_NOMAP, setifcap),
+ DEF_CMD("-nomap", -IFCAP_NOMAP, setifcap),
DEF_CMD("staticarp", IFF_STATICARP, setifflags),
DEF_CMD("-staticarp", -IFF_STATICARP, setifflags),
DEF_CMD("rxcsum6", IFCAP_RXCSUM_IPV6, setifcap),
@@ -1576,6 +1672,8 @@ static struct cmd basic_cmds[] = {
DEF_CMD("-toe", -IFCAP_TOE, setifcap),
DEF_CMD("lro", IFCAP_LRO, setifcap),
DEF_CMD("-lro", -IFCAP_LRO, setifcap),
+ DEF_CMD("txtls", IFCAP_TXTLS, setifcap),
+ DEF_CMD("-txtls", -IFCAP_TXTLS, setifcap),
DEF_CMD("wol", IFCAP_WOL, setifcap),
DEF_CMD("-wol", -IFCAP_WOL, setifcap),
DEF_CMD("wol_ucast", IFCAP_WOL_UCAST, setifcap),
diff --git a/freebsd/sbin/ifconfig/ifgre.c b/freebsd/sbin/ifconfig/ifgre.c
index 2adc6d76..092e70c2 100644
--- a/freebsd/sbin/ifconfig/ifgre.c
+++ b/freebsd/sbin/ifconfig/ifgre.c
@@ -56,15 +56,16 @@ __FBSDID("$FreeBSD$");
#include "rtems-bsd-ifconfig-ifgre-data.h"
#endif /* __rtems__ */
-#define GREBITS "\020\01ENABLE_CSUM\02ENABLE_SEQ"
+#define GREBITS "\020\01ENABLE_CSUM\02ENABLE_SEQ\03UDPENCAP"
static void gre_status(int s);
static void
gre_status(int s)
{
- uint32_t opts = 0;
+ uint32_t opts, port;
+ opts = 0;
ifr.ifr_data = (caddr_t)&opts;
if (ioctl(s, GREGKEY, &ifr) == 0)
if (opts != 0)
@@ -72,6 +73,11 @@ gre_status(int s)
opts = 0;
if (ioctl(s, GREGOPTS, &ifr) != 0 || opts == 0)
return;
+
+ port = 0;
+ ifr.ifr_data = (caddr_t)&port;
+ if (ioctl(s, GREGPORT, &ifr) == 0 && port != 0)
+ printf("\tudpport: %u\n", port);
printb("\toptions", opts, GREBITS);
putchar('\n');
}
@@ -89,6 +95,18 @@ setifgrekey(const char *val, int dummy __unused, int s,
}
static void
+setifgreport(const char *val, int dummy __unused, int s,
+ const struct afswtch *afp)
+{
+ uint32_t udpport = strtol(val, NULL, 0);
+
+ strlcpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
+ ifr.ifr_data = (caddr_t)&udpport;
+ if (ioctl(s, GRESPORT, (caddr_t)&ifr) < 0)
+ warn("ioctl (set udpport)");
+}
+
+static void
setifgreopts(const char *val, int d, int s, const struct afswtch *afp)
{
uint32_t opts;
@@ -113,10 +131,13 @@ setifgreopts(const char *val, int d, int s, const struct afswtch *afp)
static struct cmd gre_cmds[] = {
DEF_CMD_ARG("grekey", setifgrekey),
+ DEF_CMD_ARG("udpport", setifgreport),
DEF_CMD("enable_csum", GRE_ENABLE_CSUM, setifgreopts),
DEF_CMD("-enable_csum",-GRE_ENABLE_CSUM,setifgreopts),
DEF_CMD("enable_seq", GRE_ENABLE_SEQ, setifgreopts),
DEF_CMD("-enable_seq",-GRE_ENABLE_SEQ, setifgreopts),
+ DEF_CMD("udpencap", GRE_UDPENCAP, setifgreopts),
+ DEF_CMD("-udpencap",-GRE_UDPENCAP, setifgreopts),
};
static struct afswtch af_gre = {
.af_name = "af_gre",
diff --git a/freebsd/sbin/ifconfig/ifgroup.c b/freebsd/sbin/ifconfig/ifgroup.c
index a487f060..fc1b826c 100644
--- a/freebsd/sbin/ifconfig/ifgroup.c
+++ b/freebsd/sbin/ifconfig/ifgroup.c
@@ -135,9 +135,9 @@ getifgroups(int s)
len -= sizeof(struct ifg_req);
if (strcmp(ifg->ifgrq_group, "all")) {
if (cnt == 0)
- printf("\tgroups: ");
+ printf("\tgroups:");
cnt++;
- printf("%s ", ifg->ifgrq_group);
+ printf(" %s", ifg->ifgrq_group);
}
}
if (cnt)
diff --git a/freebsd/sbin/ifconfig/ifieee80211.c b/freebsd/sbin/ifconfig/ifieee80211.c
index fa407957..08c91443 100644
--- a/freebsd/sbin/ifconfig/ifieee80211.c
+++ b/freebsd/sbin/ifconfig/ifieee80211.c
@@ -86,6 +86,7 @@
#include <net80211/ieee80211_superg.h>
#include <net80211/ieee80211_tdma.h>
#include <net80211/ieee80211_mesh.h>
+#include <net80211/ieee80211_wps.h>
#include <assert.h>
#include <ctype.h>
@@ -1539,9 +1540,6 @@ getmodeflags(const char *val)
return flags;
}
-#define IEEE80211_CHAN_HTA (IEEE80211_CHAN_HT|IEEE80211_CHAN_5GHZ)
-#define IEEE80211_CHAN_HTG (IEEE80211_CHAN_HT|IEEE80211_CHAN_2GHZ)
-
#define _APPLY(_flags, _base, _param, _v) do { \
if (_flags & IEEE80211_CHAN_HT) { \
if ((_flags & (IEEE80211_CHAN_5GHZ|IEEE80211_CHAN_2GHZ)) == 0) {\
@@ -1731,8 +1729,6 @@ DECL_CMD_FUNC(set80211maxretry, val, d)
}
#undef _APPLY_RATE
#undef _APPLY
-#undef IEEE80211_CHAN_HTA
-#undef IEEE80211_CHAN_HTG
static
DECL_CMD_FUNC(set80211fragthreshold, val, d)
@@ -3141,13 +3137,6 @@ printrsnie(const char *tag, const u_int8_t *ie, size_t ielen, int maxlen)
}
}
-/* XXX move to a public include file */
-#define IEEE80211_WPS_DEV_PASS_ID 0x1012
-#define IEEE80211_WPS_SELECTED_REG 0x1041
-#define IEEE80211_WPS_SETUP_STATE 0x1044
-#define IEEE80211_WPS_UUID_E 0x1047
-#define IEEE80211_WPS_VERSION 0x104a
-
#define BE_READ_2(p) \
((u_int16_t) \
((((const u_int8_t *)(p))[1] ) | \
@@ -3169,6 +3158,7 @@ printwpsie(const char *tag, const u_int8_t *ie, size_t ielen, int maxlen)
"R" /* Registrar-specified */
};
int n;
+ int f;
ie +=6, len -= 4; /* NB: len is payload only */
@@ -3177,6 +3167,7 @@ printwpsie(const char *tag, const u_int8_t *ie, size_t ielen, int maxlen)
while (len) {
uint16_t tlv_type = BE_READ_2(ie);
uint16_t tlv_len = BE_READ_2(ie + 2);
+ uint16_t cfg_mthd;
/* some devices broadcast invalid WPS frames */
if (tlv_len > len) {
@@ -3189,30 +3180,191 @@ printwpsie(const char *tag, const u_int8_t *ie, size_t ielen, int maxlen)
ie += 4, len -= 4;
switch (tlv_type) {
- case IEEE80211_WPS_VERSION:
+ case IEEE80211_WPS_ATTR_VERSION:
printf("v:%d.%d", *ie >> 4, *ie & 0xf);
break;
- case IEEE80211_WPS_SETUP_STATE:
- /* Only 1 and 2 are valid */
- if (*ie == 0 || *ie >= 3)
- printf(" state:B");
+ case IEEE80211_WPS_ATTR_AP_SETUP_LOCKED:
+ printf(" ap_setup:%s", *ie ? "locked" :
+ "unlocked");
+ break;
+ case IEEE80211_WPS_ATTR_CONFIG_METHODS:
+ case IEEE80211_WPS_ATTR_SELECTED_REGISTRAR_CONFIG_METHODS:
+ if (tlv_type == IEEE80211_WPS_ATTR_SELECTED_REGISTRAR_CONFIG_METHODS)
+ printf(" sel_reg_cfg_mthd:");
else
- printf(" st:%s", *ie == 1 ? "N" : "C");
+ printf(" cfg_mthd:" );
+ cfg_mthd = BE_READ_2(ie);
+ f = 0;
+ for (n = 15; n >= 0; n--) {
+ if (f) {
+ printf(",");
+ f = 0;
+ }
+ switch (cfg_mthd & (1 << n)) {
+ case 0:
+ break;
+ case IEEE80211_WPS_CONFIG_USBA:
+ printf("usba");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_ETHERNET:
+ printf("ethernet");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_LABEL:
+ printf("label");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_DISPLAY:
+ if (!(cfg_mthd &
+ (IEEE80211_WPS_CONFIG_VIRT_DISPLAY |
+ IEEE80211_WPS_CONFIG_PHY_DISPLAY)))
+ {
+ printf("display");
+ f++;
+ }
+ break;
+ case IEEE80211_WPS_CONFIG_EXT_NFC_TOKEN:
+ printf("ext_nfc_tokenk");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_INT_NFC_TOKEN:
+ printf("int_nfc_token");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_NFC_INTERFACE:
+ printf("nfc_interface");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_PUSHBUTTON:
+ if (!(cfg_mthd &
+ (IEEE80211_WPS_CONFIG_VIRT_PUSHBUTTON |
+ IEEE80211_WPS_CONFIG_PHY_PUSHBUTTON))) {
+ printf("push_button");
+ f++;
+ }
+ break;
+ case IEEE80211_WPS_CONFIG_KEYPAD:
+ printf("keypad");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_VIRT_PUSHBUTTON:
+ printf("virtual_push_button");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_PHY_PUSHBUTTON:
+ printf("physical_push_button");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_P2PS:
+ printf("p2ps");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_VIRT_DISPLAY:
+ printf("virtual_display");
+ f++;
+ break;
+ case IEEE80211_WPS_CONFIG_PHY_DISPLAY:
+ printf("physical_display");
+ f++;
+ break;
+ default:
+ printf("unknown_wps_config<%04x>",
+ cfg_mthd & (1 << n));
+ f++;
+ break;
+ }
+ }
break;
- case IEEE80211_WPS_SELECTED_REG:
- printf(" sel:%s", *ie ? "T" : "F");
+ case IEEE80211_WPS_ATTR_DEV_NAME:
+ printf(" device_name:<%.*s>", tlv_len, ie);
break;
- case IEEE80211_WPS_DEV_PASS_ID:
+ case IEEE80211_WPS_ATTR_DEV_PASSWORD_ID:
n = LE_READ_2(ie);
if (n < nitems(dev_pass_id))
printf(" dpi:%s", dev_pass_id[n]);
break;
- case IEEE80211_WPS_UUID_E:
+ case IEEE80211_WPS_ATTR_MANUFACTURER:
+ printf(" manufacturer:<%.*s>", tlv_len, ie);
+ break;
+ case IEEE80211_WPS_ATTR_MODEL_NAME:
+ printf(" model_name:<%.*s>", tlv_len, ie);
+ break;
+ case IEEE80211_WPS_ATTR_MODEL_NUMBER:
+ printf(" model_number:<%.*s>", tlv_len, ie);
+ break;
+ case IEEE80211_WPS_ATTR_PRIMARY_DEV_TYPE:
+ printf(" prim_dev:");
+ for (n = 0; n < tlv_len; n++)
+ printf("%02x", ie[n]);
+ break;
+ case IEEE80211_WPS_ATTR_RF_BANDS:
+ printf(" rf:");
+ f = 0;
+ for (n = 7; n >= 0; n--) {
+ if (f) {
+ printf(",");
+ f = 0;
+ }
+ switch (*ie & (1 << n)) {
+ case 0:
+ break;
+ case IEEE80211_WPS_RF_BAND_24GHZ:
+ printf("2.4Ghz");
+ f++;
+ break;
+ case IEEE80211_WPS_RF_BAND_50GHZ:
+ printf("5Ghz");
+ f++;
+ break;
+ case IEEE80211_WPS_RF_BAND_600GHZ:
+ printf("60Ghz");
+ f++;
+ break;
+ default:
+ printf("unknown<%02x>",
+ *ie & (1 << n));
+ f++;
+ break;
+ }
+ }
+ break;
+ case IEEE80211_WPS_ATTR_RESPONSE_TYPE:
+ printf(" resp_type:0x%02x", *ie);
+ break;
+ case IEEE80211_WPS_ATTR_SELECTED_REGISTRAR:
+ printf(" sel:%s", *ie ? "T" : "F");
+ break;
+ case IEEE80211_WPS_ATTR_SERIAL_NUMBER:
+ printf(" serial_number:<%.*s>", tlv_len, ie);
+ break;
+ case IEEE80211_WPS_ATTR_UUID_E:
printf(" uuid-e:");
for (n = 0; n < (tlv_len - 1); n++)
printf("%02x-", ie[n]);
printf("%02x", ie[n]);
break;
+ case IEEE80211_WPS_ATTR_VENDOR_EXT:
+ printf(" vendor:");
+ for (n = 0; n < tlv_len; n++)
+ printf("%02x", ie[n]);
+ break;
+ case IEEE80211_WPS_ATTR_WPS_STATE:
+ switch (*ie) {
+ case IEEE80211_WPS_STATE_NOT_CONFIGURED:
+ printf(" state:N");
+ break;
+ case IEEE80211_WPS_STATE_CONFIGURED:
+ printf(" state:C");
+ break;
+ default:
+ printf(" state:B<%02x>", *ie);
+ break;
+ }
+ break;
+ default:
+ printf(" unknown_wps_attr:0x%x", tlv_type);
+ break;
}
ie += tlv_len, len -= tlv_len;
}
@@ -3365,6 +3517,7 @@ iswpsoui(const uint8_t *frm)
static const char *
iename(int elemid)
{
+ static char iename_buf[64];
switch (elemid) {
case IEEE80211_ELEMID_FHPARMS: return " FHPARMS";
case IEEE80211_ELEMID_CFPARMS: return " CFPARMS";
@@ -3382,10 +3535,21 @@ iename(int elemid)
case IEEE80211_ELEMID_MEASREP: return " MEASREP";
case IEEE80211_ELEMID_QUIET: return " QUIET";
case IEEE80211_ELEMID_IBSSDFS: return " IBSSDFS";
+ case IEEE80211_ELEMID_RESERVED_47:
+ return " RESERVED_47";
+ case IEEE80211_ELEMID_MOBILITY_DOMAIN:
+ return " MOBILITY_DOMAIN";
+ case IEEE80211_ELEMID_RRM_ENACAPS:
+ return " RRM_ENCAPS";
+ case IEEE80211_ELEMID_OVERLAP_BSS_SCAN_PARAM:
+ return " OVERLAP_BSS";
case IEEE80211_ELEMID_TPC: return " TPC";
case IEEE80211_ELEMID_CCKM: return " CCKM";
+ case IEEE80211_ELEMID_EXTCAP: return " EXTCAP";
}
- return " ???";
+ snprintf(iename_buf, sizeof(iename_buf), " UNKNOWN_ELEMID_%d",
+ elemid);
+ return (const char *) iename_buf;
}
static void
@@ -4153,7 +4317,10 @@ list_roam(int s)
rp = &roamparams.params[mode];
if (rp->rssi == 0 && rp->rate == 0)
continue;
- if (mode == IEEE80211_MODE_11NA || mode == IEEE80211_MODE_11NG) {
+ if (mode == IEEE80211_MODE_11NA ||
+ mode == IEEE80211_MODE_11NG ||
+ mode == IEEE80211_MODE_VHT_2GHZ ||
+ mode == IEEE80211_MODE_VHT_5GHZ) {
if (rp->rssi & 1)
LINE_CHECK("roam:%-7.7s rssi %2u.5dBm MCS %2u ",
modename[mode], rp->rssi/2,
@@ -4173,6 +4340,21 @@ list_roam(int s)
}
}
+/* XXX TODO: rate-to-string method... */
+static const char*
+get_mcs_mbs_rate_str(uint8_t rate)
+{
+ return (rate & IEEE80211_RATE_MCS) ? "MCS " : "Mb/s";
+}
+
+static uint8_t
+get_rate_value(uint8_t rate)
+{
+ if (rate & IEEE80211_RATE_MCS)
+ return (rate &~ IEEE80211_RATE_MCS);
+ return (rate / 2);
+}
+
static void
list_txparams(int s)
{
@@ -4184,21 +4366,28 @@ list_txparams(int s)
tp = &txparams.params[mode];
if (tp->mgmtrate == 0 && tp->mcastrate == 0)
continue;
- if (mode == IEEE80211_MODE_11NA || mode == IEEE80211_MODE_11NG) {
+ if (mode == IEEE80211_MODE_11NA ||
+ mode == IEEE80211_MODE_11NG ||
+ mode == IEEE80211_MODE_VHT_2GHZ ||
+ mode == IEEE80211_MODE_VHT_5GHZ) {
if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE)
- LINE_CHECK("%-7.7s ucast NONE mgmt %2u MCS "
- "mcast %2u MCS maxretry %u",
+ LINE_CHECK("%-7.7s ucast NONE mgmt %2u %s "
+ "mcast %2u %s maxretry %u",
modename[mode],
- tp->mgmtrate &~ IEEE80211_RATE_MCS,
- tp->mcastrate &~ IEEE80211_RATE_MCS,
+ get_rate_value(tp->mgmtrate),
+ get_mcs_mbs_rate_str(tp->mgmtrate),
+ get_rate_value(tp->mcastrate),
+ get_mcs_mbs_rate_str(tp->mcastrate),
tp->maxretry);
else
- LINE_CHECK("%-7.7s ucast %2u MCS mgmt %2u MCS "
- "mcast %2u MCS maxretry %u",
+ LINE_CHECK("%-7.7s ucast %2u MCS mgmt %2u %s "
+ "mcast %2u %s maxretry %u",
modename[mode],
tp->ucastrate &~ IEEE80211_RATE_MCS,
- tp->mgmtrate &~ IEEE80211_RATE_MCS,
- tp->mcastrate &~ IEEE80211_RATE_MCS,
+ get_rate_value(tp->mgmtrate),
+ get_mcs_mbs_rate_str(tp->mgmtrate),
+ get_rate_value(tp->mcastrate),
+ get_mcs_mbs_rate_str(tp->mcastrate),
tp->maxretry);
} else {
if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE)
@@ -4907,7 +5096,9 @@ end:
LINE_CHECK("roam:rssi %u.5", rp->rssi/2);
else
LINE_CHECK("roam:rssi %u", rp->rssi/2);
- LINE_CHECK("roam:rate %u", rp->rate/2);
+ LINE_CHECK("roam:rate %s%u",
+ (rp->rate & IEEE80211_RATE_MCS) ? "MCS " : "",
+ get_rate_value(rp->rate));
} else {
LINE_BREAK();
list_roam(s);
diff --git a/freebsd/sbin/ifconfig/iflagg.c b/freebsd/sbin/ifconfig/iflagg.c
index 4952196a..14a7a7bf 100644
--- a/freebsd/sbin/ifconfig/iflagg.c
+++ b/freebsd/sbin/ifconfig/iflagg.c
@@ -142,6 +142,8 @@ setlaggsetopt(const char *val, int d, int s, const struct afswtch *afp)
switch (ro.ro_opts) {
case LAGG_OPT_USE_FLOWID:
case -LAGG_OPT_USE_FLOWID:
+ case LAGG_OPT_USE_NUMA:
+ case -LAGG_OPT_USE_NUMA:
case LAGG_OPT_LACP_STRICT:
case -LAGG_OPT_LACP_STRICT:
case LAGG_OPT_LACP_TXTEST:
@@ -315,6 +317,8 @@ static struct cmd lagg_cmds[] = {
DEF_CMD_ARG("lagghash", setlagghash),
DEF_CMD("use_flowid", LAGG_OPT_USE_FLOWID, setlaggsetopt),
DEF_CMD("-use_flowid", -LAGG_OPT_USE_FLOWID, setlaggsetopt),
+ DEF_CMD("use_numa", LAGG_OPT_USE_NUMA, setlaggsetopt),
+ DEF_CMD("-use_numa", -LAGG_OPT_USE_NUMA, setlaggsetopt),
DEF_CMD("lacp_strict", LAGG_OPT_LACP_STRICT, setlaggsetopt),
DEF_CMD("-lacp_strict", -LAGG_OPT_LACP_STRICT, setlaggsetopt),
DEF_CMD("lacp_txtest", LAGG_OPT_LACP_TXTEST, setlaggsetopt),
diff --git a/freebsd/sbin/ifconfig/ifmedia.c b/freebsd/sbin/ifconfig/ifmedia.c
index ac2af8b6..02893547 100644
--- a/freebsd/sbin/ifconfig/ifmedia.c
+++ b/freebsd/sbin/ifconfig/ifmedia.c
@@ -89,6 +89,7 @@
#include <err.h>
#include <errno.h>
#include <fcntl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -137,18 +138,20 @@ static void
media_status(int s)
{
struct ifmediareq ifmr;
+ struct ifdownreason ifdr;
int *media_list, i;
- int xmedia = 1;
+ bool no_carrier, xmedia;
(void) memset(&ifmr, 0, sizeof(ifmr));
(void) strlcpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+ xmedia = true;
/*
* Check if interface supports extended media types.
*/
if (ioctl(s, SIOCGIFXMEDIA, (caddr_t)&ifmr) < 0)
- xmedia = 0;
- if (xmedia == 0 && ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
+ xmedia = false;
+ if (!xmedia && ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
/*
* Interface doesn't support SIOC{G,S}IFMEDIA.
*/
@@ -185,6 +188,7 @@ media_status(int s)
putchar('\n');
if (ifmr.ifm_status & IFM_AVALID) {
+ no_carrier = false;
printf("\tstatus: ");
switch (IFM_TYPE(ifmr.ifm_active)) {
case IFM_ETHER:
@@ -192,7 +196,7 @@ media_status(int s)
if (ifmr.ifm_status & IFM_ACTIVE)
printf("active");
else
- printf("no carrier");
+ no_carrier = true;
break;
case IFM_IEEE80211:
@@ -203,9 +207,27 @@ media_status(int s)
else
printf("running");
} else
- printf("no carrier");
+ no_carrier = true;
break;
}
+ if (no_carrier) {
+ printf("no carrier");
+ memset(&ifdr, 0, sizeof(ifdr));
+ strlcpy(ifdr.ifdr_name, name, sizeof(ifdr.ifdr_name));
+ if (ioctl(s, SIOCGIFDOWNREASON, (caddr_t)&ifdr) == 0) {
+ switch (ifdr.ifdr_reason) {
+ case IFDR_REASON_MSG:
+ printf(" (%s)", ifdr.ifdr_msg);
+ break;
+ case IFDR_REASON_VENDOR:
+ printf(" (vendor code %d)",
+ ifdr.ifdr_vendor);
+ break;
+ default:
+ break;
+ }
+ }
+ }
putchar('\n');
}
diff --git a/freebsd/sbin/ifconfig/ifpfsync.c b/freebsd/sbin/ifconfig/ifpfsync.c
index c2c91687..944a1b26 100644
--- a/freebsd/sbin/ifconfig/ifpfsync.c
+++ b/freebsd/sbin/ifconfig/ifpfsync.c
@@ -207,16 +207,16 @@ pfsync_status(int s)
return;
if (preq.pfsyncr_syncdev[0] != '\0' ||
- preq.pfsyncr_syncpeer.s_addr != INADDR_PFSYNC_GROUP)
+ preq.pfsyncr_syncpeer.s_addr != htonl(INADDR_PFSYNC_GROUP))
printf("\t");
if (preq.pfsyncr_syncdev[0] != '\0')
printf("pfsync: syncdev: %s ", preq.pfsyncr_syncdev);
- if (preq.pfsyncr_syncpeer.s_addr != INADDR_PFSYNC_GROUP)
+ if (preq.pfsyncr_syncpeer.s_addr != htonl(INADDR_PFSYNC_GROUP))
printf("syncpeer: %s ", inet_ntoa(preq.pfsyncr_syncpeer));
if (preq.pfsyncr_syncdev[0] != '\0' ||
- preq.pfsyncr_syncpeer.s_addr != INADDR_PFSYNC_GROUP) {
+ preq.pfsyncr_syncpeer.s_addr != htonl(INADDR_PFSYNC_GROUP)) {
printf("maxupd: %d ", preq.pfsyncr_maxupdates);
printf("defer: %s\n", preq.pfsyncr_defer ? "on" : "off");
}
diff --git a/freebsd/sbin/ifconfig/sfp.c b/freebsd/sbin/ifconfig/sfp.c
index 0aa3300d..6444736f 100644
--- a/freebsd/sbin/ifconfig/sfp.c
+++ b/freebsd/sbin/ifconfig/sfp.c
@@ -88,7 +88,7 @@ struct _nv {
const char *find_value(struct _nv *x, int value);
const char *find_zero_bit(struct _nv *x, int value, int sz);
-/* SFF-8024 Rev. 4.1 Table 4-3: Connector Types */
+/* SFF-8024 Rev. 4.6 Table 4-3: Connector Types */
static struct _nv conn[] = {
{ 0x00, "Unknown" },
{ 0x01, "SC" },
@@ -96,18 +96,23 @@ static struct _nv conn[] = {
{ 0x03, "Fibre Channel Style 2 copper" },
{ 0x04, "BNC/TNC" },
{ 0x05, "Fibre Channel coaxial" },
- { 0x06, "FiberJack" },
+ { 0x06, "Fiber Jack" },
{ 0x07, "LC" },
{ 0x08, "MT-RJ" },
{ 0x09, "MU" },
{ 0x0A, "SG" },
{ 0x0B, "Optical pigtail" },
- { 0x0C, "MPO Parallel Optic" },
+ { 0x0C, "MPO 1x12 Parallel Optic" },
+ { 0x0D, "MPO 2x16 Parallel Optic" },
{ 0x20, "HSSDC II" },
{ 0x21, "Copper pigtail" },
{ 0x22, "RJ45" },
{ 0x23, "No separable connector" },
{ 0x24, "MXC 2x16" },
+ { 0x25, "CS optical connector" },
+ { 0x26, "Mini CS optical connector" },
+ { 0x27, "MPO 2x12 Parallel Optic" },
+ { 0x28, "MPO 1x16 Parallel Optic" },
{ 0, NULL }
};
@@ -203,9 +208,61 @@ static struct _nv eth_1040g[] = {
};
#define SFF_8636_EXT_COMPLIANCE 0x80
-/* SFF-8024 Rev. 4.2 table 4-4: Extended Specification Compliance */
+/* SFF-8024 Rev. 4.6 table 4-4: Extended Specification Compliance */
static struct _nv eth_extended_comp[] = {
{ 0xFF, "Reserved" },
+ { 0x55, "128GFC LW" },
+ { 0x54, "128GFC SW" },
+ { 0x53, "128GFC EA" },
+ { 0x52, "64GFC LW" },
+ { 0x51, "64GFC SW" },
+ { 0x50, "64GFC EA" },
+ { 0x4F, "Reserved" },
+ { 0x4E, "Reserved" },
+ { 0x4D, "Reserved" },
+ { 0x4C, "Reserved" },
+ { 0x4B, "Reserved" },
+ { 0x4A, "Reserved" },
+ { 0x49, "Reserved" },
+ { 0x48, "Reserved" },
+ { 0x47, "Reserved" },
+ { 0x46, "200GBASE-LR4" },
+ { 0x45, "50GBASE-LR" },
+ { 0x44, "200G 1550nm PSM4" },
+ { 0x43, "200GBASE-FR4" },
+ { 0x42, "50GBASE-FR or 200GBASE-DR4" },
+ { 0x41, "50GBASE-SR/100GBASE-SR2/200GBASE-SR4" },
+ { 0x40, "50GBASE-CR/100GBASE-CR2/200GBASE-CR4" },
+ { 0x3F, "Reserved" },
+ { 0x3E, "Reserved" },
+ { 0x3D, "Reserved" },
+ { 0x3C, "Reserved" },
+ { 0x3B, "Reserved" },
+ { 0x3A, "Reserved" },
+ { 0x39, "Reserved" },
+ { 0x38, "Reserved" },
+ { 0x37, "Reserved" },
+ { 0x36, "Reserved" },
+ { 0x35, "Reserved" },
+ { 0x34, "Reserved" },
+ { 0x33, "50GAUI/100GAUI-2/200GAUI-4 AOC (BER <2.6e-4)" },
+ { 0x32, "50GAUI/100GAUI-2/200GAUI-4 ACC (BER <2.6e-4)" },
+ { 0x31, "50GAUI/100GAUI-2/200GAUI-4 AOC (BER <1e-6)" },
+ { 0x30, "50GAUI/100GAUI-2/200GAUI-4 ACC (BER <1e-6)" },
+ { 0x2F, "Reserved" },
+ { 0x2E, "Reserved" },
+ { 0x2D, "Reserved" },
+ { 0x2C, "Reserved" },
+ { 0x2B, "Reserved" },
+ { 0x2A, "Reserved" },
+ { 0x29, "Reserved" },
+ { 0x28, "Reserved" },
+ { 0x27, "100G-LR" },
+ { 0x26, "100G-FR" },
+ { 0x25, "100GBASE-DR" },
+ { 0x24, "4WDM-40 MSA" },
+ { 0x23, "4WDM-20 MSA" },
+ { 0x22, "4WDM-10 MSA" },
{ 0x21, "100G PAM4 BiDi" },
{ 0x20, "100G SWDM4" },
{ 0x1F, "40G SWDM4" },
@@ -226,8 +283,8 @@ static struct _nv eth_extended_comp[] = {
{ 0x10, "40GBASE-ER4" },
{ 0x0F, "Reserved" },
{ 0x0E, "Reserved" },
- { 0x0D, "25GBASE-CR CA-N" },
- { 0x0C, "25GBASE-CR CA-S" },
+ { 0x0D, "25GBASE-CR CA-25G-N" },
+ { 0x0C, "25GBASE-CR CA-25G-S" },
{ 0x0B, "100GBASE-CR4 or 25GBASE-CR CA-L" },
{ 0x0A, "Reserved" },
{ 0x09, "Obsolete" },