On 12/11/15(Thu) 20:22, Stefan Sperling wrote: > This diff adds an initial implementation of 802.11n. > > [...]
Looks good. I think you should already put in the chunks below. Especially the one needed for ifconfig(8). I think I found a typo... > Index: net/if_media.h > =================================================================== > RCS file: /cvs/src/sys/net/if_media.h,v > retrieving revision 1.34 > diff -u -p -r1.34 if_media.h > --- net/if_media.h 11 Sep 2015 13:02:28 -0000 1.34 > +++ net/if_media.h 12 Nov 2015 15:33:07 -0000 ok mpi@ > Index: net80211/ieee80211.h > =================================================================== > RCS file: /cvs/src/sys/net80211/ieee80211.h,v > retrieving revision 1.53 > diff -u -p -r1.53 ieee80211.h > --- net80211/ieee80211.h 10 Oct 2015 07:51:47 -0000 1.53 > +++ net80211/ieee80211.h 12 Nov 2015 15:33:07 -0000 ok mpi@ > Index: net80211/ieee80211_amrr.c > =================================================================== > RCS file: /cvs/src/sys/net80211/ieee80211_amrr.c,v > retrieving revision 1.8 > diff -u -p -r1.8 ieee80211_amrr.c > --- net80211/ieee80211_amrr.c 23 Dec 2014 03:24:08 -0000 1.8 > +++ net80211/ieee80211_amrr.c 12 Nov 2015 15:33:07 -0000 This is ok and could go with the "struct ieee80211_node" growth. I like how you explain your design choice for adding MCS support and it would be nice to have that in the commit message. > void > ieee80211_amrr_node_init(const struct ieee80211_amrr *amrr, > Index: net80211/ieee80211_crypto_ccmp.c > =================================================================== > RCS file: /cvs/src/sys/net80211/ieee80211_crypto_ccmp.c,v > retrieving revision 1.16 > diff -u -p -r1.16 ieee80211_crypto_ccmp.c > --- net80211/ieee80211_crypto_ccmp.c 15 Jul 2015 22:16:42 -0000 1.16 > +++ net80211/ieee80211_crypto_ccmp.c 12 Nov 2015 15:33:07 -0000 > @@ -88,17 +88,18 @@ ieee80211_ccmp_phase1(rijndael_ctx *ctx, > /* construct AAD (additional authenticated data) */ > aad = &auth[2]; /* skip l(a), will be filled later */ > *aad = wh->i_fc[0]; > - /* 11w: conditionnally mask subtype field */ > + /* 11w: conditionally mask subtype field */ > if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == > IEEE80211_FC0_TYPE_DATA) > - *aad &= ~IEEE80211_FC0_SUBTYPE_MASK; > + *aad &= ~IEEE80211_FC0_SUBTYPE_MASK | > + IEEE80211_FC0_SUBTYPE_QOS; I believe this can go already with an explanation of the fix, right? > aad++; > /* protected bit is already set in wh */ > *aad = wh->i_fc[1]; > *aad &= ~(IEEE80211_FC1_RETRY | IEEE80211_FC1_PWR_MGT | > IEEE80211_FC1_MORE_DATA); > - /* 11n: conditionnally mask order bit */ > - if (ieee80211_has_htc(wh)) > + /* 11n: conditionally mask order bit */ > + if (ieee80211_has_qos(wh)) > *aad &= ~IEEE80211_FC1_ORDER; > aad++; > IEEE80211_ADDR_COPY(aad, wh->i_addr1); aad += IEEE80211_ADDR_LEN; > @@ -112,6 +113,10 @@ ieee80211_ccmp_phase1(rijndael_ctx *ctx, > aad += IEEE80211_ADDR_LEN; > } > if (ieee80211_has_qos(wh)) { > + /* > + * XXX 802.11-2012 11.4.3.3.3 g says the A-MSDU present bit > + * should be set here if both STAs are SPP A-MSDU capable. > + */ It's not clear to me why you left an XXX if you use "should". > *aad++ = tid = ieee80211_get_qos(wh) & IEEE80211_QOS_TID; > *aad++ = 0; > } > Index: net80211/ieee80211_ioctl.h > =================================================================== > RCS file: /cvs/src/sys/net80211/ieee80211_ioctl.h,v > retrieving revision 1.21 > diff -u -p -r1.21 ieee80211_ioctl.h > --- net80211/ieee80211_ioctl.h 9 Jan 2015 20:34:21 -0000 1.21 > +++ net80211/ieee80211_ioctl.h 12 Nov 2015 15:33:07 -0000 ok mpi@ > Index: net80211/ieee80211_node.c > =================================================================== > RCS file: /cvs/src/sys/net80211/ieee80211_node.c,v > retrieving revision 1.89 > diff -u -p -r1.89 ieee80211_node.c > --- net80211/ieee80211_node.c 4 Nov 2015 12:12:00 -0000 1.89 > +++ net80211/ieee80211_node.c 12 Nov 2015 15:33:07 -0000 That could also go with the structure growth. > Index: net80211/ieee80211_node.h > =================================================================== > RCS file: /cvs/src/sys/net80211/ieee80211_node.h,v > retrieving revision 1.47 > diff -u -p -r1.47 ieee80211_node.h > --- net80211/ieee80211_node.h 4 Nov 2015 12:12:00 -0000 1.47 > +++ net80211/ieee80211_node.h 12 Nov 2015 15:33:07 -0000 > @@ -112,8 +112,8 @@ struct ieee80211_tx_ba { > struct ieee80211_node *ba_ni; /* backpointer for callbacks */ > struct timeout ba_to; > int ba_timeout_val; > -#define IEEE80211_BA_MIN_TIMEOUT (10 * 1000) /* 10msec */ > -#define IEEE80211_BA_MAX_TIMEOUT (10 * 1000 * 1000) /* 10sec */ > +#define IEEE80211_BA_MIN_TIMEOUT (10 * 1000 * 1000) /* 10 sec */ > +#define IEEE80211_BA_MAX_TIMEOUT (10 * 1000 * 1000 * 60) /* 60 sec */ 60 sec should be (60 * 1000 * 1000) no? Apart from that this file is ok mpi@ > int ba_state; > #define IEEE80211_BA_INIT 0 > @@ -220,10 +220,31 @@ struct ieee80211_node { > struct timeout ni_sa_query_to; > int ni_sa_query_count; > > +#ifndef IEEE80211_NO_HT > + /* HT capabilities */ > + uint16_t ni_htcaps; > + uint8_t ni_ampdu_param; > + uint8_t ni_rxmcs[howmany(80,NBBY)]; > + uint16_t ni_max_rxrate; /* in Mb/s, 0 <= rate <= 1023 */ > + uint8_t ni_tx_mcs_set; > + uint16_t ni_htxcaps; > + uint32_t ni_txbfcaps; > + uint8_t ni_aselcaps; > + > + /* HT operation */ > + uint8_t ni_primary_chan; /* XXX corresponds to ni_chan > */ > + uint8_t ni_htop0; > + uint16_t ni_htop1; > + uint16_t ni_htop2; > + uint8_t ni_basic_mcs[howmany(128,NBBY)]; > + > /* Block Ack records */ > struct ieee80211_tx_ba ni_tx_ba[IEEE80211_NUM_TID]; > struct ieee80211_rx_ba ni_rx_ba[IEEE80211_NUM_TID]; > > + int ni_txmcs; /* current MCS used for TX */ > +#endif > + > /* others */ > u_int16_t ni_associd; /* assoc response */ > u_int16_t ni_txseq; /* seq to be transmitted */ > @@ -327,6 +348,12 @@ extern void ieee80211_iterate_nodes(stru > ieee80211_iter_func *, void *); > extern void ieee80211_clean_cached(struct ieee80211com *ic); > extern void ieee80211_clean_nodes(struct ieee80211com *, int); > +#ifndef IEEE80211_NO_HT > +void ieee80211_setup_htcaps(struct ieee80211_node *, const uint8_t *, > + uint8_t); > +void ieee80211_setup_htop(struct ieee80211_node *, const uint8_t *, > + uint8_t); > +#endif > extern int ieee80211_setup_rates(struct ieee80211com *, > struct ieee80211_node *, const u_int8_t *, const u_int8_t *, int); > extern int ieee80211_iserp_sta(const struct ieee80211_node *); > Index: net80211/ieee80211_radiotap.h > =================================================================== > RCS file: /cvs/src/sys/net80211/ieee80211_radiotap.h,v > retrieving revision 1.11 > diff -u -p -r1.11 ieee80211_radiotap.h > --- net80211/ieee80211_radiotap.h 17 Jul 2010 16:25:09 -0000 1.11 > +++ net80211/ieee80211_radiotap.h 12 Nov 2015 15:33:07 -0000 ok mpi@ > Index: net80211/ieee80211_var.h > =================================================================== > RCS file: /cvs/src/sys/net80211/ieee80211_var.h,v > retrieving revision 1.65 > diff -u -p -r1.65 ieee80211_var.h > --- net80211/ieee80211_var.h 4 Nov 2015 12:12:00 -0000 1.65 > +++ net80211/ieee80211_var.h 12 Nov 2015 15:33:07 -0000 ok mpi@