int dfs_bin_check(struct ath_dfs_host *dfs, struct dfs_filter *rf, u_int32_t deltaT, u_int32_t width, int ext_chan_flag, u_int32_t ext_chan_busy) { u_int32_t refpri, refdur, searchpri, deltapri, averagerefpri; u_int32_t n, i, primargin, durmargin, highscore, highscoreindex; int score[DFS_MAX_DL_SIZE], delayindex, dindex, found=0; struct dfs_delayline *dl; u_int32_t scoreindex, lowpriindex= 0, lowpri = 0xffff; int numpulses=0; dl = &rf->rf_dl; if( dl->dl_numelems < (rf->rf_threshold-1)) { return 0; } if( deltaT > rf->rf_filterlen) return 0; primargin = dfs_get_pri_margin(ext_chan_flag, (rf->rf_patterntype==1), dfs->dfs_rinfo.rn_lastfull_ts, ext_chan_busy); if(rf->rf_maxdur < 10) { durmargin = 4; } else { durmargin = 6; } if( rf->rf_patterntype == 1 ){ found = dfs_bin_fixedpattern_check(dfs, rf, width, ext_chan_flag, ext_chan_busy); if(found) { dl->dl_numelems = 0; } return found; } OS_MEMZERO(score, sizeof(int)*DFS_MAX_DL_SIZE); /* find out the lowest pri */ for (n=0;n<dl->dl_numelems; n++) { delayindex = (dl->dl_firstelem + n) & DFS_MAX_DL_MASK; refpri = dl->dl_elems[delayindex].de_time; if( refpri == 0) continue; else if(refpri < lowpri) { lowpri = dl->dl_elems[delayindex].de_time; lowpriindex = n; } } /* find out the each delay element's pri score */ for (n=0;n<dl->dl_numelems; n++) { delayindex = (dl->dl_firstelem + n) & DFS_MAX_DL_MASK; refpri = dl->dl_elems[delayindex].de_time; if( refpri == 0) continue; for (i=0;i<dl->dl_numelems; i++) { dindex = (dl->dl_firstelem + i) & DFS_MAX_DL_MASK; searchpri = dl->dl_elems[dindex].de_time; deltapri = DFS_DIFF(searchpri, refpri); if( deltapri < primargin) score[n]++; } if( score[n] > rf->rf_threshold) { /* we got the most possible candidate, * no need to continue further */ break; } } /* find out the high scorer */ highscore = 0; highscoreindex = 0; for (n=0;n<dl->dl_numelems; n++) { if( score[n] > highscore) { highscore = score[n]; highscoreindex = n; } else if( score[n] == highscore ) { /*more than one pri has highscore take the least pri */ delayindex = (dl->dl_firstelem + highscoreindex) & DFS_MAX_DL_MASK; dindex = (dl->dl_firstelem + n) & DFS_MAX_DL_MASK; if( dl->dl_elems[dindex].de_time <= dl->dl_elems[delayindex].de_time ) { highscoreindex = n; } } } /* find the average pri of pulses around the pri of highscore or * the pulses around the lowest pri */ if( highscore < 3) { scoreindex = lowpriindex; } else { scoreindex = highscoreindex; } /* We got the possible pri, save its parameters as reference */ delayindex = (dl->dl_firstelem + scoreindex) & DFS_MAX_DL_MASK; refdur = dl->dl_elems[delayindex].de_dur; refpri = dl->dl_elems[delayindex].de_time; averagerefpri = 0; numpulses = dfs_bin_pri_check(dfs, rf, dl, score[scoreindex], refpri, refdur, ext_chan_flag, ext_chan_busy); if (numpulses >= dfs_get_filter_threshold(rf, ext_chan_flag, dfs->dfs_rinfo.rn_lastfull_ts, ext_chan_busy)) { found = 1; DFS_DPRINTK(dfs, ATH_DEBUG_DFS1, "ext_flag=%d MATCH filter=%u numpulses=%u thresh=%u refpri=%d primargin=%d\n", ext_chan_flag, rf->rf_pulseid, numpulses,rf->rf_threshold, refpri, primargin); dfs_print_delayline(dfs, &rf->rf_dl); dfs_print_filter(dfs, rf); } return found; }
int dfs_staggered_check(struct ath_dfs_host *dfs, struct dfs_filter *rf, u_int32_t deltaT, u_int32_t width, u_int32_t ext_chan_busy) { u_int32_t refpri, refdur, searchpri=0, deltapri;/*, averagerefpri; */ u_int32_t n, i, primargin, durmargin; int score[DFS_MAX_DL_SIZE], delayindex, dindex, found=0; struct dfs_delayline *dl; u_int32_t scoreindex, lowpriindex= 0, lowpri = 0xffff; int numpulses=0, higherthan, lowerthan, numscores; u_int32_t lowestscore=0, lowestscoreindex=0, lowestpri=0; u_int32_t midscore=0, midscoreindex=0, midpri=0; u_int32_t highestscore=0, highestscoreindex=0, highestpri=0; dl = &rf->rf_dl; if( dl->dl_numelems < (rf->rf_threshold-1)) { DFS_DPRINTK(dfs, ATH_DEBUG_DFS2, "numelems %d < threshold for filter %d\n", dl->dl_numelems, rf->rf_pulseid); return 0; } if( deltaT > rf->rf_filterlen) { DFS_DPRINTK(dfs, ATH_DEBUG_DFS2, "numelems %d < threshold for filter %d\n", dl->dl_numelems, rf->rf_pulseid); return 0; } primargin = 10; if(rf->rf_maxdur < 10) { durmargin = 4; } else { durmargin = 6; } OS_MEMZERO(score, sizeof(int)*DFS_MAX_DL_SIZE); /* find out the lowest pri */ for (n=0;n<dl->dl_numelems; n++) { delayindex = (dl->dl_firstelem + n) & DFS_MAX_DL_MASK; refpri = dl->dl_elems[delayindex].de_time; if( refpri == 0) continue; else if(refpri < lowpri) { lowpri = dl->dl_elems[delayindex].de_time; lowpriindex = n; } } /* find out the each delay element's pri score */ for (n=0;n<dl->dl_numelems; n++) { delayindex = (dl->dl_firstelem + n) & DFS_MAX_DL_MASK; refpri = dl->dl_elems[delayindex].de_time; if( refpri == 0) continue; for (i=0;i<dl->dl_numelems; i++) { dindex = (dl->dl_firstelem + i) & DFS_MAX_DL_MASK; searchpri = dl->dl_elems[dindex].de_time; deltapri = DFS_DIFF(searchpri, refpri); if( deltapri < primargin) score[n]++; } if( score[n] > rf->rf_threshold) { /* we got the most possible candidate, * no need to continue further */ DFS_DPRINTK(dfs, ATH_DEBUG_DFS2, "THRESH score[%d]=%d pri=%d\n", n, score[n], searchpri); break; } } for (n=0;n<dl->dl_numelems; n++) { delayindex = (dl->dl_firstelem + n) & DFS_MAX_DL_MASK; refdur = dl->dl_elems[delayindex].de_time; DFS_DPRINTK(dfs, ATH_DEBUG_DFS2, "score[%d]=%d pri=%d\n", n, score[n], refdur); } /* find out the 2 or 3 highest scorers */ scoreindex = 0; highestscore=0; highestscoreindex=0; highestpri=0; numscores=0; lowestscore=0; for (n=0;n<dl->dl_numelems; n++) { higherthan=0; lowerthan=0; delayindex = (dl->dl_firstelem + n) & DFS_MAX_DL_MASK; refpri = dl->dl_elems[delayindex].de_time; if ((score[n] >= highestscore) && (is_unique_pri(highestpri, midpri, lowestpri, refpri))) { lowestscore = midscore; lowestpri = midpri; lowestscoreindex = midscoreindex; midscore = highestscore; midpri = highestpri; midscoreindex = highestscoreindex; highestscore = score[n]; highestpri = refpri; highestscoreindex = n; } else { if ((score[n] >= midscore) && (is_unique_pri(highestpri, midpri, lowestpri, refpri))) { lowestscore = midscore; lowestpri = midpri; lowestscoreindex = midscoreindex; midscore = score[n]; midpri = refpri; midscoreindex = n; } else if ((score[n] >= lowestscore) && (is_unique_pri(highestpri, midpri, lowestpri, refpri))) { lowestscore = score[n]; lowestpri = refpri; lowestscoreindex = n; } } } DFS_DPRINTK(dfs, ATH_DEBUG_DFS1, "FINAL highestscore=%d highestscoreindex=%d highestpri=%d\n", highestscore, highestscoreindex, highestpri); DFS_DPRINTK(dfs, ATH_DEBUG_DFS1, "FINAL lowestscore=%d lowestscoreindex=%d lowpri=%d\n", lowestscore, lowestscoreindex, lowestpri); DFS_DPRINTK(dfs, ATH_DEBUG_DFS1, "FINAL midscore=%d midscoreindex=%d midpri=%d\n", midscore, midscoreindex, midpri); delayindex = (dl->dl_firstelem + highestscoreindex) & DFS_MAX_DL_MASK; refdur = dl->dl_elems[delayindex].de_dur; refpri = dl->dl_elems[delayindex].de_time; DFS_DPRINTK(dfs, ATH_DEBUG_DFS1, "highscoreindex=%d refdur=%d refpri=%d\n", highestscoreindex, refdur, refpri); numpulses += dfs_bin_pri_check(dfs, rf, dl, highestscore, refpri, refdur, 0, ext_chan_busy); ; delayindex = (dl->dl_firstelem + midscoreindex) & DFS_MAX_DL_MASK; refdur = dl->dl_elems[delayindex].de_dur; refpri = dl->dl_elems[delayindex].de_time; DFS_DPRINTK(dfs, ATH_DEBUG_DFS1, "midscoreindex=%d refdur=%d refpri=%d\n", midscoreindex, refdur, refpri); numpulses += dfs_bin_pri_check(dfs, rf, dl, midscore, refpri, refdur, 0, ext_chan_busy); ; delayindex = (dl->dl_firstelem + lowestscoreindex) & DFS_MAX_DL_MASK; refdur = dl->dl_elems[delayindex].de_dur; refpri = dl->dl_elems[delayindex].de_time; DFS_DPRINTK(dfs, ATH_DEBUG_DFS1, "lowestscoreindex=%d refdur=%d refpri=%d\n", lowestscoreindex, refdur, refpri); numpulses += dfs_bin_pri_check(dfs, rf, dl, lowestscore, refpri, refdur, 0, ext_chan_busy); DFS_DPRINTK(dfs, ATH_DEBUG_DFS2, "numpulses=%d\n",numpulses); if (numpulses >= rf->rf_threshold) { found = 1; DFS_DPRINTK(dfs, ATH_DEBUG_DFS, "MATCH filter=%u numpulses=%u thresh=%u\n", rf->rf_pulseid, numpulses,rf->rf_threshold); } return found; }