#define ERR_STR_V "\n\n-\n\n"
#define ERR_STR_N "999999999\n999999999\n-\n\n"
-short ap_type = ATMEL410;
+short ap_type;
char *community = NULL;
int sockfd;
struct in_addr ap_ip;
void usage()
{
printf(_("\nUsage:\n"));
- printf(_
- ("\tap-mrtg -i ip -c community -t type [-b bssid] [-n name] [-a aptype] [-v] [-h] [-r]\n\n"));
- printf(_
- ("Get stats from AP and return it in MRTG parsable format\n\n"));
+ printf(_("\tap-mrtg -i ip -c community -t type [-b bssid] [-n name] "
+ "[-v] [-h] [-r]\n\n"));
+ printf(_("Get stats from AP and return it in MRTG parsable format\n\n"));
printf(_("-i ip - AP ip address\n"));
printf(_("-c community - SNMP community string\n"));
- printf(_
- ("-t type - statistics type <w>ireless, <e>thernet, associated <s>tations or <l>ink quality in client mode\n"));
- printf(_
- ("-b bssid - mac address of the AP to which get link quality, only if type=l\n"));
- printf(_("-n name - AP name - for check only\n"));
- printf(_("-a aptype - AP type - 410 (default) or 510 for ATMEL12350's, like the ME-102\n"));
- printf(_
- ("-v - report MRTG about problems connecting to AP\n"));
+ printf(_("-t type - statistics type <w>ireless, <e>thernet, "
+ "associated <s>tations or <l>ink quality (last one will only "));
+ printf(_("work with ATMEL410 MIB devices in AP Client mode)\n"));
+ printf(_("-b bssid - mac address of the AP from which get link quality"
+ ", only if type=l\n"));
+ printf(_("-n name - AP name - for check only\n"));
+ printf(_("-v - report MRTG about problems connecting to AP\n"));
printf(_("-r - reset AP when getting LinkQuality stats\n"));
printf(_("-h - print this help screen\n\n"));
printf(_("ap-mrtg %s Copyright (c) 2002-2003 Roman Festchook\n\n"),
VERSION);
-
}
-
int main(int argc, char **argv)
{
extern char *optarg;
unsigned char essid[32];
} *app = NULL;
- char Wireless[] =
- { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x03, 0x01,
- 0x00
+ char sysDescr_NWN[] = {
+ 0x2B, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00
+ };
+ char sysDescr_ATMEL[] = {
+ 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x01, 0x01, 0x00
};
- char EthRx[] =
- { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x07, 0x01,
- 0x00
+ char bridgeOperationalMode[] = {
+ 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x04, 0x01, 0x00
};
- char EthTx[] =
- { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x07, 0x02,
- 0x00
+ char EthRxStatistics[] = {
+ 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x07, 0x01, 0x00
};
- char operAccessPointName[] =
- { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x0A,
- 0x00
+ char EthTxStatistics[] = {
+ 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x07, 0x02, 0x00
};
- char StasNum[] =
- { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x05, 0x01,
- 0x00
+ char operAccessPointName[] = {
+ 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x0A, 0x00
};
- char KnownAP[] =
- { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x07,
- 0x01, 0x00
+ char wirelessStatistics[] = {
+ 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x03, 0x01, 0x00
};
- char bridgeOperationalMode[] =
- { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01,
- 0x01, 0x04, 0x01, 0x00
+ char AssociatedSTAsNum[] = {
+ 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x05, 0x01, 0x00
+ };
+ char wirelessKnownAPs[] = {
+ 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x07, 0x01, 0x00
};
- struct EthernetRxStatistics *EthRxStat = NULL;
- struct EthernetTxStatistics *EthTxStat = NULL;
- struct WirelessStatistics *WirelessStat = NULL;
+ struct EthRxStatistics_s *EthRxStat = NULL;
+ struct EthTxStatistics_s *EthTxStat = NULL;
+ struct wirelessStatistics_s *WirelessStat = NULL;
varbind varbinds[2];
int i, reset_flag=0;
char message[12], bssid_flag, stat_type = 0, *ERR_STR =
- ERR_STR_N, *bssid = NULL, *name = NULL;
+ ERR_STR_N, *bssid = NULL, *name = NULL, *cp;
struct sockaddr_in client;
#ifdef HAVE_GETTEXT
do {
opterr = 0;
- switch (opt = getopt(argc, argv, "i:c:t:b:n:a:rv")) {
+ switch (opt = getopt(argc, argv, "i:c:t:b:n:rv")) {
case 'i':
- if (inet_aton(optarg, &ap_ip) == 0) {
- printf(_("Invalid IP-address\n"));
+ for (cp = optarg, i = 0; *cp && (cp = index(cp, '.')); cp++, i++);
+ if (i < 3 || inet_aton(optarg, &ap_ip) == 0) {
+ printf(_("Error: invalid IP-address.\n"));
return 1;
}
break;
case 'r':
reset_flag=1;
break;
- case 'a':
- if ( strcmp( optarg, "510\0" ) == 0) {
- Wireless[5] = 0xE0;
- Wireless[6] = 0x3E;
- EthRx[5] = 0xE0;
- EthRx[6] = 0x3E;
- EthTx[5] = 0xE0;
- EthTx[6] = 0x3E;
- operAccessPointName[5] = 0xE0;
- operAccessPointName[6] = 0x3E;
- StasNum[5] = 0xE0;
- StasNum[6] = 0x3E;
- KnownAP[5] = 0xE0;
- KnownAP[6] = 0x3E;
- bridgeOperationalMode[5] = 0xE0;
- bridgeOperationalMode[6] = 0x3E;
- } else if (strcmp(optarg, "410") == 0) {
- /* nothing - hard-coded defaults are fine */
- } else {
- /* Invalid AP-Type */
- printf(_("Invalid AP-Type '%s' - valid types are 510 or 410\n"), optarg);
- return 1;
- }
- break;
case -1:
break;
default:
goto quit;
}
-
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror(_("Create socket error"));
return 1;
return 1;
}
+ /*
+ * Part detecting ap_type (ATMEL AP MIB type) follows.
+ * We could use get_mib_details() here with advantage, but it would
+ * have to involve 1. putting it to separate file in lib/ and
+ * 2. patch it so it would not contain curses-related commands (TODO)
+ */
+
+ /* determine private MIB type according to enterprises ID */
+ varbinds[0].oid = sysDescr_NWN;
+ varbinds[0].len_oid = sizeof(sysDescr_NWN);
+ varbinds[0].value = NULL;
+ varbinds[0].len_val = 0;
+ varbinds[0].type = NULL_VALUE;
+ if (snmp(varbinds, 1, GET) > 0) {
+ ap_type = NWN;
+ } else {
+ varbinds[0].oid = sysDescr_ATMEL;
+ varbinds[0].len_oid = sizeof(sysDescr_ATMEL);
+ varbinds[0].value = NULL;
+ varbinds[0].len_val = 0;
+ varbinds[0].type = NULL_VALUE;
+ if (snmp(varbinds, 1, GET) > 0) {
+ ap_type = ATMEL410;
+ } else {
+ sysDescr_ATMEL[5] = 0xE0;
+ sysDescr_ATMEL[6] = 0x3E;
+ varbinds[0].oid = sysDescr_ATMEL;
+ varbinds[0].len_oid = sizeof(sysDescr_ATMEL);
+ varbinds[0].value = NULL;
+ varbinds[0].len_val = 0;
+ varbinds[0].type = NULL_VALUE;
+ if (snmp(varbinds, 1, GET) > 0) {
+ ap_type = ATMEL12350;
+ } else {
+ printf(_("Unable to determine AP MIB type "
+ "(no response from AP)."));
+ return 1;
+ }
+ }
+ }
+
+ if (ap_type == NWN) {
+ printf("NWN devices are not yet supported.");
+ return 1;
+ }
+
+ if (ap_type == ATMEL12350) {
+ bridgeOperationalMode[5] = 0xE0;
+ bridgeOperationalMode[6] = 0x3E;
+ EthRxStatistics[5] = 0xE0;
+ EthRxStatistics[6] = 0x3E;
+ EthTxStatistics[5] = 0xE0;
+ EthTxStatistics[6] = 0x3E;
+ operAccessPointName[5] = 0xE0;
+ operAccessPointName[6] = 0x3E;
+ wirelessStatistics[5] = 0xE0;
+ wirelessStatistics[6] = 0x3E;
+ AssociatedSTAsNum[5] = 0xE0;
+ AssociatedSTAsNum[6] = 0x3E;
+ wirelessKnownAPs[5] = 0xE0;
+ wirelessKnownAPs[6] = 0x3E;
+ }
+
switch (stat_type) {
case 'e':
-
- varbinds[0].oid = EthRx;
- varbinds[0].len_oid = sizeof(EthRx);
- varbinds[0].value = EthRx;
+ varbinds[0].oid = EthRxStatistics;
+ varbinds[0].len_oid = sizeof(EthRxStatistics);
+ varbinds[0].value = EthRxStatistics;
varbinds[0].len_val = 0;
varbinds[0].type = NULL_VALUE;
- varbinds[1].oid = EthTx;
- varbinds[1].len_oid = sizeof(EthTx);
- varbinds[1].value = EthTx;
+ varbinds[1].oid = EthTxStatistics;
+ varbinds[1].len_oid = sizeof(EthTxStatistics);
+ varbinds[1].value = EthTxStatistics;
varbinds[1].len_val = 0;
varbinds[1].type = NULL_VALUE;
- if (snmp(varbinds, 2, GET) <= 0) {
+ if (snmp(varbinds, 2, GET) < 2) {
printf(ERR_STR);
return 1;
}
if (EthRxStat)
free(EthRxStat);
EthRxStat =
- (struct EthernetRxStatistics *) malloc(varbinds[0].
+ (struct EthRxStatistics_s *) malloc(varbinds[0].
len_val);
memcpy(EthRxStat, varbinds[0].value, varbinds[0].len_val);
} else {
if (EthTxStat)
free(EthTxStat);
EthTxStat =
- (struct EthernetTxStatistics *) malloc(varbinds[1].
+ (struct EthTxStatistics_s *) malloc(varbinds[1].
len_val);
memcpy(EthTxStat, varbinds[1].value, varbinds[1].len_val);
} else {
free(EthTxStat);
break;
case 'w':
- varbinds[0].oid = Wireless;
- varbinds[0].len_oid = sizeof(Wireless);
- varbinds[0].value = Wireless;
+ varbinds[0].oid = wirelessStatistics;
+ varbinds[0].len_oid = sizeof(wirelessStatistics);
+ varbinds[0].value = wirelessStatistics;
varbinds[0].len_val = 0;
varbinds[0].type = NULL_VALUE;
return 1;
}
- if (varbinds[0].len_val == 88) {
+ if (varbinds[0].len_val == 88 || varbinds[0].len_val == 104) {
+ /*
+ * 88 ... using traditional ATMEL 12350 MIB
+ * 104 .. using functionally enhanced ATMEL 12350 MIB by EZYNET
+ */
if (WirelessStat)
free(WirelessStat);
WirelessStat =
- (struct WirelessStatistics *) malloc(varbinds[0].len_val);
+ (struct wirelessStatistics_s *) malloc(varbinds[0].len_val);
memcpy(WirelessStat, varbinds[0].value, varbinds[0].len_val);
} else {
printf(ERR_STR);
break;
case 's':
- varbinds[0].oid = StasNum;
- varbinds[0].len_oid = sizeof(StasNum);
- varbinds[0].value = StasNum;
+ varbinds[0].oid = AssociatedSTAsNum;
+ varbinds[0].len_oid = sizeof(AssociatedSTAsNum);
+ varbinds[0].value = AssociatedSTAsNum;
varbinds[0].len_val = 0;
varbinds[0].type = NULL_VALUE;
break;
case 'l':
-
varbinds[0].oid = bridgeOperationalMode;
varbinds[0].len_oid = sizeof(bridgeOperationalMode);
varbinds[0].len_val = 0;
return 1;
}
- if (*(varbinds[0].value) != 3) {
+ if (!(ap_type == ATMEL410 && *(varbinds[0].value) == 3)) {
printf(ERR_STR);
return 1;
}
}
sleep(10);
}
-
- varbinds[0].oid = KnownAP;
- varbinds[0].len_oid = sizeof(KnownAP);
+
+ varbinds[0].oid = wirelessKnownAPs;
+ varbinds[0].len_oid = sizeof(wirelessKnownAPs);
varbinds[0].type = NULL_VALUE;
varbinds[0].len_val = 0;
printf("-\n");
-
if ( name != NULL ) {
varbinds[0].oid = operAccessPointName;
varbinds[0].len_oid = sizeof(operAccessPointName);