Always consider ramdisk builds after adding code to ifconfig not inside SMALL.
Thanks, Penned by Sebastian Benoit on 20180804 14:12.27, we have: | Hi, | | with this diff, | | ifconfig <if> join | | will print the list of networks that are configured for autojoin. | | $ ifconfig iwm0 join | iwm0: flags=208843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,AUTOCONF6> mtu 1500 | lladdr a4:7f:da:a4:d7:c1 | index 1 priority 4 llprio 3 | groups: wlan egress | media: IEEE802.11 autoselect (HT-MCS12 mode 11n) | status: active | ieee80211: join fn0rd chan 6 bssid 62:62:b5:d3:56:a7 62% wpakey wpaprotos wpa2 wpaakms psk wpaciphers ccmp wpagroupcipher ccmp | join: gesamtkunstwerk | fn0rd | Gaeste | WLAN | | | comments? oks? | | (benno_join_list_5.diff) | | diff --git sbin/ifconfig/ifconfig.c sbin/ifconfig/ifconfig.c | index 9bfb1751aab..de6aabf4fba 100644 | --- sbin/ifconfig/ifconfig.c | +++ sbin/ifconfig/ifconfig.c | @@ -163,6 +163,7 @@ int newaddr = 0; | int af = AF_INET; | int explicit_prefix = 0; | int Lflag = 1; | +int show_join = 0; | | int showmediaflag; | int showcapsflag; | @@ -633,6 +634,7 @@ void in6_status(int); | void in6_getaddr(const char *, int); | void in6_getprefix(const char *, int); | void ieee80211_status(void); | +void join_status(void); | void ieee80211_listchans(void); | void ieee80211_listnodes(void); | void ieee80211_printnode(struct ieee80211_nodereq *); | @@ -1656,7 +1658,7 @@ setifjoin(const char *val, int d) | int len; | | if (val == NULL) { | - /* TODO: display the list of join'd networks */ | + show_join = 1; | return; | } | | @@ -2292,14 +2294,68 @@ ieee80211_status(void) | putchar(' '); | printb_status(ifr.ifr_flags, IEEE80211_F_USERBITS); | } | - | putchar('\n'); | + if (show_join) | + join_status(); | if (shownet80211chans) | ieee80211_listchans(); | else if (shownet80211nodes) | ieee80211_listnodes(); | } | | +void | +join_status(void) | +{ | + struct ieee80211_joinreq_all ja; | + struct ieee80211_join *jn = NULL; | + int jsz = IEEE80211_CACHE_SIZE; | + int ojsz; | + int i; | + int r; | + | + bzero(&ja, sizeof(ja)); | + jn = recallocarray(NULL, 0, jsz, sizeof(*jn)); | + if (jn == NULL) | + err(1, "recallocarray"); | + ojsz = jsz; | + while (1) { | + ja.ja_node = jn; | + ja.ja_size = jsz * sizeof(*jn); | + strlcpy(ja.ja_ifname, name, sizeof(ja.ja_ifname)); | + | + if ((r = ioctl(s, SIOCG80211JOINALL, &ja)) != 0) { | + if (errno == E2BIG) { | + jsz += IEEE80211_CACHE_SIZE; | + if (jsz > 10*IEEE80211_CACHE_SIZE) { | + warn("SIOCG80211JOINALL"); | + return; | + } | + jn = recallocarray(jn, ojsz, jsz, sizeof(*jn)); | + if (jn == NULL) | + err(1, "recallocarray"); | + ojsz = jsz; | + continue; | + } else if (errno != ENOENT) | + warn("SIOCG80211JOINALL"); | + return; | + } | + break; | + } | + | + if (!ja.ja_nodes) | + return; | + | + fputs("\tjoin:\t", stdout); | + for (i = 0; i < ja.ja_nodes; i++) { | + if (i > 0) | + printf("\t\t"); | + if (jn[i].i_len > IEEE80211_NWID_LEN) | + jn[i].i_len = IEEE80211_NWID_LEN; | + print_string(jn[i].i_nwid, jn[i].i_len); | + putchar('\n'); | + } | +} | + | void | ieee80211_listchans(void) | { | diff --git sys/net80211/ieee80211.h sys/net80211/ieee80211.h | index d7be80a4562..b02cb7924d3 100644 | --- sys/net80211/ieee80211.h | +++ sys/net80211/ieee80211.h | @@ -1023,4 +1023,6 @@ enum ieee80211_htprot { | IEEE80211_HTPROT_NONHT_MIXED /* non-HT STA associated to our BSS */ | }; | | +#define IEEE80211_CACHE_SIZE 100 | + | #endif /* _NET80211_IEEE80211_H_ */ | diff --git sys/net80211/ieee80211_ioctl.c sys/net80211/ieee80211_ioctl.c | index 4d6b7eb1b71..b41b4fe09d8 100644 | --- sys/net80211/ieee80211_ioctl.c | +++ sys/net80211/ieee80211_ioctl.c | @@ -391,8 +391,10 @@ ieee80211_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) | struct ieee80211com *ic = (void *)ifp; | struct ifreq *ifr = (struct ifreq *)data; | int i, error = 0; | + size_t len; | struct ieee80211_nwid nwid; | struct ieee80211_join join; | + struct ieee80211_joinreq_all *ja; | struct ieee80211_ess *ess; | struct ieee80211_wpapsk *psk; | struct ieee80211_keyavail *ka; | @@ -488,6 +490,26 @@ ieee80211_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) | } | } | break; | + case SIOCG80211JOINALL: | + ja = (struct ieee80211_joinreq_all *)data; | + ja->ja_nodes = len = 0; | + TAILQ_FOREACH(ess, &ic->ic_ess, ess_next) { | + if (len + sizeof(struct ieee80211_nodereq) >= | + ja->ja_size) { | + error = E2BIG; | + break; | + } | + memset(&join, 0, sizeof(struct ieee80211_join)); | + join.i_len = ess->esslen; | + memcpy(&join.i_nwid, ess->essid, join.i_len); | + error = copyout(&join, &ja->ja_node[ja->ja_nodes], | + sizeof(struct ieee80211_nodereq)); | + if (error) | + break; | + len += sizeof(struct ieee80211_join); | + ja->ja_nodes++; | + } | + break; | case SIOCS80211NWKEY: | if ((error = suser(curproc)) != 0) | break; | diff --git sys/net80211/ieee80211_ioctl.h sys/net80211/ieee80211_ioctl.h | index 9ea74127b22..ea19d8a9550 100644 | --- sys/net80211/ieee80211_ioctl.h | +++ sys/net80211/ieee80211_ioctl.h | @@ -275,6 +275,7 @@ struct ieee80211_keyrun { | | #define SIOCS80211SCAN _IOW('i', 210, struct ifreq) | | +#define SIOCG80211JOINALL _IOWR('i', 218, struct ieee80211_joinreq_all) | #define SIOCS80211JOIN _IOWR('i', 255, struct ifreq) | #define SIOCG80211JOIN _IOWR('i', 256, struct ifreq) | | @@ -288,6 +289,14 @@ struct ieee80211_join { | struct ieee80211_nwkey i_nwkey; | }; | | +struct ieee80211_joinreq_all { | + char ja_ifname[IFNAMSIZ]; | + int ja_nodes; /* returned count */ | + size_t ja_size; /* size of node buffer */ | + struct ieee80211_join *ja_node; /* allocated node buffer */ | +}; | + | + | #define IEEE80211_JOIN_SHOW 0x01 | #define IEEE80211_JOIN_FOUND 0x02 | #define IEEE80211_JOIN_DEL 0x04 | diff --git sys/net80211/ieee80211_node.h sys/net80211/ieee80211_node.h | index 882df583190..afd9b4ce438 100644 | --- sys/net80211/ieee80211_node.h | +++ sys/net80211/ieee80211_node.h | @@ -39,7 +39,7 @@ | #define IEEE80211_TRANS_WAIT 5 /* transition wait */ | #define IEEE80211_INACT_WAIT 5 /* inactivity timer interval */ | #define IEEE80211_INACT_MAX (300/IEEE80211_INACT_WAIT) | -#define IEEE80211_CACHE_SIZE 100 | + | #define IEEE80211_CACHE_WAIT 30 | | struct ieee80211_rateset { -- Todd T. Fries . http://todd.fries.net/pgp.txt . @unix2mars . github:toddfries