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_bin_check(struct ath_softc *sc, struct dfs_filter *rf, u_int32_t deltaT, u_int32_t width, int ext_chan_flag) { u_int32_t refpri, refdur, searchpri, deltapri,deltapri_2,deltapri_3, 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; int lowprichk=3,pri_match=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(sc, ext_chan_flag, (rf->rf_patterntype==1)); if(rf->rf_maxdur < 10) { durmargin = 4; } else { durmargin = 6; } if( rf->rf_patterntype == 1 ){ found = dfs_bin_fixedpattern_check(sc, rf, width, ext_chan_flag); 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; if (refpri < rf->rf_maxpri) { // use only valid PRI range for high score 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); deltapri_2 = DFS_DIFF(searchpri, 2*refpri); deltapri_3 = DFS_DIFF(searchpri, 3*refpri); if (rf->rf_ignore_pri_window==2) { pri_match = ((deltapri < primargin) || (deltapri_2 < primargin) || (deltapri_3 < primargin)); } else { pri_match = (deltapri < primargin); } if (pri_match) score[n]++; } } else { score[n] = 0; } 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 (rf->rf_ignore_pri_window > 0) { lowprichk = (rf->rf_threshold >> 1)+1; } else {