]> git.decadent.org.uk Git - ap-utils.git/blobdiff - lib/wlan.c
Imported Upstream version 1.4.2~pre2~a
[ap-utils.git] / lib / wlan.c
index 12cafc1604eda62bb9fef11e6e8965d07c443d39..33d8f698648facaa2c64c2da401d0f095ce1e4ea 100644 (file)
 #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) {