* stations.c from Access Point SNMP Utils for Linux
*
* Copyright (c) 2002 Roman Festchook <roma at polesye dot net>
+ * Copyright (c) 2005 Jan Rafaj <jr-aputils at cedric dot unob dot cz>
*
* 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
#include <signal.h>
#include <string.h>
#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;
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);
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 =
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;
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':
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:
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;
}
}
}
free(curr);
}
- print_title("");
+ print_top(NULL, NULL);
clear_main(0);
}
-