Changeset 2480


Ignore:
Timestamp:
2005-11-14T03:07:33+01:00 (10 years ago)
Author:
nbd
Message:

add support for the new broadcom driver to wificonf. wep is currently broken. will fix that later, when i find out what's wrong with it

Location:
trunk/openwrt/package/wificonf
Files:
10 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/openwrt/package/wificonf/Makefile

    r2385 r2480  
    2020 
    2121$(PKG_BUILD_DIR)/.built: 
    22         $(TARGET_CC) $(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include -o $(PKG_BUILD_DIR)/wifi wificonf.c -L$(STAGING_DIR)/usr/lib -lnvram -lshared $(STAGING_DIR)/usr/lib/libiw.so 
     22        $(TARGET_CC) $(TARGET_CFLAGS) -Iinclude/ -I$(STAGING_DIR)/usr/include -o $(PKG_BUILD_DIR)/wifi wificonf.c -L$(STAGING_DIR)/usr/lib -lnvram -lshared $(STAGING_DIR)/usr/lib/libiw.so 
    2323        touch $@ 
    2424 
  • trunk/openwrt/package/wificonf/wificonf.c

    r2472 r2480  
    22 * Wireless Network Adapter configuration utility 
    33 * 
    4  * Copyright (C) 2005 Felix Fietkau <nbd@vd-s.ath.cx> 
     4 * Copyright (C) 2005 Felix Fietkau <nbd@openwrt.org> 
    55 * 
    66 * This program is free software; you can redistribute it and/or 
     
    2222#include <wlioctl.h> 
    2323#include <signal.h> 
     24 
     25#define ADD_VIF_RETRIES 5 
     26#define DEBUG 
    2427 
    2528/*------------------------------------------------------------------*/ 
     
    8689static char *wl_var(char *name) 
    8790{ 
    88         strcpy(buffer, prefix); 
    89         strcat(buffer, name); 
     91        sprintf(buffer, "%s_%s", prefix, name); 
     92        return buffer; 
     93} 
     94 
     95static char *vif_var(int vif, char *name) 
     96{ 
     97        if (vif == 0) 
     98                return wl_var(name); 
     99         
     100        sprintf(buffer, "%s.%d_%s", prefix, vif, name); 
     101        return buffer; 
    90102} 
    91103 
     
    115127 
    116128        ret = ioctl(skfd, SIOCDEVPRIVATE, &ifr); 
     129         
     130#ifdef DEBUG 
     131        if (ret < 0) 
     132                fprintf(stderr, "IOCTL %d failed: %d\n", cmd, ret); 
     133#endif 
    117134 
    118135        return ret; 
    119136} 
    120137 
    121 static int bcom_set_val(int skfd, char *ifname, char *var, void *val, int len) 
     138static int bcom_set_var(int skfd, char *ifname, char *var, void *val, int len) 
    122139{ 
    123140        char buf[8192]; 
     
    127144                return -1; 
    128145 
     146        bzero(buf, sizeof(buf)); 
    129147        strcpy(buf, var); 
    130148        memcpy(&buf[strlen(var) + 1], val, len); 
    131149         
    132         if ((ret = bcom_ioctl(skfd, ifname, WLC_SET_VAR, buf, sizeof(buf)))) 
    133                 return ret; 
    134  
    135         return 0;        
     150        ret = bcom_ioctl(skfd, ifname, WLC_SET_VAR, buf, sizeof(buf)); 
     151 
     152#ifdef DEBUG 
     153        if (ret < 0) 
     154                fprintf(stderr, "SET_VAR %s failed: %d\n", var, ret); 
     155#endif 
     156         
     157        return ret; 
     158} 
     159 
     160static int bcom_get_var(int skfd, char *ifname, char *var, void *buf, int len) 
     161{ 
     162        int ret; 
     163         
     164        if (strlen(var) + 1 > sizeof(buf) || len > sizeof(buf)) 
     165                return -1; 
     166 
     167        bzero(buf, sizeof(buf)); 
     168        strcpy(buf, var); 
     169         
     170        ret = bcom_ioctl(skfd, ifname, WLC_GET_VAR, buf, sizeof(buf)); 
     171 
     172#ifdef DEBUG 
     173        if (ret < 0) 
     174                fprintf(stderr, "GET_VAR %s failed: %d\n", var, ret); 
     175#endif 
     176         
     177        return ret; 
     178} 
     179 
     180static int bcom_set_bss_var(int skfd, char *ifname, int bss, char *var, void *val, int len) 
     181{ 
     182        char buf[8192]; 
     183        int i = 0, ret; 
     184 
     185        bzero(buf, sizeof(buf)); 
     186        if (strlen(var) + len + 8 > sizeof(buf) || len > sizeof(buf)) 
     187                return -1; 
     188         
     189        // "bsscfg:<name>\x00" <bss> <data> 
     190        i = sprintf(buf, "bsscfg:%s", var); 
     191        buf[i++] = 0; 
     192                         
     193        memcpy(buf + i, &bss, sizeof(bss)); 
     194        i += sizeof(bss); 
     195         
     196        memcpy(buf + i, val, len); 
     197        i += len; 
     198         
     199        ret = bcom_ioctl(skfd, ifname, WLC_SET_VAR, buf, i); 
     200 
     201#ifdef DEBUG 
     202        if (ret < 0) 
     203                fprintf(stderr, "SET_BSS_VAR %s failed: %d\n", var, ret); 
     204#endif 
     205 
     206        return ret; 
    136207} 
    137208 
    138209static int bcom_set_int(int skfd, char *ifname, char *var, int val) 
    139210{ 
    140         return bcom_set_val(skfd, ifname, var, &val, sizeof(val)); 
     211        return bcom_set_var(skfd, ifname, var, &val, sizeof(val)); 
     212} 
     213 
     214static int bcom_set_bss_int(int skfd, char *ifname, int bss, char *var, int val) 
     215{ 
     216        return bcom_set_bss_var(skfd, ifname, bss, var, &val, sizeof(val)); 
     217} 
     218 
     219static int is_new_bcom(int skfd, char *ifname) 
     220{ 
     221        char buf[8192]; 
     222         
     223        bzero(buf, 8192); 
     224        bcom_ioctl(skfd, ifname, WLC_DUMP, buf, 8192); 
     225 
     226        if (strstr(buf, "3.130")) 
     227                return 1; 
     228 
     229        return 0; 
     230} 
     231 
     232static int bcom_get_wsec(int vif) 
     233{ 
     234        int val;  
     235 
     236        if (nvram_match(vif_var(vif, "crypto"), "tkip")) 
     237                val = TKIP_ENABLED; 
     238        else if (nvram_match(vif_var(vif, "crypto"), "aes")) 
     239                val = AES_ENABLED; 
     240        else if (nvram_match(vif_var(vif, "crypto"), "tkip+aes") || nvram_match(vif_var(vif, "crypto"), "aes+tkip")) 
     241                val = TKIP_ENABLED | AES_ENABLED; 
     242        else 
     243                val = 0; 
     244         
     245        return val; 
     246} 
     247 
     248static int bcom_get_wauth(int vif) 
     249{ 
     250        char *v, *next, var[80]; 
     251        int res = 0; 
     252         
     253        if (!(v = nvram_get(vif_var(vif, "akm")))) 
     254                v = nvram_safe_get(vif_var(vif, "auth_mode")); 
     255 
     256        foreach(var, v, next) { 
     257                if (strcmp(var, "psk") == 0) 
     258                        res |= WPA_AUTH_PSK; 
     259                else if (strcmp(var, "psk2") == 0) 
     260                        res |= WPA2_AUTH_PSK; 
     261                else if (strcmp(var, "wpa") == 0) 
     262                        res |= WPA_AUTH_UNSPECIFIED; 
     263                else if (strcmp(var, "wpa2") == 0) 
     264                        res |= WPA2_AUTH_UNSPECIFIED; 
     265        } 
     266 
     267        return res; 
    141268} 
    142269 
     
    164291 
    165292        bcom_ioctl(skfd, ifname, WLC_UP, &val, sizeof(val)); 
    166         set_wext_ssid(skfd, ifname); 
    167293} 
    168294 
     
    192318} 
    193319 
     320static void set_wext_mode(skfd, ifname) 
     321{ 
     322        struct iwreq wrq; 
     323        int ap = 0, infra = 0, wet = 0; 
     324         
     325        /* Set operation mode */ 
     326        ap = !nvram_match(wl_var("mode"), "sta") && !nvram_match(wl_var("mode"), "wet"); 
     327        infra = !nvram_disabled(wl_var("infra")); 
     328        wet = !ap && nvram_match(wl_var("mode"), "wet"); 
     329 
     330        wrq.u.mode = (!infra ? IW_MODE_ADHOC : (ap ? IW_MODE_MASTER : (wet ? IW_MODE_REPEAT : IW_MODE_INFRA))); 
     331        IW_SET_EXT_ERR(skfd, ifname, SIOCSIWMODE, &wrq, "Set Mode"); 
     332} 
     333 
     334 
    194335void start_watchdog(int skfd, char *ifname) 
    195336{ 
    196337        FILE *f; 
    197         unsigned char buf[8192], buf2[8192], wbuf[80], *v, *p, *next, *tmp; 
     338        char *v, *next; 
     339        unsigned char buf[8192], buf2[8192], wbuf[80], *p, *tmp; 
    198340        int wds = 0, i, restart_wds; 
    199341 
     
    243385} 
    244386 
    245 static void setup_bcom(int skfd, char *ifname) 
     387static void setup_bcom_vif_sec(int skfd, char *ifname, int vif) 
     388{ 
     389        int val, wep, wsec, i; 
     390        char *v; 
     391 
     392        wsec = bcom_get_wsec(vif); 
     393        if (wsec) 
     394                val = bcom_get_wauth(vif); 
     395        else 
     396                val = 0; 
     397 
     398        bcom_set_bss_int(skfd, ifname, vif, "wpa_auth", val); 
     399 
     400        if (val) { 
     401                if (WPA_AUTH_PSK | WPA2_AUTH_PSK) { 
     402                        v = nvram_safe_get(wl_var("wpa_psk")); 
     403                        if ((strlen(v) >= 8) && (strlen(v) < 63) && nvram_match(wl_var("mode"), "wet") && (vif == 0)) { 
     404                                /* Enable in-driver WPA supplicant */ 
     405                                wsec_pmk_t pmk; 
     406                         
     407                                pmk.key_len = (unsigned short) strlen(v); 
     408                                pmk.flags = WSEC_PASSPHRASE; 
     409                                strcpy(pmk.key, v); 
     410                                bcom_ioctl(skfd, ifname, WLC_SET_WSEC_PMK, &pmk, sizeof(pmk)); 
     411                                bcom_set_int(skfd, ifname, "sup_wpa", 1); 
     412                        } else { 
     413                                bcom_set_int(skfd, ifname, "sup_wpa", 0); 
     414                        } 
     415                } 
     416                bcom_set_bss_int(skfd, ifname, vif, "eap_restrict", 1); 
     417                bcom_set_bss_int(skfd, ifname, vif, "wsec", wsec); 
     418                bcom_set_bss_int(skfd, ifname, vif, "wsec_restrict", 1); 
     419        } else { 
     420                bcom_set_bss_int(skfd, ifname, vif, "eap_restrict", 0); 
     421                if (wep = nvram_enabled(vif_var(vif, "wep"))) { 
     422                        wep = atoi(nvram_safe_get(vif_var(vif, "key"))); 
     423                        if ((wep >= 1) && (wep <= 4)) { 
     424                                for (i = 1; i < 4; i++) { 
     425                                        wl_wsec_key_t k; 
     426                                        char name[5] = "key0"; 
     427                                        unsigned char *kdata = k.data; 
     428                                        unsigned char *kstr; 
     429 
     430                                        bzero(&k, sizeof(k)); 
     431                                        name[3] += i; 
     432                                        kstr = nvram_safe_get(vif_var(vif, name)); 
     433                                        k.len = strlen(kstr); 
     434                                        if ((k.len == 10) || (k.len == 26)) { 
     435                                                k.index = i - 1; 
     436#ifdef DEBUG 
     437                                                fprintf(stderr, "Adding WEP key %d to VIF %d: ", i, vif); 
     438#endif 
     439                                                k.len = 0; 
     440                                                while (*kstr != 0) { 
     441                                                        strncpy(name, kstr, 2); 
     442                                                        name[2] = 0; 
     443                                                        *kdata = (unsigned char) strtoul(name, NULL, 16); 
     444#ifdef DEBUG 
     445                                                        fprintf(stderr, "%02x", *kdata); 
     446#endif 
     447                                                        kstr += 2; 
     448                                                        kdata++; 
     449                                                        k.len++; 
     450                                                } 
     451#ifdef DEBUG 
     452                                                fprintf(stderr, "\n"); 
     453#endif 
     454                                        } else { 
     455                                                k.len = 0; 
     456                                        } 
     457                                        if ((k.len > 0) && (i == wep)) 
     458                                                k.flags = WL_PRIMARY_KEY; 
     459 
     460                                        bcom_set_bss_var(skfd, ifname, vif, "wsec_key", &k, sizeof(k)); 
     461                                } 
     462                                wep = 1; 
     463                                bcom_set_bss_int(skfd, ifname, vif, "wsec", WEP_ENABLED); 
     464                                bcom_set_bss_int(skfd, ifname, vif, "wsec_restrict", 1); 
     465                                bcom_set_bss_int(skfd, ifname, vif, "auth", 1); 
     466                        } else { 
     467                                wep = 0; 
     468                        } 
     469                } 
     470        } 
     471         
     472        if (!wep && !val) { 
     473                bcom_set_bss_int(skfd, ifname, vif, "wsec", 0); 
     474                bcom_set_bss_int(skfd, ifname, vif, "wsec_restrict", 0); 
     475        } 
     476         
     477//      bcom_set_bss_int(skfd, ifname, vif, "auth", atoi(nvram_safe_get(vif_var(vif, "auth")))); 
     478} 
     479 
     480static void setup_bcom_vif(int skfd, char *ifname, int vif) 
     481{ 
     482        int val, wep, wsec, i; 
     483        char *s, *v; 
     484        wlc_ssid_t ssid; 
     485         
     486        s = nvram_safe_get(vif_var(vif, "ssid")); 
     487        strncpy(ssid.SSID, s, sizeof(ssid.SSID)); 
     488        ssid.SSID_len = strlen(ssid.SSID); 
     489        ssid.SSID_len = ((ssid.SSID_len > sizeof(ssid.SSID)) ? sizeof(ssid.SSID) : ssid.SSID_len); 
     490        bcom_set_bss_var(skfd, ifname, vif, "ssid", &ssid, sizeof(ssid)); 
     491         
     492        val = nvram_enabled(vif_var(vif, "closed")); 
     493        bcom_set_bss_int(skfd, ifname, vif, "closednet", val); 
     494 
     495        val = nvram_enabled(wl_var("ap_isolate")); 
     496        bcom_set_bss_int(skfd, ifname, vif, "ap_isolate", val); 
     497 
     498} 
     499         
     500static void start_bcom_vif(int skfd, char *ifname, int vif) 
     501{ 
     502        int cfg[2]; 
     503        int i; 
     504         
     505        cfg[0] = vif; 
     506        cfg[1] = 1; 
     507        for (i = 0; i < ADD_VIF_RETRIES; i++) { 
     508                if (bcom_set_var(skfd, ifname, "bss" , cfg, sizeof(cfg)) == 0) 
     509                        break; 
     510                usleep(1000 * 1000); 
     511        } 
     512} 
     513 
     514static void setup_bcom_common(int skfd, char *ifname) 
    246515{ 
    247516        int val = 0, ap; 
    248         char buf[8192]; 
    249         char wbuf[80]; 
    250         char *v; 
    251         int wds_enabled = 0; 
    252          
    253         if (bcom_ioctl(skfd, ifname, WLC_GET_MAGIC, &val, sizeof(val)) < 0) 
    254                 return; 
    255          
     517        char buf[8192], wbuf[80], *v; 
     518 
    256519        nvram_set(wl_var("ifname"), ifname); 
    257          
    258         stop_bcom(skfd, ifname); 
    259520 
    260521        /* Set Country */ 
     
    265526        /* Set other options */ 
    266527        val = nvram_enabled(wl_var("lazywds")); 
    267         wds_enabled = val; 
    268528        bcom_ioctl(skfd, ifname, WLC_SET_LAZYWDS, &val, sizeof(val)); 
    269          
    270         if (v = nvram_get(wl_var("frag"))) { 
    271                 val = atoi(v); 
    272                 bcom_ioctl(skfd, ifname, WLC_SET_FRAG, &val, sizeof(val)); 
    273         } 
     529 
    274530        if (v = nvram_get(wl_var("dtim"))) { 
    275531                val = atoi(v); 
     
    280536                bcom_ioctl(skfd, ifname, WLC_SET_BCNPRD, &val, sizeof(val)); 
    281537        } 
    282         if (v = nvram_get(wl_var("rts"))) { 
    283                 val = atoi(v); 
    284                 bcom_ioctl(skfd, ifname, WLC_SET_RTS, &val, sizeof(val)); 
    285         } 
    286538        if (v = nvram_get(wl_var("antdiv"))) { 
    287539                val = atoi(v); 
     
    292544                bcom_ioctl(skfd, ifname, WLC_SET_TXANT, &val, sizeof(val)); 
    293545        } 
    294          
    295         val = nvram_enabled(wl_var("closed")); 
    296         bcom_ioctl(skfd, ifname, WLC_SET_CLOSED, &val, sizeof(val)); 
    297  
    298         val = nvram_enabled(wl_var("ap_isolate")); 
    299         bcom_set_int(skfd, ifname, "ap_isolate", val); 
    300  
     546        if (v = nvram_get(wl_var("maxassoc"))) { 
     547                val = atoi(v); 
     548                bcom_set_int(skfd, ifname, "maxassoc", val); 
     549        } 
     550         
    301551        val = nvram_enabled(wl_var("frameburst")); 
    302552        bcom_ioctl(skfd, ifname, WLC_SET_FAKEFRAG, &val, sizeof(val)); 
     553 
     554        ap = !nvram_match(wl_var("mode"), "sta") && !nvram_match(wl_var("mode"), "wet"); 
     555 
     556        if (ap) 
     557                val = setup_bcom_wds(skfd, ifname); 
     558 
     559        if ((!ap || val) && is_new_bcom(skfd, ifname)) 
     560                start_watchdog(skfd, ifname); 
     561         
     562        /* Set up afterburner, disabled it if WDS is enabled */ 
     563        if (val || nvram_enabled(wl_var("lazywds"))) { 
     564                val = ABO_OFF; 
     565        } else { 
     566                val = ABO_AUTO; 
     567                if (nvram_enabled(wl_var("afterburner"))) 
     568                        val = ABO_ON; 
     569                if (nvram_disabled(wl_var("afterburner"))) 
     570                        val = ABO_OFF; 
     571        } 
     572         
     573        bcom_set_var(skfd, ifname, "afterburner_override", &val, sizeof(val)); 
    303574 
    304575        /* Set up MAC list */ 
     
    331602        bcom_ioctl(skfd, ifname, WLC_SET_MACMODE, &val, sizeof(val)); 
    332603 
    333         if (ap = !nvram_match(wl_var("mode"), "sta") && !nvram_match(wl_var("mode"), "wet")) 
    334                 wds_enabled = setup_bcom_wds(skfd, ifname); 
    335  
    336         if (!ap || wds_enabled)  
    337                 start_watchdog(skfd, ifname); 
    338          
    339         /* Set up afterburner, disabled it if WDS is enabled */ 
    340         if (wds_enabled) { 
    341                 val = ABO_OFF; 
    342         } else { 
    343                 val = ABO_AUTO; 
    344                 if (nvram_enabled(wl_var("afterburner"))) 
    345                         val = ABO_ON; 
    346                 if (nvram_disabled(wl_var("afterburner"))) 
    347                         val = ABO_OFF; 
    348         } 
    349          
    350         bcom_set_val(skfd, ifname, "afterburner_override", &val, sizeof(val)); 
    351          
    352604        /* Set up G mode */ 
    353605        bcom_ioctl(skfd, ifname, WLC_GET_PHYTYPE, &val, sizeof(val)); 
     
    386638                } 
    387639        } 
    388  
     640} 
     641 
     642static void setup_bcom_new(int skfd, char *ifname) 
     643{ 
     644        int val = 0, i; 
     645        int iface[16], ifaces = 1; 
     646        int ap, apsta, sta, wet; 
     647        char *v; 
     648 
     649        if (bcom_ioctl(skfd, ifname, WLC_GET_MAGIC, &val, sizeof(val)) < 0)  
     650                return; 
     651         
     652        /* Clear all VIFs */ 
     653        iface[0] = 0; 
     654        for (i = 0; i < 16; i++) { 
     655                int cfg[2]; /* index, enabled */ 
     656                 
     657                cfg[0] = i; 
     658                cfg[1] = 0; 
     659                 
     660                bcom_set_var(skfd, ifname, "bss", cfg, sizeof(cfg)); 
     661                 
     662                if ((i > 0) && nvram_enabled(vif_var(i, "enabled")) && (i == 0 || nvram_get(vif_var(i, "ssid")))) { 
     663                        iface[ifaces] = i; 
     664                        ifaces++; 
     665                } 
     666        } 
     667 
     668        set_wext_mode(skfd, ifname); 
     669         
     670        ap = nvram_match(wl_var("mode"), "ap") || nvram_match(wl_var("mode"), "apsta"); 
     671        apsta = nvram_match(wl_var("mode"), "apsta"); 
     672        sta = nvram_match(wl_var("mode"), "sta"); 
     673 
     674        bcom_set_int(skfd, ifname, "apsta", apsta); 
     675        bcom_set_int(skfd, ifname, "mssid", (ifaces > 1)); 
     676 
     677        for (i = 0; i < (sta ? 0 : ifaces); i++) { 
     678#ifdef DEBUG 
     679                fprintf(stderr, "setup_bcom_vif(%d) start\n", iface[i]); 
     680#endif 
     681                setup_bcom_vif(skfd, ifname, iface[i]); 
     682#ifdef DEBUG 
     683                fprintf(stderr, "setup_bcom_vif(%d) end\n", iface[i]); 
     684#endif 
     685        } 
     686 
     687         
     688        if (v = nvram_get(wl_var("rts"))) { 
     689                val = atoi(v); 
     690                bcom_set_int(skfd, ifname, "rtsthresh", val); 
     691        } 
     692        if (v = nvram_get(wl_var("frag"))) { 
     693                val = atoi(v); 
     694                bcom_set_int(skfd, ifname, "fragthresh", val); 
     695        } 
     696 
     697        val = (nvram_disabled(wl_var("radio")) ? (1 | (1 << 16)) : 0); 
     698        bcom_ioctl(skfd, ifname, WLC_SET_RADIO, &val, sizeof(val)); 
     699 
     700        setup_bcom_common(skfd, ifname); 
    389701        start_bcom(skfd, ifname); 
    390702 
    391         if (!(v = nvram_get(wl_var("akm")))) 
    392                 v = nvram_safe_get(wl_var("auth_mode")); 
    393          
    394         if (strstr(v, "wpa") || strstr(v, "psk")) { 
    395                 wpa_enc = 1; 
    396  
    397                 /* Set up WPA */ 
    398                 if (nvram_match(wl_var("crypto"), "tkip")) 
    399                         val = TKIP_ENABLED; 
    400                 else if (nvram_match(wl_var("crypto"), "aes")) 
    401                         val = AES_ENABLED; 
    402                 else if (nvram_match(wl_var("crypto"), "tkip+aes") || nvram_match(wl_var("crypto"), "aes+tkip")) 
    403                         val = TKIP_ENABLED | AES_ENABLED; 
    404                 else 
    405                         val = 0; 
     703        val = atoi(nvram_safe_get(wl_var("channel"))); 
     704        if (val > 0) 
     705                bcom_ioctl(skfd, ifname, WLC_SET_CHANNEL, &val, sizeof(val)); 
     706         
     707        val = (ap ? 15 : 0); 
     708        bcom_ioctl(skfd, ifname, WLC_SET_CS_SCAN_TIMER, &val, sizeof(val)); 
     709         
     710        for (i = 0; i < (sta ? 0 : ifaces); i++) { 
     711                setup_bcom_vif_sec(skfd, ifname, iface[i]); 
     712        } 
     713 
     714        for (i = 0; i < (sta ? 0 : ifaces); i++) { 
     715                start_bcom_vif(skfd, ifname, iface[i]); 
     716        } 
     717} 
     718 
     719static void setup_bcom_old(int skfd, char *ifname) 
     720{ 
     721        int val = 0, i; 
     722        char buf[8192]; 
     723        char wbuf[80]; 
     724        char *v; 
     725         
     726        if (bcom_ioctl(skfd, ifname, WLC_GET_MAGIC, &val, sizeof(val)) < 0) 
     727                return; 
     728         
     729        setup_bcom_common(skfd, ifname); 
     730 
     731        if (v = nvram_get(wl_var("frag"))) { 
     732                val = atoi(v); 
     733                bcom_ioctl(skfd, ifname, WLC_SET_FRAG, &val, sizeof(val)); 
     734        } 
     735        if (v = nvram_get(wl_var("rts"))) { 
     736                val = atoi(v); 
     737                bcom_ioctl(skfd, ifname, WLC_SET_RTS, &val, sizeof(val)); 
     738        } 
     739         
     740        val = nvram_enabled(wl_var("closed")); 
     741        bcom_ioctl(skfd, ifname, WLC_SET_CLOSED, &val, sizeof(val)); 
     742 
     743        val = nvram_enabled(wl_var("ap_isolate")); 
     744        bcom_set_int(skfd, ifname, "ap_isolate", val); 
     745 
     746        start_bcom(skfd, ifname); 
     747        set_wext_ssid(skfd, ifname); 
     748 
     749        val = bcom_get_wauth(0); 
     750        bcom_ioctl(skfd, ifname, WLC_SET_WPA_AUTH, &val, sizeof(val)); 
     751 
     752        if (val & (WPA_AUTH_PSK | WPA2_AUTH_PSK)) { 
     753                v = nvram_safe_get(wl_var("wpa_psk")); 
     754                if ((strlen(v) >= 8) && (strlen(v) < 63) && nvram_match(wl_var("mode"), "wet")) { 
     755                        /* Enable in-driver WPA supplicant */ 
     756                        wsec_pmk_t pmk; 
     757                         
     758                        pmk.key_len = (unsigned short) strlen(v); 
     759                        pmk.flags = WSEC_PASSPHRASE; 
     760                        strcpy(pmk.key, v); 
     761                        bcom_ioctl(skfd, ifname, WLC_SET_WSEC_PMK, &pmk, sizeof(pmk)); 
     762                        bcom_set_int(skfd, ifname, "sup_wpa", 1); 
     763                } 
     764        } 
     765        if (val) { 
     766                val = 1; 
     767                bcom_ioctl(skfd, ifname, WLC_SET_EAP_RESTRICT, &val, sizeof(val)); 
     768                val = bcom_get_wsec(0); 
    406769                bcom_ioctl(skfd, ifname, WLC_SET_WSEC, &val, sizeof(val)); 
    407  
    408                 if (val && strstr(v, "psk")) { 
    409                         val = (strstr(v, "psk2") ? 0x84 : 0x4); 
    410                         v = nvram_safe_get(wl_var("wpa_psk")); 
    411                         if ((strlen(v) >= 8) && (strlen(v) < 63)) { 
    412                                  
    413                                 bcom_ioctl(skfd, ifname, WLC_SET_WPA_AUTH, &val, sizeof(val)); 
    414                                  
    415                                 if (!nvram_match(wl_var("mode"), "wet")) { 
    416                                         /* Enable in-driver WPA supplicant */ 
    417                                         wsec_pmk_t pmk; 
    418                                          
    419                                         pmk.key_len = (unsigned short) strlen(v); 
    420                                         pmk.flags = WSEC_PASSPHRASE; 
    421                                         strcpy(pmk.key, v); 
    422                                         bcom_ioctl(skfd, ifname, WLC_SET_WSEC_PMK, &pmk, sizeof(pmk)); 
    423                                         bcom_set_int(skfd, ifname, "sup_wpa", 1); 
    424                                 } 
    425                         } 
    426                 } else  { 
    427                         val = 1; 
    428                         bcom_ioctl(skfd, ifname, WLC_SET_EAP_RESTRICT, &val, sizeof(val)); 
    429                 } 
    430770        } else { 
    431771                val = 0; 
    432  
    433772                bcom_ioctl(skfd, ifname, WLC_SET_WSEC, &val, sizeof(val)); 
    434                 bcom_ioctl(skfd, ifname, WLC_SET_WPA_AUTH, &val, sizeof(val)); 
    435773                bcom_ioctl(skfd, ifname, WLC_SET_EAP_RESTRICT, &val, sizeof(val)); 
    436774                bcom_set_int(skfd, ifname, "sup_wpa", 0); 
     
    488826} 
    489827 
    490 static void set_wext_mode(skfd, ifname) 
    491 { 
    492         struct iwreq wrq; 
    493         int ap = 0, infra = 0, wet = 0; 
    494          
    495         /* Set operation mode */ 
    496         ap = !nvram_match(wl_var("mode"), "sta") && !nvram_match(wl_var("mode"), "wet"); 
    497         infra = !nvram_disabled(wl_var("infra")); 
    498         wet = !ap && nvram_match(wl_var("mode"), "wet"); 
    499  
    500         wrq.u.mode = (!infra ? IW_MODE_ADHOC : (ap ? IW_MODE_MASTER : (wet ? IW_MODE_REPEAT : IW_MODE_INFRA))); 
    501         IW_SET_EXT_ERR(skfd, ifname, SIOCSIWMODE, &wrq, "Set Mode"); 
    502 } 
    503  
    504828static void setup_wext(int skfd, char *ifname) 
    505829{ 
     
    520844        } 
    521845 
    522  
    523846        /* Disable radio if wlX_radio is set and not enabled */ 
    524847        wrq.u.txpower.disabled = nvram_disabled(wl_var("radio")); 
     
    553876                setup_wext(skfd, ifname); 
    554877        } else { 
    555                 stop_bcom(skfd, ifname); 
    556                 set_wext_mode(skfd, ifname); 
    557                 setup_bcom(skfd, ifname); 
    558                 setup_wext(skfd, ifname); 
     878                if (is_new_bcom(skfd, ifname)) { 
     879#ifdef DEBUG 
     880                        fprintf(stderr, "New Broadcom driver detected.\n"); 
     881#endif 
     882                        stop_bcom(skfd, ifname); 
     883#ifdef DEBUG 
     884                        fprintf(stderr, "Setup start.\n"); 
     885#endif 
     886                        setup_bcom_new(skfd, ifname); 
     887#ifdef DEBUG 
     888                        fprintf(stderr, "Setup done.\n"); 
     889#endif 
     890                } else { 
     891#ifdef DEBUG 
     892                        fprintf(stderr, "Old Broadcom driver detected.\n"); 
     893#endif 
     894                        stop_bcom(skfd, ifname); 
     895                        set_wext_mode(skfd, ifname); 
     896                        setup_bcom_old(skfd, ifname); 
     897                        setup_wext(skfd, ifname); 
     898                } 
    559899        } 
    560900         
     
    570910        } 
    571911 
    572         prefix = strdup("wl0_"); 
     912        prefix = strdup("wl0"); 
    573913        iw_enum_devices(skfd, &setup_interfaces, NULL, 0); 
    574914         
Note: See TracChangeset for help on using the changeset viewer.