Changeset 886


Ignore:
Timestamp:
2005-05-13T23:58:19+02:00 (13 years ago)
Author:
nbd
Message:

implement SIOCGIWENCODE in wlcompat (broadcom disabled the ioctl to get the wsec_info, so we have to read it from the chipset's shmem. got the offsets from linux-bcom4301)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/openwrt/package/openwrt/wlcompat.c

    r884 r886  
    4444#define NUM_CHANNELS ( sizeof(channel_frequency) / sizeof(channel_frequency[0]) ) 
    4545 
     46 
     47 
    4648static int wlcompat_private_ioctl(struct net_device *dev, 
    4749                         struct iw_request_info *info, 
     
    102104} 
    103105 
     106int read_shmem(struct net_device *dev, int offset) 
     107{ 
     108        if (wl_ioctl(dev, WLC_GET_SHMEM, &offset, sizeof(offset)) < 0) 
     109                return -EINVAL; 
     110 
     111        return offset; 
     112} 
    104113 
    105114static int wlcompat_ioctl_getiwrange(struct net_device *dev, 
     
    398407                case SIOCGIWENCODE: 
    399408                { 
    400                         int val = 0; 
     409                        int val; 
     410                         
    401411                        if (wl_ioctl(dev, WLC_GET_WEP, &val, sizeof(val)) < 0) 
    402412                                return -EINVAL; 
    403413                         
     414 
    404415                        if (val > 0) { 
    405                                 wrqu->data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; 
     416                                int key; 
     417                                 
     418                                for (key = val = 0; (key < 4) && (val == 0); key++) { 
     419                                        val = key; 
     420                                        if (wl_ioctl(dev, WLC_GET_KEY_PRIMARY, &val, sizeof(val)) < 0) 
     421                                                return -EINVAL; 
     422                                } 
     423                                 
     424                                wrqu->data.flags = IW_ENCODE_ENABLED; 
     425                                if (key-- > 0) { 
     426                                        int magic_offset; 
     427                                        int16 buffer[8]; 
     428                                         
     429                                        magic_offset = read_shmem(dev, 0x56) * 2; 
     430 
     431                                        wrqu->data.flags |= key + 1; 
     432                                        wrqu->data.length = 16; 
     433                                         
     434                                        for (val = 0; val < 8; val++) { 
     435                                                buffer[val] = read_shmem(dev, magic_offset + (key * 16) + val * 2); 
     436                                        } 
     437                                         
     438                                        memset(extra, 0, 16); 
     439                                        memcpy(extra, buffer, 16); 
     440                                } else { 
     441                                        wrqu->data.flags |= IW_ENCODE_NOKEY; 
     442                                } 
    406443                        } else { 
    407444                                wrqu->data.flags = IW_ENCODE_DISABLED; 
    408445                        } 
    409                                  
    410                                  
    411446                         
    412447                        break; 
Note: See TracChangeset for help on using the changeset viewer.