46#include <sys/malloc.h>
47#include <sys/kernel.h>
49#include <sys/socket.h>
50#include <sys/sockio.h>
51#include <sys/endian.h>
54#include <sys/sysctl.h>
57#include <net/if_media.h>
58#include <net/if_llc.h>
59#include <net/ethernet.h>
92 struct timeval *,
struct timeval *);
124 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
127#define HWMP_SEQ_LT(a, b) ((int32_t)((a)-(b)) < 0)
128#define HWMP_SEQ_LEQ(a, b) ((int32_t)((a)-(b)) <= 0)
129#define HWMP_SEQ_EQ(a, b) ((int32_t)((a)-(b)) == 0)
130#define HWMP_SEQ_GT(a, b) ((int32_t)((a)-(b)) > 0)
132#define HWMP_SEQ_MAX(a, b) (a > b ? a : b)
155static SYSCTL_NODE(_net_wlan, OID_AUTO, hwmp, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
156 "IEEE 802.11s HWMP parameters");
162 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
164 "path entry lifetime (ms)");
167 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
169 "maximum number of preq retries");
172 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
175 "estimate traversal time across the MBSS (ms)");
178 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
180 "root PREQ timeout (ms)");
183 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
185 "root interval (ms)");
188 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
190 "root announcement interval (ms)");
194 CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
196 "root confirmation interval (ms) (read-only)");
198#define IEEE80211_HWMP_DEFAULT_MAXHOPS 31
214 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
216 "mesh route inactivity timeout (ms)");
263 (
"not a mesh vap, opmode %d", vap->
iv_opmode));
268 printf(
"%s: couldn't alloc HWMP state\n", __func__);
324 if(iefrm[1] != (alloc_sz)) {
327 wh, NULL,
"PREQ (AE=%s) with wrong len",
351 wh, NULL,
"PREP (AE=%s) with wrong len",
367 const uint8_t *iefrm_t = iefrm;
374 wh, NULL,
"PERR with wrong number of destionat (>19), %u",
381 for(i = 0; i<ndest; i++) {
388 alloc_sz = (iefrm_t - iefrm) - 2;
389 if(alloc_sz != iefrm[1]) {
392 wh, NULL,
"%s",
"PERR with wrong len");
401 const uint8_t *frm,
const uint8_t *efrm)
408 const uint8_t *iefrm = frm + 2;
409 const uint8_t *iefrm_t = iefrm;
413 while (efrm - iefrm > 1) {
430 KASSERT(preq != NULL, (
"preq == NULL"));
437 preq->
preq_id = le32dec(iefrm_t); iefrm_t += 4;
448 preq->
preq_metric = le32dec(iefrm_t); iefrm_t += 4;
477 KASSERT(prep != NULL, (
"prep == NULL"));
494 prep->
prep_metric = le32dec(iefrm_t); iefrm_t += 4;
518 KASSERT(perr != NULL, (
"perr == NULL"));
558 wh, NULL,
"%s",
"RAN with wrong len");
562 memcpy(&rann, mrann,
sizeof(rann));
571 iefrm += iefrm[1] + 2;
576 wh, NULL,
"%s",
"PATH SEL action without IE");
585 uint8_t *ie,
size_t len)
596#ifdef IEEE80211_DEBUG_REFCNT
598 "ieee80211_ref_node (%s:%u) %p<%s> refcnt %d\n",
610 "block %s frame in CAC state",
"HWMP action");
615 KASSERT(ni != NULL, (
"null node"));
648 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *);
665 memset(¶ms, 0,
sizeof(params));
678#define ADDSHORT(frm, v) do { \
682#define ADDWORD(frm, v) do { \
689#define PREQ_TFLAGS(n) preq->preq_targets[n].target_flags
690#define PREQ_TADDR(n) preq->preq_targets[n].target_addr
691#define PREQ_TSEQ(n) preq->preq_targets[n].target_seq
751#define PERR_DFLAGS(n) perr->perr_dests[n].dest_flags
752#define PERR_DADDR(n) perr->perr_dests[n].dest_addr
753#define PERR_DSEQ(n) perr->perr_dests[n].dest_seq
754#define PERR_EXTADDR(n) perr->perr_dests[n].dest_ext_addr
755#define PERR_DRCODE(n) perr->perr_dests[n].dest_rcode
811 ms->
ms_flags &= ~IEEE80211_MESHFLAGS_ROOT;
831#define PREQ_TFLAGS(n) preq.preq_targets[n].target_flags
832#define PREQ_TADDR(n) preq.preq_targets[n].target_addr
833#define PREQ_TSEQ(n) preq.preq_targets[n].target_seq
843 "%s",
"send broadcast PREQ");
884 "%s",
"send broadcast RANN");
906 const char *hwmp_frame)
913 if (rttran == NULL) {
915 if (rttran == NULL) {
917 "unable to add path to transmitter %6D of %s",
928 "%s path to transmitter %6D of %s, metric %d:%d",
930 "prefer" :
"update", ni->
ni_macaddr,
":", hwmp_frame,
940#define PREQ_TFLAGS(n) preq->preq_targets[n].target_flags
941#define PREQ_TADDR(n) preq->preq_targets[n].target_addr
942#define PREQ_TSEQ(n) preq->preq_targets[n].target_seq
965 "received PREQ, orig %6D, targ(0) %6D", preq->
preq_origaddr,
":",
997 "unicast addressed PREQ of unknown target %6D",
1005 if (rtorig == NULL) {
1007 if (rtorig == NULL) {
1009 "unable to add orig path to %6D",
1029 metric < rtorig->rt_metric)) {
1040 }
else if ((hrtarg != NULL &&
1045 "discard PREQ from %6D, old seqno %u <= %u,"
1046 " or old preqid %u < %u",
1078 if (rttarg != NULL &&
1081 "reply for proxy %6D", rttarg->
rt_dest,
":");
1109 if (rtorig_ext == NULL) {
1112 if (rtorig_ext == NULL) {
1114 "unable to add orig ext proxy to %6D",
1174 memcpy(&ppreq, preq,
sizeof(ppreq));
1180 if (rttarg != NULL &&
1193 "intermediate reply for PREQ from %6D",
1218 "forward PREQ from %6D",
1236 struct timeval *last,
struct timeval *minint)
1243 if (last != NULL && minint != NULL) {
1244 if (ratecheck(last, minint) == 0)
1246 getmicrouptime(last);
1269#define IS_PROXY(rt) (rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY)
1270#define PROXIED_BY_US(rt) \
1271 (IEEE80211_ADDR_EQ(vap->iv_myaddr, rt->rt_mesh_gate))
1279 struct mbuf *m, *next;
1280 uint32_t metric = 0;
1281 const uint8_t *addr;
1284 "received PREP, orig %6D, targ %6D", prep->
prep_origaddr,
":",
1297 "discard PREP, orig(%6D) not proxied or generated by us",
1316 "unable to add PREP path to %6D",
1330 "discard PREP from %6D, old seq no %u < %u",
1337 "discard PREP from %6D, new metric %u > %u",
1345 "%s path to %6D, hopcount %d:%d metric %d:%d",
1347 "prefer" :
"update",
1360 rt->
rt_flags &= ~IEEE80211_MESHRT_FLAGS_DISCOVER;
1380 if (rtorig == NULL) {
1382 "received PREP for an unknown orig(%6D)",
1388 "propagate PREP from %6D",
1391 memcpy(&pprep, prep,
sizeof(pprep));
1408 if (rtext == NULL) {
1411 if (rtext == NULL) {
1413 "unable to add PREP path to proxy %6D",
1420 "%s path to %6D, hopcount %d:%d metric %d:%d",
1422 "prefer" :
"update",
1460 for (; m != NULL; m = next) {
1461 next = m->m_nextpkt;
1462 m->m_nextpkt = NULL;
1464 "flush queued frame %p len %d", m, m->m_pkthdr.len);
1497#define PERR_DFLAGS(n) perr.perr_dests[n].dest_flags
1498#define PERR_DADDR(n) perr.perr_dests[n].dest_addr
1499#define PERR_DSEQ(n) perr.perr_dests[n].dest_seq
1500#define PERR_DRCODE(n) perr.perr_dests[n].dest_rcode
1515 "%s",
"delete route entry");
1534#define PERR_DFLAGS(n) perr->perr_dests[n].dest_flags
1535#define PERR_DADDR(n) perr->perr_dests[n].dest_addr
1536#define PERR_DSEQ(n) perr->perr_dests[n].dest_seq
1537#define PERR_DEXTADDR(n) perr->perr_dests[n].dest_ext_addr
1547 int i, j = 0, forward = 0;
1550 "received PERR from %6D", wh->
i_addr2,
":");
1589 rt->
rt_flags &= ~IEEE80211_MESHRT_FLAGS_VALID;
1595 rt->
rt_flags &= ~IEEE80211_MESHRT_FLAGS_VALID;
1601 if (rt_ext != NULL) {
1603 ~IEEE80211_MESHRT_FLAGS_VALID;
1609 "PERR, unknown reason code %u\n",
PERR_DFLAGS(i));
1613 KASSERT(j < 32, (
"PERR, error ndest >= 32 (%u)", j));
1617 "PERR not accepted");
1624 if (forward && perr->
perr_ttl > 1) {
1626 "propagate PERR from %6D", wh->
i_addr2,
":");
1684#define PERR_DFLAGS(n) perr.perr_dests[n].dest_flags
1685#define PERR_DADDR(n) perr.perr_dests[n].dest_addr
1686#define PERR_DSEQ(n) perr.perr_dests[n].dest_seq
1687#define PERR_DEXTADDR(n) perr.perr_dests[n].dest_ext_addr
1688#define PERR_DRCODE(n) perr.perr_dests[n].dest_rcode
1713 KASSERT(rt != NULL, (
"no proxy info for sending PERR"));
1715 (
"route is not marked proxy"));
1722 KASSERT(rt != NULL, (
"no route info for sending PERR"));
1727 KASSERT(0, (
"unknown reason code for HWMP PERR (%u)", rcode));
1780 "unable to add mac for RANN root %6D",
1822 memcpy(&prann, rann,
sizeof(prann));
1849#define PREQ_TFLAGS(n) preq.preq_targets[n].target_flags
1850#define PREQ_TADDR(n) preq.preq_targets[n].target_addr
1851#define PREQ_TSEQ(n) preq.preq_targets[n].target_seq
1870 "max number of discovery, send queued frames to GATE");
1879 "start path rediscovery , target seq %u", hr->
hr_seq);
1920 (
"not a mesh vap, opmode %d", vap->
iv_opmode));
1923 (
"%s: discovering self!", __func__));
1932 ni,
"unable to add discovery path to %6D",
1942 "%s",
"already discovering queue frame until path found");
1952 "too frequent discovery requeust");
1961 "no valid path , max number of discovery");
1972 "start path discovery (src %s), target seq %u",
1973 m == NULL ?
"<none>" : ether_sprintf(
1974 mtod(m,
struct ether_header *)->ether_shost),
2008 KASSERT(ni != NULL, (
"leak mcast frame"));
2012 if (ni == NULL && m != NULL) {
2021 "%s",
"queue frame until path found");
2022 MPASS((m->m_pkthdr.csum_flags & CSUM_SND_TAG) == 0);
2023 m->m_pkthdr.rcvif = (
void *)(uintptr_t)
2030 dest, NULL,
"%s",
"no valid path to this node");
#define IEEE80211_NONQOS_TID
uint32_t ieee80211_mac_hash(const struct ieee80211com *ic, const uint8_t addr[IEEE80211_ADDR_LEN])
#define IEEE80211_FC0_SUBTYPE_ACTION
#define IEEE80211_ADDR_LEN
#define IEEE80211_FC0_TYPE_MGT
#define IEEE80211_IS_MULTICAST(_a)
#define IEEE80211_ACTION_CAT_MESH
@ IEEE80211_REASON_MESH_PERR_NO_PROXY
@ IEEE80211_REASON_MESH_PERR_NO_FI
@ IEEE80211_REASON_MESH_PERR_DEST_UNREACH
@ IEEE80211_ELEMID_MESHPERR
@ IEEE80211_ELEMID_MESHPREQ
@ IEEE80211_ELEMID_MESHRANN
@ IEEE80211_ELEMID_MESHPREP
int ieee80211_recv_action_register(int cat, int act, ieee80211_recv_action_func *f)
int ieee80211_recv_action_func(struct ieee80211_node *, const struct ieee80211_frame *, const uint8_t *, const uint8_t *)
int ieee80211_ageq_append(struct ieee80211_ageq *aq, struct mbuf *m, int age)
struct mbuf * ieee80211_ageq_remove(struct ieee80211_ageq *aq, struct ieee80211_node *match)
int ieee80211_sysctl_msecs_ticks(SYSCTL_HANDLER_ARGS)
struct mbuf * ieee80211_getmgtframe(uint8_t **frm, int headroom, int pktlen)
int ieee80211_vap_xmitpkt(struct ieee80211vap *vap, struct mbuf *m)
#define IEEE80211_M_NOWAIT
#define msecs_to_ticks(ms)
#define IEEE80211_TX_LOCK(_ic)
#define ieee80211_node_refcnt(_ni)
#define ticks_to_msecs(t)
#define IEEE80211_TX_UNLOCK(_ic)
static uint8_t * hwmp_add_meshpreq(uint8_t *, const struct ieee80211_meshpreq_ie *)
#define HWMP_SEQ_GT(a, b)
static void hwmp_recv_prep(struct ieee80211vap *, struct ieee80211_node *, const struct ieee80211_frame *, const struct ieee80211_meshprep_ie *)
#define HWMP_SEQ_LEQ(a, b)
static uint8_t * hwmp_add_meshperr(uint8_t *, const struct ieee80211_meshperr_ie *)
static SYSCTL_NODE(_net_wlan, OID_AUTO, hwmp, CTLFLAG_RD|CTLFLAG_MPSAFE, 0, "IEEE 802.11s HWMP parameters")
static void hwmp_update_transmitter(struct ieee80211vap *vap, struct ieee80211_node *ni, const char *hwmp_frame)
static int hwmp_ioctl_set80211(struct ieee80211vap *vap, struct ieee80211req *ireq)
static uint8_t * hwmp_add_meshprep(uint8_t *, const struct ieee80211_meshprep_ie *)
#define HWMP_SEQ_EQ(a, b)
static int ieee80211_hwmp_targetonly
static void hwmp_recv_preq(struct ieee80211vap *, struct ieee80211_node *, const struct ieee80211_frame *, const struct ieee80211_meshpreq_ie *)
static ieee80211_recv_action_func hwmp_recv_action_meshpath
static void hwmp_rootmode_rann_cb(void *)
#define HWMP_SEQ_LT(a, b)
#define IEEE80211_HWMP_DEFAULT_MAXHOPS
static struct ieee80211_mesh_proto_path mesh_proto_hwmp
static int hwmp_send_prep(struct ieee80211vap *, const uint8_t[IEEE80211_ADDR_LEN], struct ieee80211_meshprep_ie *)
static int ieee80211_hwmp_rootconfint_internal
SYSCTL_INT(_net_wlan_hwmp, OID_AUTO, targetonly, CTLFLAG_RW, &ieee80211_hwmp_targetonly, 0, "Set TO bit on generated PREQs")
static int hwmp_newstate(struct ieee80211vap *, enum ieee80211_state, int)
static void hwmp_vdetach(struct ieee80211vap *)
static void hwmp_rootmode_setup(struct ieee80211vap *)
static struct timeval ieee80211_hwmp_rootconfint
static struct timeval ieee80211_hwmp_perrminint
static int hwmp_send_perr(struct ieee80211vap *, const uint8_t[IEEE80211_ADDR_LEN], struct ieee80211_meshperr_ie *)
static int hwmp_ioctl_get80211(struct ieee80211vap *vap, struct ieee80211req *ireq)
static int ieee80211_hwmp_net_diameter_traversaltime
static struct timeval ieee80211_hwmp_preqminint
SYSINIT(wlan_hwmp, SI_SUB_DRIVERS, SI_ORDER_SECOND, ieee80211_hwmp_init, NULL)
static int verify_mesh_perr_len(struct ieee80211vap *vap, const struct ieee80211_frame *wh, const uint8_t *iefrm)
SYSCTL_PROC(_net_wlan_hwmp, OID_AUTO, pathlifetime, CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_MPSAFE, &ieee80211_hwmp_pathtimeout, 0, ieee80211_sysctl_msecs_ticks, "I", "path entry lifetime (ms)")
static void hwmp_recv_perr(struct ieee80211vap *, struct ieee80211_node *, const struct ieee80211_frame *, const struct ieee80211_meshperr_ie *)
static int hwmp_send_preq(struct ieee80211vap *, const uint8_t[IEEE80211_ADDR_LEN], struct ieee80211_meshpreq_ie *, struct timeval *, struct timeval *)
static int verify_mesh_preq_len(struct ieee80211vap *vap, const struct ieee80211_frame *wh, const uint8_t *iefrm)
#define HWMP_SEQ_MAX(a, b)
uint32_t ieee80211_hwmp_seq
static int ieee80211_hwmp_rootint
static int hwmp_send_rann(struct ieee80211vap *, const uint8_t[IEEE80211_ADDR_LEN], struct ieee80211_meshrann_ie *)
static int hwmp_send_action(struct ieee80211vap *, const uint8_t[IEEE80211_ADDR_LEN], uint8_t *, size_t)
static int ieee80211_hwmp_roottimeout
static void hwmp_recv_rann(struct ieee80211vap *, struct ieee80211_node *, const struct ieee80211_frame *, const struct ieee80211_meshrann_ie *)
IEEE80211_IOCTL_GET(hwmp, hwmp_ioctl_get80211)
static struct ieee80211_node * hwmp_discover(struct ieee80211vap *, const uint8_t[IEEE80211_ADDR_LEN], struct mbuf *)
static void hwmp_rediscover_cb(void *arg)
#define PROXIED_BY_US(rt)
static uint8_t * hwmp_add_meshrann(uint8_t *, const struct ieee80211_meshrann_ie *)
static void ieee80211_hwmp_init(void)
static void hwmp_senderror(struct ieee80211vap *, const uint8_t[IEEE80211_ADDR_LEN], struct ieee80211_mesh_route *, int)
static int verify_mesh_prep_len(struct ieee80211vap *vap, const struct ieee80211_frame *wh, const uint8_t *iefrm)
static int ieee80211_hwmp_maxpreq_retries
static void hwmp_rootmode_cb(void *)
static void hwmp_peerdown(struct ieee80211_node *)
static int ieee80211_hwmp_pathtimeout
IEEE80211_IOCTL_SET(hwmp, hwmp_ioctl_set80211)
static void hwmp_vattach(struct ieee80211vap *)
static const uint8_t broadcastaddr[IEEE80211_ADDR_LEN]
static int ieee80211_hwmp_rannint
#define IEEE80211_MESHRT_FLAGS_VALID
#define IEEE80211_MESHRT_FLAGS_GATE
#define IEEE80211_IOC_HWMP_ROOTMODE
#define IEEE80211_MESHRT_FLAGS_PROXY
#define IEEE80211_MESHRT_FLAGS_DISCOVER
@ IEEE80211_HWMP_ROOTMODE_DISABLED
@ IEEE80211_HWMP_ROOTMODE_RANN
@ IEEE80211_HWMP_ROOTMODE_NORMAL
@ IEEE80211_HWMP_ROOTMODE_PROACTIVE
#define IEEE80211_IOC_HWMP_MAXHOPS
struct ieee80211_node * ieee80211_mesh_find_txnode(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN])
int ieee80211_mesh_register_proto_path(const struct ieee80211_mesh_proto_path *mpp)
struct ieee80211_mesh_gate_route * ieee80211_mesh_mark_gate(struct ieee80211vap *vap, const uint8_t *addr, struct ieee80211_mesh_route *rt)
int ieee80211_mesh_rt_update(struct ieee80211_mesh_route *rt, int new_lifetime)
void ieee80211_mesh_forward_to_gates(struct ieee80211vap *vap, struct ieee80211_mesh_route *rt_dest)
struct ieee80211_mesh_route * ieee80211_mesh_rt_find(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN])
void ieee80211_mesh_rt_flush_peer(struct ieee80211vap *vap, const uint8_t peer[IEEE80211_ADDR_LEN])
struct ieee80211_mesh_route * ieee80211_mesh_rt_add(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN])
@ IEEE80211_MESHCONF_PATH_HWMP
#define IEEE80211_MESHLMETRIC_INITIALVAL
#define IEEE80211_MESHPERR_DEST_SZ_AE
#define IEEE80211_MESHPREQ_TCNT_OFFSET
#define IEEE80211_MESHPERR_FLAGS_AE
#define IEEE80211_MESHFLAGS_ROOT
#define IEEE80211_MESHPREQ_FLAGS_PP
#define IEEE80211_MESHPREP_FLAGS_AE
#define IEEE80211_MESHPERR_DFLAGS_RC
#define IEEE80211_MESHPERR_BASE_SZ
#define IEEE80211_MESHPERR_NDEST_OFFSET
#define IEEE80211_MESHFLAGS_FWD
#define IEEE80211_MESHPREQ_TRGT_SZ
#define IEEE80211_MESH_ROUTE_PRIV(rt, cast)
#define IEEE80211_MESHPREQ_FLAGS_AM
#define IEEE80211_MESHPREQ_FLAGS_AE
#define IEEE80211_MESHPREQ_FLAGS_GATE
#define IEEE80211_MESHPREQ_TFLAGS_TO
#define IEEE80211_MESHPERR_DEST_SZ
#define IEEE80211_MESHPREP_BASE_SZ
#define IEEE80211_MESHPERR_DFLAGS_USN
#define IEEE80211_MESHPREQ_TCNT_OFFSET_AE
#define IEEE80211_MESHPREQ_BASE_SZ
#define IEEE80211_MESHRANN_FLAGS_GATE
#define IEEE80211_MESHPREQ_TFLAGS_USN
#define IEEE80211_MESHRANN_BASE_SZ
#define IEEE80211_MESHPREP_BASE_SZ_AE
#define IEEE80211_MESHPERR_MAXDEST
@ IEEE80211_ACTION_MESH_HWMP
#define IEEE80211_MESHPREQ_BASE_SZ_AE
#define IEEE80211_MESHFLAGS_GATE
void ieee80211_free_node(struct ieee80211_node *ni)
struct ieee80211_node * ieee80211_find_txnode(struct ieee80211vap *vap, const uint8_t macaddr[IEEE80211_ADDR_LEN])
#define IEEE80211_INACT_WAIT
#define IEEE80211_NODE_STAT(ni, stat)
static __inline struct ieee80211_node * ieee80211_ref_node(struct ieee80211_node *ni)
void ieee80211_send_setup(struct ieee80211_node *ni, struct mbuf *m, int type, int tid, const uint8_t sa[IEEE80211_ADDR_LEN], const uint8_t da[IEEE80211_ADDR_LEN], const uint8_t bssid[IEEE80211_ADDR_LEN])
int ieee80211_raw_output(struct ieee80211vap *vap, struct ieee80211_node *ni, struct mbuf *m, const struct ieee80211_bpf_params *params)
const char * ieee80211_state_name[IEEE80211_S_MAX]
#define IEEE80211_MSG_STATE
#define IEEE80211_ADDR_COPY(dst, src)
#define IEEE80211_MSG_OUTPUT
#define IEEE80211_MSG_HWMP
#define IEEE80211_MSG_ANY
#define IEEE80211_NOTE_MAC(_vap, _m, _mac, _fmt,...)
#define IEEE80211_MSG_NODE
#define IEEE80211_ADDR_EQ(a1, a2)
#define IEEE80211_NOTE(_vap, _m, _ni, _fmt,...)
#define IEEE80211_DISCARD_MAC(_vap, _m, _mac, _type, _fmt,...)
#define IEEE80211_DPRINTF(_vap, _m, _fmt,...)
#define IEEE80211_DISCARD(_vap, _m, _wh, _type, _fmt,...)
#define IEEE80211_MSG_ACTION
uint8_t i_addr2[IEEE80211_ADDR_LEN]
struct timeval hr_lastpreq
ieee80211_hwmp_seq hr_seq
ieee80211_hwmp_seq hr_origseq
ieee80211_hwmp_seq hr_preqid
struct timeval hr_lastrootconf
struct timeval hs_lastperr
struct callout hs_roottimer
ieee80211_hwmp_seq hs_preqid
ieee80211_hwmp_seq hs_seq
uint32_t(* mpm_metric)(struct ieee80211_node *)
char mpp_descr[IEEE80211_MESH_PROTO_DSZ]
struct ieee80211vap * rt_vap
struct callout rt_discovery
uint8_t rt_nexthop[IEEE80211_ADDR_LEN]
uint8_t rt_mesh_gate[IEEE80211_ADDR_LEN]
uint8_t rt_dest[IEEE80211_ADDR_LEN]
struct ieee80211_mesh_proto_metric * ms_pmetric
struct ieee80211_mesh_proto_path * ms_ppath
uint8_t dest_addr[IEEE80211_ADDR_LEN]
uint8_t dest_ext_addr[IEEE80211_ADDR_LEN]
struct ieee80211_meshperr_ie::@23 perr_dests[1]
uint8_t prep_targetaddr[IEEE80211_ADDR_LEN]
uint8_t prep_origaddr[IEEE80211_ADDR_LEN]
uint8_t prep_target_ext_addr[IEEE80211_ADDR_LEN]
uint8_t target_addr[IEEE80211_ADDR_LEN]
uint8_t preq_orig_ext_addr[IEEE80211_ADDR_LEN]
uint8_t preq_origaddr[IEEE80211_ADDR_LEN]
struct ieee80211_meshpreq_ie::@22 preq_targets[1]
uint8_t rann_addr[IEEE80211_ADDR_LEN]
struct ieee80211com * ni_ic
uint8_t ni_macaddr[IEEE80211_ADDR_LEN]
struct ieee80211vap * ni_vap
const struct ieee80211_txparam * ni_txparms
uint32_t is_hwmp_rootrann
uint32_t is_hwmp_rootreqs
uint32_t is_rx_mgtdiscard
uint32_t is_mesh_fwd_nopath
uint32_t is_mesh_rtaddfailed
struct ieee80211_ageq ic_stageq
struct ieee80211com * iv_ic
struct ieee80211_node * iv_bss
enum ieee80211_opmode iv_opmode
uint8_t iv_myaddr[IEEE80211_ADDR_LEN]
struct ieee80211_stats iv_stats
struct ieee80211_mesh_state * iv_mesh
enum ieee80211_state iv_state
struct ieee80211_hwmp_state * iv_hwmp