X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=lib%2Fwlan.c;h=33d8f698648facaa2c64c2da401d0f095ce1e4ea;hb=refs%2Ftags%2Fupstream%2F1.4.2.pre2.a;hp=12cafc1604eda62bb9fef11e6e8965d07c443d39;hpb=6a9e980b8799891e0a5467a0126a60b169c8f4eb;p=ap-utils.git diff --git a/lib/wlan.c b/lib/wlan.c index 12cafc1..33d8f69 100644 --- a/lib/wlan.c +++ b/lib/wlan.c @@ -46,96 +46,83 @@ #define INT_ROAMING _("[I] International roaming: ") #define BEACON_PER _("[B] Beacon period (msec): ") #define DTIM_I _("[D] DTIM sending interval (beacons): ") +#define SIFS_T _("[T] SIFS time (msec): ") #define WLAN_HELP _("[key] - set option; W - write conf; Q - quit to menu") extern short ap_type; +extern char IS_ATMEL12350_TELLUS; +extern char IS_ATMEL12350_VERNET; void atmel_wireless() { - char sysDeviceInfo[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x01, 0x05, - 0x00 - }; - char operEthernetAddress[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x02, 0x03, - 0x00 + char sysDeviceInfo[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x01, 0x05, 0x00 }; - char operChannelID[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x01, - 0x00 + char operChannelID[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x01, 0x00 }; - char operESSIDLength[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x02, - 0x00 + char operESSIDLength[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x02, 0x00 }; - char operESSID[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x03, - 0x00 + char operESSID[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x03, 0x00 }; - char operRTSThreshold[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x04, - 0x00 + char operRTSThreshold[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x04, 0x00 }; - char operFragmentationThreshold[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x05, - 0x00 + char operFragmentationThreshold[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x05, 0x00 }; - char operPreambleType[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x06, - 0x00 + char operPreambleType[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x06, 0x00 }; - char operAuthenticationType[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x07, - 0x00 + char operAuthenticationType[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x07, 0x00 }; - char operBasicRates[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x08, - 0x00 + char operBasicRates[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x08, 0x00 }; - char operAutoRateFallBack[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x09, - 0x00 + char operAutoRateFallBack[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x09, 0x00 }; - char operAccessPointName[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x0A, - 0x00 + char operAccessPointName[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x0A, 0x00 }; - char operSSIDBroadcasting[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x0B, - 0x00 + char operSSIDBroadcasting[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x0B, 0x00 }; /* This one is ATMEL12350 MIB specific. */ - char operInterRoaming[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, 0x01, 0x02, 0x01, 0x0D, - 0x00 + char operInterRoaming[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, 0x01, 0x02, 0x01, 0x0D, 0x00 }; /* These two are ATMEL12350 TELLUS MIB specific. */ - char operBeaconPeriod[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, 0x01, 0x02, 0x01, 0x0E, - 0x00 + char operBeaconPeriod[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, 0x01, 0x02, 0x01, 0x0E, 0x00 }; - char operDTIM[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, 0x01, 0x02, 0x01, 0x0F, - 0x00 + char operDTIM[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, 0x01, 0x02, 0x01, 0x0F, 0x00 + }; + /* This one is ATMEL12350 VERNET MIB specific. */ + char operSIFSTIME[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0xE0, 0x3E, 0x01, 0x02, 0x01, 0x10, 0x00 }; extern WINDOW *main_sub; - varbind varbinds[15]; + varbind varbinds[16]; unsigned short int RTSThreshold, FragmentationThreshold, - InterRoaming, m_basic_rates = 0, first_channel = 1; - unsigned int BeaconPeriod = 0; + InterRoaming, m_basic_rates = 0, first_channel = 1, BeaconPeriod = 0, + sifs = 0; unsigned char dtim, ch; char *AuthenticationTypes[3] = { OSYS, SH_KEY, BOTH_TYPE }, - message[1024], - oui_tellus[3] = { 0x00, 0x04, 0xDB }, - IS_ATMEL12350_TELLUS = 0; /* ATMEL12350 Tellus uses different MIB */ + message[1024]; char domain[32], basic_rates[4], AutoRateFallBack, SSIDBroadcasting, ap_name[32], ch_num = 0, PreambleType, AuthenticationType, channel; char m_channel = 0, m_essid = 0, m_broadcast = 0, m_rts = 0, m_fragment = 0, m_auth = 0, m_ap_name = 0, m_preambule = 0, - m_auto_rate = 0, m_inter_roaming = 0, m_beacon = 0, m_dtim = 0; + m_auto_rate = 0, m_inter_roaming = 0, m_beacon = 0, m_dtim = 0, + m_sifs = 0; char *item_name[14], *rates[3] = { ON, OFF, BASIC }, *preambules[2] = { _("Short"), _("Long")}; short __rates[4] = { 2, 4, 11, 22 }; @@ -144,12 +131,10 @@ void atmel_wireless() struct SysDeviceInfo_ATMEL410 ptr410; struct SysDeviceInfo_ATMEL12350 ptr12350; - + if (ap_type == ATMEL12350) { sysDeviceInfo[5] = 0xE0; sysDeviceInfo[6] = 0x3E; - operEthernetAddress[5] = 0xE0; - operEthernetAddress[6] = 0x3E; operChannelID[5] = 0xE0; operChannelID[6] = 0x3E; operESSIDLength[5] = 0xE0; @@ -174,24 +159,7 @@ void atmel_wireless() operSSIDBroadcasting[6] = 0x3E; } - - /* Find out whether the device uses enhanced ATMEL12350 TELLUS MIB. */ - varbinds[0].type = NULL_VALUE; - varbinds[0].oid = operEthernetAddress; - varbinds[0].len_oid = sizeof(operEthernetAddress); - varbinds[0].len_val = 0; - - print_help(WAIT_RET); - if (snmp(varbinds, 1, GET) <= 0) { - print_helperr(ERR_RET); - goto exit; - } - - if (ap_type == ATMEL12350 && (memcmp(oui_tellus, varbinds[0].value, 3) ==0)) - IS_ATMEL12350_TELLUS = 1; - - - for (i = 1; i < 15; i++) { + for (i = 0; i < 16; i++) { varbinds[i].type = NULL_VALUE; varbinds[i].len_val = 0; varbinds[i].len_oid = sizeof(operChannelID); @@ -217,6 +185,8 @@ void atmel_wireless() varbinds[i++].oid = operBeaconPeriod; varbinds[i++].oid = operDTIM; } + if (IS_ATMEL12350_VERNET) + varbinds[i++].oid = operSIFSTIME; } if (snmp(varbinds, i, GET) <= 0) { @@ -240,21 +210,29 @@ void atmel_wireless() if (ap_type == ATMEL12350) { InterRoaming = *(varbinds[12].value); if (IS_ATMEL12350_TELLUS) { - for (i = 0; i < varbinds[13].len_val; - BeaconPeriod += varbinds[13].value[i] * - (1 << ((varbinds[13].len_val - i - 1) * 8)), i++); + BeaconPeriod = varbinds[13].len_val == 2 ? + (varbinds[13].value[0] << 8) | varbinds[13].value[1] : + varbinds[13].value[0] < 0x80 ? + varbinds[13].value[0] : 0xff00 | varbinds[13].value[0]; dtim = *(varbinds[14].value); } + if (IS_ATMEL12350_VERNET) + sifs = varbinds[15].len_val == 2 ? + (varbinds[15].value[0] << 8) | varbinds[15].value[1] : + varbinds[15].value[0] < 0x80 ? + varbinds[15].value[0] : 0xff00 | varbinds[15].value[0]; } if (ap_type == ATMEL12350) { - memcpy(&ptr12350, varbinds[11].value, sizeof(struct SysDeviceInfo_ATMEL12350)); - ap_regdomain=ptr12350.RegulationDomain; + memcpy(&ptr12350, varbinds[11].value, + sizeof(struct SysDeviceInfo_ATMEL12350)); + ap_regdomain=ptr12350.RegulationDomain; } else /* ATMEL410 */{ - memcpy(&ptr410, varbinds[11].value, sizeof(struct SysDeviceInfo_ATMEL410)); - ap_regdomain = swap4(ptr410.RegulationDomain); - } - + memcpy(&ptr410, varbinds[11].value, + sizeof(struct SysDeviceInfo_ATMEL410)); + ap_regdomain = swap4(ptr410.RegulationDomain); + } + if ((ch_num = ch_list(ap_regdomain, item_name)) == 0) { print_helperr(ERR_RET); goto exit; @@ -299,6 +277,10 @@ void atmel_wireless() sprintf(message, "%s%u", DTIM_I, dtim); mvwaddstr(main_sub, 17, 0, message); } + if (IS_ATMEL12350_VERNET) { + sprintf(message, "%s%u", SIFS_T, sifs); + mvwaddstr(main_sub, 18, 0, message); + } } wrefresh(main_sub); @@ -426,6 +408,15 @@ void atmel_wireless() dtim = atoi(message); m_dtim = 1; continue; + case 'T': + case 't': + if (!IS_ATMEL12350_VERNET) + continue; + get_value(message, 18, strlen(SIFS_T), 6, INT_STRING, 0, 65535, + WLAN_HELP); + sifs = atoi(message); + m_sifs = 1; + continue; case 'w': case 'W': i = 0; @@ -534,15 +525,12 @@ void atmel_wireless() i++; } if (m_beacon) { - int len_val; - - len_val = (BeaconPeriod > 0x7fff) ? 3 : - (BeaconPeriod > 0x7f) ? 2 : 1; varbinds[i].oid = operBeaconPeriod; varbinds[i].len_oid = sizeof(operBeaconPeriod); + BeaconPeriod = htons(BeaconPeriod); varbinds[i].value = (char *) &BeaconPeriod; - varbinds[i].len_val = len_val; - varbinds[i].type = STRING_VALUE; + varbinds[i].len_val = 2; + varbinds[i].type = INT_VALUE; i++; } if (m_dtim) { @@ -553,6 +541,15 @@ void atmel_wireless() varbinds[i].type = INT_VALUE; i++; } + if (m_sifs) { + varbinds[i].oid = operSIFSTIME; + varbinds[i].len_oid = sizeof(operSIFSTIME); + sifs = htons(sifs); + varbinds[i].value = (char *) &sifs; + varbinds[i].len_val = 2; + varbinds[i].type = INT_VALUE; + i++; + } print_help(WAIT_SET); if (snmp(varbinds, i, SET) <= 0) {