ok benno@

Stefan Sperling([email protected]) on 2016.04.27 13:36:51 +0200:
> I'd like to add some 802.11n-related counters to netstat -W output.
> 
> The first diff below is for the kernel, the second for netstat.
> 
> ok?
> 
> Index: ieee80211_input.c
> ===================================================================
> RCS file: /cvs/src/sys/net80211/ieee80211_input.c,v
> retrieving revision 1.171
> diff -u -p -r1.171 ieee80211_input.c
> --- ieee80211_input.c 15 Apr 2016 03:04:27 -0000      1.171
> +++ ieee80211_input.c 27 Apr 2016 11:30:08 -0000
> @@ -707,7 +707,7 @@ ieee80211_input_ba(struct ieee80211com *
>               timeout_add_usec(&ba->ba_to, ba->ba_timeout_val);
>  
>       if (SEQ_LT(sn, ba->ba_winstart)) {      /* SN < WinStartB */
> -             ic->ic_stats.is_rx_dup++;
> +             ic->ic_stats.is_ht_rx_frame_below_ba_winstart++;
>               m_freem(m);     /* discard the MPDU */
>               return;
>       }
> @@ -730,6 +730,7 @@ ieee80211_input_ba(struct ieee80211com *
>                           "%d, expecting %d:%d\n", __func__,
>                           sn, ba->ba_winstart, ba->ba_winend);
>  #endif
> +             ic->ic_stats.is_ht_rx_frame_above_ba_winend++;
>               if (count > ba->ba_winsize) {
>                       if (ba->ba_winmiss < IEEE80211_BA_MAX_WINMISS) { 
>                               if (ba->ba_missedsn == sn - 1)
> @@ -743,6 +744,7 @@ ieee80211_input_ba(struct ieee80211com *
>                       }
>  
>                       /* It appears the window has moved for real. */
> +                     ic->ic_stats.is_ht_rx_ba_window_jump++;
>                       ba->ba_winmiss = 0;
>                       ba->ba_missedsn = 0;
>  
> @@ -754,7 +756,8 @@ ieee80211_input_ba(struct ieee80211com *
>                               ieee80211_input(ifp, ba->ba_buf[ba->ba_head].m,
>                                   ni, &ba->ba_buf[ba->ba_head].rxi);
>                               ba->ba_buf[ba->ba_head].m = NULL;
> -                     }
> +                     } else
> +                             ic->ic_stats.is_ht_rx_ba_frame_lost++;
>                       ba->ba_head = (ba->ba_head + 1) %
>                           IEEE80211_BA_MAX_WINSZ;
>               }
> @@ -769,6 +772,7 @@ ieee80211_input_ba(struct ieee80211com *
>       /* store the received MPDU in the buffer */
>       if (ba->ba_buf[idx].m != NULL) {
>               ifp->if_ierrors++;
> +             ic->ic_stats.is_ht_rx_ba_no_buf++;
>               m_freem(m);
>               return;
>       }
> @@ -820,6 +824,8 @@ ieee80211_input_ba_gap_timeout(void *arg
>       struct ieee80211com *ic = ni->ni_ic;
>       int s, skipped;
>  
> +     ic->ic_stats.is_ht_rx_ba_window_gap_timeout++;
> +
>       s = splnet();
>  
>       skipped = 0;
> @@ -828,6 +834,7 @@ ieee80211_input_ba_gap_timeout(void *arg
>               ba->ba_head = (ba->ba_head + 1) % IEEE80211_BA_MAX_WINSZ;
>               ba->ba_winstart = (ba->ba_winstart + 1) & 0xfff;
>               skipped++;
> +             ic->ic_stats.is_ht_rx_ba_frame_lost++;
>       }
>       if (skipped > 0)
>               ba->ba_winend = (ba->ba_winstart + ba->ba_winsize - 1) & 0xfff;
> @@ -861,7 +868,8 @@ ieee80211_ba_move_window(struct ieee8021
>                       ieee80211_input(ifp, ba->ba_buf[ba->ba_head].m, ni,
>                           &ba->ba_buf[ba->ba_head].rxi);
>                       ba->ba_buf[ba->ba_head].m = NULL;
> -             }
> +             } else
> +                     ic->ic_stats.is_ht_rx_ba_frame_lost++;
>               ba->ba_head = (ba->ba_head + 1) % IEEE80211_BA_MAX_WINSZ;
>       }
>       /* move window forward */
> @@ -1580,6 +1588,7 @@ ieee80211_recv_probe_resp(struct ieee802
>                               DPRINTF(("[%s] htprot change: was %d, now %d\n",
>                                   ether_sprintf((u_int8_t *)wh->i_addr2),
>                                   htprot_last, htprot));
> +                             ic->ic_stats.is_ht_prot_change++;
>                               ic->ic_bss->ni_htop1 = ni->ni_htop1;
>                               ic->ic_update_htprot(ic, ic->ic_bss);
>                       }
> @@ -2491,6 +2500,7 @@ ieee80211_recv_addba_req(struct ieee8021
>               goto resp;
>       }
>       ba->ba_state = IEEE80211_BA_AGREED;
> +     ic->ic_stats.is_ht_rx_ba_agreements++;
>       /* start Block Ack inactivity timer */
>       if (ba->ba_timeout_val != 0)
>               timeout_add_usec(&ba->ba_to, ba->ba_timeout_val);
> @@ -2561,6 +2571,7 @@ ieee80211_recv_addba_resp(struct ieee802
>       }
>       /* MLME-ADDBA.confirm(Success) */
>       ba->ba_state = IEEE80211_BA_AGREED;
> +     ic->ic_stats.is_ht_tx_ba_agreements++;
>  
>       /* notify drivers of this new Block Ack agreement */
>       if (ic->ic_ampdu_tx_start != NULL)
> Index: ieee80211_ioctl.h
> ===================================================================
> RCS file: /cvs/src/sys/net80211/ieee80211_ioctl.h,v
> retrieving revision 1.23
> diff -u -p -r1.23 ieee80211_ioctl.h
> --- ieee80211_ioctl.h 12 Jan 2016 09:28:09 -0000      1.23
> +++ ieee80211_ioctl.h 27 Apr 2016 11:19:38 -0000
> @@ -95,6 +95,20 @@ struct ieee80211_stats {
>       u_int32_t       is_cmac_replays;
>       u_int32_t       is_cmac_icv_errs;
>       u_int32_t       is_pbac_errs;
> +     u_int32_t       is_ht_nego_no_mandatory_mcs;
> +     u_int32_t       is_ht_nego_no_basic_mcs;
> +     u_int32_t       is_ht_nego_bad_crypto;
> +     u_int32_t       is_ht_prot_change;
> +     u_int32_t       is_ht_rx_ba_agreements;
> +     u_int32_t       is_ht_tx_ba_agreements;
> +     u_int32_t       is_ht_rx_frame_below_ba_winstart;
> +     u_int32_t       is_ht_rx_frame_above_ba_winend;
> +     u_int32_t       is_ht_rx_ba_window_jump;
> +     u_int32_t       is_ht_rx_ba_no_buf;
> +     u_int32_t       is_ht_rx_ba_frame_lost;
> +     u_int32_t       is_ht_rx_ba_window_gap_timeout;
> +     u_int32_t       is_ht_rx_ba_timeout;
> +     u_int32_t       is_ht_tx_ba_timeout;
>  };
>  
>  #define      SIOCG80211STATS         _IOWR('i', 242, struct ifreq)
> Index: ieee80211_proto.c
> ===================================================================
> RCS file: /cvs/src/sys/net80211/ieee80211_proto.c,v
> retrieving revision 1.65
> diff -u -p -r1.65 ieee80211_proto.c
> --- ieee80211_proto.c 12 Apr 2016 14:33:27 -0000      1.65
> +++ ieee80211_proto.c 27 Apr 2016 10:42:05 -0000
> @@ -560,15 +560,19 @@ ieee80211_ht_negotiate(struct ieee80211c
>               return;
>  
>       /* Check if the peer supports HT. MCS 0-7 are mandatory. */
> -     if (ni->ni_rxmcs[0] != 0xff)
> +     if (ni->ni_rxmcs[0] != 0xff) {
> +             ic->ic_stats.is_ht_nego_no_mandatory_mcs++;
>               return;
> +     }
>  
>       if (ic->ic_opmode == IEEE80211_M_STA) {
>               /* We must support the AP's basic MCS set. */
>               for (i = 0; i < IEEE80211_HT_NUM_MCS; i++) {
>                       if (isset(ni->ni_basic_mcs, i) &&
> -                         !isset(ic->ic_sup_mcs, i))
> +                         !isset(ic->ic_sup_mcs, i)) {
> +                             ic->ic_stats.is_ht_nego_no_basic_mcs++;
>                               return;
> +                     }
>               }
>       }
>  
> @@ -576,12 +580,16 @@ ieee80211_ht_negotiate(struct ieee80211c
>        * Don't allow group cipher (includes WEP) or TKIP
>        * for pairwise encryption (see 802.11-2012 11.1.6).
>        */
> -     if (ic->ic_flags & IEEE80211_F_WEPON)
> +     if (ic->ic_flags & IEEE80211_F_WEPON) {
> +             ic->ic_stats.is_ht_nego_bad_crypto++;
>               return;
> +     }
>       if ((ic->ic_flags & IEEE80211_F_RSNON) &&
>           (ni->ni_rsnciphers & IEEE80211_CIPHER_USEGROUP ||
> -         ni->ni_rsnciphers & IEEE80211_CIPHER_TKIP))
> +         ni->ni_rsnciphers & IEEE80211_CIPHER_TKIP)) {
> +             ic->ic_stats.is_ht_nego_bad_crypto++;
>               return;
> +     }
>  
>       ni->ni_flags |= IEEE80211_NODE_HT; 
>  }
> @@ -595,6 +603,8 @@ ieee80211_tx_ba_timeout(void *arg)
>       u_int8_t tid;
>       int s;
>  
> +     ic->ic_stats.is_ht_tx_ba_timeout++;
> +
>       s = splnet();
>       if (ba->ba_state == IEEE80211_BA_REQUESTED) {
>               /* MLME-ADDBA.confirm(TIMEOUT) */
> @@ -618,6 +628,8 @@ ieee80211_rx_ba_timeout(void *arg)
>       u_int8_t tid;
>       int s;
>  
> +     ic->ic_stats.is_ht_rx_ba_timeout++;
> +
>       s = splnet();
>  
>       /* Block Ack inactivity timeout */
> 
> 
> 
> 
> Index: net80211.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/netstat/net80211.c,v
> retrieving revision 1.13
> diff -u -p -r1.13 net80211.c
> --- net80211.c        16 Jan 2015 06:40:10 -0000      1.13
> +++ net80211.c        27 Apr 2016 11:29:11 -0000
> @@ -114,6 +114,30 @@ net80211_ifstats(char *ifname)
>       p(is_cmac_replays, "\t%lu cmac replayed frame%s\n");
>       p(is_tkip_icv_errs, "\t%lu tkip icv error%s\n");
>       p(is_tkip_replays, "\t%lu tkip replay%s\n");
> +     p(is_pbac_errs, "\t%lu pbac error%s\n");
> +     p(is_ht_nego_no_mandatory_mcs, "\t%lu HT negotiation failure%s because "
> +         "peer does not support MCS 0-7\n");
> +     p(is_ht_nego_no_mandatory_mcs, "\t%lu HT negotiation failure%s because "
> +         "we do not support basic MCS set\n");
> +     p(is_ht_nego_bad_crypto,
> +         "\t%lu HT negotiation failure%s because peer uses bad crypto\n");
> +     p(is_ht_prot_change, "\t%lu HT protection change%s\n");
> +     p(is_ht_rx_ba_agreements, "\t%lu new input block ack agreement%s\n");
> +     p(is_ht_tx_ba_agreements, "\t%lu new output block ack agreement%s\n");
> +     p(is_ht_rx_frame_below_ba_winstart,
> +         "\t%lu input frame%s below block ack window start\n");
> +     p(is_ht_rx_frame_above_ba_winend,
> +         "\t%lu input frame%s above block ack window end\n");
> +     p(is_ht_rx_ba_window_jump, "\t%lu input block ack window jump%s\n");
> +     p(is_ht_rx_ba_no_buf, "\t%lu duplicate input block ack frame%s\n");
> +     p(is_ht_rx_ba_frame_lost,
> +         "\t%lu expected input block ack frame%s never arrived\n");
> +     p(is_ht_rx_ba_window_gap_timeout,
> +         "\t%lu input block ack window gap%s timed out\n");
> +     p(is_ht_rx_ba_timeout,
> +         "\t%lu input block ack agreement%s timed out\n");
> +     p(is_ht_tx_ba_timeout,
> +         "\t%lu output block ack agreement%s timed out\n");
>  
>       close(s);
>  
> 

-- 

Reply via email to