mirror of https://github.com/hak5/openwrt.git
parent
5c382ab9e2
commit
55474bd3a4
|
@ -26,10 +26,10 @@ $(PKG_BUILD_DIR)/.prepared:
|
|||
$(PKG_BUILD_DIR)/.built: $(PKG_BUILD_DIR)/wlcompat.o $(PKG_BUILD_DIR)/wlcompat-debug.o
|
||||
touch $@
|
||||
|
||||
$(PKG_BUILD_DIR)/wlcompat.o:
|
||||
$(PKG_BUILD_DIR)/wlcompat.o: $(PKG_BUILD_DIR)/.prepared
|
||||
$(TARGET_CC) $(WLCOMPAT_FLAGS) -o $@ wlcompat.c
|
||||
|
||||
$(PKG_BUILD_DIR)/wlcompat-debug.o:
|
||||
$(PKG_BUILD_DIR)/wlcompat-debug.o: $(PKG_BUILD_DIR)/.prepared
|
||||
$(TARGET_CC) -DDEBUG $(WLCOMPAT_FLAGS) -o $@ wlcompat.c
|
||||
|
||||
$(IPKG_KMOD_WLCOMPAT): $(PKG_BUILD_DIR)/wlcompat.o $(PKG_BUILD_DIR)/wlcompat-debug.o
|
||||
|
|
|
@ -83,6 +83,7 @@ static int wl_set_val(struct net_device *dev, char *var, void *val, int len)
|
|||
{
|
||||
char buf[128];
|
||||
int buf_len;
|
||||
int ret;
|
||||
|
||||
/* check for overflow */
|
||||
if ((buf_len = strlen(var)) + 1 + len > sizeof(buf))
|
||||
|
@ -92,23 +93,25 @@ static int wl_set_val(struct net_device *dev, char *var, void *val, int len)
|
|||
buf_len += 1;
|
||||
|
||||
/* append int value onto the end of the name string */
|
||||
memcpy(&buf[buf_len], val, len);
|
||||
memcpy(&(buf[buf_len]), val, len);
|
||||
buf_len += len;
|
||||
|
||||
return wl_ioctl(dev, WLC_SET_VAR, buf, buf_len);
|
||||
ret = wl_ioctl(dev, WLC_SET_VAR, buf, buf_len);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int wl_get_val(struct net_device *dev, char *var, void *val, int len)
|
||||
{
|
||||
char buf[128];
|
||||
int buf_len;
|
||||
int ret;
|
||||
|
||||
/* check for overflow */
|
||||
if (strlen(var) + 1 > sizeof(buf) || len > sizeof(buf))
|
||||
if ((buf_len = strlen(var)) + 1 > sizeof(buf) || len > sizeof(buf))
|
||||
return -1;
|
||||
|
||||
strcpy(buf, var);
|
||||
if ((ret = wl_ioctl(dev, WLC_GET_VAR, buf, sizeof(buf))))
|
||||
if (ret = wl_ioctl(dev, WLC_GET_VAR, buf, buf_len + len))
|
||||
return ret;
|
||||
|
||||
memcpy(val, buf, len);
|
||||
|
@ -309,23 +312,29 @@ static int wlcompat_ioctl(struct net_device *dev,
|
|||
}
|
||||
case SIOCSIWFREQ:
|
||||
{
|
||||
if (wrqu->freq.e == 1) {
|
||||
int channel = 0;
|
||||
int f = wrqu->freq.m / 100000;
|
||||
while ((channel < NUM_CHANNELS + 1) && (f != channel_frequency[channel]))
|
||||
channel++;
|
||||
|
||||
if (channel == NUM_CHANNELS) // channel not found
|
||||
return -EINVAL;
|
||||
|
||||
wrqu->freq.e = 0;
|
||||
wrqu->freq.m = channel + 1;
|
||||
}
|
||||
if ((wrqu->freq.e == 0) && (wrqu->freq.m < 1000)) {
|
||||
if (wrqu->freq.m == -1) {
|
||||
wrqu->freq.m = 0;
|
||||
if (wl_ioctl(dev, WLC_SET_CHANNEL, &wrqu->freq.m, sizeof(int)) < 0)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
if (wrqu->freq.e == 1) {
|
||||
int channel = 0;
|
||||
int f = wrqu->freq.m / 100000;
|
||||
while ((channel < NUM_CHANNELS + 1) && (f != channel_frequency[channel]))
|
||||
channel++;
|
||||
|
||||
if (channel == NUM_CHANNELS) // channel not found
|
||||
return -EINVAL;
|
||||
|
||||
wrqu->freq.e = 0;
|
||||
wrqu->freq.m = channel + 1;
|
||||
}
|
||||
if ((wrqu->freq.e == 0) && (wrqu->freq.m < 1000)) {
|
||||
if (wl_ioctl(dev, WLC_SET_CHANNEL, &wrqu->freq.m, sizeof(int)) < 0)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -425,24 +434,26 @@ static int wlcompat_ioctl(struct net_device *dev,
|
|||
return -EINVAL;
|
||||
|
||||
if (!wrqu->txpower.disabled) {
|
||||
int override;
|
||||
|
||||
if (wl_get_val(dev, "qtxpower", &override, sizeof(int)) < 0)
|
||||
int value;
|
||||
|
||||
if (wl_get_val(dev, "qtxpower", &value, sizeof(int)) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
wrqu->txpower.value |= override & WL_TXPWR_OVERRIDE;
|
||||
value &= WL_TXPWR_OVERRIDE;
|
||||
wrqu->txpower.value |= value;
|
||||
|
||||
if (wrqu->txpower.flags != IW_TXPOW_MWATT)
|
||||
return -EINVAL;
|
||||
|
||||
if (wl_set_val(dev, "qtxpower", &wrqu->txpower.value, sizeof(int)) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
if (wrqu->txpower.value > 0)
|
||||
if (wl_set_val(dev, "qtxpower", &(wrqu->txpower.value), sizeof(int)) < 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SIOCSIWENCODE:
|
||||
{
|
||||
int wep = 1, wrestrict = 1;
|
||||
int val = 0, wep = 1, wrestrict = 1;
|
||||
int index = (wrqu->data.flags & IW_ENCODE_INDEX) - 1;
|
||||
|
||||
if (index < 0)
|
||||
|
@ -471,12 +482,16 @@ static int wlcompat_ioctl(struct net_device *dev,
|
|||
if (wl_ioctl(dev, WLC_SET_KEY_PRIMARY, &index, sizeof(index)) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (wl_ioctl(dev, WLC_SET_WSEC, &wep, sizeof(wep)) < 0)
|
||||
if (wl_ioctl(dev, WLC_GET_WSEC, &val, sizeof(val)) < 0)
|
||||
return -EINVAL;
|
||||
val |= wep;
|
||||
if (wl_ioctl(dev, WLC_SET_WSEC, &val, sizeof(val)) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (wrestrict >= 0)
|
||||
if (wl_ioctl(dev, WLC_SET_WEP_RESTRICT, &wrestrict, sizeof(wrestrict)) < 0)
|
||||
return -EINVAL;
|
||||
break;
|
||||
}
|
||||
case SIOCGIWENCODE:
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue