Changeset 1407

Show
Ignore:
Timestamp:
01/23/06 08:07:51 (5 years ago)
Author:
svens
Message:

autocreation patch

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ath/if_ath.c

    r1392 r1407  
    5858#include <linux/proc_fs.h> 
    5959#include <linux/if_arp.h> 
    60  
     60#include <linux/rtnetlink.h> 
    6161#include <asm/uaccess.h> 
    6262 
     
    257257static  int ath_outdoor = AH_FALSE;             /* enable outdoor use */ 
    258258static  int ath_xchanmode = AH_TRUE;            /* enable extended channels */ 
    259  
     259static  char *autocreate = NULL; 
    260260static  int rfkill = -1; 
    261261static  int countrycode = -1; 
     
    287287MODULE_PARM(xchanmode, "i"); 
    288288MODULE_PARM(rfkill, "i"); 
     289MODULE_PARM(autocreate, "s"); 
    289290#else 
    290291#include <linux/moduleparam.h> 
     
    293294module_param(xchanmode, int, 0); 
    294295module_param(rfkill, int, 0); 
     296module_param(autocreate, charp, 0); 
    295297#endif 
    296298MODULE_PARM_DESC(countrycode, "Override default country code"); 
     
    298300MODULE_PARM_DESC(xchanmode, "Enable/disable extended channel mode"); 
    299301MODULE_PARM_DESC(rfkill, "Enable/disable RFKILL capability"); 
    300  
     302MODULE_PARM_DESC(autocreate, "Create ath device in [sta|ap|wds|adhoc|ahdemo|monitor] mode. defaults to sta, use 'none' to disable"); 
    301303#ifdef AR_DEBUG 
    302304 
     
    390392        HAL_STATUS status; 
    391393        int error = 0,i; 
     394        int autocreatemode = IEEE80211_M_STA; 
    392395        u_int8_t csz; 
    393396 
     
    866869        printk("%s: TX99 support enabled\n", dev->name); 
    867870#endif 
     871        sc->sc_invalid = 0; 
     872 
     873        if(autocreate) { 
     874                if(!strcmp(autocreate, "none")) 
     875                        autocreatemode = 0; 
     876                else if(!strcmp(autocreate, "sta")) 
     877                        autocreatemode = IEEE80211_M_STA; 
     878                else if (!strcmp(autocreate, "ap")) 
     879                        autocreatemode = IEEE80211_M_HOSTAP; 
     880                else if (!strcmp(autocreate, "adhoc")) 
     881                        autocreatemode = IEEE80211_M_IBSS; 
     882                else if (!strcmp(autocreate, "ahdemo")) 
     883                        autocreatemode = IEEE80211_M_AHDEMO; 
     884                else if (!strcmp(autocreate, "wds")) 
     885                        autocreatemode = IEEE80211_M_WDS; 
     886                else if (!strcmp(autocreate, "monitor")) 
     887                        autocreatemode = IEEE80211_M_MONITOR; 
     888                else  
     889                        printk(KERN_INFO "Unknown autocreate mode: %s\n", autocreate); 
     890        } 
     891        if(autocreatemode) { 
     892                rtnl_lock(); 
     893                error = ieee80211_create_vap(ic, "ath%d", dev, autocreatemode, IEEE80211_CLONE_BSSID); 
     894                rtnl_unlock(); 
     895                if(error) 
     896                        printk(KERN_ERR "%s: autocreation of vap failed: %d\n", dev->name, error); 
     897        } 
     898 
    868899        return 0; 
    869900bad3: 
  • trunk/net80211/ieee80211.c

    r1333 r1407  
    378378        struct ieee80211vap *vap = dev->priv; 
    379379        struct net_device *parent = ic->ic_dev; 
    380  
    381         if (name != NULL)       /* XXX */ 
    382                 strncpy(dev->name, name, sizeof(dev->name)); 
     380        int err; 
     381         
     382        if (name != NULL) {     /* XXX */ 
     383                if(strchr(name, '%')) { 
     384                        if((err = dev_alloc_name(dev, name)) < 0) { 
     385                                printk(KERN_ERR "can't alloc name %s\n", name); 
     386                                return err; 
     387                        } 
     388                } else 
     389                        strncpy(dev->name, name, sizeof(dev->name)); 
     390        } 
    383391        dev->get_stats = ieee80211_getstats; 
    384392        dev->open = ieee80211_open; 
  • trunk/net80211/ieee80211_linux.h

    r1380 r1407  
    445445struct ifreq; 
    446446int     ieee80211_ioctl_create_vap(struct ieee80211com *, struct ifreq *, struct net_device *); 
    447  
     447int     ieee80211_create_vap(struct ieee80211com *ic, char *name, struct net_device *mdev, int opmode, int opflags); 
    448448#endif /* _NET80211_IEEE80211_LINUX_H_ */ 
  • trunk/net80211/ieee80211_wireless.c

    r1403 r1407  
    40664066} 
    40674067EXPORT_SYMBOL(ieee80211_ioctl_create_vap); 
     4068/* 
     4069 * Create a virtual ap.  This is public as it must be implemented 
     4070 * outside our control (e.g. in the driver). 
     4071 * Must be called with rtnl_lock held 
     4072 */ 
     4073int 
     4074ieee80211_create_vap(struct ieee80211com *ic, char *name, struct net_device *mdev, int opmode, int opflags) 
     4075{ 
     4076        struct ieee80211vap *vap; 
     4077        int error, unit; 
     4078         
     4079        if((error = ifc_name2unit(name, &unit))) 
     4080                return error; 
     4081 
     4082        if (unit == -1) { 
     4083                if((unit = ieee80211_new_wlanunit()) == -1) 
     4084                        return -EIO;            /* XXX */ 
     4085        } else { 
     4086                if (!ieee80211_alloc_wlanunit(unit)) 
     4087                        return -EINVAL; 
     4088 
     4089        } 
     4090 
     4091        if((vap = ic->ic_vap_create(ic, name, unit, opmode, opflags, mdev)) == NULL) { 
     4092                ieee80211_delete_wlanunit(unit); 
     4093                return -EIO; 
     4094        } 
     4095        return 0; 
     4096} 
     4097EXPORT_SYMBOL(ieee80211_create_vap); 
     4098 
    40684099 
    40694100void