X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=src%2Fstations.c;h=bb6ca9018cac9f347b8cce6ce4ea0ade72c3327e;hb=7e47c451d988dc11ede64c0860da8f171eda4998;hp=2c435d092523af249b69200c0916c9ddde692544;hpb=09ed626f25fb3e7c57ad7a59e5261ea005aa498f;p=ap-utils.git diff --git a/src/stations.c b/src/stations.c index 2c435d0..bb6ca90 100644 --- a/src/stations.c +++ b/src/stations.c @@ -2,6 +2,7 @@ * stations.c from Access Point SNMP Utils for Linux * * Copyright (c) 2002 Roman Festchook + * Copyright (c) 2005 Jan Rafaj * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License Version 2 from @@ -24,54 +25,47 @@ #include #include #include "ap-utils.h" -#include "ap-curses.h" - -#define STAS _("Associated Stations") #define MAX_LINES LINES-4 extern int LINES; extern WINDOW *main_sub; -extern short ap_type; +extern short ap_type, ap_vendorext; +extern int sts_viewtype; -void stations() +void atmel_stations() { - struct AssociatedSTAsInfo { - unsigned short Num; - unsigned char MacAddress[6]; - } *mac = NULL, get; - char StasNum[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x05, 0x01, - 0x00 + char bridgeOperationalMode[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x04, 0x01, 0x00 }; - - char StasMac[] = - { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x05, 0x02, - 0x00 + char AssociatedSTAsNum[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x05, 0x01, 0x00 }; - - char bridgeOperationalMode[] = { - 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x04, 0x01, 0x00 + char AssociatedSTAsInfo[] = { + 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x05, 0x02, 0x00 }; - - + + /* AP mode: connected APClients info */ + + struct AssociatedSTAsInfo_ATMEL410 ap_410; + struct AssociatedSTAsInfo_ATMEL12350 ap_12350; + struct MacListStat *first = NULL, *curr = NULL; char message[1024]; - int mac_num, begin, end, total_mac; + int mac_idx, begin, end, total_mac; varbind varbinds[1]; - + if (ap_type == ATMEL12350) { - StasNum[5] = 0xE0; - StasNum[6] = 0x3E; - StasMac[5] = 0xE0; - StasMac[6] = 0x3E; bridgeOperationalMode[5] = 0xE0; bridgeOperationalMode[6] = 0x3E; + AssociatedSTAsNum[5] = 0xE0; + AssociatedSTAsNum[6] = 0x3E; + AssociatedSTAsInfo[5] = 0xE0; + AssociatedSTAsInfo[6] = 0x3E; } - print_title(STAS); - + /* find out mode the device is currently in */ varbinds[0].oid = bridgeOperationalMode; varbinds[0].len_oid = sizeof(bridgeOperationalMode); varbinds[0].value = bridgeOperationalMode; @@ -83,146 +77,202 @@ void stations() goto exit; } - if (*(varbinds[0].value) == 3) { - mvwaddstr(main_sub, 3, 1, _("AP now in AP Client Mode and don't has any associated stations")); - print_help(ANY_KEY); - wrefresh(main_sub); - getch(); - goto exit; + /* Rule out all modes except AP(2). */ + if (*(varbinds[0].value) != 2) { + mvwaddstr(main_sub, 1, 1, _("Not available (device not in AP mode).")); + print_help(ANY_KEY); + wrefresh(main_sub); + goto exit; } - + noecho(); + + wattrset(main_sub, COLOR_PAIR(13)); + mvwaddstr(main_sub, 0, 0, + _(" # MAC Parent MAC RSSI LQ Sts MACn IP ")); + wattrset(main_sub, A_NORMAL); - varbinds[0].oid = StasNum; - varbinds[0].len_oid = sizeof(StasNum); - varbinds[0].value = StasNum; +refresh: + /* find out how many STAtions is in the list */ + varbinds[0].oid = AssociatedSTAsNum; + varbinds[0].len_oid = sizeof(AssociatedSTAsNum); + varbinds[0].value = AssociatedSTAsNum; varbinds[0].type = NULL_VALUE; varbinds[0].len_val = 0; + print_help(WAIT_RET); + if (snmp(varbinds, 1, GET) <= 0) { print_helperr(ERR_RET); - getch(); goto exit; } total_mac = *(varbinds[0].value); - mac_num = 1; - - sprintf(message, "%s: %d", STAS, total_mac); - print_title(message); - mvwaddstr(main_sub, 0, 3, _("Id MAC address")); - noecho(); - - while (mac_num <= total_mac) { - - varbinds[0].oid = StasMac; - varbinds[0].len_oid = sizeof(StasMac); + print_help(WAIT_SET); + mac_idx = 1; + + while (mac_idx <= total_mac) { + /* + * Tell the AP we want mac_idx-th AssociatedSTAsInfo structure. + * Note: since: + * - position of 'Index' member in ap_* struct is always the same + * - only the 'Index' member is actually to be used + * - both structures have same size (24) + * we may pick *any* ap_* struct here. + */ + varbinds[0].oid = AssociatedSTAsInfo; + varbinds[0].len_oid = sizeof(AssociatedSTAsInfo); varbinds[0].type = INT_VALUE; - get.Num = swap2(mac_num); - varbinds[0].value = (char *) &get; - varbinds[0].len_val = sizeof(get); + ap_410.Index = swap2(mac_idx); + varbinds[0].value = (char *)&ap_410; + varbinds[0].len_val = sizeof(ap_410); if (snmp(varbinds, 1, SET) <= 0) { print_helperr(ERR_RET); - getch(); goto exit; } - if (varbinds[0].len_val == 24) { - if (mac) - free(mac); - mac = - (struct AssociatedSTAsInfo *) malloc(varbinds[0].len_val); - memcpy(mac, varbinds[0].value, varbinds[0].len_val); -/* mac = (struct AssociatedSTAsInfo *) varbinds[0].value;*/ - } else { + if (varbinds[0].len_val != 24) { print_helperr(_("AssociatedSTAsInfo packet error")); goto exit; } - if (first == NULL) { first = - (struct MacListStat *) malloc(sizeof(struct MacListStat)); + (struct MacListStat *) calloc(1, sizeof(struct MacListStat)); curr = first; } else { curr->next = - (struct MacListStat *) malloc(sizeof(struct MacListStat)); + (struct MacListStat *) calloc(1, sizeof(struct MacListStat)); curr = curr->next; } - memcpy(curr->addr, mac->MacAddress, 6); + /* lets not use black magic (casting) here, ok? */ + if (ap_type == ATMEL410) { + memcpy(&ap_410, varbinds[0].value, sizeof(ap_410)); + + memcpy(curr->addr, ap_410.MacAddress, 6); + if (ap_vendorext == SBRIDGES) { + memcpy(curr->ParentMacAddress, ap_410.ParentMacAddress, 6); + memcpy(&(curr->IP.s_addr), ap_410.IP, 4); + curr->rssi = ap_410.RSSI; + curr->quality = ap_410.LinkQuality; + curr->Status = ap_410.Status; + curr->Port = ap_410.Port; + } + } else { /* ap_type == ATMEL12350 */ + memcpy(&ap_12350, varbinds[0].value, sizeof(ap_12350)); + + memcpy(curr->addr, ap_12350.MacAddress, 6); + if (ap_vendorext == EZYNET) { + memcpy(curr->ParentMacAddress, ap_12350.ParentMacAddress, 6); + memcpy(&(curr->IP.s_addr), ap_12350.IP, 4); + curr->rssi = ap_12350.RSSI; + /* curr->quality stays empty */ + curr->Status = ap_12350.Status; + curr->Port = ap_12350.Port; + } + } + curr->next = NULL; - mac_num++; + mac_idx++; } + begin = 1; - end = (MAX_LINES < mac_num) ? MAX_LINES : mac_num; - scroll_rows(first, begin, end, 1, 0); - print_help(_("Arrows - scroll; S - save to file; Q - quit to menu.")); + end = (MAX_LINES < mac_idx) ? MAX_LINES : mac_idx; + + sprintf(message, "%s: %d", ST_TITLE, total_mac); while (1) { + if ((ap_type == ATMEL410 && ap_vendorext == SBRIDGES) || + (ap_type == ATMEL12350 && ap_vendorext == EZYNET)) { + print_top_rssi(message); + print_help(_("Arrows - scroll; S - save to file; Q - return; " + "T - toggle view; Other - refresh")); + } else { + print_top(NULL, message); + print_help(_("Arrows - scroll; S - save to file; Q - return; " + "Other key - refresh")); + } + scroll_rows(first, begin, end, 1, 2); + switch (getch()) { - case 'S': - case 's': - save_Stations(first); - continue; - case KEY_RIGHT: - case KEY_DOWN: - if (end < mac_num) { - begin++; - end++; - scroll_rows(first, begin, end, 1, 0); - } - continue; - case KEY_UP: - case KEY_LEFT: - if (begin > 1) { - begin--; - end--; - scroll_rows(first, begin, end, 1, 0); - } - continue; - case 'Q': - case 'q': - goto exit; + case 'S': + case 's': + save_Stations(first); + continue; + case KEY_RIGHT: + case KEY_DOWN: + if (end < mac_idx) { + begin++; + end++; + } + continue; + case KEY_UP: + case KEY_LEFT: + if (begin > 1) { + begin--; + end--; + } + continue; + case 'Q': + case 'q': + goto quit; + case 'T': + case 't': + if ((ap_type == ATMEL410 && ap_vendorext == SBRIDGES) || + (ap_type == ATMEL12350 && ap_vendorext == EZYNET)) { + sts_viewtype += 1; + if (sts_viewtype == 3) + sts_viewtype = 0; + } + continue; + default: + while ((curr = first)) { + first = curr->next; + free(curr); + } + first = curr = NULL; + goto refresh; } } - exit: +exit: + getch(); +quit: while ((curr = first)) { first = curr->next; free(curr); } - print_title(""); + print_top(NULL, NULL); clear_main(0); } void nwn_stations() { - unsigned char Mac[] = - { 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01, + unsigned char Mac[] = { + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01, 0x02, 0x01, 0x02, 0x80, 0x00 }; - - unsigned char Quality[] = - { 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01, - 0x02, 0x01, 0x03, 0x80, 0x00 }; - unsigned char Age[] = - { 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01, - 0x02, 0x01, 0x04, 0x80, 0x00 }; - unsigned char RSSI[] = - { 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01, - 0x02, 0x01, 0x05, 0x80, 0x00 }; + unsigned char Quality[] = { + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01, + 0x02, 0x01, 0x03, 0x80, 0x00 }; + unsigned char Age[] = { + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01, + 0x02, 0x01, 0x04, 0x80, 0x00 }; + unsigned char RSSI[] = { + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01, + 0x02, 0x01, 0x05, 0x80, 0x00 }; struct MacListStat *first = NULL, *curr = NULL; char null[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, message[1024]; - int mac_num, begin, end; + int mac_idx, begin, end; varbind varbinds[4]; unsigned char next_num; - mac_num = 0; - print_title(_("Associated stations")); + mac_idx = 0; + print_top(NULL, ST_TITLE); mvwaddstr(main_sub, 0, 3, - _("Id MAC address Quality Age RSSI")); + _("Id MAC address Quality Age RSSI")); noecho(); print_help(WAIT_RET); @@ -266,13 +316,12 @@ void nwn_stations() varbinds[3].len_oid = sizeof(RSSI); varbinds[3].len_val = 0; varbinds[3].type = NULL_VALUE; - if (snmp(varbinds, 4, GET) <= 0) { + if (snmp(varbinds, 4, GET) < 4) { print_helperr(ERR_RET); getch(); goto exit; } - if (memcmp(null, varbinds[0].value, 6)) { if (first == NULL) { first = @@ -285,12 +334,12 @@ void nwn_stations() malloc(sizeof(struct MacListStat)); curr = curr->next; } - memcpy(curr->addr, varbinds[0].value, 6); - curr->quality = *varbinds[1].value; - curr->idle = *varbinds[2].value; - curr->rssi = *varbinds[3].value; - curr->next = NULL; - mac_num++; + memcpy(curr->addr, varbinds[0].value, 6); + curr->quality = *varbinds[1].value; + curr->idle = *varbinds[2].value; + curr->rssi = *varbinds[3].value; + curr->next = NULL; + mac_idx++; } varbinds[0].oid = Mac; @@ -304,14 +353,21 @@ void nwn_stations() next_num = varbinds[0].oid[varbinds[0].len_oid - 1]; } - sprintf(message, "%s: %d", _("Associated stations"), mac_num); - print_title(message); - if(mac_num) { + + if(mac_idx) { + begin = 1; - end = (MAX_LINES < mac_num+1) ? MAX_LINES : mac_num+1; - scroll_rows(first, begin, end, 1, 1); - print_help(_("Arrows - scroll; S - save to file; Q - quit to menu.")); + end = (MAX_LINES < mac_idx + 1) ? MAX_LINES : mac_idx + 1; + while (1) { + print_help(_("Arrows - scroll; S - save to file; Q - return; " + "T - toggle view; Other - refresh")); + + scroll_rows(first, begin, end, 1, 1); + + sprintf(message, "%s: %d", ST_TITLE, mac_idx); + print_top_rssi(message); + switch (getch()) { case 'S': case 's': @@ -319,10 +375,9 @@ void nwn_stations() continue; case KEY_DOWN: case KEY_RIGHT: - if (end < mac_num+1) { + if (end < mac_idx+1) { begin++; end++; - scroll_rows(first, begin, end, 1, 1); } continue; case KEY_UP: @@ -330,12 +385,18 @@ void nwn_stations() if (begin > 1) { begin--; end--; - scroll_rows(first, begin, end, 1, 1); } continue; case 'Q': case 'q': goto exit; + case 'T': + case 't': + sts_viewtype += 1; + if (sts_viewtype == 3) + sts_viewtype = 0; + + continue; } } } @@ -349,7 +410,6 @@ void nwn_stations() free(curr); } - print_title(""); + print_top(NULL, NULL); clear_main(0); } -