Changeset 17279


Ignore:
Timestamp:
2009-08-15T23:36:37+02:00 (8 years ago)
Author:
nbd
Message:

merge madwifi and wprobe into 8.09

Location:
branches/8.09/package
Files:
16 added
2 deleted
38 edited
1 moved

Legend:

Unmodified
Added
Removed
  • branches/8.09/package/madwifi/files/lib/wifi/madwifi.sh

    r16722 r17279  
    55        local device="$1" 
    66        local wds 
    7         local adhoc sta ap 
     7        local adhoc ahdemo sta ap monitor 
    88         
    99        config_get vifs "$device" vifs 
     
    8585        [ auto = "$channel" ] && channel=0 
    8686 
    87         local first=1 
     87        config_get_bool antdiv "$device" diversity 
     88        config_get antrx "$device" rxantenna 
     89        config_get anttx "$device" txantenna 
     90        config_get_bool softled "$device" softled 1 
     91 
     92        devname="$(cat /proc/sys/dev/$device/dev_name)" 
     93        antgpio= 
     94        case "$devname" in 
     95                NanoStation2) antgpio=7;; 
     96                NanoStation5) antgpio=1;; 
     97        esac 
     98        if [ -n "$antgpio" ]; then 
     99                softled=0 
     100                config_get antenna "$device" antenna 
     101                case "$antenna" in 
     102                        external) antdiv=0; antrx=1; anttx=1 ;; 
     103                        horizontal) antdiv=0; antrx=1; anttx=1 ;; 
     104                        vertical) antdiv=0; antrx=2; anttx=2 ;; 
     105                        auto) antdiv=1; antrx=0; anttx=0 ;; 
     106                esac 
     107                         
     108                [ -x "$(which gpioctl 2>/dev/null)" ] || antenna= 
     109                case "$antenna" in 
     110                        horizontal|vertical|auto) 
     111                                gpioctl "dirout" "$antgpio" >/dev/null 2>&1 
     112                                gpioctl "set" "$antgpio" >/dev/null 2>&1 
     113                        ;; 
     114                        external) 
     115                                gpioctl "dirout" "$antgpio" >/dev/null 2>&1 
     116                                gpioctl "clear" "$antgpio" >/dev/null 2>&1 
     117                        ;; 
     118                esac 
     119        fi 
     120 
     121        [ -n "$antdiv" ] && sysctl -w dev."$device".diversity="$antdiv" >&- 
     122        [ -n "$antrx" ] && sysctl -w dev."$device".rxantenna="$antrx" >&- 
     123        [ -n "$anttx" ] && sysctl -w dev."$device".txantenna="$anttx" >&- 
     124        [ -n "$softled" ] && sysctl -w dev."$device".softled="$softled" >&- 
     125 
     126        config_get distance "$device" distance 
     127        [ -n "$distance" ] && sysctl -w dev."$device".distance="$distance" >&- 
     128 
    88129        for vif in $vifs; do 
    89                 local start_hostapd vif_txpower 
    90                 nosbeacon= 
     130                local start_hostapd= vif_txpower= nosbeacon= 
    91131                config_get ifname "$vif" ifname 
    92132                config_get enc "$vif" encryption 
     
    95135                 
    96136                case "$mode" in 
    97                         sta) config_get nosbeacon "$device" nosbeacon;; 
    98                         adhoc) config_get nosbeacon "$vif" sw_merge;; 
     137                        sta) config_get_bool nosbeacon "$device" nosbeacon;; 
     138                        adhoc) config_get_bool nosbeacon "$vif" sw_merge 1;; 
    99139                esac 
    100140                 
    101                 config_get ifname "$vif" ifname 
     141                [ "$nosbeacon" = 1 ] || nosbeacon="" 
    102142                ifname=$(wlanconfig "$ifname" create wlandev "$device" wlanmode "$mode" ${nosbeacon:+nosbeacon}) 
    103143                [ $? -ne 0 ] && { 
     
    107147                config_set "$vif" ifname "$ifname" 
    108148 
    109                 # only need to change freq band and channel on the first vif 
    110149                config_get hwmode "$device" hwmode 
    111150                [ -z "$hwmode" ] && config_get hwmode "$device" mode 
     
    123162                        *) hwmode=auto;; 
    124163                esac 
     164                iwpriv "$ifname" mode "$hwmode" 
    125165                iwpriv "$ifname" pureg "$pureg" 
    126166 
    127                 [ "$first" = 1 ] && { 
    128                         iwpriv "$ifname" mode "$hwmode" 
    129                         iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null  
    130                 } 
    131          
     167                iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null  
     168 
    132169                config_get_bool hidden "$vif" hidden 0 
    133170                iwpriv "$ifname" hide_ssid "$hidden" 
     
    143180                        *) wds=0;; 
    144181                esac 
    145                 iwpriv "$ifname" wds "$wds" 
     182                iwpriv "$ifname" wds "$wds" >/dev/null 2>&1 
    146183 
    147184                [ "$mode" = ap -a "$wds" = 1 ] && { 
     
    177214                        ;; 
    178215                esac 
    179                 config_get ssid "$vif" ssid 
    180216 
    181217                config_get_bool bgscan "$vif" bgscan 
    182218                [ -n "$bgscan" ] && iwpriv "$ifname" bgscan "$bgscan" 
    183219 
    184                 config_get_bool antdiv "$device" diversity 
    185                 config_get antrx "$device" rxantenna 
    186                 config_get anttx "$device" txantenna 
    187                 config_get_bool softled "$device" softled 1 
    188  
    189                 devname="$(cat /proc/sys/dev/$device/dev_name)" 
    190                 antgpio= 
    191                 case "$devname" in 
    192                         NanoStation2) antgpio=7;; 
    193                         NanoStation5) antgpio=1;; 
    194                 esac 
    195                 if [ -n "$antgpio" ]; then 
    196                         softled=0 
    197                         config_get antenna "$device" antenna 
    198                         case "$antenna" in 
    199                                 external) antdiv=0; antrx=1; anttx=1 ;; 
    200                                 horizontal) antdiv=0; antrx=1; anttx=1 ;; 
    201                                 vertical) antdiv=0; antrx=2; anttx=2 ;; 
    202                                 auto) antdiv=1; antrx=0; anttx=0 ;; 
    203                         esac 
    204                          
    205                         [ -x "$(which gpioctl 2>/dev/null)" ] || antenna= 
    206                         case "$antenna" in 
    207                                 horizontal|vertical|auto) 
    208                                         gpioctl "dirout" "$antgpio" >/dev/null 2>&1 
    209                                         gpioctl "set" "$antgpio" >/dev/null 2>&1 
    210                                 ;; 
    211                                 external) 
    212                                         gpioctl "dirout" "$antgpio" >/dev/null 2>&1 
    213                                         gpioctl "clear" "$antgpio" >/dev/null 2>&1 
    214                                 ;; 
    215                         esac 
    216                 fi 
    217  
    218                 [ -n "$antdiv" ] && sysctl -w dev."$device".diversity="$antdiv" >&- 
    219                 [ -n "$antrx" ] && sysctl -w dev."$device".rxantenna="$antrx" >&- 
    220                 [ -n "$anttx" ] && sysctl -w dev."$device".txantenna="$anttx" >&- 
    221                 [ -n "$softled" ] && sysctl -w dev."$device".softled="$softled" >&- 
    222  
    223                 config_get distance "$device" distance 
    224                 [ -n "$distance" ] && sysctl -w dev."$device".distance="$distance" >&- 
    225  
    226220                config_get rate "$vif" rate 
    227221                [ -n "$rate" ] && iwconfig "$ifname" rate "${rate%%.*}" 
     
    237231 
    238232                config_get_bool comp "$vif" compression 0 
    239                 iwpriv "$ifname" compression "$comp" 
     233                iwpriv "$ifname" compression "$comp" >/dev/null 2>&1 
    240234 
    241235                config_get_bool minrate "$vif" minrate 
     
    298292                        start_net "$ifname" "$net_cfg" 
    299293                } 
     294 
     295                config_get ssid "$vif" ssid 
    300296                [ -n "$ssid" ] && { 
    301297                        iwconfig "$ifname" essid on 
    302298                        iwconfig "$ifname" essid "$ssid" 
    303299                } 
     300 
    304301                set_wifi_up "$vif" "$ifname" 
    305302 
     
    340337                        ;; 
    341338                esac 
    342                 first=0 
    343339        done 
    344340} 
     
    359355                        ;; 
    360356                esac 
    361                 [ "$type" = atheros ] && return 
     357                [ "$type" = atheros ] && continue 
    362358                cat <<EOF 
    363359config wifi-device  $dev 
  • branches/8.09/package/madwifi/patches/105-ratectl_attach.patch

    r13708 r17279  
    99+               /* pick the first available rate control module */ 
    1010+               printk(KERN_INFO "Rate control module \"%s\" not available\n", buf); 
    11 +               for (id = 0; id < IEEE80211_RATE_MAX; id++) { 
     11+               for (id = 0; id < IEEE80211_RATE_MAX - 1; id++) { 
    1212+                       if (ratectls[id].attach) 
    1313+                               break; 
  • branches/8.09/package/madwifi/patches/106-get_arch.patch

    r13708 r17279  
    11--- a/scripts/get_arch.mk 
    22+++ b/scripts/get_arch.mk 
    3 @@ -36,6 +36,13 @@ ifeq (,$(ARCH-y)) 
     3@@ -36,11 +36,14 @@ ifeq (,$(ARCH-y)) 
    44 $(Cannot determine ARCH) 
    55 endif 
     
    1515 ifeq (,$(ARCH)) 
    1616 ARCH = $(ARCH-y) 
     17-else 
     18-ifneq ($(ARCH),$(ARCH-y)) 
     19-$(error ARCH mismatch: supplied "$(ARCH)", determined "$(ARCH-y)") 
     20-endif 
     21 endif 
  • branches/8.09/package/madwifi/patches/200-no_debug.patch

    r13708 r17279  
    205205--- a/Makefile.inc 
    206206+++ b/Makefile.inc 
    207 @@ -148,7 +148,8 @@ ATH_RATE=   $(TOP)/ath_rate 
     207@@ -147,8 +147,9 @@ ATH_RATE=   $(TOP)/ath_rate 
     208 #  
    208209 TOOLS=  $(TOP)/tools  
    209210  
    210  WARNINGS = -Werror 
     211-WARNINGS = -Werror 
    211212-COPTS+= $(WARNINGS) 
    212 +DEBUG = -DAR_DEBUG -DIEEE80211_DEBUG 
     213+WARNINGS = -Wno-unused 
     214+# DEBUG = -DAR_DEBUG -DIEEE80211_DEBUG 
    213215+COPTS+= $(WARNINGS) $(DEBUG) 
    214216 INCS=  -include $(TOP)/include/compat.h -I$(TOP)/include 
  • branches/8.09/package/madwifi/patches/370-wdsvap.patch

    r15465 r17279  
    884884        if (vap->iv_bss != NULL) { 
    885885                ieee80211_unref_node(&vap->iv_bss); 
     886@@ -309,7 +314,7 @@ ieee80211_create_ibss(struct ieee80211va 
     887        /* Check to see if we already have a node for this mac 
     888         * NB: we gain a node reference here 
     889         */ 
     890-       ni = ieee80211_find_node(&ic->ic_sta, vap->iv_myaddr); 
     891+       ni = ieee80211_find_txnode(vap, vap->iv_myaddr); 
     892        if (ni == NULL) { 
     893                ni = ieee80211_alloc_node_table(vap, vap->iv_myaddr); 
     894                IEEE80211_DPRINTF(vap, IEEE80211_MSG_ASSOC, 
    886895@@ -831,12 +836,18 @@ node_table_leave_locked(struct ieee80211 
    887896                LIST_REMOVE(ni, ni_hash); 
     
    13571366--- a/net80211/ieee80211_proto.c 
    13581367+++ b/net80211/ieee80211_proto.c 
    1359 @@ -1081,6 +1081,8 @@ ieee80211_init(struct net_device *dev, i 
     1368@@ -979,6 +979,12 @@ ieee80211_init(struct net_device *dev, i 
     1369                "start running (state=%d)\n", vap->iv_state); 
     1370  
     1371  
     1372+       if (vap->iv_master && vap->iv_master->iv_state == IEEE80211_S_INIT) { 
     1373+               int ret = ieee80211_init(vap->iv_master->iv_dev, forcescan); 
     1374+               if (ret < 0) 
     1375+                       return ret; 
     1376+       } 
     1377+ 
     1378        if ((dev->flags & IFF_RUNNING) == 0) { 
     1379                if (ic->ic_nopened++ == 0 && 
     1380                    (parent->flags & IFF_RUNNING) == 0) 
     1381@@ -1081,6 +1087,8 @@ ieee80211_init(struct net_device *dev, i 
    13601382 int 
    13611383 ieee80211_open(struct net_device *dev) 
     
    13661388 } 
    13671389  
    1368 @@ -1090,7 +1092,7 @@ ieee80211_open(struct net_device *dev) 
     1390@@ -1090,7 +1098,7 @@ ieee80211_open(struct net_device *dev) 
    13691391 void 
    13701392 ieee80211_start_running(struct ieee80211com *ic) 
     
    13751397  
    13761398        /* XXX locking */ 
    1377 @@ -1099,6 +1101,16 @@ ieee80211_start_running(struct ieee80211 
     1399@@ -1099,6 +1107,16 @@ ieee80211_start_running(struct ieee80211 
    13781400                /* NB: avoid recursion */ 
    13791401                if ((dev->flags & IFF_UP) && !(dev->flags & IFF_RUNNING)) 
     
    13921414 } 
    13931415 EXPORT_SYMBOL(ieee80211_start_running); 
    1394 @@ -1116,11 +1128,43 @@ ieee80211_stop(struct net_device *dev) 
     1416@@ -1116,11 +1134,43 @@ ieee80211_stop(struct net_device *dev) 
    13951417        struct ieee80211vap *vap = dev->priv; 
    13961418        struct ieee80211com *ic = vap->iv_ic; 
     
    14361458        if (dev->flags & IFF_RUNNING) { 
    14371459                dev->flags &= ~IFF_RUNNING;             /* mark us stopped */ 
    1438 @@ -1148,7 +1192,7 @@ EXPORT_SYMBOL(ieee80211_stop); 
     1460@@ -1148,7 +1198,7 @@ EXPORT_SYMBOL(ieee80211_stop); 
    14391461 void 
    14401462 ieee80211_stop_running(struct ieee80211com *ic) 
     
    14451467  
    14461468        /* XXX locking */ 
    1447 @@ -1156,6 +1200,12 @@ ieee80211_stop_running(struct ieee80211c 
     1469@@ -1156,6 +1206,12 @@ ieee80211_stop_running(struct ieee80211c 
    14481470                dev = vap->iv_dev; 
    14491471                if (dev->flags & IFF_RUNNING)   /* NB: avoid recursion */ 
     
    14581480 } 
    14591481 EXPORT_SYMBOL(ieee80211_stop_running); 
    1460 @@ -1342,9 +1392,9 @@ ieee80211_new_state(struct ieee80211vap  
     1482@@ -1342,9 +1398,9 @@ ieee80211_new_state(struct ieee80211vap  
    14611483        struct ieee80211com *ic = vap->iv_ic; 
    14621484        int rc; 
     
    14701492 } 
    14711493  
    1472 @@ -1557,57 +1607,12 @@ __ieee80211_newstate(struct ieee80211vap 
     1494@@ -1557,57 +1613,12 @@ __ieee80211_newstate(struct ieee80211vap 
    14731495                switch (ostate) { 
    14741496                case IEEE80211_S_INIT: 
     
    15281550                        } 
    15291551                        /* fall thru... */ 
    1530 @@ -1675,6 +1680,7 @@ __ieee80211_newstate(struct ieee80211vap 
     1552@@ -1675,6 +1686,7 @@ __ieee80211_newstate(struct ieee80211vap 
    15311553                 */ 
    15321554                if (ni->ni_authmode != IEEE80211_AUTH_8021X) 
     
    15361558                /* 
    15371559                 * fire a timer to bring up XR vap if configured. 
    1538 @@ -1808,6 +1814,11 @@ ieee80211_newstate(struct ieee80211vap * 
     1560@@ -1808,6 +1820,11 @@ ieee80211_newstate(struct ieee80211vap * 
    15391561                          ieee80211_state_name[dstate]); 
    15401562  
     
    15481570        case IEEE80211_S_AUTH: 
    15491571        case IEEE80211_S_ASSOC: 
    1550 @@ -1930,8 +1941,15 @@ ieee80211_newstate(struct ieee80211vap * 
     1572@@ -1930,8 +1947,15 @@ ieee80211_newstate(struct ieee80211vap * 
    15511573                if (ostate == IEEE80211_S_SCAN ||  
    15521574                    ostate == IEEE80211_S_AUTH || 
  • branches/8.09/package/madwifi/patches/384-hwdetect.patch

    r15465 r17279  
    3434        sc->sc_bslot =  
    3535                kmalloc(ath_maxvaps * sizeof(struct ieee80211vap*), GFP_KERNEL); 
    36 @@ -1508,6 +1520,28 @@ ath_vap_create(struct ieee80211com *ic,  
     36@@ -1508,6 +1520,29 @@ ath_vap_create(struct ieee80211com *ic,  
    3737        return vap; 
    3838 } 
     
    5656+ 
    5757+               sc->sc_hwinfo = c; 
     58+               sc->sc_poweroffset = c->poweroffset; 
    5859+               break; 
    5960+       } 
     
    6364 ath_vap_delete(struct ieee80211vap *vap) 
    6465 { 
    65 @@ -10821,6 +10855,12 @@ ath_ioctl(struct net_device *dev, struct 
     66@@ -10225,6 +10260,7 @@ static u_int32_t 
     67 ath_set_clamped_maxtxpower(struct ath_softc *sc,  
     68                u_int32_t new_clamped_maxtxpower) 
     69 { 
     70+       new_clamped_maxtxpower -= sc->sc_poweroffset; 
     71        (void)ath_hal_settxpowlimit(sc->sc_ah, new_clamped_maxtxpower); 
     72        return ath_get_clamped_maxtxpower(sc); 
     73 } 
     74@@ -10238,6 +10274,7 @@ ath_get_clamped_maxtxpower(struct ath_so 
     75 { 
     76        u_int32_t clamped_maxtxpower; 
     77        (void)ath_hal_getmaxtxpow(sc->sc_ah, &clamped_maxtxpower); 
     78+       clamped_maxtxpower += sc->sc_poweroffset; 
     79        return clamped_maxtxpower; 
     80 } 
     81  
     82@@ -10821,6 +10858,12 @@ ath_ioctl(struct net_device *dev, struct 
    6683  * is to add module parameters. 
    6784  */ 
     
    7693  * Dynamic (i.e. per-device) sysctls.  These are automatically 
    7794  * mirrored in /proc/sys. 
    78 @@ -10900,6 +10940,38 @@ ath_sysctl_get_intmit(struct ath_softc * 
     95@@ -10900,6 +10943,38 @@ ath_sysctl_get_intmit(struct ath_softc * 
    7996 } 
    8097  
     
    115132 { 
    116133        struct ath_softc *sc = ctl->extra1; 
    117 @@ -11179,6 +11251,24 @@ static int maxint = 0x7fffffff;                /* 32-b 
     134@@ -11179,6 +11254,24 @@ static int maxint = 0x7fffffff;                /* 32-b 
    118135  
    119136 static const ctl_table ath_sysctl_template[] = { 
     
    175192        unsigned int    sc_invalid:1;           /* being detached */ 
    176193        unsigned int    sc_mrretry:1;           /* multi-rate retry support */ 
    177 @@ -929,4 +935,15 @@ int ar_device(int devid); 
     194@@ -683,6 +689,7 @@ struct ath_softc { 
     195        const HAL_RATE_TABLE *sc_quarter_rates; /* quarter rate table */ 
     196        HAL_OPMODE sc_opmode;                   /* current hal operating mode */ 
     197        enum ieee80211_phymode sc_curmode;      /* current phy mode */ 
     198+       u_int sc_poweroffset;                   /* hardware power offset */ 
     199        u_int16_t sc_curtxpow;                  /* current tx power limit */ 
     200        u_int16_t sc_curaid;                    /* current association id */ 
     201        HAL_CHANNEL sc_curchan;                 /* current h/w channel */ 
     202@@ -929,4 +936,16 @@ int ar_device(int devid); 
    178203  
    179204 void ath_radar_detected(struct ath_softc *sc, const char* message); 
     
    186211+       u32 subvendor; 
    187212+       u32 subid; 
     213+       u32 poweroffset; 
    188214+}; 
    189215+ 
     
    201227 #include <asm/io.h> 
    202228 #include <asm/uaccess.h> 
    203 @@ -181,12 +182,97 @@ exit_ath_wmac(u_int16_t wlanNum, struct  
     229@@ -181,12 +182,32 @@ exit_ath_wmac(u_int16_t wlanNum, struct  
    204230        return 0; 
    205231 } 
    206232  
    207233+static const char ubnt[] = "Ubiquiti Networks"; 
     234+/* { vendorname, cardname, vendorid, cardid, subsys vendorid, subsys id, poweroffset } */ 
    208235+static const struct ath_hw_detect cards[] = { 
    209 +       { 
    210 +               .vendor_name = ubnt, 
    211 +               .card_name = "PowerStation2 (18V)", 
    212 +               .vendor = PCI_ANY_ID, 
    213 +               .id = PCI_ANY_ID, 
    214 +               .subvendor = PCI_ANY_ID, 
    215 +               .subid = 0xb102, 
    216 +       }, 
    217 +       { 
    218 +               .vendor_name = ubnt, 
    219 +               .card_name = "PowerStation2 (16D)", 
    220 +               .vendor = PCI_ANY_ID, 
    221 +               .id = PCI_ANY_ID, 
    222 +               .subvendor = PCI_ANY_ID, 
    223 +               .subid = 0xb202, 
    224 +       }, 
    225 +       { 
    226 +               .vendor_name = ubnt, 
    227 +               .card_name = "PowerStation2 (EXT)", 
    228 +               .vendor = PCI_ANY_ID, 
    229 +               .id = PCI_ANY_ID, 
    230 +               .subvendor = PCI_ANY_ID, 
    231 +               .subid = 0xb302, 
    232 +       }, 
    233 +       { 
    234 +               .vendor_name = ubnt, 
    235 +               .card_name = "PowerStation5 (22V)", 
    236 +               .vendor = PCI_ANY_ID, 
    237 +               .id = PCI_ANY_ID, 
    238 +               .subvendor = PCI_ANY_ID, 
    239 +               .subid = 0xb105, 
    240 +       }, 
    241 +       { 
    242 +               .vendor_name = ubnt, 
    243 +               .card_name = "PowerStation5 (EXT)", 
    244 +               .vendor = PCI_ANY_ID, 
    245 +               .id = PCI_ANY_ID, 
    246 +               .subvendor = PCI_ANY_ID, 
    247 +               .subid = 0xb305, 
    248 +       }, 
    249 +       { 
    250 +               .vendor_name = ubnt, 
    251 +               .card_name = "WispStation5", 
    252 +               .vendor = PCI_ANY_ID, 
    253 +               .id = PCI_ANY_ID, 
    254 +               .subvendor = PCI_ANY_ID, 
    255 +               .subid = 0xa105, 
    256 +       }, 
    257 +       { 
    258 +               .vendor_name = ubnt, 
    259 +               .card_name = "LiteStation2", 
    260 +               .vendor = PCI_ANY_ID, 
    261 +               .id = PCI_ANY_ID, 
    262 +               .subvendor = PCI_ANY_ID, 
    263 +               .subid = 0xa002, 
    264 +       }, 
    265 +       { 
    266 +               .vendor_name = ubnt, 
    267 +               .card_name = "LiteStation5", 
    268 +               .vendor = PCI_ANY_ID, 
    269 +               .id = PCI_ANY_ID, 
    270 +               .subvendor = PCI_ANY_ID, 
    271 +               .subid = 0xa005, 
    272 +       }, 
    273 +       { 
    274 +               .vendor_name = ubnt, 
    275 +               .card_name = "NanoStation2", 
    276 +               .vendor = PCI_ANY_ID, 
    277 +               .id = PCI_ANY_ID, 
    278 +               .subvendor = PCI_ANY_ID, 
    279 +               .subid = 0xc002, 
    280 +       }, 
    281 +       { 
    282 +               .vendor_name = ubnt, 
    283 +               .card_name = "NanoStation5", 
    284 +               .vendor = PCI_ANY_ID, 
    285 +               .id = PCI_ANY_ID, 
    286 +               .subvendor = PCI_ANY_ID, 
    287 +               .subid = 0xc005, 
    288 +       }, 
     236+       { ubnt, "PowerStation2 (18V)", PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xb102 }, 
     237+       { ubnt, "PowerStation2 (16D)", PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xb202 }, 
     238+       { ubnt, "PowerStation2 (EXT)", PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xb302 }, 
     239+       { ubnt, "PowerStation5 (22V)", PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xb105 }, 
     240+       { ubnt, "PowerStation5 (EXT)", PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xb305 }, 
     241+       { ubnt, "WispStation5",        PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xa105 }, 
     242+       { ubnt, "LiteStation2",        PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xa002 }, 
     243+       { ubnt, "LiteStation5",        PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xa005 }, 
     244+       { ubnt, "NanoStation2",        PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xc002 }, 
     245+       { ubnt, "NanoStation5",        PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xc005 }, 
     246+       { ubnt, "NanoStation Loco2",   PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xc102 }, 
     247+       { ubnt, "NanoStation Loco5",   PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xc105 }, 
     248+       { ubnt, "Bullet2",             PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xc202 }, 
     249+       { ubnt, "Bullet5",             PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xc205 }, 
    289250+}; 
    290251+ 
     
    299260        if (((wlanNum != 0) && (wlanNum != 1)) || 
    300261                (sclist[wlanNum] != NULL)) 
    301 @@ -248,6 +334,16 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
     262@@ -248,6 +269,16 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
    302263        sc->aps_sc.sc_softled = 1; /* SoftLED over GPIO */ 
    303264        sc->aps_sc.sc_ledpin = config->board->sysLedGpio; 
     
    316277  
    317278  bad4: 
     279--- a/ath/if_ath_pci.c 
     280+++ b/ath/if_ath_pci.c 
     281@@ -123,6 +123,33 @@ static u16 ath_devidmap[][2] = { 
     282        { 0xff1a, 0x001a } 
     283 }; 
     284  
     285+static const char ubnt[] = "Ubiquiti Networks"; 
     286+/* { vendorname, cardname, vendorid, cardid, subsys vendorid, subsys id, poweroffset } */ 
     287+static const struct ath_hw_detect cards[] = { 
     288+       { ubnt, "XR2",     0x168c, 0x001b, 0x0777, 0x3002, 10 }, 
     289+       { ubnt, "XR2",     0x168c, 0x001b, 0x7777, 0x3002, 10 }, 
     290+       { ubnt, "XR2.3",   0x168c, 0x001b, 0x0777, 0x3b02, 10 }, 
     291+       { ubnt, "XR2.6",   0x168c, 0x001b, 0x0777, 0x3c02, 10 }, 
     292+       { ubnt, "XR3-2.8", 0x168c, 0x001b, 0x0777, 0x3b03, 10 }, 
     293+       { ubnt, "XR3-3.6", 0x168c, 0x001b, 0x0777, 0x3c03, 10 }, 
     294+       { ubnt, "XR3",     0x168c, 0x001b, 0x0777, 0x3003, 10 }, 
     295+       { ubnt, "XR4",     0x168c, 0x001b, 0x0777, 0x3004, 10 }, 
     296+       { ubnt, "XR5",     0x168c, 0x001b, 0x0777, 0x3005, 10 }, 
     297+       { ubnt, "XR5",     0x168c, 0x001b, 0x7777, 0x3005, 10 }, 
     298+       { ubnt, "XR7",     0x168c, 0x001b, 0x0777, 0x3007, 10 }, 
     299+       { ubnt, "XR9",     0x168c, 0x001b, 0x0777, 0x3009, 10 }, 
     300+       { ubnt, "SRC",     0x168c, 0x0013, 0x168c, 0x1042, 1 }, 
     301+       { ubnt, "SR2",     0x168c, 0x0013, 0x0777, 0x2041, 10 }, 
     302+       { ubnt, "SR4",     0x168c, 0x0013, 0x0777, 0x2004, 6 }, 
     303+       { ubnt, "SR4",     0x168c, 0x0013, 0x7777, 0x2004, 6 }, 
     304+       { ubnt, "SR4C",    0x168c, 0x0013, 0x0777, 0x1004, 6 }, 
     305+       { ubnt, "SR4C",    0x168c, 0x0013, 0x7777, 0x1004, 6 }, 
     306+       { ubnt, "SR5",     0x168c, 0x0013, 0x168c, 0x2042, 7 }, 
     307+       { ubnt, "SR9",     0x168c, 0x0013, 0x7777, 0x2009, 12 }, 
     308+       { ubnt, "SR71A",   0x168c, 0x0027, 0x168c, 0x2082, 10 }, 
     309+       { ubnt, "SR71",    0x168c, 0x0027, 0x0777, 0x4082, 10 }, 
     310+}; 
     311+ 
     312 static int 
     313 ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) 
     314 { 
     315@@ -257,6 +284,10 @@ ath_pci_probe(struct pci_dev *pdev, cons 
     316        printk(KERN_INFO "%s: %s: %s: mem=0x%lx, irq=%d\n", 
     317                dev_info, dev->name, athname ? athname : "Atheros ???", phymem, dev->irq); 
     318  
     319+       ath_hw_detect(&sc->aps_sc, cards, ARRAY_SIZE(cards), 
     320+               pdev->vendor, pdev->device, 
     321+               pdev->subsystem_vendor, pdev->subsystem_device); 
     322+ 
     323        /* ready to process interrupts */ 
     324        sc->aps_sc.sc_invalid = 0; 
     325  
  • branches/8.09/package/madwifi/patches/385-antenna_fix.patch

    r15465 r17279  
    11--- a/ath/if_ath.c 
    22+++ b/ath/if_ath.c 
    3 @@ -6668,6 +6668,7 @@ ath_setdefantenna(struct ath_softc *sc,  
     3@@ -6669,6 +6669,7 @@ ath_setdefantenna(struct ath_softc *sc,  
    44        struct ath_hal *ah = sc->sc_ah; 
    55  
  • branches/8.09/package/madwifi/patches/389-autochannel.patch

    r16033 r17279  
    99 /* calibrate every 30 secs in steady state but check every second at first. */ 
    1010 static int ath_calinterval = ATH_SHORT_CALINTERVAL; 
    11 @@ -2580,6 +2581,7 @@ ath_init(struct net_device *dev) 
     11@@ -2581,6 +2582,7 @@ ath_init(struct net_device *dev) 
    1212         * be followed by initialization of the appropriate bits 
    1313         * and then setup of the interrupt mask. 
     
    1717        sc->sc_curchan.channelFlags = ath_chan2flags(ic->ic_curchan); 
    1818        if (!ath_hal_reset(ah, sc->sc_opmode, &sc->sc_curchan, AH_FALSE, &status)) { 
    19 @@ -2913,6 +2915,48 @@ ath_hw_check_atim(struct ath_softc *sc,  
     19@@ -2914,6 +2916,48 @@ ath_hw_check_atim(struct ath_softc *sc,  
    2020        return 0; 
    2121 } 
     
    6666 /* 
    6767  * Reset the hardware w/o losing operational state.  This is 
    68 @@ -2940,6 +2984,7 @@ ath_reset(struct net_device *dev) 
     68@@ -2941,6 +2985,7 @@ ath_reset(struct net_device *dev) 
    6969         * Convert to a HAL channel description with the flags 
    7070         * constrained to reflect the current operating mode. 
     
    7474        sc->sc_curchan.channel = c->ic_freq; 
    7575        sc->sc_curchan.channelFlags = ath_chan2flags(c); 
    76 @@ -9022,6 +9067,7 @@ ath_chan_set(struct ath_softc *sc, struc 
     76@@ -9023,6 +9068,7 @@ ath_chan_set(struct ath_softc *sc, struc 
    7777        u_int8_t channel_change_required = 0; 
    7878        struct timeval tv; 
     
    8282         * Convert to a HAL channel description with 
    8383         * the flags constrained to reflect the current 
    84 @@ -9030,6 +9076,14 @@ ath_chan_set(struct ath_softc *sc, struc 
     84@@ -9031,6 +9077,14 @@ ath_chan_set(struct ath_softc *sc, struc 
    8585        memset(&hchan, 0, sizeof(HAL_CHANNEL)); 
    8686        hchan.channel = chan->ic_freq; 
     
    9999--- a/ath/if_athvar.h 
    100100+++ b/ath/if_athvar.h 
    101 @@ -773,6 +773,7 @@ struct ath_softc { 
     101@@ -774,6 +774,7 @@ struct ath_softc { 
    102102        struct ieee80211vap **sc_bslot;         /* beacon xmit slots */ 
    103103        int sc_bnext;                           /* next slot for beacon xmit */ 
  • branches/8.09/package/madwifi/patches/390-frame_type.patch

    r13708 r17279  
    66  
    77-       return eth->h_proto; 
    8 +       if (ntohs(eth->h_proto) >= 1536) 
     8+       if ((ntohs(eth->h_proto) >= 1536) || (ntohs(eth->h_proto) < 38)) 
    99+               return eth->h_proto; 
    1010+       return htons(ETH_P_802_2); 
  • branches/8.09/package/madwifi/patches/393-mbss_vap_auth.patch

    r16033 r17279  
    320320--- a/ath/if_ath.c 
    321321+++ b/ath/if_ath.c 
    322 @@ -6588,9 +6588,8 @@ ath_recv_mgmt(struct ieee80211vap * vap, 
     322@@ -6589,9 +6589,8 @@ ath_recv_mgmt(struct ieee80211vap * vap, 
    323323  
    324324        sc->sc_recv_mgmt(vap, ni_or_null, skb, subtype, rssi, rtsf); 
     
    331331        if (ni == NULL) { 
    332332                DPRINTF(sc, ATH_DEBUG_BEACON, "Dropping; node unknown.\n"); 
    333 @@ -6745,7 +6744,9 @@ ath_rx_poll(struct net_device *dev, int  
     333@@ -6746,7 +6745,9 @@ ath_rx_poll(struct net_device *dev, int  
    334334        struct ath_desc *ds; 
    335335        struct ath_rx_status *rs; 
     
    341341        int type; 
    342342        u_int phyerr; 
    343 @@ -6900,12 +6901,15 @@ rx_accept: 
     343@@ -6901,12 +6902,15 @@ rx_accept: 
    344344                skb_trim(skb, skb->len - IEEE80211_CRC_LEN); 
    345345  
     
    359359                        if (ni && ni->ni_table) { 
    360360                                ieee80211_check_mic(ni, skb); 
    361 @@ -6967,11 +6971,24 @@ drop_micfail: 
     361@@ -6968,11 +6972,24 @@ drop_micfail: 
    362362                 * for its use.  If the sender is unknown spam the 
    363363                 * frame; it'll be dropped where it's not wanted. 
     
    386386                        type = ieee80211_input(ni->ni_vap, ni, skb, rs->rs_rssi, bf->bf_tsf); 
    387387                        ieee80211_unref_node(&ni); 
    388 @@ -6980,24 +6997,35 @@ drop_micfail: 
     388@@ -6981,24 +6998,35 @@ drop_micfail: 
    389389                         * No key index or no entry, do a lookup and 
    390390                         * add the node to the mapping table if possible. 
  • branches/8.09/package/madwifi/patches/395-ath_ff_unmap.patch

    r16033 r17279  
    11--- a/ath/if_ath.c 
    22+++ b/ath/if_ath.c 
    3 @@ -13527,7 +13527,7 @@ cleanup_ath_buf(struct ath_softc *sc, st 
     3@@ -13530,7 +13530,7 @@ cleanup_ath_buf(struct ath_softc *sc, st 
    44                                bus_unmap_single( 
    55                                        sc->sc_bdev, 
  • branches/8.09/package/madwifi/patches/396-napi_ff_fix.patch

    r16033 r17279  
    11--- a/ath/if_ath.c 
    22+++ b/ath/if_ath.c 
    3 @@ -6733,10 +6733,10 @@ ath_rx_poll(struct net_device *dev, int  
     3@@ -6734,10 +6734,10 @@ ath_rx_poll(struct net_device *dev, int  
    44 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) 
    55        struct ath_softc *sc = container_of(napi, struct ath_softc, sc_napi); 
     
    1414        struct ath_buf *bf; 
    1515        struct ieee80211com *ic = &sc->sc_ic; 
    16 @@ -6779,13 +6779,15 @@ process_rx_again: 
     16@@ -6780,13 +6780,15 @@ process_rx_again: 
    1717                        break; 
    1818                } 
     
    3434                skb = bf->bf_skb; 
    3535                if (skb == NULL) { 
    36 @@ -7069,8 +7071,8 @@ rx_next: 
     36@@ -7070,8 +7072,8 @@ rx_next: 
    3737                if (sc->sc_isr & HAL_INT_RX) { 
    3838                        u_int64_t hw_tsf = ath_hal_gettsf64(ah); 
  • branches/8.09/package/madwifi/patches/400-new_hal.patch

    r16033 r17279  
    1616         * Check if the MAC has multi-rate retry support. 
    1717         * We do this by trying to setup a fake extended 
    18 @@ -7563,7 +7571,7 @@ ath_txq_setup(struct ath_softc *sc, int  
     18@@ -7564,7 +7572,7 @@ ath_txq_setup(struct ath_softc *sc, int  
    1919        if (qtype == HAL_TX_QUEUE_UAPSD) 
    2020                qi.tqi_qflags = HAL_TXQ_TXDESCINT_ENABLE; 
  • branches/8.09/package/madwifi/patches/406-monitor_r3711.patch

    r16033 r17279  
    11--- a/ath/if_ath.c 
    22+++ b/ath/if_ath.c 
    3 @@ -6529,7 +6529,7 @@ ath_capture(struct net_device *dev, cons 
     3@@ -6530,7 +6530,7 @@ ath_capture(struct net_device *dev, cons 
    44  
    55        /* Never copy the SKB, as it is ours on the RX side, and this is the  
     
    1010                DPRINTF(sc, ATH_DEBUG_ANY, 
    1111                        "Dropping; ath_skb_removepad failed!\n"); 
    12 @@ -6537,6 +6537,8 @@ ath_capture(struct net_device *dev, cons 
     12@@ -6538,6 +6538,8 @@ ath_capture(struct net_device *dev, cons 
    1313        } 
    1414         
  • branches/8.09/package/madwifi/patches/408-changeset_r3337.patch

    r16033 r17279  
    1111--- a/ath/if_ath.c 
    1212+++ b/ath/if_ath.c 
    13 @@ -3146,7 +3146,7 @@ ath_tx_startraw(struct net_device *dev,  
     13@@ -3147,7 +3147,7 @@ ath_tx_startraw(struct net_device *dev,  
    1414        struct ath_softc *sc = dev->priv; 
    1515        struct ath_hal *ah = sc->sc_ah; 
  • branches/8.09/package/madwifi/patches/410-ar231x_2.6.28.patch

    r15465 r17279  
    8282- 
    8383 static const char ubnt[] = "Ubiquiti Networks"; 
     84 /* { vendorname, cardname, vendorid, cardid, subsys vendorid, subsys id, poweroffset } */ 
    8485 static const struct ath_hw_detect cards[] = { 
    85         { 
    86 @@ -266,6 +238,114 @@ static const struct ath_hw_detect cards[ 
    87         }, 
     86@@ -201,6 +173,114 @@ static const struct ath_hw_detect cards[ 
     87        { ubnt, "Bullet5",             PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0xc205 }, 
    8888 }; 
    8989  
     
    199199 init_ath_wmac(u_int16_t devid, u_int16_t wlanNum, struct ar531x_config *config) 
    200200 { 
    201 @@ -318,7 +398,7 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
     201@@ -253,7 +333,7 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
    202202        sc->aps_sc.sc_iobase = (void __iomem *) dev->mem_start; 
    203203        sc->aps_sc.sc_bdev = NULL; 
     
    208208                goto bad3; 
    209209        } 
    210 @@ -328,21 +408,12 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
     210@@ -263,21 +343,12 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
    211211        athname = ath_hal_probe(ATHEROS_VENDOR_ID, devid); 
    212212        printk(KERN_INFO "%s: %s: %s: mem=0x%lx, irq=%d\n", 
     
    231231        return 0; 
    232232  
    233 @@ -357,6 +428,29 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
     233@@ -292,6 +363,29 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
    234234        return -ENODEV; 
    235235 } 
     
    261261 { 
    262262        u_int16_t devid; 
    263 @@ -377,11 +471,18 @@ static int ahb_wmac_remove(struct platfo 
     263@@ -312,11 +406,18 @@ static int ahb_wmac_remove(struct platfo 
    264264        return 0; 
    265265 } 
  • branches/8.09/package/madwifi/patches/412-fragmentation_fix.patch

    r16033 r17279  
    11--- a/ath/if_ath.c 
    22+++ b/ath/if_ath.c 
    3 @@ -3683,6 +3683,7 @@ ff_bypass: 
     3@@ -3684,6 +3684,7 @@ ff_bypass: 
    44                 *  already alloc'd 
    55                 */ 
  • branches/8.09/package/madwifi/patches/413-rxorn.patch

    r15465 r17279  
    11--- a/ath/if_ath.c 
    22+++ b/ath/if_ath.c 
    3 @@ -2307,6 +2307,17 @@ ath_intr(int irq, void *dev_id, struct p 
     3@@ -2308,6 +2308,17 @@ ath_intr(int irq, void *dev_id, struct p 
    44  
    55        sc->sc_isr = status; 
     
    1919         * we will check to see if we need an initial hardware TSF reading.  
    2020         * Normally we would just populate this all the time to keep things 
    21 @@ -2319,10 +2330,6 @@ ath_intr(int irq, void *dev_id, struct p 
     21@@ -2320,10 +2331,6 @@ ath_intr(int irq, void *dev_id, struct p 
    2222                sc->sc_stats.ast_hardware++; 
    2323                ath_hal_intrset(ah, 0);         /* disable intr's until reset */ 
  • branches/8.09/package/madwifi/patches/414-txpower.patch

    r16033 r17279  
    1313                        ("channel with bogus ieee number %u", c->ic_ieee)); 
    1414                setbit(ic->ic_chan_avail, c->ic_ieee); 
    15 +               ic->ic_max_txpower = max(ic->ic_max_txpower, (u16) c->ic_maxpower * 2); 
     15+               ic->ic_max_txpower = max(ic->ic_max_txpower, (u16) (c->ic_maxpower * 2)); 
    1616  
    1717                if (c->ic_scanflags & IEEE80211_NOSCAN_DEFAULT) 
     
    166166 static void ath_poll_disable(struct net_device *dev); 
    167167 static void ath_poll_enable(struct net_device *dev); 
    168 @@ -3167,7 +3166,7 @@ ath_tx_startraw(struct net_device *dev,  
     168@@ -3168,7 +3167,7 @@ ath_tx_startraw(struct net_device *dev,  
    169169        try0 = ph->try0; 
    170170        rt = sc->sc_currates; 
     
    175175        pktlen = skb->len + IEEE80211_CRC_LEN; 
    176176  
    177 @@ -8389,7 +8388,7 @@ ath_tx_start(struct net_device *dev, str 
     177@@ -8390,7 +8389,7 @@ ath_tx_start(struct net_device *dev, str 
    178178                            pktlen,                     /* packet length */ 
    179179                            hdrlen,                     /* header length */ 
     
    184184                            keyix,                      /* key cache index */ 
    185185                            antenna,                    /* antenna mode */ 
    186 @@ -10380,59 +10379,16 @@ ath_get_clamped_maxtxpower(struct ath_so 
     186@@ -10383,59 +10382,16 @@ ath_get_clamped_maxtxpower(struct ath_so 
    187187  
    188188 /* XXX: this function needs some locking to avoid being called  
  • branches/8.09/package/madwifi/patches/416-wprobe.patch

    r16033 r17279  
    11--- /dev/null 
    22+++ b/ath/ath_wprobe.c 
    3 @@ -0,0 +1,392 @@ 
     3@@ -0,0 +1,433 @@ 
    44+#include <net80211/ieee80211_node.h> 
    55+#include <linux/wprobe.h> 
     
    207207+               return -1; 
    208208+ 
    209 +       return rt->info[rate].rateKbps / 10; 
    210 +} 
     209+       return rt->info[rate].rateKbps; 
     210+} 
     211+ 
     212+static void 
     213+ath_wprobe_report_rx(struct ieee80211vap *vap, struct ath_rx_status *rs, struct sk_buff *skb) 
     214+{ 
     215+       const struct ieee80211_frame *wh = (struct ieee80211_frame *)skb->data; 
     216+       struct wprobe_wlan_hdr hdr; 
     217+       struct ath_vap *avp; 
     218+       int hdrsize; 
     219+ 
     220+       if (wprobe_disabled()) 
     221+               return; 
     222+ 
     223+       avp = ATH_VAP(vap); 
     224+       avp->av_rxframes++; 
     225+       if (wh->i_fc[0] == (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_REQ)) 
     226+               avp->av_rxprobereq++; 
     227+ 
     228+       memset(&hdr, 0, sizeof(hdr)); 
     229+       hdr.len = skb->len; 
     230+       hdr.snr = rs->rs_rssi; 
     231+       hdr.type = WPROBE_PKT_RX; 
     232+       if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) 
     233+               hdrsize = sizeof(struct ieee80211_ctlframe_addr2); 
     234+       else 
     235+               hdrsize = ieee80211_hdrsize(skb->data); 
     236+       wprobe_add_frame(&avp->av_wpif, &hdr, skb->data, hdrsize + 0x42); 
     237+} 
     238+ 
    211239+ 
    212240+static void 
     
    238266+ 
    239267+static void 
    240 +ath_node_sample_tx(struct ieee80211_node *ni, struct ath_tx_status *ts, int len) 
     268+ath_wprobe_report_tx(struct ieee80211vap *vap, struct ath_tx_status *ts, struct sk_buff *skb) 
     269+{ 
     270+       const struct ieee80211_frame *wh = (struct ieee80211_frame *)skb->data; 
     271+       struct wprobe_wlan_hdr hdr; 
     272+       struct ath_vap *avp; 
     273+       int hdrsize; 
     274+ 
     275+       if (wprobe_disabled()) 
     276+               return; 
     277+ 
     278+       avp = ATH_VAP(vap); 
     279+ 
     280+       memset(&hdr, 0, sizeof(hdr)); 
     281+       hdr.len = skb->len; 
     282+       hdr.snr = ts->ts_rssi; 
     283+       hdr.type = WPROBE_PKT_TX; 
     284+       if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) 
     285+               hdrsize = sizeof(struct ieee80211_ctlframe_addr2); 
     286+       else 
     287+               hdrsize = ieee80211_hdrsize(skb->data); 
     288+       wprobe_add_frame(&avp->av_wpif, &hdr, skb->data, hdrsize + 0x42); 
     289+} 
     290+ 
     291+ 
     292+ 
     293+static void 
     294+ath_node_sample_tx(struct ieee80211_node *ni, struct ath_tx_status *ts, struct sk_buff *skb) 
    241295+{ 
    242296+       struct ath_node *an = ATH_NODE(ni); 
     
    247301+       unsigned long flags; 
    248302+       int rate, rexmit_counter; 
     303+       int len = skb->len; 
    249304+ 
    250305+       if (wprobe_disabled() || !an->an_wplink_active || !l->val) 
    251306+               return; 
    252307+ 
     308+       ath_wprobe_report_tx(vap, ts, skb); 
    253309+       rate = ath_lookup_rateval(ni, ts->ts_rate); 
    254310+ 
     
    276332+ 
    277333+static void 
    278 +ath_wprobe_report_rx(struct ieee80211vap *vap, struct sk_buff *skb) 
    279 +{ 
    280 +       struct ieee80211_frame *wh = (struct ieee80211_frame *)skb->data; 
    281 +       struct ath_vap *avp; 
    282 + 
    283 +       if (wprobe_disabled()) 
    284 +               return; 
    285 + 
    286 +       avp = ATH_VAP(vap); 
    287 +       avp->av_rxframes++; 
    288 +       if (wh->i_fc[0] == (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_REQ)) 
    289 +               avp->av_rxprobereq++; 
    290 +} 
    291 + 
    292 +static void 
    293334+ath_wprobe_node_join(struct ieee80211vap *vap, struct ieee80211_node *ni) 
    294335+{ 
     
    412453 } 
    413454  
    414 @@ -1605,6 +1607,7 @@ ath_vap_delete(struct ieee80211vap *vap) 
     455@@ -1606,6 +1608,7 @@ ath_vap_delete(struct ieee80211vap *vap) 
    415456                decrease = 0; 
    416457  
     
    420461        if (decrease) 
    421462                sc->sc_nvaps--; 
    422 @@ -5939,6 +5942,7 @@ ath_node_cleanup(struct ieee80211_node * 
     463@@ -5940,6 +5943,7 @@ ath_node_cleanup(struct ieee80211_node * 
    423464        /* Clean up node-specific rate things - this currently appears to  
    424465         * always be a no-op */ 
     
    428469        ATH_NODE_UAPSD_LOCK_IRQ(an); 
    429470 #ifdef IEEE80211_DEBUG_REFCNT 
    430 @@ -7009,6 +7013,8 @@ drop_micfail: 
     471@@ -7010,6 +7014,8 @@ drop_micfail: 
    431472                                goto lookup_slowpath; 
    432473                        } 
    433474                        ATH_RSSI_LPF(ATH_NODE(ni)->an_avgrssi, rs->rs_rssi); 
    434475+                       ath_node_sample_rx(ni, rs); 
    435 +                       ath_wprobe_report_rx(ni->ni_vap, skb); 
     476+                       ath_wprobe_report_rx(ni->ni_vap, rs, skb); 
    436477                        type = ieee80211_input(ni->ni_vap, ni, skb, rs->rs_rssi, bf->bf_tsf); 
    437478                        ieee80211_unref_node(&ni); 
    438479                } else { 
    439 @@ -7019,15 +7025,22 @@ drop_micfail: 
     480@@ -7020,15 +7026,22 @@ drop_micfail: 
    440481  
    441482 lookup_slowpath: 
     
    443484-                       if (vap) 
    444485+                       if (vap) { 
    445 +                               ath_wprobe_report_rx(vap, skb); 
     486+                               ath_wprobe_report_rx(vap, rs, skb); 
    446487                                ni = ieee80211_find_rxnode(ic, vap, wh); 
    447488-                       else 
    448489+                       } else { 
    449490+                               TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) { 
    450 +                                       ath_wprobe_report_rx(vap, skb); 
     491+                                       ath_wprobe_report_rx(vap, rs, skb); 
    451492+                               } 
    452493+                               vap = NULL; 
     
    462503                                /* 
    463504                                 * If the station has a key cache slot assigned 
    464 @@ -8607,6 +8620,7 @@ ath_tx_processq(struct ath_softc *sc, st 
     505@@ -8608,6 +8621,7 @@ ath_tx_processq(struct ath_softc *sc, st 
    465506                                sc->sc_stats.ast_tx_rssi = ts->ts_rssi; 
    466507                                ATH_RSSI_LPF(an->an_halstats.ns_avgtxrssi, 
    467508                                        ts->ts_rssi); 
    468 +                                       ath_node_sample_tx(&an->an_node, ts, bf->bf_skb->len); 
     509+                                       ath_node_sample_tx(&an->an_node, ts, bf->bf_skb); 
    469510                                if (bf->bf_skb->priority == WME_AC_VO || 
    470511                                    bf->bf_skb->priority == WME_AC_VI) 
    471512                                        ni->ni_ic->ic_wme.wme_hipri_traffic++; 
    472 @@ -10106,6 +10120,7 @@ ath_newassoc(struct ieee80211_node *ni,  
     513@@ -10107,6 +10121,7 @@ ath_newassoc(struct ieee80211_node *ni,  
    473514        struct ath_softc *sc = ic->ic_dev->priv; 
    474515  
  • branches/8.09/package/madwifi/patches/417-beacon_txpower.patch

    r16033 r17279  
    1010 static int maxvaps = -1; 
    1111 static int outdoor = -1; 
    12 @@ -4931,6 +4931,7 @@ ath_beacon_setup(struct ath_softc *sc, s 
     12@@ -4932,6 +4932,7 @@ ath_beacon_setup(struct ath_softc *sc, s 
    1313        (((_ic)->ic_flags & (IEEE80211_F_SHPREAMBLE | IEEE80211_F_USEBARKER))\ 
    1414                == IEEE80211_F_SHPREAMBLE) 
     
    1818        struct ath_hal *ah = sc->sc_ah; 
    1919        struct ath_desc *ds; 
    20 @@ -4998,7 +4999,7 @@ ath_beacon_setup(struct ath_softc *sc, s 
     20@@ -4999,7 +5000,7 @@ ath_beacon_setup(struct ath_softc *sc, s 
    2121                skb->len + IEEE80211_CRC_LEN,   /* frame length */ 
    2222                sizeof(struct ieee80211_frame), /* header length */ 
  • branches/8.09/package/madwifi/patches/419-skb_unmap_crash.patch

    r16033 r17279  
    11--- a/ath/if_ath.c 
    22+++ b/ath/if_ath.c 
    3 @@ -13493,7 +13493,7 @@ cleanup_ath_buf(struct ath_softc *sc, st 
     3@@ -13496,7 +13496,7 @@ cleanup_ath_buf(struct ath_softc *sc, st 
    44        if (bf == NULL)  
    55                return bf; 
     
    1010                        sc->sc_bdev, 
    1111                        bf->bf_skbaddr,  
    12 @@ -13501,8 +13501,6 @@ cleanup_ath_buf(struct ath_softc *sc, st 
     12@@ -13504,8 +13504,6 @@ cleanup_ath_buf(struct ath_softc *sc, st 
    1313                                sc->sc_rxbufsize : bf->bf_skb->len), 
    1414                        direction); 
  • branches/8.09/package/madwifi/patches/420-diversity_fix.patch

    r16847 r17279  
    99        if (sc->sc_rc == NULL) { 
    1010                error = EIO; 
    11 @@ -2623,9 +2622,6 @@ ath_init(struct net_device *dev) 
     11@@ -2624,9 +2623,6 @@ ath_init(struct net_device *dev) 
    1212        ath_radar_update(sc); 
    1313        ath_rp_flush(sc); 
     
    1919         * Setup the hardware after reset: the key cache 
    2020         * is filled as needed and the receive engine is 
    21 @@ -3018,7 +3014,6 @@ ath_reset(struct net_device *dev) 
     21@@ -3019,7 +3015,6 @@ ath_reset(struct net_device *dev) 
    2222        ath_setintmit(sc); 
    2323        ath_update_txpow(sc);           /* update tx power state */ 
     
    2727                EPRINTF(sc, "Unable to start receive logic.\n"); 
    2828        if (sc->sc_softled) 
    29 @@ -5352,27 +5347,6 @@ ath_beacon_send(struct ath_softc *sc, in 
     29@@ -5353,27 +5348,6 @@ ath_beacon_send(struct ath_softc *sc, in 
    3030        } else if ((sc->sc_updateslot == COMMIT) && (sc->sc_slotupdate == slot)) 
    3131                ath_setslottime(sc);            /* commit change to hardware */ 
     
    5555                /* 
    5656                 * Stop any current DMA and put the new frame(s) on the queue. 
    57 @@ -6733,9 +6707,8 @@ ath_setdefantenna(struct ath_softc *sc,  
     57@@ -6734,9 +6708,8 @@ ath_setdefantenna(struct ath_softc *sc,  
    5858 { 
    5959        struct ath_hal *ah = sc->sc_ah; 
     
    6666                sc->sc_stats.ast_ant_defswitch++; 
    6767        sc->sc_defant = antenna; 
    68 @@ -11154,7 +11127,7 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
     68@@ -11157,7 +11130,7 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
    6969                                        break; 
    7070                                } 
  • branches/8.09/package/madwifi/patches/421-channel_handling.patch

    r16033 r17279  
    185185        ic->ic_ath_cap |= (ath_hal_xrsupported(ah) ? IEEE80211_ATHC_XR : 0); 
    186186 #endif 
    187 @@ -4469,17 +4485,17 @@ ath_mode_init(struct net_device *dev) 
     187@@ -4470,17 +4486,17 @@ ath_mode_init(struct net_device *dev) 
    188188  * Set the slot time based on the current setting. 
    189189  */ 
     
    211211 } 
    212212  
    213 @@ -4501,7 +4517,7 @@ ath_updateslot(struct net_device *dev) 
     213@@ -4502,7 +4518,7 @@ ath_updateslot(struct net_device *dev) 
    214214        if (ic->ic_opmode == IEEE80211_M_HOSTAP) 
    215215                sc->sc_updateslot = UPDATE; 
     
    220220  
    221221 #ifdef ATH_SUPERG_DYNTURBO 
    222 @@ -5345,7 +5361,7 @@ ath_beacon_send(struct ath_softc *sc, in 
     222@@ -5346,7 +5362,7 @@ ath_beacon_send(struct ath_softc *sc, in 
    223223                sc->sc_updateslot = COMMIT;     /* commit next beacon */ 
    224224                sc->sc_slotupdate = slot; 
     
    229229        if (bfaddr != 0) { 
    230230                /* 
    231 @@ -7798,12 +7814,14 @@ ath_get_ivlen(struct ieee80211_key *k) 
     231@@ -7799,12 +7815,14 @@ ath_get_ivlen(struct ieee80211_key *k) 
    232232  * Get transmit rate index using rate in Kbps 
    233233  */ 
     
    246246                        break; 
    247247                } 
    248 @@ -8096,7 +8114,7 @@ ath_tx_start(struct net_device *dev, str 
     248@@ -8097,7 +8115,7 @@ ath_tx_start(struct net_device *dev, str 
    249249                atype = HAL_PKT_TYPE_NORMAL;            /* default */ 
    250250  
     
    255255                        if (shortPreamble) 
    256256                                txrate |= rt->info[rix].shortPreamble; 
    257 @@ -9063,7 +9081,7 @@ ath_chan_change(struct ath_softc *sc, st 
     257@@ -9064,7 +9082,7 @@ ath_chan_change(struct ath_softc *sc, st 
    258258        struct net_device *dev = sc->sc_dev; 
    259259        enum ieee80211_phymode mode; 
     
    264264        ath_rate_setup(dev, mode); 
    265265        ath_setcurmode(sc, mode); 
    266 @@ -10120,8 +10138,7 @@ ath_newassoc(struct ieee80211_node *ni,  
     266@@ -10121,8 +10139,7 @@ ath_newassoc(struct ieee80211_node *ni,  
    267267 } 
    268268  
     
    274274        struct ath_softc *sc = dev->priv; 
    275275        struct ieee80211com *ic = &sc->sc_ic; 
    276 @@ -10135,17 +10152,31 @@ ath_getchannels(struct net_device *dev,  
     276@@ -10136,17 +10153,31 @@ ath_getchannels(struct net_device *dev,  
    277277                EPRINTF(sc, "Insufficient memory for channel table!\n"); 
    278278                return -ENOMEM; 
     
    308308         * Convert HAL channels to ieee80211 ones. 
    309309         */ 
    310 @@ -10389,7 +10420,7 @@ ath_xr_rate_setup(struct net_device *dev 
     310@@ -10392,7 +10423,7 @@ ath_xr_rate_setup(struct net_device *dev 
    311311        struct ieee80211com *ic = &sc->sc_ic; 
    312312        const HAL_RATE_TABLE *rt; 
     
    317317        rt = sc->sc_xr_rates; 
    318318        if (rt == NULL) 
    319 @@ -10402,57 +10433,16 @@ ath_xr_rate_setup(struct net_device *dev 
     319@@ -10405,57 +10436,16 @@ ath_xr_rate_setup(struct net_device *dev 
    320320        } else 
    321321                maxrates = rt->rateCount; 
     
    381381 ath_rate_setup(struct net_device *dev, u_int mode) 
    382382 { 
    383 @@ -10461,7 +10451,7 @@ ath_rate_setup(struct net_device *dev, u 
     383@@ -10464,7 +10454,7 @@ ath_rate_setup(struct net_device *dev, u 
    384384        struct ieee80211com *ic = &sc->sc_ic; 
    385385        const HAL_RATE_TABLE *rt; 
     
    390390        switch (mode) { 
    391391        case IEEE80211_MODE_11A: 
    392 @@ -10479,6 +10469,12 @@ ath_rate_setup(struct net_device *dev, u 
     392@@ -10482,6 +10472,12 @@ ath_rate_setup(struct net_device *dev, u 
    393393        case IEEE80211_MODE_TURBO_G: 
    394394                sc->sc_rates[mode] = ath_hal_getratetable(ah, HAL_MODE_108G); 
     
    403403                DPRINTF(sc, ATH_DEBUG_ANY, "Invalid mode %u\n", mode); 
    404404                return 0; 
    405 @@ -10493,10 +10489,16 @@ ath_rate_setup(struct net_device *dev, u 
     405@@ -10496,10 +10492,16 @@ ath_rate_setup(struct net_device *dev, u 
    406406                maxrates = IEEE80211_RATE_MAXSIZE; 
    407407        } else 
     
    420420 } 
    421421  
    422 @@ -10525,13 +10527,18 @@ ath_setcurmode(struct ath_softc *sc, enu 
     422@@ -10528,13 +10530,18 @@ ath_setcurmode(struct ath_softc *sc, enu 
    423423                {   0, 500, 130 }, 
    424424        }; 
     
    441441        for (i = 0; i < 32; i++) { 
    442442                u_int8_t ix = rt->rateCodeToIndex[i]; 
    443 @@ -10541,7 +10548,7 @@ ath_setcurmode(struct ath_softc *sc, enu 
     443@@ -10544,7 +10551,7 @@ ath_setcurmode(struct ath_softc *sc, enu 
    444444                        continue; 
    445445                } 
     
    450450                    rt->info[ix].phy == IEEE80211_T_OFDM) 
    451451                        sc->sc_hwmap[i].flags |= IEEE80211_RADIOTAP_F_SHORTPRE; 
    452 @@ -10942,9 +10949,106 @@ enum { 
     452@@ -10945,9 +10952,106 @@ enum { 
    453453        ATH_MAXVAPS             = 26, 
    454454        ATH_INTMIT                      = 27, 
     
    558558 ath_sysctl_set_intmit(struct ath_softc *sc, long ctl, u_int val) 
    559559 { 
    560 @@ -11023,6 +11127,7 @@ static int 
     560@@ -11026,6 +11130,7 @@ static int 
    561561 ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl, write, filp, buffer, lenp, ppos) 
    562562 { 
     
    566566        u_int val; 
    567567        u_int tab_3_val[3]; 
    568 @@ -11046,25 +11151,34 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
     568@@ -11049,25 +11154,34 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
    569569                                lenp, ppos); 
    570570                if (ret == 0) { 
     
    614614                        case ATH_SOFTLED: 
    615615                                if (val != sc->sc_softled) { 
    616 @@ -11217,6 +11331,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
     616@@ -11220,6 +11334,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
    617617                } 
    618618        } else { 
     
    624624                        val = ath_hal_getslottime(ah); 
    625625                        break; 
    626 @@ -11235,6 +11352,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
     626@@ -11238,6 +11355,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
    627627                case ATH_COUNTRYCODE: 
    628628                        ath_hal_getcountrycode(ah, &val); 
     
    634634                        val = ath_maxvaps; 
    635635                        break; 
    636 @@ -11348,11 +11468,17 @@ static const ctl_table ath_sysctl_templa 
     636@@ -11351,11 +11471,17 @@ static const ctl_table ath_sysctl_templa 
    637637        }, 
    638638        { .ctl_name     = CTL_AUTO, 
     
    653653          .mode         = 0444, 
    654654          .proc_handler = ath_sysctl_halparam, 
    655 @@ -11360,7 +11486,7 @@ static const ctl_table ath_sysctl_templa 
     655@@ -11363,7 +11489,7 @@ static const ctl_table ath_sysctl_templa 
    656656        }, 
    657657        { .ctl_name     = CTL_AUTO, 
     
    662662          .extra2       = (void *)ATH_REGDOMAIN, 
    663663        }, 
    664 @@ -11423,6 +11549,12 @@ static const ctl_table ath_sysctl_templa 
     664@@ -11426,6 +11552,12 @@ static const ctl_table ath_sysctl_templa 
    665665          .extra2       = (void *)ATH_ACKRATE, 
    666666        }, 
     
    675675          .mode         = 0200, 
    676676          .proc_handler = ath_sysctl_halparam, 
    677 @@ -11663,13 +11795,6 @@ static ctl_table ath_static_sysctls[] =  
     677@@ -11666,13 +11798,6 @@ static ctl_table ath_static_sysctls[] =  
    678678        }, 
    679679 #endif 
     
    689689          .mode         = 0444, 
    690690          .data         = &ath_maxvaps, 
    691 @@ -11677,13 +11802,6 @@ static ctl_table ath_static_sysctls[] =  
     691@@ -11680,13 +11805,6 @@ static ctl_table ath_static_sysctls[] =  
    692692          .proc_handler = proc_dointvec 
    693693        }, 
     
    705705--- a/ath/if_athvar.h 
    706706+++ b/ath/if_athvar.h 
    707 @@ -688,16 +688,17 @@ struct ath_softc { 
     707@@ -688,17 +688,18 @@ struct ath_softc { 
    708708        int8_t sc_ofdm_weak_det; /* OFDM weak frames detection, -1 == auto */ 
    709709  
     
    719719        HAL_OPMODE sc_opmode;                   /* current hal operating mode */ 
    720720        enum ieee80211_phymode sc_curmode;      /* current phy mode */ 
     721        u_int sc_poweroffset;                   /* hardware power offset */ 
    721722        u_int16_t sc_curtxpow;                  /* current tx power limit */ 
    722723        u_int16_t sc_curaid;                    /* current association id */ 
     
    726727        u_int8_t        sc_rixmap[256];                 /* IEEE to h/w rate table ix */ 
    727728        struct { 
    728 @@ -808,6 +809,8 @@ struct ath_softc { 
     729@@ -809,6 +810,8 @@ struct ath_softc { 
    729730        u_int32_t sc_dturbo_bw_turbo;           /* bandwidth threshold */ 
    730731 #endif 
     
    735736        struct timer_list sc_dfs_excl_timer;    /* mark expiration timer task */ 
    736737        struct timer_list sc_dfs_cac_timer;     /* dfs wait timer */ 
    737 @@ -826,6 +829,7 @@ struct ath_softc { 
     738@@ -827,6 +830,7 @@ struct ath_softc { 
    738739        int sc_rp_num; 
    739740        int sc_rp_min; 
     
    743744         
    744745        int sc_rp_ignored;                      /* if set, we ignored all  
    745 @@ -941,6 +945,48 @@ int ar_device(int devid); 
     746@@ -942,6 +946,48 @@ int ar_device(int devid); 
    746747          DEV_NAME(_v->iv_ic->ic_dev)) 
    747748  
  • branches/8.09/package/madwifi/patches/423-phyerr_handling.patch

    r16033 r17279  
    11--- a/ath/if_ath.c 
    22+++ b/ath/if_ath.c 
    3 @@ -4390,13 +4390,12 @@ ath_key_update_end(struct ieee80211vap * 
     3@@ -4391,13 +4391,12 @@ ath_key_update_end(struct ieee80211vap * 
    44 static u_int32_t 
    55 ath_calcrxfilter(struct ath_softc *sc) 
     
    1616                 HAL_RX_FILTER_MCAST; 
    1717        if (ic->ic_opmode != IEEE80211_M_STA) 
    18 @@ -4415,9 +4414,8 @@ ath_calcrxfilter(struct ath_softc *sc) 
     18@@ -4416,9 +4415,8 @@ ath_calcrxfilter(struct ath_softc *sc) 
    1919        if (sc->sc_hasintmit && !sc->sc_needmib && ath_hal_getintmit(ah, NULL)) 
    2020                rfilt |= HAL_RX_FILTER_PHYERR; 
  • branches/8.09/package/madwifi/patches/424-timing.patch

    r16033 r17279  
    1717        return 0; 
    1818 bad3: 
    19 @@ -2672,6 +2674,7 @@ ath_init(struct net_device *dev) 
     19@@ -2673,6 +2675,7 @@ ath_init(struct net_device *dev) 
    2020         */ 
    2121        ath_chan_change(sc, ic->ic_curchan); 
     
    2525        ieee80211_start_running(ic);            /* start all VAPs */ 
    2626 #ifdef ATH_TX99_DIAG 
    27 @@ -4483,17 +4486,52 @@ ath_mode_init(struct net_device *dev) 
     27@@ -4484,17 +4487,52 @@ ath_mode_init(struct net_device *dev) 
    2828  * Set the slot time based on the current setting. 
    2929  */ 
     
    8383 } 
    8484  
    85 @@ -4515,7 +4553,7 @@ ath_updateslot(struct net_device *dev) 
     85@@ -4516,7 +4554,7 @@ ath_updateslot(struct net_device *dev) 
    8686        if (ic->ic_opmode == IEEE80211_M_HOSTAP) 
    8787                sc->sc_updateslot = UPDATE; 
     
    9292  
    9393 #ifdef ATH_SUPERG_DYNTURBO 
    94 @@ -5359,7 +5397,7 @@ ath_beacon_send(struct ath_softc *sc, in 
     94@@ -5360,7 +5398,7 @@ ath_beacon_send(struct ath_softc *sc, in 
    9595                sc->sc_updateslot = COMMIT;     /* commit next beacon */ 
    9696                sc->sc_slotupdate = slot; 
     
    101101        if (bfaddr != 0) { 
    102102                /* 
    103 @@ -9429,7 +9467,8 @@ ath_set_coverageclass(struct ieee80211co 
     103@@ -9430,7 +9468,8 @@ ath_set_coverageclass(struct ieee80211co 
    104104 { 
    105105        struct ath_softc *sc = ic->ic_dev->priv; 
     
    111111        return; 
    112112 } 
    113 @@ -10950,6 +10989,7 @@ enum { 
     113@@ -10953,6 +10992,7 @@ enum { 
    114114        ATH_OFDM_WEAK_DET       = 29, 
    115115        ATH_CHANBW              = 30, 
     
    119119  
    120120 /* 
    121 @@ -11162,21 +11202,31 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
     121@@ -11165,21 +11205,31 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
    122122                                        sc->sc_slottimeconf = val; 
    123123                                else 
     
    154154                        case ATH_SOFTLED: 
    155155                                if (val != sc->sc_softled) { 
    156 @@ -11332,6 +11382,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
     156@@ -11335,6 +11385,9 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl 
    157157                case ATH_CHANBW: 
    158158                        val = sc->sc_chanbw ?: 20; 
     
    164164                        val = ath_hal_getslottime(ah); 
    165165                        break; 
    166 @@ -11453,6 +11506,12 @@ static const ctl_table ath_sysctl_templa 
     166@@ -11456,6 +11509,12 @@ static const ctl_table ath_sysctl_templa 
    167167          .extra2       = (void *)ATH_CTSTIMEOUT, 
    168168        }, 
     
    233233        struct ieee80211com sc_ic;              /* NB: must be first */ 
    234234        struct net_device *sc_dev; 
    235 @@ -838,6 +847,8 @@ struct ath_softc { 
     235@@ -839,6 +848,8 @@ struct ath_softc { 
    236236                                                 * detected radars */ 
    237237        u_int32_t sc_nexttbtt; 
     
    242242  
    243243 typedef void (*ath_callback) (struct ath_softc *); 
    244 @@ -945,49 +956,76 @@ int ar_device(int devid); 
     244@@ -946,49 +957,76 @@ int ar_device(int devid); 
    245245          DEV_NAME(_v->iv_ic->ic_dev)) 
    246246  
  • branches/8.09/package/madwifi/patches/425-rc_rexmit.patch

    r16033 r17279  
    2121--- a/ath/if_ath.c 
    2222+++ b/ath/if_ath.c 
    23 @@ -8634,6 +8634,8 @@ ath_tx_processq(struct ath_softc *sc, st 
     23@@ -8635,6 +8635,8 @@ ath_tx_processq(struct ath_softc *sc, st 
    2424  
    2525                ni = bf->bf_node; 
     
    3030                        if (ts->ts_status == 0) { 
    3131                                u_int8_t txant = ts->ts_antenna; 
    32 @@ -8686,15 +8688,43 @@ ath_tx_processq(struct ath_softc *sc, st 
     32@@ -8687,15 +8689,43 @@ ath_tx_processq(struct ath_softc *sc, st 
    3333                        lr = ts->ts_longretry; 
    3434                        sc->sc_stats.ast_tx_shortretry += sr; 
  • branches/8.09/package/madwifi/patches/430-use_netdev_priv.patch

    r16033 r17279  
    2121--- a/ath/if_ath_ahb.c 
    2222+++ b/ath/if_ath_ahb.c 
    23 @@ -268,7 +268,7 @@ static int ahb_wmac_probe(struct platfor 
     23@@ -203,7 +203,7 @@ static int ahb_wmac_probe(struct platfor 
    2424        if (!dev) 
    2525                return -ENOMEM; 
     
    3030  
    3131        dev->irq = platform_get_irq(pdev, 0); 
    32 @@ -365,7 +365,7 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
     32@@ -300,7 +300,7 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
    3333                printk(KERN_ERR "%s: no memory for device state\n", dev_info); 
    3434                goto bad2; 
     
    7777        /* override with driver methods */ 
    7878        vap = &avp->av_vap; 
    79 @@ -1570,7 +1570,7 @@ static void 
     79@@ -1571,7 +1571,7 @@ static void 
    8080 ath_vap_delete(struct ieee80211vap *vap) 
    8181 { 
     
    8686        struct ath_vap *avp = ATH_VAP(vap); 
    8787        int decrease = 1; 
    88 @@ -1672,7 +1672,7 @@ void 
     88@@ -1673,7 +1673,7 @@ void 
    8989 ath_suspend(struct net_device *dev) 
    9090 { 
     
    9595  
    9696        DPRINTF(sc, ATH_DEBUG_ANY, "flags=%x\n", dev->flags); 
    97 @@ -1683,7 +1683,7 @@ void 
     97@@ -1684,7 +1684,7 @@ void 
    9898 ath_resume(struct net_device *dev) 
    9999 { 
     
    104104  
    105105        DPRINTF(sc, ATH_DEBUG_ANY, "flags=%x\n", dev->flags); 
    106 @@ -2247,7 +2247,7 @@ ath_intr(int irq, void *dev_id, struct p 
     106@@ -2248,7 +2248,7 @@ ath_intr(int irq, void *dev_id, struct p 
    107107 #endif 
    108108 { 
     
    113113        u_int64_t hw_tsf = 0; 
    114114        HAL_INT status; 
    115 @@ -2468,7 +2468,7 @@ static void 
     115@@ -2469,7 +2469,7 @@ static void 
    116116 ath_fatal_tasklet(TQUEUE_ARG data) 
    117117 { 
     
    122122        EPRINTF(sc, "Hardware error; resetting.\n"); 
    123123        ath_reset(dev); 
    124 @@ -2478,7 +2478,7 @@ static void 
     124@@ -2479,7 +2479,7 @@ static void 
    125125 ath_rxorn_tasklet(TQUEUE_ARG data) 
    126126 { 
     
    131131        EPRINTF(sc, "Receive FIFO overrun; resetting.\n"); 
    132132        ath_reset(dev); 
    133 @@ -2488,7 +2488,7 @@ static void 
     133@@ -2489,7 +2489,7 @@ static void 
    134134 ath_bmiss_tasklet(TQUEUE_ARG data) 
    135135 { 
     
    140140        if (time_before(jiffies, sc->sc_ic.ic_bmiss_guard)) { 
    141141                /* Beacon miss interrupt occured too short after last beacon 
    142 @@ -2567,7 +2567,7 @@ done: 
     142@@ -2568,7 +2568,7 @@ done: 
    143143 static int 
    144144 ath_init(struct net_device *dev) 
     
    149149        struct ath_hal *ah = sc->sc_ah; 
    150150        HAL_STATUS status; 
    151 @@ -2692,7 +2692,7 @@ done: 
     151@@ -2693,7 +2693,7 @@ done: 
    152152 static int 
    153153 ath_stop_locked(struct net_device *dev) 
     
    158158        struct ath_hal *ah = sc->sc_ah; 
    159159  
    160 @@ -2777,7 +2777,7 @@ static void ath_set_beacon_cal(struct at 
     160@@ -2778,7 +2778,7 @@ static void ath_set_beacon_cal(struct at 
    161161 static int 
    162162 ath_stop(struct net_device *dev) 
     
    167167  
    168168        ATH_LOCK(sc); 
    169 @@ -2997,7 +2997,7 @@ ath_fetch_idle_time(struct ath_softc *sc 
     169@@ -2998,7 +2998,7 @@ ath_fetch_idle_time(struct ath_softc *sc 
    170170 static int 
    171171 ath_reset(struct net_device *dev) 
     
    176176        struct ath_hal *ah = sc->sc_ah; 
    177177        struct ieee80211_channel *c; 
    178 @@ -3163,7 +3163,7 @@ dot11_to_ratecode(struct ath_softc *sc,  
     178@@ -3164,7 +3164,7 @@ dot11_to_ratecode(struct ath_softc *sc,  
    179179 static int 
    180180 ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) 
     
    185185        struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) 
    186186                (SKB_CB(skb) + 1); /* NB: SKB_CB casts to CB struct*. */ 
    187 @@ -3476,7 +3476,7 @@ _take_txbuf(struct ath_softc *sc, int fo 
     187@@ -3477,7 +3477,7 @@ _take_txbuf(struct ath_softc *sc, int fo 
    188188 static int 
    189189 ath_hardstart(struct sk_buff *skb, struct net_device *dev) 
     
    194194        struct ath_buf *bf = NULL; 
    195195        ath_bufhead bf_head; 
    196 @@ -3791,7 +3791,7 @@ static int 
     196@@ -3792,7 +3792,7 @@ static int 
    197197 ath_mgtstart(struct ieee80211com *ic, struct sk_buff *skb) 
    198198 { 
     
    203203        int error; 
    204204  
    205 @@ -4150,7 +4150,7 @@ static ieee80211_keyix_t 
     205@@ -4151,7 +4151,7 @@ static ieee80211_keyix_t 
    206206 ath_key_alloc(struct ieee80211vap *vap, const struct ieee80211_key *k) 
    207207 { 
     
    212212        /* 
    213213         * Group key allocation must be handled specially for 
    214 @@ -4215,7 +4215,7 @@ ath_key_delete(struct ieee80211vap *vap, 
     214@@ -4216,7 +4216,7 @@ ath_key_delete(struct ieee80211vap *vap, 
    215215                                struct ieee80211_node *ninfo) 
    216216 { 
     
    221221        struct ieee80211_node *ni = NULL; 
    222222        const struct ieee80211_cipher *cip = k->wk_cipher; 
    223 @@ -4291,14 +4291,14 @@ ath_key_set(struct ieee80211vap *vap, co 
     223@@ -4292,14 +4292,14 @@ ath_key_set(struct ieee80211vap *vap, co 
    224224        const u_int8_t mac[IEEE80211_ADDR_LEN]) 
    225225 { 
     
    238238        /* 
    239239         * XXX Using in_softirq is not right since we might 
    240 @@ -4316,7 +4316,7 @@ static void ath_poll_disable(struct net_ 
     240@@ -4317,7 +4317,7 @@ static void ath_poll_disable(struct net_ 
    241241  
    242242 static void ath_poll_enable(struct net_device *dev) 
     
    247247        /* NB: see above */ 
    248248        if (!in_softirq()) { 
    249 @@ -4342,7 +4342,7 @@ ath_key_update_begin(struct ieee80211vap 
     249@@ -4343,7 +4343,7 @@ ath_key_update_begin(struct ieee80211vap 
    250250 { 
    251251        struct net_device *dev = vap->iv_ic->ic_dev; 
     
    256256  
    257257        DPRINTF(sc, ATH_DEBUG_KEYCACHE, "Begin\n"); 
    258 @@ -4360,7 +4360,7 @@ ath_key_update_end(struct ieee80211vap * 
     258@@ -4361,7 +4361,7 @@ ath_key_update_end(struct ieee80211vap * 
    259259 { 
    260260        struct net_device *dev = vap->iv_ic->ic_dev; 
     
    265265  
    266266        DPRINTF(sc, ATH_DEBUG_KEYCACHE, "End\n"); 
    267 @@ -4453,7 +4453,7 @@ ath_merge_mcast(struct ath_softc *sc, u_ 
     267@@ -4454,7 +4454,7 @@ ath_merge_mcast(struct ath_softc *sc, u_ 
    268268 static void 
    269269 ath_mode_init(struct net_device *dev) 
     
    274274        u_int32_t rfilt, mfilt[2]; 
    275275  
    276 @@ -4539,7 +4539,7 @@ ath_set_timing(struct ath_softc *sc) 
     276@@ -4540,7 +4540,7 @@ ath_set_timing(struct ath_softc *sc) 
    277277 static void 
    278278 ath_updateslot(struct net_device *dev) 
     
    283283  
    284284        /* 
    285 @@ -4569,7 +4569,7 @@ ath_beacon_dturbo_config(struct ieee8021 
     285@@ -4570,7 +4570,7 @@ ath_beacon_dturbo_config(struct ieee8021 
    286286        (vap->iv_bss && (vap->iv_bss->ni_ath_flags & (IEEE80211_ATHC_TURBOP)) == \ 
    287287                (IEEE80211_ATHC_TURBOP)) 
     
    292292        if (ic->ic_opmode == IEEE80211_M_HOSTAP && IS_CAPABLE(vap)) { 
    293293  
    294 @@ -4617,7 +4617,7 @@ static void 
     294@@ -4618,7 +4618,7 @@ static void 
    295295 ath_beacon_dturbo_update(struct ieee80211vap *vap, int *needmark, u_int8_t dtim) 
    296296 { 
     
    301301  
    302302        if (sc->sc_ignore_ar) { 
    303 @@ -4758,7 +4758,7 @@ static void 
     303@@ -4759,7 +4759,7 @@ static void 
    304304 ath_turbo_switch_mode(unsigned long data) 
    305305 { 
     
    310310        unsigned int newflags; 
    311311  
    312 @@ -5437,7 +5437,7 @@ static void 
     312@@ -5438,7 +5438,7 @@ static void 
    313313 ath_bstuck_tasklet(TQUEUE_ARG data) 
    314314 { 
     
    319319         * XXX:if the bmisscount is cleared while the 
    320320         *     tasklet execution is pending, the following 
    321 @@ -5890,7 +5890,7 @@ ath_node_alloc_debug(struct ieee80211vap 
     321@@ -5891,7 +5891,7 @@ ath_node_alloc_debug(struct ieee80211vap 
    322322 ath_node_alloc(struct ieee80211vap *vap) 
    323323 #endif  
     
    328328        struct ath_node *an = kmalloc(space, GFP_ATOMIC); 
    329329        if (an != NULL) { 
    330 @@ -5926,7 +5926,7 @@ ath_node_cleanup(struct ieee80211_node * 
     330@@ -5927,7 +5927,7 @@ ath_node_cleanup(struct ieee80211_node * 
    331331 #endif 
    332332 { 
     
    337337        struct ath_buf *bf; 
    338338  
    339 @@ -5984,7 +5984,7 @@ ath_node_free_debug(struct ieee80211_nod 
     339@@ -5985,7 +5985,7 @@ ath_node_free_debug(struct ieee80211_nod 
    340340 ath_node_free(struct ieee80211_node *ni) 
    341341 #endif 
     
    346346 #ifdef IEEE80211_DEBUG_REFCNT 
    347347        sc->sc_node_free_debug(ni, func, line); 
    348 @@ -6032,7 +6032,7 @@ ath_node_move_data(const struct ieee8021 
     348@@ -6033,7 +6033,7 @@ ath_node_move_data(const struct ieee8021 
    349349 #ifdef NOT_YET 
    350350        struct ath_txq *txq = NULL; 
     
    355355        struct ath_hal *ah = sc->sc_ah; 
    356356        struct sk_buff *skb = NULL; 
    357 @@ -6552,7 +6552,7 @@ static void 
     357@@ -6553,7 +6553,7 @@ static void 
    358358 ath_capture(struct net_device *dev, const struct ath_buf *bf, 
    359359                struct sk_buff *skb, u_int64_t tsf, unsigned int tx) 
     
    364364        struct sk_buff *tskb = NULL; 
    365365    
    366 @@ -6612,7 +6612,7 @@ static void 
     366@@ -6613,7 +6613,7 @@ static void 
    367367 ath_recv_mgmt(struct ieee80211vap * vap, struct ieee80211_node *ni_or_null, 
    368368        struct sk_buff *skb, int subtype, int rssi, u_int64_t rtsf) 
     
    373373         struct ieee80211_frame *wh = (struct ieee80211_frame *)skb->data; 
    374374 #endif 
    375 @@ -6779,7 +6779,7 @@ ath_rx_poll(struct net_device *dev, int  
     375@@ -6780,7 +6780,7 @@ ath_rx_poll(struct net_device *dev, int  
    376376        struct net_device *dev = sc->sc_dev; 
    377377        int rx_limit = budget; 
     
    382382 #endif 
    383383        struct ath_buf *bf; 
    384 @@ -7301,7 +7301,7 @@ static void ath_grppoll_start(struct iee 
     384@@ -7302,7 +7302,7 @@ static void ath_grppoll_start(struct iee 
    385385        struct sk_buff *skb = NULL; 
    386386        struct ath_buf *bf, *head = NULL; 
     
    391391        u_int8_t rate; 
    392392        unsigned int ctsrate = 0, ctsduration = 0; 
    393 @@ -7519,7 +7519,7 @@ static void ath_grppoll_start(struct iee 
     393@@ -7520,7 +7520,7 @@ static void ath_grppoll_start(struct iee 
    394394 static void ath_grppoll_stop(struct ieee80211vap *vap) 
    395395 { 
     
    400400        struct ath_txq *txq = &sc->sc_grpplq; 
    401401        struct ath_buf *bf; 
    402 @@ -7731,7 +7731,7 @@ ath_txq_update(struct ath_softc *sc, str 
     402@@ -7732,7 +7732,7 @@ ath_txq_update(struct ath_softc *sc, str 
    403403 static int 
    404404 ath_wme_update(struct ieee80211com *ic) 
     
    409409        if (sc->sc_uapsdq) 
    410410                ath_txq_update(sc, sc->sc_uapsdq, WME_AC_VO); 
    411 @@ -7750,7 +7750,7 @@ ath_uapsd_flush(struct ieee80211_node *n 
     411@@ -7751,7 +7751,7 @@ ath_uapsd_flush(struct ieee80211_node *n 
    412412 { 
    413413        struct ath_node *an = ATH_NODE(ni); 
     
    418418  
    419419        ATH_NODE_UAPSD_LOCK_IRQ(an); 
    420 @@ -7941,7 +7941,7 @@ ath_tx_start(struct net_device *dev, str 
     420@@ -7942,7 +7942,7 @@ ath_tx_start(struct net_device *dev, str 
    421421                struct ath_buf *bf, struct sk_buff *skb, int nextfraglen) 
    422422 { 
     
    427427        struct ieee80211vap *vap = ni->ni_vap; 
    428428        struct ath_hal *ah = sc->sc_ah; 
    429 @@ -8850,7 +8850,7 @@ static void 
     429@@ -8851,7 +8851,7 @@ static void 
    430430 ath_tx_tasklet_q0(TQUEUE_ARG data) 
    431431 { 
     
    436436  
    437437 process_tx_again: 
    438 @@ -8881,7 +8881,7 @@ static void 
     438@@ -8882,7 +8882,7 @@ static void 
    439439 ath_tx_tasklet_q0123(TQUEUE_ARG data) 
    440440 { 
     
    445445  
    446446 process_tx_again: 
    447 @@ -8926,7 +8926,7 @@ static void 
     447@@ -8927,7 +8927,7 @@ static void 
    448448 ath_tx_tasklet(TQUEUE_ARG data) 
    449449 { 
     
    454454        unsigned long flags; 
    455455  
    456 @@ -8954,7 +8954,7 @@ process_tx_again: 
     456@@ -8955,7 +8955,7 @@ process_tx_again: 
    457457 static void 
    458458 ath_tx_timeout(struct net_device *dev) 
     
    463463        if (ath_chan_unavail(sc)) 
    464464                return; 
    465 @@ -9362,7 +9362,7 @@ static void 
     465@@ -9363,7 +9363,7 @@ static void 
    466466 ath_calibrate(unsigned long arg) 
    467467 { 
     
    472472        struct ieee80211com *ic = &sc->sc_ic; 
    473473        /* u_int32_t nchans; */ 
    474 @@ -9437,7 +9437,7 @@ static void 
     474@@ -9438,7 +9438,7 @@ static void 
    475475 ath_scan_start(struct ieee80211com *ic) 
    476476 { 
     
    481481        u_int32_t rfilt; 
    482482  
    483 @@ -9457,7 +9457,7 @@ static void 
     483@@ -9458,7 +9458,7 @@ static void 
    484484 ath_scan_end(struct ieee80211com *ic) 
    485485 { 
     
    490490        u_int32_t rfilt; 
    491491  
    492 @@ -9475,7 +9475,7 @@ static void 
     492@@ -9476,7 +9476,7 @@ static void 
    493493 ath_set_channel(struct ieee80211com *ic) 
    494494 { 
     
    499499        (void) ath_chan_set(sc, ic->ic_curchan); 
    500500        ic->ic_channoise = ath_hal_get_channel_noise(sc->sc_ah, &(sc->sc_curchan)); 
    501 @@ -9492,7 +9492,7 @@ ath_set_channel(struct ieee80211com *ic) 
     501@@ -9493,7 +9493,7 @@ ath_set_channel(struct ieee80211com *ic) 
    502502 static void 
    503503 ath_set_coverageclass(struct ieee80211com *ic) 
     
    508508        sc->sc_coverage = ic->ic_coverageclass * 3; 
    509509        ath_set_timing(sc); 
    510 @@ -9503,7 +9503,7 @@ ath_set_coverageclass(struct ieee80211co 
     510@@ -9504,7 +9504,7 @@ ath_set_coverageclass(struct ieee80211co 
    511511 static u_int 
    512512 ath_mhz2ieee(struct ieee80211com *ic, u_int freq, u_int flags) 
     
    517517        return (ath_hal_mhz2ieee(sc->sc_ah, freq, flags)); 
    518518 } 
    519 @@ -9518,7 +9518,7 @@ ath_newstate(struct ieee80211vap *vap, e 
     519@@ -9519,7 +9519,7 @@ ath_newstate(struct ieee80211vap *vap, e 
    520520        struct ath_vap *avp = ATH_VAP(vap); 
    521521        struct ieee80211com *ic = vap->iv_ic; 
     
    526526        struct ieee80211_node *ni, *wds_ni; 
    527527        unsigned int i; 
    528 @@ -9958,7 +9958,7 @@ ath_setup_comp(struct ieee80211_node *ni 
     528@@ -9959,7 +9959,7 @@ ath_setup_comp(struct ieee80211_node *ni 
    529529 { 
    530530 #define        IEEE80211_KEY_XR        (IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV) 
     
    535535        ieee80211_keyix_t keyix; 
    536536  
    537 @@ -10012,7 +10012,7 @@ static void 
     537@@ -10013,7 +10013,7 @@ static void 
    538538 ath_setup_stationkey(struct ieee80211_node *ni) 
    539539 { 
     
    544544  
    545545        keyix = ath_key_alloc(vap, &ni->ni_ucastkey); 
    546 @@ -10173,7 +10173,7 @@ ath_newassoc(struct ieee80211_node *ni,  
     546@@ -10174,7 +10174,7 @@ ath_newassoc(struct ieee80211_node *ni,  
    547547 { 
    548548        struct ieee80211com *ic = ni->ni_ic; 
     
    553553        sc->sc_rc->ops->newassoc(sc, ATH_NODE(ni), isnew); 
    554554        ath_wprobe_node_join(ni->ni_vap, ni); 
    555 @@ -10204,7 +10204,7 @@ ath_newassoc(struct ieee80211_node *ni,  
     555@@ -10205,7 +10205,7 @@ ath_newassoc(struct ieee80211_node *ni,  
    556556 static int 
    557557 ath_getchannels(struct net_device *dev) 
     
    562562        struct ath_hal *ah = sc->sc_ah; 
    563563        HAL_CHANNEL *chans; 
    564 @@ -10479,7 +10479,7 @@ ath_update_txpow(struct ath_softc *sc) 
     564@@ -10482,7 +10482,7 @@ ath_update_txpow(struct ath_softc *sc) 
    565565 static int 
    566566 ath_xr_rate_setup(struct net_device *dev) 
     
    571571        struct ieee80211com *ic = &sc->sc_ic; 
    572572        const HAL_RATE_TABLE *rt; 
    573 @@ -10510,7 +10510,7 @@ ath_xr_rate_setup(struct net_device *dev 
     573@@ -10513,7 +10513,7 @@ ath_xr_rate_setup(struct net_device *dev 
    574574 static int 
    575575 ath_rate_setup(struct net_device *dev, u_int mode) 
     
    580580        struct ieee80211com *ic = &sc->sc_ic; 
    581581        const HAL_RATE_TABLE *rt; 
    582 @@ -10757,7 +10757,7 @@ ath_printtxbuf(const struct ath_buf *bf, 
     582@@ -10760,7 +10760,7 @@ ath_printtxbuf(const struct ath_buf *bf, 
    583583 { 
    584584        const struct ath_tx_status *ts = &bf->bf_dsstatus.ds_txstat; 
     
    589589  
    590590        DPRINTF(sc, ATH_DEBUG_ANY,  
    591 @@ -10784,7 +10784,7 @@ ath_printtxbuf(const struct ath_buf *bf, 
     591@@ -10787,7 +10787,7 @@ ath_printtxbuf(const struct ath_buf *bf, 
    592592 static struct net_device_stats * 
    593593 ath_getstats(struct net_device *dev) 
     
    598598  
    599599        /* update according to private statistics */ 
    600 @@ -10807,7 +10807,7 @@ ath_getstats(struct net_device *dev) 
     600@@ -10810,7 +10810,7 @@ ath_getstats(struct net_device *dev) 
    601601 static int 
    602602 ath_set_mac_address(struct net_device *dev, void *addr) 
     
    607607        struct ath_hal *ah = sc->sc_ah; 
    608608        struct sockaddr *mac = addr; 
    609 @@ -10836,7 +10836,7 @@ ath_set_mac_address(struct net_device *d 
     609@@ -10839,7 +10839,7 @@ ath_set_mac_address(struct net_device *d 
    610610 static int 
    611611 ath_change_mtu(struct net_device *dev, int mtu) 
     
    616616  
    617617        if (!(ATH_MIN_MTU < mtu && mtu <= ATH_MAX_MTU)) { 
    618 @@ -10923,7 +10923,7 @@ bad: 
     618@@ -10926,7 +10926,7 @@ bad: 
    619619 static int 
    620620 ath_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 
     
    625625        int error; 
    626626  
    627 @@ -11804,7 +11804,7 @@ static void 
     627@@ -11807,7 +11807,7 @@ static void 
    628628 ath_announce(struct net_device *dev) 
    629629 { 
     
    634634        u_int modes, cc; 
    635635        static const int MLEN = 1024; 
    636 @@ -11991,7 +11991,7 @@ static void 
     636@@ -11994,7 +11994,7 @@ static void 
    637637 txcont_configure_radio(struct ieee80211com *ic) 
    638638 { 
     
    643643        struct ieee80211_wme_state  *wme = &ic->ic_wme; 
    644644        struct ieee80211vap         *vap = TAILQ_FIRST(&ic->ic_vaps); 
    645 @@ -12265,7 +12265,7 @@ static void 
     645@@ -12268,7 +12268,7 @@ static void 
    646646 txcont_queue_packet(struct ieee80211com *ic, struct ath_txq* txq) 
    647647 { 
     
    652652        struct ath_buf *bf                 = NULL; 
    653653        struct sk_buff *skb                = NULL; 
    654 @@ -12398,7 +12398,7 @@ static void 
     654@@ -12401,7 +12401,7 @@ static void 
    655655 txcont_on(struct ieee80211com *ic) 
    656656 { 
     
    661661        if (IFF_RUNNING != (ic->ic_dev->flags & IFF_RUNNING)) { 
    662662                EPRINTF(sc, "Cannot enable txcont when" 
    663 @@ -12419,7 +12419,7 @@ static void 
     663@@ -12422,7 +12422,7 @@ static void 
    664664 txcont_off(struct ieee80211com *ic) 
    665665 { 
     
    670670        if (TAILQ_FIRST(&ic->ic_vaps)->iv_opmode != IEEE80211_M_WDS) 
    671671                sc->sc_beacons = 1; 
    672 @@ -12433,7 +12433,7 @@ static int 
     672@@ -12436,7 +12436,7 @@ static int 
    673673 ath_get_dfs_testmode(struct ieee80211com *ic) 
    674674 { 
     
    679679 } 
    680680  
    681 @@ -12460,7 +12460,7 @@ static void 
     681@@ -12463,7 +12463,7 @@ static void 
    682682 ath_set_dfs_testmode(struct ieee80211com *ic, int value) 
    683683 { 
     
    688688 } 
    689689  
    690 @@ -12470,7 +12470,7 @@ static int 
     690@@ -12473,7 +12473,7 @@ static int 
    691691 ath_get_txcont(struct ieee80211com *ic) 
    692692 { 
     
    697697 } 
    698698  
    699 @@ -12488,7 +12488,7 @@ static void 
     699@@ -12491,7 +12491,7 @@ static void 
    700700 ath_set_txcont_power(struct ieee80211com *ic, unsigned int txpower) 
    701701 { 
     
    706706                IEEE80211_TXPOWER_MAX : txpower; 
    707707        if (sc->sc_txcont_power != new_txcont_power) { 
    708 @@ -12506,7 +12506,7 @@ static int 
     708@@ -12509,7 +12509,7 @@ static int 
    709709 ath_get_txcont_power(struct ieee80211com *ic) 
    710710 { 
     
    715715        return sc->sc_txcont_power ? sc->sc_txcont_power : 0; 
    716716 } 
    717 @@ -12516,7 +12516,7 @@ ath_get_txcont_power(struct ieee80211com 
     717@@ -12519,7 +12519,7 @@ ath_get_txcont_power(struct ieee80211com 
    718718 ath_set_txcont_rate(struct ieee80211com *ic, unsigned int new_rate) 
    719719 { 
     
    724724                /*  NOTE: This value is sanity checked and dropped down to  
    725725                 *  closest rate in txcont_on. */ 
    726 @@ -12533,7 +12533,7 @@ ath_set_txcont_rate(struct ieee80211com  
     726@@ -12536,7 +12536,7 @@ ath_set_txcont_rate(struct ieee80211com  
    727727 ath_get_txcont_rate(struct ieee80211com *ic) 
    728728 { 
     
    733733 } 
    734734  
    735 @@ -12543,7 +12543,7 @@ static void 
     735@@ -12546,7 +12546,7 @@ static void 
    736736 ath_set_dfs_cac_time(struct ieee80211com *ic, unsigned int time_s) 
    737737 { 
     
    742742 } 
    743743  
    744 @@ -12553,7 +12553,7 @@ static unsigned int 
     744@@ -12556,7 +12556,7 @@ static unsigned int 
    745745 ath_get_dfs_cac_time(struct ieee80211com *ic) 
    746746 { 
     
    751751 } 
    752752  
    753 @@ -12573,7 +12573,7 @@ static void 
     753@@ -12576,7 +12576,7 @@ static void 
    754754 ath_set_dfs_excl_period(struct ieee80211com *ic, unsigned int time_s) 
    755755 { 
     
    760760 } 
    761761  
    762 @@ -12582,7 +12582,7 @@ static unsigned int 
     762@@ -12585,7 +12585,7 @@ static unsigned int 
    763763 ath_get_dfs_excl_period(struct ieee80211com *ic) 
    764764 { 
     
    769769 } 
    770770  
    771 @@ -12594,7 +12594,7 @@ static unsigned int 
     771@@ -12597,7 +12597,7 @@ static unsigned int 
    772772 ath_test_radar(struct ieee80211com *ic) 
    773773 { 
     
    778778                ath_radar_detected(sc, "ath_test_radar from user space"); 
    779779        else 
    780 @@ -12610,7 +12610,7 @@ static unsigned int 
     780@@ -12613,7 +12613,7 @@ static unsigned int 
    781781 ath_dump_hal_map(struct ieee80211com *ic) 
    782782 { 
     
    787787        return 0; 
    788788 } 
    789 @@ -12718,7 +12718,7 @@ ath_rcv_dev_event(struct notifier_block  
     789@@ -12721,7 +12721,7 @@ ath_rcv_dev_event(struct notifier_block  
    790790        void *ptr) 
    791791 { 
     
    796796        if (!dev || !sc || dev->open != &ath_init) 
    797797                return 0; 
    798 @@ -13453,7 +13453,7 @@ static unsigned int 
     798@@ -13456,7 +13456,7 @@ static unsigned int 
    799799 ath_read_register(struct ieee80211com *ic, unsigned int address,  
    800800                unsigned int* value) 
     
    805805                IPRINTF(sc, "Illegal Atheros register access " 
    806806                                "attempted: 0x%04x >= 0x%04x\n", 
    807 @@ -13483,7 +13483,7 @@ static unsigned int 
     807@@ -13486,7 +13486,7 @@ static unsigned int 
    808808 ath_write_register(struct ieee80211com *ic, unsigned int address,  
    809809                unsigned int value) 
     
    814814                IPRINTF(sc, "Illegal Atheros register access " 
    815815                                "attempted: 0x%04x >= 0x%04x\n", 
    816 @@ -13511,7 +13511,7 @@ static void 
     816@@ -13514,7 +13514,7 @@ static void 
    817817 ath_registers_dump(struct ieee80211com *ic) 
    818818 { 
     
    823823 } 
    824824 #endif /* #ifdef ATH_REVERSE_ENGINEERING */ 
    825 @@ -13523,7 +13523,7 @@ static void 
     825@@ -13526,7 +13526,7 @@ static void 
    826826 ath_registers_mark(struct ieee80211com *ic) 
    827827 { 
     
    832832 } 
    833833 #endif /* #ifdef ATH_REVERSE_ENGINEERING */ 
    834 @@ -13535,7 +13535,7 @@ static void 
     834@@ -13538,7 +13538,7 @@ static void 
    835835 ath_registers_dump_delta(struct ieee80211com *ic) 
    836836 { 
     
    843843--- a/ath/if_ath_pci.c 
    844844+++ b/ath/if_ath_pci.c 
    845 @@ -199,7 +199,7 @@ ath_pci_probe(struct pci_dev *pdev, cons 
     845@@ -226,7 +226,7 @@ ath_pci_probe(struct pci_dev *pdev, cons 
    846846                printk(KERN_ERR "%s: no memory for device state\n", dev_info); 
    847847                goto bad2; 
     
    852852        sc->aps_sc.sc_iobase = mem; 
    853853  
    854 @@ -278,7 +278,7 @@ static void 
     854@@ -309,7 +309,7 @@ static void 
    855855 ath_pci_remove(struct pci_dev *pdev) 
    856856 { 
     
    861861        ath_detach(dev); 
    862862        if (dev->irq) 
    863 @@ -296,7 +296,7 @@ ath_pci_suspend(struct pci_dev *pdev, pm 
     863@@ -327,7 +327,7 @@ ath_pci_suspend(struct pci_dev *pdev, pm 
    864864        struct net_device *dev = pci_get_drvdata(pdev); 
    865865  
     
    870870        return pci_set_power_state(pdev, PCI_D3hot); 
    871871 } 
    872 @@ -313,7 +313,7 @@ ath_pci_resume(struct pci_dev *pdev) 
     872@@ -344,7 +344,7 @@ ath_pci_resume(struct pci_dev *pdev) 
    873873                return err; 
    874874  
  • branches/8.09/package/madwifi/patches/431-compile_fixes.patch

    r16033 r17279  
    11--- a/ath/if_ath.c 
    22+++ b/ath/if_ath.c 
    3 @@ -2387,7 +2387,9 @@ ath_intr(int irq, void *dev_id, struct p 
     3@@ -2388,7 +2388,9 @@ ath_intr(int irq, void *dev_id, struct p 
    44                if (status & (HAL_INT_RX | HAL_INT_RXPHY)) { 
    55                        ath_uapsd_processtriggers(sc, hw_tsf); 
     
    1212 #else 
    1313                        if (netif_rx_schedule_prep(dev)) 
    14 @@ -2395,7 +2397,9 @@ ath_intr(int irq, void *dev_id, struct p 
     14@@ -2396,7 +2398,9 @@ ath_intr(int irq, void *dev_id, struct p 
    1515                        { 
    1616                                sc->sc_imask &= ~HAL_INT_RX; 
     
    2323 #else 
    2424                                __netif_rx_schedule(dev); 
    25 @@ -7131,7 +7135,9 @@ rx_next: 
     25@@ -7132,7 +7136,9 @@ rx_next: 
    2626                local_irq_restore(flags); 
    2727        } 
  • branches/8.09/package/madwifi/patches/432-netdev_ops.patch

    r17239 r17279  
    4646 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) 
    4747        netif_napi_add(dev, &sc->sc_napi, ath_rx_poll, 64); 
    48 @@ -12726,8 +12744,13 @@ ath_rcv_dev_event(struct notifier_block  
     48@@ -1257,7 +1275,6 @@ ath_detach(struct net_device *dev) 
     49        ath_dynamic_sysctl_unregister(sc); 
     50        ATH_LOCK_DESTROY(sc); 
     51        ATH_HAL_LOCK_DESTROY(sc); 
     52-       dev->stop = NULL; /* prevent calling ath_stop again */ 
     53        unregister_netdev(dev); 
     54        return 0; 
     55 } 
     56@@ -12729,8 +12746,13 @@ ath_rcv_dev_event(struct notifier_block  
    4957        struct net_device *dev = (struct net_device *)ptr; 
    5058        struct ath_softc *sc = (struct ath_softc *)netdev_priv(dev); 
     
    6270--- a/net80211/ieee80211.c 
    6371+++ b/net80211/ieee80211.c 
    64 @@ -450,6 +450,17 @@ ieee80211_ifdetach(struct ieee80211com * 
     72@@ -450,6 +450,18 @@ ieee80211_ifdetach(struct ieee80211com * 
    6573 } 
    6674 EXPORT_SYMBOL(ieee80211_ifdetach); 
     
    7482+       .ndo_set_multicast_list = ieee80211_set_multicast_list, 
    7583+       .ndo_change_mtu         = ieee80211_change_mtu, 
     84+       .ndo_do_ioctl           = ieee80211_ioctl, 
    7685+}; 
    7786+#endif 
     
    8089 ieee80211_vap_setup(struct ieee80211com *ic, struct net_device *dev, 
    8190        const char *name, int opmode, int flags, struct ieee80211vap *master) 
    82 @@ -470,12 +481,16 @@ ieee80211_vap_setup(struct ieee80211com  
     91@@ -470,12 +482,17 @@ ieee80211_vap_setup(struct ieee80211com  
    8392                } else 
    8493                        strncpy(dev->name, name, sizeof(dev->name)); 
     
    91100        dev->hard_start_xmit = ieee80211_hardstart; 
    92101        dev->set_multicast_list = ieee80211_set_multicast_list; 
     102+       dev->do_ioctl = ieee80211_ioctl; 
    93103+#else 
    94104+       dev->netdev_ops = &ieee80211_netdev_ops; 
     
    97107        dev->set_mac_address = ieee80211_set_mac_address; 
    98108 #endif 
    99 @@ -1823,7 +1838,11 @@ ieee80211_set_multicast_list(struct net_ 
     109@@ -1823,7 +1840,11 @@ ieee80211_set_multicast_list(struct net_ 
    100110        IEEE80211_UNLOCK_IRQ(ic); 
    101111  
     
    126136        switch (event) { 
    127137        case NETDEV_CHANGENAME: 
     138--- a/net80211/ieee80211_var.h 
     139+++ b/net80211/ieee80211_var.h 
     140@@ -740,6 +740,7 @@ void ieee80211_build_sc_ie(struct ieee80 
     141 void ieee80211_dfs_action(struct ieee80211com *); 
     142 void ieee80211_expire_channel_excl_restrictions(struct ieee80211com *); 
     143 void ieee80211_setpuregbasicrates(struct ieee80211_rateset *rs); 
     144+int ieee80211_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); 
     145  
     146 /* 
     147  * Iterate through ic_channels to enumerate all distinct ic_ieee channel numbers. 
     148--- a/net80211/ieee80211_wireless.c 
     149+++ b/net80211/ieee80211_wireless.c 
     150@@ -5945,7 +5945,7 @@ static struct iw_handler_def ieee80211_i 
     151 /* 
     152  * Handle private ioctl requests. 
     153  */ 
     154-static int 
     155+int 
     156 ieee80211_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 
     157 { 
     158        struct ieee80211vap *vap = netdev_priv(dev); 
     159@@ -6035,7 +6035,6 @@ ieee80211_ioctl_vattach(struct ieee80211 
     160 { 
     161        struct net_device *dev = vap->iv_dev; 
     162  
     163-       dev->do_ioctl = ieee80211_ioctl; 
     164 #if IW_HANDLER_VERSION < 7 
     165        dev->get_wireless_stats = ieee80211_iw_getstats; 
     166 #endif 
     167--- a/net80211/ieee80211_input.c 
     168+++ b/net80211/ieee80211_input.c 
     169@@ -1185,7 +1185,11 @@ ieee80211_deliver_data(struct ieee80211_ 
     170                        skb1->protocol = __constant_htons(ETH_P_802_2); 
     171                        /* XXX insert vlan tag before queue it? */ 
     172                        ni_tmp = SKB_CB(skb1)->ni; /* remember node so we can free it */ 
     173+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) 
     174                        ret = dev->hard_start_xmit(skb1, dev); 
     175+#else 
     176+                       ret = dev->netdev_ops->ndo_start_xmit(skb1, dev); 
     177+#endif 
     178  
     179                        if (ret == NETDEV_TX_BUSY) 
     180                                ieee80211_dev_kfree_skb(&skb1); 
  • branches/8.09/package/madwifi/patches/434-name-alloc-fix.patch

    r16033 r17279  
    1 diff -ur madwifi-trunk-r3314/ath/if_ath_ahb.c madwifi-trunk-r3314.patched/ath/if_ath_ahb.c 
    2 --- madwifi-trunk-r3314/ath/if_ath_ahb.c        2009-05-17 22:16:05.000000000 +0300 
    3 +++ madwifi-trunk-r3314.patched/ath/if_ath_ahb.c        2009-05-17 22:15:47.000000000 +0300 
    4 @@ -376,6 +376,11 @@ 
     1--- a/ath/if_ath_ahb.c 
     2+++ b/ath/if_ath_ahb.c 
     3@@ -311,6 +311,11 @@ init_ath_wmac(u_int16_t devid, u_int16_t 
    54        SET_MODULE_OWNER(dev); 
    65        sclist[wlanNum] = sc; 
     
    1413        case AR531X_WLAN0_NUM: 
    1514                if (((devid & AR5315_REV_MAJ_M) == AR5315_REV_MAJ) || 
    16 diff -ur madwifi-trunk-r3314/ath/if_ath_pci.c madwifi-trunk-r3314.patched/ath/if_ath_pci.c 
    17 --- madwifi-trunk-r3314/ath/if_ath_pci.c        2009-05-17 22:16:05.000000000 +0300 
    18 +++ madwifi-trunk-r3314.patched/ath/if_ath_pci.c        2009-05-17 22:15:47.000000000 +0300 
    19 @@ -209,6 +209,11 @@ 
     15--- a/ath/if_ath_pci.c 
     16+++ b/ath/if_ath_pci.c 
     17@@ -236,6 +236,11 @@ ath_pci_probe(struct pci_dev *pdev, cons 
    2018         */ 
    2119        sc->aps_sc.sc_invalid = 1; 
  • branches/8.09/package/wprobe/Makefile

    r15750 r17279  
    2121define KernelPackage/wprobe 
    2222  SUBMENU:=Network Support 
     23  DEPENDS:=@LINUX_2_6 
    2324  TITLE:=Wireless driver probe infrastructure 
    2425  FILES:= \ 
    2526        $(PKG_BUILD_DIR)/kernel/wprobe.$(LINUX_KMOD_SUFFIX) 
    2627  AUTOLOAD:=$(call AutoLoad,01,wprobe) 
    27   DEPENDS:=@!LINUX_2_4 
    2828endef 
    2929 
     
    3232endef 
    3333 
    34 define Package/wprobe-info 
     34define Package/wprobe-util 
    3535  SECTION:=net 
    3636  CATEGORY:=Network 
     
    3939endef 
    4040 
    41 define Package/wprobe-info/description 
    42   wprobe-info uses the wprobe kernel module to query 
     41define Package/wprobe-util/description 
     42  wprobe-util uses the wprobe kernel module to query 
    4343  wireless driver measurement data from an interface 
    4444endef 
     
    4747  SECTION:=net 
    4848  CATEGORY:=Network 
    49   DEPENDS:=+kmod-wprobe +libnl-tiny 
     49  DEPENDS:=+wprobe-util 
    5050  TITLE:=Wireless measurement data exporter 
    5151endef 
     
    8484                CPPFLAGS="$(TARGET_CPPFLAGS) -I$(PKG_BUILD_DIR)/kernel" \ 
    8585                LDFLAGS="$(TARGET_LDFLAGS)" \ 
     86                HOST_OS=Linux \ 
    8687                LIBNL="-lnl-tiny" 
    8788endef 
     
    109110endef 
    110111 
    111 define Package/wprobe-info/install 
     112define Package/wprobe-util/install 
    112113        $(INSTALL_DIR) $(1)/sbin 
    113         $(INSTALL_BIN) $(PKG_BUILD_DIR)/user/wprobe-info $(1)/sbin/ 
     114        $(INSTALL_BIN) $(PKG_BUILD_DIR)/user/wprobe-util $(1)/sbin/ 
    114115endef 
    115116 
    116117define Package/wprobe-export/install 
    117         $(INSTALL_DIR) $(1)/sbin $(1)/etc/init.d 
    118         $(INSTALL_BIN) ./files/wprobe.init $(1)/etc/init.d/ 
     118        $(INSTALL_DIR) $(1)/sbin $(1)/etc/init.d $(1)/etc/config 
     119        $(INSTALL_BIN) ./files/wprobe.init $(1)/etc/init.d/wprobe 
     120        $(INSTALL_BIN) ./files/wprobe.config $(1)/etc/config/wprobe 
    119121        $(INSTALL_BIN) $(PKG_BUILD_DIR)/exporter/wprobe-export $(1)/sbin/ 
    120122endef 
    121123 
    122124$(eval $(call KernelPackage,wprobe)) 
    123 $(eval $(call BuildPackage,wprobe-info)) 
     125$(eval $(call BuildPackage,wprobe-util)) 
    124126$(eval $(call BuildPackage,wprobe-export)) 
  • branches/8.09/package/wprobe/files/wprobe.init

    r15719 r17279  
    11#!/bin/sh /etc/rc.common 
    22START=90 
     3EXPORTER=/usr/sbin/wprobe-ipfix 
     4UTIL=/sbin/wprobe-util 
    35 
    46wprobe_ssd() { 
    5         local cfg="$1"; shift 
    67        local cmd="$1"; shift 
    7         start-stop-daemon "$cmd" -p "/var/run/wprobe-$cfg.pid" -b -x /sbin/wprobe-export -m -- "$@" 
     8        local type="$1"; shift 
     9        local app="$1"; shift 
     10        start-stop-daemon "$cmd" -p "/var/run/wprobe-$type.pid" -b ${app:+-x "$app"} -m -- "$@" 
    811} 
    912 
    1013stop_wprobe() { 
    11         local cfg="$1" 
    12         [ -f "/var/run/wprobe-$cfg.pid" ] && wprobe_ssd "$cfg" -K 
    13         rm -f "/var/run/wprobe-$cfg.pid" 
     14        local type="$1" 
     15        [ -f "/var/run/wprobe-$type.pid" ] && wprobe_ssd -K "$type" 
     16        rm -f "/var/run/wprobe-$type.pid" 
    1417} 
    1518 
    16 start_wprobe() { 
     19config_wprobe() { 
     20        config_get ifname "$cfg" ifname 
     21        config_get interval "$cfg" interval 
     22        [ -n "$interval" ] || interval=100 
     23        $UTIL "$ifname" -i "$interval" 2>/dev/null >/dev/null 
     24} 
     25 
     26start_proxy() { 
     27        config_get port "$cfg" port 
     28        wprobe_ssd -S proxy "$UTIL" -P -p "${port:-17990}" 
     29} 
     30 
     31start_ipfix() { 
    1732        local cfg="$1" 
    1833        config_get ifname "$cfg" interface 
     
    3045                return 
    3146        } 
    32         wprobe_ssd "$cfg" -S "$proto" -i "$ifname" -c "$host" -p "${port:-4739}" 
     47        config_wprobe "$cfg" 
     48        wprobe_ssd -S "export-$cfg" "$EXPORTER" "$proto" -i "$ifname" -c "$host" -p "${port:-4739}" 
     49} 
     50 
     51start_export() { 
     52        local cfg="$1" 
     53        config_get export_type "$cfg" type 
     54        case "$export_type" in  
     55                ipfix) [ -x "$EXPORTER" ] && start_ipfix "$cfg";; 
     56                wprobe) start_proxy "$cfg";; 
     57        esac 
    3358} 
    3459 
     
    4368start() { 
    4469        config_load wprobe 
    45         config_foreach start_wprobe wprobe 
     70        config_foreach config_wprobe interface 
     71        config_foreach start_export export 
    4672} 
  • branches/8.09/package/wprobe/src/exporter/Makefile

    r15719 r17279  
     1include ../Makefile.inc 
     2CPPFLAGS += -I../kernel -I../user 
     3 
    14wprobe-export: wprobe-export.c 
    25        $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) 
  • branches/8.09/package/wprobe/src/exporter/wprobe-export.c

    r15719 r17279  
    6666 
    6767static struct wprobe_mapping map_perlink[] = { 
    68         WMAP(IEEE_TX_RATE, "tx_rate", .scale = 10.0f), 
    69         WMAP(IEEE_RX_RATE, "rx_rate", .scale = 10.0f), 
     68        WMAP(IEEE_TX_RATE, "tx_rate"), 
     69        WMAP(IEEE_RX_RATE, "rx_rate"), 
    7070        WMAP(RSSI, "rssi"), 
    7171        WMAP(SIGNAL, "signal"), 
     
    7878static unsigned char link_local[6]; 
    7979static char link_default[6]; 
    80 static LIST_HEAD(global_attr); 
    81 static LIST_HEAD(link_attr); 
    82 static LIST_HEAD(links); 
    8380static int nfields = 0; 
    8481 
     
    167164 
    168165static void 
    169 wprobe_dump_data(ipfix_t *ipfixh, ipfix_template_t *ipfixt, const char *ifname, struct list_head *gl, struct list_head *ll, struct list_head *ls) 
     166wprobe_dump_data(ipfix_t *ipfixh, ipfix_template_t *ipfixt, struct wprobe_iface *dev) 
    170167{ 
    171168        struct wprobe_link *link; 
    172169 
    173         wprobe_update_links(ifname, ls); 
    174         wprobe_request_data(ifname, gl, NULL, 2); 
    175         if (list_empty(ls)) { 
     170        wprobe_update_links(dev); 
     171        wprobe_request_data(dev, NULL); 
     172        if (list_empty(&dev->links)) { 
    176173                g_data.addrs[1] = link_default; 
    177174                ipfix_export_array(ipfixh, ipfixt, g_data.maxfields, g_data.addrs, g_data.lens); 
    178175                ipfix_export_flush(ipfixh); 
    179176        } 
    180         list_for_each_entry(link, ls, list) { 
     177        list_for_each_entry(link, &dev->links, list) { 
    181178                g_data.addrs[1] = link->addr; 
    182                 wprobe_request_data(ifname, ll, link->addr, 2); 
     179                wprobe_request_data(dev, link->addr); 
    183180                ipfix_export_array(ipfixh, ipfixt, g_data.maxfields, g_data.addrs, g_data.lens); 
    184181                ipfix_export_flush(ipfixh); 
     
    188185int main ( int argc, char **argv ) 
    189186{ 
     187        struct wprobe_iface *dev = NULL; 
    190188    ipfix_template_t  *ipfixt = NULL; 
    191189    ipfix_t *ipfixh = NULL; 
     
    197195    int verbose_level = 0; 
    198196    int opt, i = 10; 
     197        char *err = NULL; 
    199198 
    200199        while ((opt = getopt(argc, argv, "hi:c:p:vstu")) != EOF) { 
     
    255254        } 
    256255 
    257         if (wprobe_init() != 0) { 
    258                 fprintf(stderr, "wprobe init failed\n"); 
     256        dev = wprobe_get_auto(ifname, &err); 
     257        if (!dev || (list_empty(&dev->global_attr) && list_empty(&dev->link_attr))) { 
     258                fprintf(stderr, "Cannot connect to wprobe on interface '%s': %s\n", ifname, (err ? err : "Unknown error")); 
    259259                return -1; 
    260260        } 
    261261 
    262         wprobe_dump_attributes(ifname, false, &global_attr, (char *) link_local); 
    263         wprobe_dump_attributes(ifname, true, &link_attr, NULL); 
    264         if (list_empty(&global_attr) && list_empty(&link_attr)) { 
    265                 fprintf(stderr, "Cannot connect to wprobe on interface '%s'\n", ifname); 
    266                 return -1; 
    267         } 
    268  
    269         match_template(map_globals, ARRAY_SIZE(map_globals), &global_attr); 
    270         match_template(map_perlink, ARRAY_SIZE(map_perlink), &link_attr); 
     262        match_template(map_globals, ARRAY_SIZE(map_globals), &dev->global_attr); 
     263        match_template(map_perlink, ARRAY_SIZE(map_perlink), &dev->link_attr); 
    271264        if (nfields == 0) { 
    272265                fprintf(stderr, "No usable attributes found\n"); 
     
    301294 
    302295        while (!do_close) { 
    303                 usleep(100 * 1000); 
    304                 wprobe_measure(ifname); 
    305  
    306                 if (i-- > 0) 
    307                         continue; 
    308  
    309                 i = 10; 
    310                 wprobe_dump_data(ipfixh, ipfixt, ifname, &global_attr, &link_attr, &links); 
     296                sleep(1); 
     297                wprobe_dump_data(ipfixh, ipfixt, dev); 
    311298    } 
    312299 
  • branches/8.09/package/wprobe/src/kernel/linux/wprobe.h

    r15719 r17279  
    2323#include <linux/module.h> 
    2424#include <linux/list.h> 
     25#include <linux/timer.h> 
     26#include <linux/filter.h> 
    2527#include <net/genetlink.h> 
    2628#endif 
     
    3335 * @WPROBE_ATTR_INTERFACE: interface name to process query on (NLA_STRING) 
    3436 * @WPROBE_ATTR_MAC: mac address (used for wireless links) (NLA_STRING) 
    35  * @WPROBE_ATTR_FLAGS: interface/link/attribute flags (see enum wprobe_flags) (NLA_U32) 
    36  * @WPROBE_ATTR_DURATION: sampling duration (in milliseconds) (NLA_MSECS) 
     37 * @WPROBE_ATTR_FLAGS: interface/link/attribute flags (see enum wprobe_flags) (NLA_U32)a 
     38 * @WPROBE_ATTR_DURATION: sampling duration (in milliseconds) (NLA_MSECS)  
    3739 * 
    3840 * @WPROBE_ATTR_ID: attribute id (NLA_U32) 
    3941 * @WPROBE_ATTR_NAME: attribute name (NLA_STRING) 
    4042 * @WPROBE_ATTR_TYPE: attribute type (NLA_U8) 
    41  * @WPROBE_ATTR_SCALE: attribute scale factor (NLA_U32) 
    4243 * 
    4344 * attribute values: 
     
    5758 * @WPROBE_VAL_SUM_SQ: sum of all samples^2 
    5859 * @WPROBE_VAL_SAMPLES: number of samples 
     60 * @WPROBE_VAL_SCALE_TIME: last time the samples were scaled down 
     61 * 
     62 * configuration: 
     63 * @WPROBE_ATTR_INTERVAL: (measurement interval in milliseconds) (NLA_MSECS) 
     64 * @WPROBE_ATTR_SAMPLES_MIN: minimum samples to keep during inactivity (NLA_U32) 
     65 * @WPROBE_ATTR_SAMPLES_MAX: maximum samples to keep before scaling down (NLA_U32) 
     66 * @WPROBE_ATTR_SAMPLES_SCALE_M: multiplier for scaling down samples (NLA_U32) 
     67 * @WPROBE_ATTR_SAMPLES_SCALE_D: divisor for scaling down samples (NLA_U32) 
    5968 * 
    6069 * @WPROBE_ATTR_LAST: unused 
    6170 */ 
    6271enum wprobe_attr { 
     72        /* query attributes */ 
    6373        WPROBE_ATTR_UNSPEC, 
    6474        WPROBE_ATTR_INTERFACE, 
    6575        WPROBE_ATTR_MAC, 
    6676        WPROBE_ATTR_FLAGS, 
    67         WPROBE_ATTR_DURATION, 
    68         WPROBE_ATTR_SCALE, 
    69         /* end of query attributes */ 
    7077 
    7178        /* response data */ 
     
    7380        WPROBE_ATTR_NAME, 
    7481        WPROBE_ATTR_TYPE, 
     82        WPROBE_ATTR_DURATION, 
    7583 
    7684        /* value type attributes */ 
     
    8997        WPROBE_VAL_SUM_SQ, 
    9098        WPROBE_VAL_SAMPLES, 
     99        WPROBE_VAL_SCALE_TIME, 
     100 
     101        /* config attributes */ 
     102        WPROBE_ATTR_INTERVAL, 
     103        WPROBE_ATTR_SAMPLES_MIN, 
     104        WPROBE_ATTR_SAMPLES_MAX, 
     105        WPROBE_ATTR_SAMPLES_SCALE_M, 
     106        WPROBE_ATTR_SAMPLES_SCALE_D, 
     107        WPROBE_ATTR_FILTER, 
     108 
     109        WPROBE_ATTR_FILTER_GROUP, 
     110        WPROBE_ATTR_RXCOUNT, 
     111        WPROBE_ATTR_TXCOUNT, 
    91112 
    92113        WPROBE_ATTR_LAST 
     
    104125 * @WPROBE_CMD_MEASURE: take a snapshot of the current data 
    105126 * @WPROBE_CMD_GET_LINKS: get a list of links 
     127 * @WPROBE_CMD_CONFIG: set config options 
     128 * @WPROBE_CMD_GET_FILTER: get counters for active filters 
    106129 * 
    107130 * @WPROBE_CMD_LAST: unused 
     
    118141        WPROBE_CMD_MEASURE, 
    119142        WPROBE_CMD_GET_LINKS, 
     143        WPROBE_CMD_CONFIG, 
     144        WPROBE_CMD_GET_FILTER, 
    120145        WPROBE_CMD_LAST 
    121146}; 
     
    124149 * enum wprobe_flags: flags for wprobe links and items 
    125150 * @WPROBE_F_KEEPSTAT: keep statistics for this link/device 
    126  * @WPROBE_F_RESET: reset statistics now (used only in WPROBE_CMD_SET_LINK) 
     151 * @WPROBE_F_RESET: reset statistics now 
    127152 * @WPROBE_F_NEWDATA: used to indicate that a value has been updated 
    128153 */ 
     
    138163struct wprobe_item; 
    139164struct wprobe_source; 
     165struct wprobe_value; 
    140166 
    141167/** 
     
    155181        u32 flags; 
    156182        void *priv; 
    157         void *val; 
     183        struct wprobe_value *val; 
    158184}; 
    159185 
     
    193219        /* timestamps */ 
    194220        u64 first, last; 
    195 }; 
     221        u64 scale_timestamp; 
     222}; 
     223 
     224struct wprobe_filter_item_hdr { 
     225        char name[32]; 
     226        __be32 n_items; 
     227} __attribute__((packed)); 
     228 
     229struct wprobe_filter_item { 
     230        struct wprobe_filter_item_hdr hdr; 
     231        struct sock_filter filter[]; 
     232} __attribute__((packed)); 
     233 
     234struct wprobe_filter_counter { 
     235        u64 tx; 
     236        u64 rx; 
     237}; 
     238 
     239struct wprobe_filter_group { 
     240        const char *name; 
     241        int n_items; 
     242        struct wprobe_filter_item **items; 
     243        struct wprobe_filter_counter *counters; 
     244}; 
     245 
     246struct wprobe_filter_hdr { 
     247        __u8 magic[4]; 
     248        __u8 version; 
     249        __u8 hdrlen; 
     250        __u16 n_groups; 
     251} __attribute__((packed)); 
     252 
     253struct wprobe_filter { 
     254        spinlock_t lock; 
     255        struct sk_buff *skb; 
     256        void *data; 
     257        int n_groups; 
     258        int hdrlen; 
     259        struct wprobe_filter_item **items; 
     260        struct wprobe_filter_counter *counters; 
     261        struct wprobe_filter_group groups[]; 
     262}; 
     263 
     264enum { 
     265        WPROBE_PKT_RX = 0x00, 
     266        WPROBE_PKT_TX = 0x10, 
     267}; 
     268 
     269struct wprobe_wlan_hdr { 
     270        u16 len; 
     271        u8 snr; 
     272        u8 type; 
     273} __attribute__((packed)); 
     274 
    196275 
    197276/** 
     
    226305        int n_global_items; 
    227306 
    228         int (*sync_data)(struct wprobe_iface *dev, struct wprobe_link *l, struct wprobe_value *val, bool measure); 
     307        int (*sync_data)(struct wprobe_iface *dev, struct wprobe_link *l, 
     308                         struct wprobe_value *val, bool measure); 
    229309        void *priv; 
    230310 
     
    233313        struct list_head links; 
    234314        spinlock_t lock; 
    235         void *val; 
    236         void *query_val; 
    237 }; 
     315        struct wprobe_value *val; 
     316        struct wprobe_value *query_val; 
     317        struct wprobe_filter *active_filter; 
     318 
     319        u32 measure_interval; 
     320        struct timer_list measure_timer; 
     321 
     322        u32 scale_min; 
     323        u32 scale_max; 
     324        u32 scale_m; 
     325        u32 scale_d; 
     326}; 
     327 
    238328 
    239329#define WPROBE_FILL_BEGIN(_ptr, _list) do {                     \ 
     
    294384extern void __weak wprobe_update_stats(struct wprobe_iface *dev, struct wprobe_link *l); 
    295385 
     386/** 
     387 * wprobe_add_frame: add frame for layer 2 analysis 
     388 * @dev: wprobe_iface structure describing the interface 
     389 * @hdr: metadata for the frame 
     390 * @data: 802.11 header pointer 
     391 * @len: length of the 802.11 header 
     392 */ 
     393extern int __weak wprobe_add_frame(struct wprobe_iface *dev, const struct wprobe_wlan_hdr *hdr, void *data, int len); 
     394 
    296395#endif /* __KERNEL__ */ 
    297396 
  • branches/8.09/package/wprobe/src/kernel/wprobe-core.c

    r15719 r17279  
    3535#endif 
    3636 
     37#ifndef BIT 
     38#define BIT(x) (1 << (x)) 
     39#endif 
     40 
     41#define WPROBE_MIN_INTERVAL             100 /* minimum measurement interval in msecs */ 
     42#define WPROBE_MAX_FILTER_SIZE  1024 
     43#define WPROBE_MAX_FRAME_SIZE   1900 
     44 
    3745static struct list_head wprobe_if; 
    3846static spinlock_t wprobe_lock; 
     
    4452        .version = 1, 
    4553        /* only the first set of attributes is used for queries */ 
    46         .maxattr = WPROBE_ATTR_ID, 
     54        .maxattr = WPROBE_ATTR_LAST, 
    4755}; 
    4856 
     57/* fake radiotap header */ 
     58struct wprobe_rtap_hdr { 
     59        __u8 version; 
     60        __u8 padding; 
     61        __le16 len; 
     62        __le32 present; 
     63}; 
     64 
    4965static void wprobe_update_stats(struct wprobe_iface *dev, struct wprobe_link *l); 
     66static int wprobe_sync_data(struct wprobe_iface *dev, struct wprobe_link *l, bool query); 
     67static void wprobe_free_filter(struct wprobe_filter *f); 
    5068 
    5169int 
     
    82100EXPORT_SYMBOL(wprobe_remove_link); 
    83101 
     102static void 
     103wprobe_measure_timer(unsigned long data) 
     104{ 
     105        struct wprobe_iface *dev = (struct wprobe_iface *) data; 
     106 
     107        /* set next measurement interval */ 
     108        mod_timer(&dev->measure_timer, jiffies + 
     109                msecs_to_jiffies(dev->measure_interval)); 
     110 
     111        /* perform measurement */ 
     112        wprobe_sync_data(dev, NULL, false); 
     113} 
     114 
    84115int 
    85116wprobe_add_iface(struct wprobe_iface *s) 
     
    94125        INIT_LIST_HEAD(&s->list); 
    95126        INIT_LIST_HEAD(&s->links); 
    96  
    97         vsize = max(s->n_link_items, s->n_global_items); 
    98         s->val = kzalloc(sizeof(struct wprobe_value) * vsize, GFP_ATOMIC); 
     127        setup_timer(&s->measure_timer, wprobe_measure_timer, (unsigned long) s); 
     128 
     129        s->val = kzalloc(sizeof(struct wprobe_value) * s->n_global_items, GFP_ATOMIC); 
    99130        if (!s->val) 
    100131                goto error; 
    101132 
     133        vsize = max(s->n_link_items, s->n_global_items); 
    102134        s->query_val = kzalloc(sizeof(struct wprobe_value) * vsize, GFP_ATOMIC); 
    103135        if (!s->query_val) 
    104136                goto error; 
     137 
     138        /* initialize defaults to be able to handle overflow, 
     139         * user space will need to handle this if it keeps an 
     140         * internal histogram */ 
     141        s->scale_min = 20; 
     142        s->scale_max = (1 << 31); 
     143 
     144        s->scale_m = 1; 
     145        s->scale_d = 10; 
    105146 
    106147        spin_lock_irqsave(&wprobe_lock, flags); 
     
    124165        BUG_ON(!list_empty(&s->links)); 
    125166 
     167        del_timer_sync(&s->measure_timer); 
    126168        spin_lock_irqsave(&wprobe_lock, flags); 
    127169        list_del_rcu(&s->list); 
     
    134176        kfree(s->val); 
    135177        kfree(s->query_val); 
     178        if (s->active_filter) 
     179                wprobe_free_filter(s->active_filter); 
    136180} 
    137181EXPORT_SYMBOL(wprobe_remove_iface); 
     
    162206 
    163207int 
     208wprobe_add_frame(struct wprobe_iface *dev, const struct wprobe_wlan_hdr *hdr, void *data, int len) 
     209{ 
     210        struct wprobe_wlan_hdr *new_hdr; 
     211        struct wprobe_filter *f; 
     212        struct sk_buff *skb; 
     213        unsigned long flags; 
     214        int i, j; 
     215 
     216        rcu_read_lock(); 
     217        f = rcu_dereference(dev->active_filter); 
     218        if (!f) 
     219                goto out; 
     220 
     221        spin_lock_irqsave(&f->lock, flags); 
     222 
     223        skb = f->skb; 
     224        skb->len = sizeof(struct wprobe_rtap_hdr); 
     225        skb->tail = skb->data + skb->len; 
     226        if (len + skb->len > WPROBE_MAX_FRAME_SIZE) 
     227                len = WPROBE_MAX_FRAME_SIZE - skb->len; 
     228 
     229        new_hdr = (struct wprobe_wlan_hdr *) skb_put(skb, f->hdrlen); 
     230        memcpy(new_hdr, hdr, sizeof(struct wprobe_wlan_hdr)); 
     231        new_hdr->len = cpu_to_be16(new_hdr->len); 
     232 
     233        memcpy(skb_put(skb, len), data, len); 
     234 
     235        for(i = 0; i < f->n_groups; i++) { 
     236                struct wprobe_filter_group *fg = &f->groups[i]; 
     237                bool found = false; 
     238                int def = -1; 
     239 
     240                for (j = 0; j < fg->n_items; j++) { 
     241                        struct wprobe_filter_item *fi = fg->items[j]; 
     242 
     243                        if (!fi->hdr.n_items) { 
     244                                def = j; 
     245                                continue; 
     246                        } 
     247                        if (sk_run_filter(skb, fi->filter, fi->hdr.n_items) == 0) 
     248                                continue; 
     249 
     250                        found = true; 
     251                        break; 
     252                } 
     253                if (!found && def >= 0) { 
     254                        j = def; 
     255                        found = true; 
     256                } 
     257                if (found) { 
     258                        struct wprobe_filter_counter *c = &fg->counters[j]; 
     259 
     260                        if (hdr->type >= WPROBE_PKT_TX) 
     261                                c->tx++; 
     262                        else 
     263                                c->rx++; 
     264                } 
     265        } 
     266 
     267        spin_unlock_irqrestore(&f->lock, flags); 
     268out: 
     269        rcu_read_unlock(); 
     270        return 0; 
     271} 
     272EXPORT_SYMBOL(wprobe_add_frame); 
     273 
     274static int 
    164275wprobe_sync_data(struct wprobe_iface *dev, struct wprobe_link *l, bool query) 
    165276{ 
     
    191302EXPORT_SYMBOL(wprobe_sync_data); 
    192303 
     304static void 
     305wprobe_scale_stats(struct wprobe_iface *dev, const struct wprobe_item *item, 
     306                   struct wprobe_value *val, int n) 
     307{ 
     308        u64 scale_ts = jiffies_64; 
     309        int i; 
     310 
     311        for (i = 0; i < n; i++) { 
     312                if (!(item[i].flags & WPROBE_F_KEEPSTAT)) 
     313                        continue; 
     314 
     315                if (val[i].n <= dev->scale_min) 
     316                        continue; 
     317 
     318                /* FIXME: div_s64 seems to be very imprecise here, even when 
     319                 * the values are scaled up */ 
     320                val[i].s *= dev->scale_m; 
     321                val[i].s = div_s64(val[i].s, dev->scale_d); 
     322 
     323                val[i].ss *= dev->scale_m; 
     324                val[i].ss = div_s64(val[i].ss, dev->scale_d); 
     325 
     326                val[i].n = (val[i].n * dev->scale_m) / dev->scale_d; 
     327                val[i].scale_timestamp = scale_ts; 
     328        } 
     329} 
     330 
     331 
    193332void 
    194333wprobe_update_stats(struct wprobe_iface *dev, struct wprobe_link *l) 
     
    196335        const struct wprobe_item *item; 
    197336        struct wprobe_value *val; 
     337        bool scale_stats = false; 
    198338        int i, n; 
    199339 
     
    216356 
    217357                val[i].n++; 
     358                if ((item[i].flags & WPROBE_F_KEEPSTAT) && 
     359                        (dev->scale_max > 0) && (val[i].n > dev->scale_max)) { 
     360                        scale_stats = true; 
     361                } 
    218362 
    219363                switch(item[i].type) { 
     
    250394                val[i].pending = false; 
    251395        } 
     396        if (scale_stats) 
     397                wprobe_scale_stats(dev, item, val, n); 
    252398} 
    253399EXPORT_SYMBOL(wprobe_update_stats); 
    254400 
    255 static const struct nla_policy wprobe_policy[WPROBE_ATTR_ID+1] = { 
     401static const struct nla_policy wprobe_policy[WPROBE_ATTR_LAST+1] = { 
    256402        [WPROBE_ATTR_INTERFACE] = { .type = NLA_NUL_STRING }, 
    257403        [WPROBE_ATTR_MAC] = { .type = NLA_STRING }, 
    258         [WPROBE_ATTR_DURATION] = { .type = NLA_MSECS }, 
    259404        [WPROBE_ATTR_FLAGS] = { .type = NLA_U32 }, 
    260         [WPROBE_ATTR_SCALE] = { .type = NLA_U32 }, 
     405 
     406        /* config */ 
     407        [WPROBE_ATTR_INTERVAL] = { .type = NLA_MSECS }, 
     408        [WPROBE_ATTR_SAMPLES_MIN] = { .type = NLA_U32 }, 
     409        [WPROBE_ATTR_SAMPLES_MAX] = { .type = NLA_U32 }, 
     410        [WPROBE_ATTR_SAMPLES_SCALE_M] = { .type = NLA_U32 }, 
     411        [WPROBE_ATTR_SAMPLES_SCALE_D] = { .type = NLA_U32 }, 
     412        [WPROBE_ATTR_FILTER] = { .type = NLA_BINARY, .len = 32768 }, 
    261413}; 
    262414 
     
    323475                NLA_PUT_U64(msg, WPROBE_VAL_SUM_SQ, val[i].ss); 
    324476                NLA_PUT_U32(msg, WPROBE_VAL_SAMPLES, (u32) val[i].n); 
     477                NLA_PUT_MSECS(msg, WPROBE_VAL_SCALE_TIME, val[i].scale_timestamp); 
    325478        } 
    326479done: 
     
    371524 
    372525static bool 
     526wprobe_dump_filter_group(struct sk_buff *msg, struct wprobe_filter_group *fg, struct netlink_callback *cb) 
     527{ 
     528        struct genlmsghdr *hdr; 
     529        struct nlattr *group, *item; 
     530        int i; 
     531 
     532        hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, 
     533                        &wprobe_fam, NLM_F_MULTI, WPROBE_CMD_GET_FILTER); 
     534        if (!hdr) 
     535                return false; 
     536 
     537        NLA_PUT_STRING(msg, WPROBE_ATTR_NAME, fg->name); 
     538        group = nla_nest_start(msg, WPROBE_ATTR_FILTER_GROUP); 
     539        for (i = 0; i < fg->n_items; i++) { 
     540                struct wprobe_filter_item *fi = fg->items[i]; 
     541                struct wprobe_filter_counter *fc = &fg->counters[i]; 
     542 
     543                item = nla_nest_start(msg, WPROBE_ATTR_FILTER_GROUP); 
     544                NLA_PUT_STRING(msg, WPROBE_ATTR_NAME, fi->hdr.name); 
     545                NLA_PUT_U64(msg, WPROBE_ATTR_RXCOUNT, fc->rx); 
     546                NLA_PUT_U64(msg, WPROBE_ATTR_TXCOUNT, fc->tx); 
     547                nla_nest_end(msg, item); 
     548        } 
     549 
     550        nla_nest_end(msg, group); 
     551        genlmsg_end(msg, hdr); 
     552        return true; 
     553 
     554nla_put_failure: 
     555        genlmsg_cancel(msg, hdr); 
     556        return false; 
     557} 
     558 
     559static int 
     560wprobe_dump_filters(struct sk_buff *skb, struct netlink_callback *cb) 
     561{ 
     562        struct wprobe_iface *dev = (struct wprobe_iface *)cb->args[0]; 
     563        struct wprobe_filter *f; 
     564        int err = 0; 
     565        int i = 0; 
     566 
     567        if (!dev) { 
     568                err = nlmsg_parse(cb->nlh, GENL_HDRLEN + wprobe_fam.hdrsize, 
     569                                wprobe_fam.attrbuf, wprobe_fam.maxattr, wprobe_policy); 
     570                if (err) 
     571                        goto done; 
     572 
     573                dev = wprobe_get_dev(wprobe_fam.attrbuf[WPROBE_ATTR_INTERFACE]); 
     574                if (!dev) { 
     575                        err = -ENODEV; 
     576                        goto done; 
     577                } 
     578 
     579                cb->args[0] = (long) dev; 
     580                cb->args[1] = 0; 
     581        } else { 
     582                if (!wprobe_check_ptr(&wprobe_if, &dev->list)) { 
     583                        err = -ENODEV; 
     584                        goto done; 
     585                } 
     586        } 
     587 
     588        rcu_read_lock(); 
     589        f = rcu_dereference(dev->active_filter); 
     590        if (!f) 
     591                goto abort; 
     592 
     593        for (i = cb->args[1]; i < f->n_groups; i++) { 
     594                if (unlikely(!wprobe_dump_filter_group(skb, &f->groups[i], cb))) 
     595                        break; 
     596        } 
     597        cb->args[1] = i; 
     598abort: 
     599        rcu_read_unlock(); 
     600        err = skb->len; 
     601done: 
     602        return err; 
     603} 
     604 
     605static bool 
    373606wprobe_dump_link(struct sk_buff *msg, struct wprobe_link *l, struct netlink_callback *cb) 
    374607{ 
     
    432665done: 
    433666        return err; 
    434 } 
    435 static void 
    436 wprobe_scale_stats(const struct wprobe_item *item, struct wprobe_value *val, int n, u32 flags) 
    437 { 
    438         u32 scale = 0; 
    439         int i; 
    440  
    441         for (i = 0; i < n; i++) { 
    442                 if (!(item[i].flags & WPROBE_F_KEEPSTAT)) 
    443                         continue; 
    444  
    445                 /* reset statistics, if requested */ 
    446                 if (flags & WPROBE_F_RESET) 
    447                         scale = val[i].n; 
    448                 else if (wprobe_fam.attrbuf[WPROBE_ATTR_SCALE]) 
    449                         scale = nla_get_u32(wprobe_fam.attrbuf[WPROBE_ATTR_SCALE]); 
    450  
    451                 if ((scale > 0) && (val[i].n > scale)) { 
    452                         val[i].s = div_s64(val[i].s, scale); 
    453                         val[i].ss = div_s64(val[i].ss, scale); 
    454                         val[i].n = val[i].n / scale + 1; 
    455                 } 
    456         } 
    457667} 
    458668 
     
    516726                        if (!err) 
    517727                                memcpy(dev->query_val, val, n * sizeof(struct wprobe_value)); 
    518                         wprobe_scale_stats(item, val, n, flags); 
    519728                        spin_unlock_irqrestore(&dev->lock, flags); 
    520729 
     
    584793 
    585794static int 
     795wprobe_update_auto_measurement(struct wprobe_iface *dev, u32 interval) 
     796{ 
     797        if (interval && (interval < WPROBE_MIN_INTERVAL)) 
     798                return -EINVAL; 
     799 
     800        if (!interval && dev->measure_interval) 
     801                del_timer_sync(&dev->measure_timer); 
     802 
     803        dev->measure_interval = interval; 
     804        if (!interval) 
     805                return 0; 
     806 
     807        /* kick of a new measurement immediately */ 
     808        mod_timer(&dev->measure_timer, jiffies + 1); 
     809 
     810        return 0; 
     811} 
     812 
     813static int 
    586814wprobe_measure(struct sk_buff *skb, struct genl_info *info) 
    587815{ 
     
    605833done: 
    606834        rcu_read_unlock(); 
     835        return err; 
     836} 
     837 
     838static int 
     839wprobe_check_filter(void *data, int datalen, int gs) 
     840{ 
     841        struct wprobe_filter_item_hdr *hdr; 
     842        void *orig_data = data; 
     843        void *end = data + datalen; 
     844        int i, j, k, is, cur_is; 
     845 
     846        for (i = j = is = 0; i < gs; i++) { 
     847                hdr = data; 
     848                data += sizeof(*hdr); 
     849 
     850                if (data > end) 
     851                        goto overrun; 
     852 
     853                hdr->name[31] = 0; 
     854                cur_is = be32_to_cpu(hdr->n_items); 
     855                hdr->n_items = cur_is; 
     856                is += cur_is; 
     857                for (j = 0; j < cur_is; j++) { 
     858                        struct sock_filter *sf; 
     859                        int n_items; 
     860 
     861                        hdr = data; 
     862                        data += sizeof(*hdr); 
     863                        if (data > end) 
     864                                goto overrun; 
     865 
     866                        hdr->name[31] = 0; 
     867                        n_items = be32_to_cpu(hdr->n_items); 
     868                        hdr->n_items = n_items; 
     869 
     870                        if (n_items > 1024) 
     871                                goto overrun; 
     872 
     873                        sf = data; 
     874                        if (n_items > 0) { 
     875                                for (k = 0; k < n_items; k++) { 
     876                                        sf->code = be16_to_cpu(sf->code); 
     877                                        sf->k = be32_to_cpu(sf->k); 
     878                                        sf++; 
     879                                } 
     880                                if (sk_chk_filter(data, n_items) != 0) { 
     881                                        printk("%s: filter check failed at group %d, item %d\n", __func__, i, j); 
     882                                        return 0; 
     883                                } 
     884                        } 
     885                        data += n_items * sizeof(struct sock_filter); 
     886                } 
     887        } 
     888        return is; 
     889 
     890overrun: 
     891        printk(KERN_ERR "%s: overrun during filter check at group %d, item %d, offset=%d, len=%d\n", __func__, i, j, (data - orig_data), datalen); 
     892        return 0; 
     893} 
     894 
     895static void 
     896wprobe_free_filter(struct wprobe_filter *f) 
     897{ 
     898        if (f->skb) 
     899                kfree_skb(f->skb); 
     900        if (f->data) 
     901                kfree(f->data); 
     902        if (f->items) 
     903                kfree(f->items); 
     904        if (f->counters) 
     905                kfree(f->counters); 
     906        kfree(f); 
     907} 
     908 
     909 
     910static int 
     911wprobe_set_filter(struct wprobe_iface *dev, void *data, int len) 
     912{ 
     913        struct wprobe_filter_hdr *fhdr; 
     914        struct wprobe_rtap_hdr *rtap; 
     915        struct wprobe_filter *f; 
     916        int i, j, cur_is, is, gs; 
     917 
     918        if (len < sizeof(*fhdr)) 
     919                return -EINVAL; 
     920 
     921        fhdr = data; 
     922        data += sizeof(*fhdr); 
     923        len -= sizeof(*fhdr); 
     924 
     925        if (memcmp(fhdr->magic, "WPFF", 4) != 0) { 
     926                printk(KERN_ERR "%s: filter rejected (invalid magic)\n", __func__); 
     927                return -EINVAL; 
     928        } 
     929 
     930        gs = be16_to_cpu(fhdr->n_groups); 
     931        is = wprobe_check_filter(data, len, gs); 
     932        if (is == 0) 
     933                return -EINVAL; 
     934 
     935        f = kzalloc(sizeof(struct wprobe_filter) + 
     936                gs * sizeof(struct wprobe_filter_group), GFP_ATOMIC); 
     937        if (!f) 
     938                return -ENOMEM; 
     939 
     940        f->skb = alloc_skb(WPROBE_MAX_FRAME_SIZE, GFP_ATOMIC); 
     941        if (!f->skb) 
     942                goto error; 
     943 
     944        f->data = kmalloc(len, GFP_ATOMIC); 
     945        if (!f->data) 
     946                goto error; 
     947 
     948        f->items = kzalloc(sizeof(struct wprobe_filter_item *) * is, GFP_ATOMIC); 
     949        if (!f->items) 
     950                goto error; 
     951 
     952        f->counters = kzalloc(sizeof(struct wprobe_filter_counter) * is, GFP_ATOMIC); 
     953        if (!f->counters) 
     954                goto error; 
     955 
     956        spin_lock_init(&f->lock); 
     957        memcpy(f->data, data, len); 
     958        f->n_groups = gs; 
     959 
     960        if (f->hdrlen < sizeof(struct wprobe_wlan_hdr)) 
     961                f->hdrlen = sizeof(struct wprobe_wlan_hdr); 
     962 
     963        rtap = (struct wprobe_rtap_hdr *)skb_put(f->skb, sizeof(*rtap)); 
     964        memset(rtap, 0, sizeof(*rtap)); 
     965        rtap->len = cpu_to_le16(sizeof(struct wprobe_rtap_hdr) + f->hdrlen); 
     966        data = f->data; 
     967 
     968        cur_is = 0; 
     969        for (i = 0; i < gs; i++) { 
     970                struct wprobe_filter_item_hdr *hdr = data; 
     971                struct wprobe_filter_group *g = &f->groups[i]; 
     972 
     973                data += sizeof(*hdr); 
     974                g->name = hdr->name; 
     975                g->items = &f->items[cur_is]; 
     976                g->counters = &f->counters[cur_is]; 
     977                g->n_items = hdr->n_items; 
     978 
     979                for (j = 0; j < g->n_items; j++) { 
     980                        hdr = data; 
     981                        f->items[cur_is++] = data; 
     982                        data += sizeof(*hdr) + hdr->n_items * sizeof(struct sock_filter); 
     983                } 
     984        } 
     985        rcu_assign_pointer(dev->active_filter, f); 
     986        return 0; 
     987 
     988error: 
     989        wprobe_free_filter(f); 
     990        return -ENOMEM; 
     991} 
     992 
     993static int 
     994wprobe_set_config(struct sk_buff *skb, struct genl_info *info) 
     995{ 
     996        struct wprobe_iface *dev; 
     997        unsigned long flags; 
     998        int err = -ENOENT; 
     999        u32 scale_min, scale_max; 
     1000        u32 scale_m, scale_d; 
     1001        struct nlattr *attr; 
     1002        struct wprobe_filter *filter_free = NULL; 
     1003 
     1004        rcu_read_lock(); 
     1005        dev = wprobe_get_dev(info->attrs[WPROBE_ATTR_INTERFACE]); 
     1006        if (!dev) 
     1007                goto done_unlocked; 
     1008 
     1009        err = -EINVAL; 
     1010        spin_lock_irqsave(&dev->lock, flags); 
     1011        if (info->attrs[WPROBE_ATTR_MAC]) { 
     1012                /* not supported yet */ 
     1013                goto done; 
     1014        } 
     1015 
     1016        if (info->attrs[WPROBE_ATTR_FLAGS]) { 
     1017                u32 flags = nla_get_u32(info->attrs[WPROBE_ATTR_FLAGS]); 
     1018 
     1019                if (flags & BIT(WPROBE_F_RESET)) { 
     1020                        struct wprobe_link *l; 
     1021 
     1022                        memset(dev->val, 0, sizeof(struct wprobe_value) * dev->n_global_items); 
     1023                        list_for_each_entry_rcu(l, &dev->links, list) { 
     1024                                memset(l->val, 0, sizeof(struct wprobe_value) * dev->n_link_items); 
     1025                        } 
     1026                } 
     1027        } 
     1028 
     1029        if (info->attrs[WPROBE_ATTR_SAMPLES_MIN] || 
     1030                info->attrs[WPROBE_ATTR_SAMPLES_MAX]) { 
     1031                if ((attr = info->attrs[WPROBE_ATTR_SAMPLES_MIN])) 
     1032                        scale_min = nla_get_u32(attr); 
     1033                else 
     1034                        scale_min = dev->scale_min; 
     1035 
     1036                if ((attr = info->attrs[WPROBE_ATTR_SAMPLES_MAX])) 
     1037                        scale_max = nla_get_u32(attr); 
     1038                else 
     1039                        scale_max = dev->scale_max; 
     1040 
     1041                if ((!scale_min && !scale_max) || 
     1042                    (scale_min && scale_max && (scale_min < scale_max))) { 
     1043                        dev->scale_min = scale_min; 
     1044                        dev->scale_max = scale_max; 
     1045                } else { 
     1046                        goto done; 
     1047                } 
     1048        } 
     1049 
     1050        if (info->attrs[WPROBE_ATTR_SAMPLES_SCALE_M] && 
     1051                info->attrs[WPROBE_ATTR_SAMPLES_SCALE_D]) { 
     1052 
     1053                scale_m = nla_get_u32(info->attrs[WPROBE_ATTR_SAMPLES_SCALE_M]); 
     1054                scale_d = nla_get_u32(info->attrs[WPROBE_ATTR_SAMPLES_SCALE_D]); 
     1055 
     1056                if (!scale_d || (scale_m > scale_d)) 
     1057                        goto done; 
     1058 
     1059                dev->scale_m = scale_m; 
     1060                dev->scale_d = scale_d; 
     1061        } 
     1062 
     1063        if ((attr = info->attrs[WPROBE_ATTR_FILTER])) { 
     1064                filter_free = rcu_dereference(dev->active_filter); 
     1065                rcu_assign_pointer(dev->active_filter, NULL); 
     1066                if (nla_len(attr) > 0) 
     1067                        wprobe_set_filter(dev, nla_data(attr), nla_len(attr)); 
     1068        } 
     1069 
     1070        err = 0; 
     1071        if (info->attrs[WPROBE_ATTR_INTERVAL]) { 
     1072                /* change of measurement interval requested */ 
     1073                err = wprobe_update_auto_measurement(dev, 
     1074                        (u32) nla_get_u64(info->attrs[WPROBE_ATTR_INTERVAL])); 
     1075        } 
     1076 
     1077done: 
     1078        spin_unlock_irqrestore(&dev->lock, flags); 
     1079done_unlocked: 
     1080        rcu_read_unlock(); 
     1081        if (filter_free) { 
     1082                synchronize_rcu(); 
     1083                wprobe_free_filter(filter_free); 
     1084        } 
    6071085        return err; 
    6081086} 
     
    6281106                .dumpit = wprobe_dump_links, 
    6291107                .policy = wprobe_policy, 
    630         } 
     1108        }, 
     1109        { 
     1110                .cmd = WPROBE_CMD_CONFIG, 
     1111                .doit = wprobe_set_config, 
     1112                .policy = wprobe_policy, 
     1113        }, 
     1114        { 
     1115                .cmd = WPROBE_CMD_GET_FILTER, 
     1116                .dumpit = wprobe_dump_filters, 
     1117                .policy = wprobe_policy, 
     1118        }, 
    6311119}; 
    6321120 
  • branches/8.09/package/wprobe/src/user/Makefile

    r15719 r17279  
    1 CFLAGS = -O2 
    2 CPPFLAGS ?= -I../kernel 
    3 WFLAGS = -Wall -Werror 
     1include ../Makefile.inc 
     2 
     3CPPFLAGS += -I../kernel 
    44LDFLAGS = 
    55 
     6ifneq ($(HOST_OS),Linux) 
     7USE_LIBNL_MICRO=1 
     8else 
     9USE_LIBNL_MICRO= 
     10endif 
     11 
     12ifeq ($(USE_LIBNL_MICRO),1) 
     13LIBNL_PREFIX = /usr/local 
     14LIBNL = $(LIBNL_PREFIX)/lib/libnl-micro.a 
     15CPPFLAGS += -I$(LIBNL_PREFIX)/include/libnl-micro 
     16EXTRA_CFLAGS += -DNO_LOCAL_ACCESS 
     17else 
    618LIBNL = -lnl 
     19endif 
     20 
    721LIBM = -lm 
    822LIBS = $(LIBNL) $(LIBM) 
    923 
    10 all: libwprobe.a wprobe-info 
     24all: libwprobe.a wprobe-util 
    1125 
    12 libwprobe.a: wprobe.o 
     26libwprobe.a: wprobe-lib.o 
    1327        rm -f $@ 
    1428        $(AR) rcu $@ $^ 
     
    1630 
    1731%.o: %.c 
    18         $(CC) $(WFLAGS) -c -o $@ $(CPPFLAGS) $(CFLAGS) $< 
     32        $(CC) $(WFLAGS) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(EXTRA_CFLAGS) $< 
    1933 
    20 wprobe-info: wprobe-info.o wprobe.o 
     34wprobe-util: wprobe-util.o wprobe-lib.o 
    2135        $(CC) -o $@ $^ $(LDFLAGS) $(LIBS) 
     36 
     37clean: 
     38        rm -f *.o *.a wprobe-util 
  • branches/8.09/package/wprobe/src/user/wprobe.h

    r15719 r17279  
    8888}; 
    8989 
    90 /** 
    91  * wprobe_init: initialize internal data structures and connect to the wprobe netlink api 
    92  */ 
    93 extern int wprobe_init(void); 
    94  
    95 /** 
    96  * wprobe_free: free all internally allocated data structures 
    97  */ 
    98 extern void wprobe_free(void); 
     90struct wprobe_filter_item { 
     91        char name[32]; 
     92        uint64_t rx; 
     93        uint64_t tx; 
     94}; 
     95 
     96struct wprobe_iface_ops; 
     97struct wprobe_iface { 
     98        const struct wprobe_iface_ops *ops; 
     99 
     100        int sockfd; 
     101        const char *ifname; 
     102        unsigned int genl_family; 
     103        char addr[6]; 
     104 
     105        struct list_head global_attr; 
     106        struct list_head link_attr; 
     107        struct list_head links; 
     108 
     109        /* config */ 
     110        int interval; 
     111        int scale_min; 
     112        int scale_max; 
     113        int scale_m; 
     114        int scale_d; 
     115 
     116        /* filter */ 
     117        void *filter; 
     118 
     119        /* filter_len: 
     120         *   set to -1 to drop the current filter 
     121         *   automatically reset to 0 after config apply 
     122         */ 
     123        int filter_len; 
     124}; 
     125 
     126typedef void (*wprobe_filter_cb)(void *arg, const char *group, struct wprobe_filter_item *items, int n_items); 
     127extern int wprobe_port; 
    99128 
    100129/** 
    101130 * wprobe_update_links: get a list of all link partners 
    102  * @ifname: name of the wprobe interface 
     131 * @dev: wprobe device structure 
    103132 * @list: linked list for storing link descriptions 
    104133 * 
     
    106135 * is updated with new link partners, old entries are automatically expired 
    107136 */ 
    108 extern int wprobe_update_links(const char *ifname, struct list_head *list); 
     137extern int wprobe_update_links(struct wprobe_iface *dev); 
     138 
     139/** 
     140 * wprobe_dump_filters: dump all layer 2 filter counters 
     141 * @dev: wprobe device structure 
     142 * @cb: callback (called once per filter group) 
     143 * @arg: user argument for the callback 
     144 */ 
     145extern int wprobe_dump_filters(struct wprobe_iface *dev, wprobe_filter_cb cb, void *arg); 
    109146 
    110147/** 
    111148 * wprobe_measure: start a measurement request for all global attributes 
    112  * @ifname: name of the wprobe interface 
     149 * @dev: wprobe device structure 
    113150 * 
    114151 * not all attributes are automatically filled with data, since for some 
     
    116153 * you can use this function to do that. 
    117154 */ 
    118 extern void wprobe_measure(const char *ifname); 
    119  
    120 /** 
    121  * wprobe_dump_attributes: create a linked list of available attributes 
     155extern int wprobe_measure(struct wprobe_iface *dev); 
     156 
     157/** 
     158 * wprobe_get_dev: get a handle to a local wprobe device 
    122159 * @ifname: name of the wprobe interface 
    123  * @link: false: get the list of global attributes; true: get the list of per-link attributes 
    124  * @list: linked list to store the attributes in 
    125  * @addr: buffer to store the interface's mac address in (optional) 
    126  * 
    127  * attributes must be freed by the caller 
    128  */ 
    129 extern int wprobe_dump_attributes(const char *ifname, bool link, struct list_head *list, char *addr); 
     160 * 
     161 * queries the wprobe interface for all attributes 
     162 * must be freed with wprobe_free_dev 
     163 */ 
     164extern struct wprobe_iface *wprobe_get_dev(const char *ifname); 
     165 
     166/** 
     167 * wprobe_get_auto: get a handle to a local or remote wprobe device 
     168 * @arg: pointer to the wprobe device, either <dev> (local) or <host>:<dev> (remote) 
     169 */ 
     170extern struct wprobe_iface *wprobe_get_auto(const char *arg, char **err); 
     171 
     172/** 
     173 * wprobe_get_dev: free all device information 
     174 * @dev: wprobe device structure 
     175 */ 
     176extern void wprobe_free_dev(struct wprobe_iface *dev); 
     177 
     178/** 
     179 * wprobe_apply_config: apply configuration data 
     180 * @dev: wprobe device structure 
     181 * 
     182 * uploads all configuration values from @dev that are not set to -1 
     183 */ 
     184extern int wprobe_apply_config(struct wprobe_iface *dev); 
    130185 
    131186/** 
    132187 * wprobe_request_data: request new sampling values for the given list of attributes 
    133  * @ifname: name of the wprobe interface 
    134  * @attrs: attribute list 
     188 * @dev: wprobe device structure 
    135189 * @addr: (optional) mac address of the link partner 
    136  * @scale: scale down values by a factor (scale < 0: reset statistics entirely) 
    137  * 
    138  * if addr is unset, attrs must point to the list of global attributes, 
    139  * if addr is set, attrs must point to the list of per-link attributes 
    140  */ 
    141 extern int wprobe_request_data(const char *ifname, struct list_head *attrs, const unsigned char *addr, int scale); 
     190 * 
     191 * if addr is unset, global values are stored in the global attributes list 
     192 * if addr is set, per-link values for the given address are stored in the link attributes list 
     193 */ 
     194extern int wprobe_request_data(struct wprobe_iface *dev, const unsigned char *addr); 
     195 
     196/** 
     197 * wprobe_server_init: send a wprobe server init message to a server's client socket 
     198 * @socket: socket of the connection to the client 
     199 */ 
     200extern int wprobe_server_init(int socket); 
     201 
     202/** 
     203 * wprobe_server_handle: read a request from the client socket, process it, send the response 
     204 * @socket: socket of the connection to the client 
     205 */ 
     206extern int wprobe_server_handle(int socket); 
     207 
     208/** 
     209 * wprobe_server_done: release memory allocated for the server connection 
     210 */ 
     211extern void wprobe_server_done(void); 
    142212 
    143213#endif 
Note: See TracChangeset for help on using the changeset viewer.