static void tdma_vdetach(struct ieee80211vap *vap) { struct ieee80211_tdma_state *ts = vap->iv_tdma; if (ts == NULL) { /* NB: should not have touched any ic state */ return; } ts->tdma_opdetach(vap); free(vap->iv_tdma, M_80211_VAP); vap->iv_tdma = NULL; setackpolicy(vap->iv_ic, 0); /* enable ACK's */ }
void ieee80211_tdma_vattach(struct ieee80211vap *vap) { struct ieee80211_tdma_state *ts; KASSERT(vap->iv_caps & IEEE80211_C_TDMA, ("not a tdma vap, caps 0x%x", vap->iv_caps)); ts = (struct ieee80211_tdma_state *) IEEE80211_MALLOC( sizeof(struct ieee80211_tdma_state), M_80211_VAP, IEEE80211_M_NOWAIT | IEEE80211_M_ZERO); if (ts == NULL) { printf("%s: cannot allocate TDMA state block\n", __func__); /* NB: fall back to adhdemo mode */ vap->iv_caps &= ~IEEE80211_C_TDMA; return; } /* NB: default configuration is passive so no beacons */ ts->tdma_version = TDMA_VERSION; ts->tdma_slotlen = TDMA_SLOTLEN_DEFAULT; ts->tdma_slotcnt = TDMA_SLOTCNT_DEFAULT; ts->tdma_bintval = TDMA_BINTVAL_DEFAULT; ts->tdma_slot = 1; /* passive operation */ /* setup default fixed rates */ settxparms(vap, IEEE80211_MODE_11A, TDMA_TXRATE_11A_DEFAULT); settxparms(vap, IEEE80211_MODE_11B, TDMA_TXRATE_11B_DEFAULT); settxparms(vap, IEEE80211_MODE_11G, TDMA_TXRATE_11G_DEFAULT); settxparms(vap, IEEE80211_MODE_TURBO_A, TDMA_TXRATE_TURBO_DEFAULT); settxparms(vap, IEEE80211_MODE_TURBO_G, TDMA_TXRATE_TURBO_DEFAULT); settxparms(vap, IEEE80211_MODE_STURBO_A, TDMA_TXRATE_TURBO_DEFAULT); settxparms(vap, IEEE80211_MODE_11NA, TDMA_TXRATE_11NA_DEFAULT); settxparms(vap, IEEE80211_MODE_11NG, TDMA_TXRATE_11NG_DEFAULT); settxparms(vap, IEEE80211_MODE_HALF, TDMA_TXRATE_HALF_DEFAULT); settxparms(vap, IEEE80211_MODE_QUARTER, TDMA_TXRATE_QUARTER_DEFAULT); setackpolicy(vap->iv_ic, 1); /* disable ACK's */ ts->tdma_opdetach = vap->iv_opdetach; vap->iv_opdetach = tdma_vdetach; ts->tdma_newstate = vap->iv_newstate; vap->iv_newstate = tdma_newstate; vap->iv_bmiss = tdma_beacon_miss; ts->tdma_recv_mgmt = vap->iv_recv_mgmt; vap->iv_recv_mgmt = tdma_recv_mgmt; vap->iv_tdma = ts; }