]> git.decadent.org.uk Git - ap-utils.git/blob - src/stations.c
2c435d092523af249b69200c0916c9ddde692544
[ap-utils.git] / src / stations.c
1 /*
2  *      stations.c from Access Point SNMP Utils for Linux
3  *
4  * Copyright (c) 2002 Roman Festchook <roma at polesye dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License Version 2 from
8  * June 1991 as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  */
20 #include <sys/wait.h>
21 #include <unistd.h>
22 #include <stdlib.h>
23 #include <fcntl.h>
24 #include <signal.h>
25 #include <string.h>
26 #include "ap-utils.h"
27 #include "ap-curses.h"
28
29 #define STAS _("Associated Stations")
30
31 #define MAX_LINES LINES-4
32
33 extern int LINES;
34 extern WINDOW *main_sub;
35 extern short ap_type;
36
37 void stations()
38 {
39     struct AssociatedSTAsInfo {
40         unsigned short Num;
41         unsigned char MacAddress[6];
42     } *mac = NULL, get;
43     char StasNum[] =
44         { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x05, 0x01,
45         0x00
46     };
47
48     char StasMac[] =
49         { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x05, 0x02,
50         0x00
51     };
52
53     char bridgeOperationalMode[] = {
54                 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x04, 0x01, 0x00
55     };
56         
57     
58     struct MacListStat *first = NULL, *curr = NULL;
59     char message[1024];
60     int mac_num, begin, end, total_mac;
61     varbind varbinds[1];
62
63   
64     if (ap_type == ATMEL12350) {
65         StasNum[5] = 0xE0;
66         StasNum[6] = 0x3E;
67         StasMac[5] = 0xE0;
68         StasMac[6] = 0x3E;
69         bridgeOperationalMode[5] = 0xE0;
70         bridgeOperationalMode[6] = 0x3E;
71     }   
72
73     print_title(STAS);
74
75     varbinds[0].oid = bridgeOperationalMode;
76     varbinds[0].len_oid = sizeof(bridgeOperationalMode);
77     varbinds[0].value = bridgeOperationalMode;
78     varbinds[0].len_val = 0;
79     varbinds[0].type = NULL_VALUE;
80     print_help(WAIT_RET);
81     if (snmp(varbinds, 1, GET) <= 0) {
82           print_helperr(ERR_RET);
83           goto exit;
84     }
85
86     if (*(varbinds[0].value) == 3) {
87             mvwaddstr(main_sub, 3, 1, _("AP now in AP Client Mode and don't has any associated stations"));
88             print_help(ANY_KEY);
89             wrefresh(main_sub);
90             getch();
91             goto exit;
92     }
93
94                             
95
96     varbinds[0].oid = StasNum;
97     varbinds[0].len_oid = sizeof(StasNum);
98     varbinds[0].value = StasNum;
99     varbinds[0].type = NULL_VALUE;
100     varbinds[0].len_val = 0;
101     print_help(WAIT_RET);
102     if (snmp(varbinds, 1, GET) <= 0) {
103         print_helperr(ERR_RET);
104         getch();
105         goto exit;
106     }
107
108     total_mac = *(varbinds[0].value);
109     mac_num = 1;
110
111     sprintf(message, "%s: %d", STAS, total_mac);
112     print_title(message);
113     mvwaddstr(main_sub, 0, 3, _("Id       MAC address"));
114     noecho();
115
116     while (mac_num <= total_mac) {
117
118         varbinds[0].oid = StasMac;
119         varbinds[0].len_oid = sizeof(StasMac);
120         varbinds[0].type = INT_VALUE;
121         get.Num = swap2(mac_num);
122         varbinds[0].value = (char *) &get;
123         varbinds[0].len_val = sizeof(get);
124
125         if (snmp(varbinds, 1, SET) <= 0) {
126             print_helperr(ERR_RET);
127             getch();
128             goto exit;
129         }
130
131         if (varbinds[0].len_val == 24) {
132             if (mac)
133                 free(mac);
134             mac =
135                 (struct AssociatedSTAsInfo *) malloc(varbinds[0].len_val);
136             memcpy(mac, varbinds[0].value, varbinds[0].len_val);
137 /*          mac = (struct AssociatedSTAsInfo *) varbinds[0].value;*/
138         } else {
139             print_helperr(_("AssociatedSTAsInfo packet error"));
140             goto exit;
141         }
142
143
144         if (first == NULL) {
145             first =
146                 (struct MacListStat *) malloc(sizeof(struct MacListStat));
147             curr = first;
148         } else {
149             curr->next =
150                 (struct MacListStat *) malloc(sizeof(struct MacListStat));
151             curr = curr->next;
152         }
153
154         memcpy(curr->addr, mac->MacAddress, 6);
155         curr->next = NULL;
156         mac_num++;
157     }
158     begin = 1;
159     end = (MAX_LINES < mac_num) ? MAX_LINES : mac_num;
160     scroll_rows(first, begin, end, 1, 0);
161     print_help(_("Arrows - scroll; S - save to file; Q - quit to menu."));
162     while (1) {
163         switch (getch()) {
164         case 'S':
165         case 's':
166             save_Stations(first);
167             continue;
168         case KEY_RIGHT:
169         case KEY_DOWN:
170             if (end < mac_num) {
171                 begin++;
172                 end++;
173                 scroll_rows(first, begin, end, 1, 0);
174             }
175             continue;
176         case KEY_UP:
177         case KEY_LEFT:
178             if (begin > 1) {
179                 begin--;
180                 end--;
181                 scroll_rows(first, begin, end, 1, 0);
182             }
183             continue;
184         case 'Q':
185         case 'q':
186             goto exit;
187         }
188     }
189
190   exit:
191     while ((curr = first)) {
192         first = curr->next;
193         free(curr);
194     }
195     print_title("");
196     clear_main(0);
197 }
198
199 void nwn_stations()
200 {
201     unsigned char Mac[] =
202         { 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01,
203         0x02, 0x01, 0x02, 0x80, 0x00 };
204
205     unsigned char Quality[] =
206         { 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01,
207         0x02, 0x01, 0x03, 0x80, 0x00  };
208     unsigned char Age[] =
209         { 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01,
210         0x02, 0x01, 0x04, 0x80, 0x00    };
211     unsigned char RSSI[] =
212         { 0x2b, 0x06, 0x01, 0x04, 0x01, 0x87, 0x29, 0x03, 0x01, 0x03, 0x01,
213         0x02, 0x01, 0x05, 0x80, 0x00    };
214
215     struct MacListStat *first = NULL, *curr = NULL;
216     char null[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, message[1024];
217     int mac_num, begin, end;
218     varbind varbinds[4];
219     unsigned char next_num;
220
221
222     mac_num = 0;
223     print_title(_("Associated stations"));
224     mvwaddstr(main_sub, 0, 3,
225               _("Id       MAC address     Quality  Age  RSSI"));
226     noecho();
227     print_help(WAIT_RET);
228
229     varbinds[0].oid = Mac;
230     varbinds[0].len_oid = sizeof(Mac);
231     varbinds[0].len_val = 0;
232     varbinds[0].type = NULL_VALUE;
233     if (snmp(varbinds, 1, GET_NEXT) <= 0) {
234         print_helperr(ERR_RET);
235         goto exit;
236     }
237    next_num = varbinds[0].oid[varbinds[0].len_oid - 1];
238
239    while (memcmp(varbinds[0].oid, Mac, sizeof(Mac) - 2) == 0) {
240
241         Mac[sizeof(Mac) - 1] = next_num;
242         Quality[sizeof(Mac) - 1] = next_num;
243         Age[sizeof(Mac) - 1] = next_num;
244         RSSI[sizeof(Mac) - 1] = next_num;
245
246         if(sizeof(Mac) == varbinds[0].len_oid) {
247                 Mac[sizeof(Mac) - 2] = varbinds[0].oid[varbinds[0].len_oid - 2];
248                 Quality[sizeof(Mac) - 2] = varbinds[0].oid[varbinds[0].len_oid - 2];
249                 Age[sizeof(Mac) - 2]  = varbinds[0].oid[varbinds[0].len_oid - 2];
250                 RSSI[sizeof(Mac) - 2] = varbinds[0].oid[varbinds[0].len_oid - 2];
251         }
252
253         varbinds[0].oid = Mac;
254         varbinds[0].len_oid = sizeof(Mac);
255         varbinds[0].len_val = 0;
256         varbinds[0].type = NULL_VALUE;
257         varbinds[1].oid = Quality;
258         varbinds[1].len_oid = sizeof(Quality);
259         varbinds[1].len_val = 0;
260         varbinds[1].type = NULL_VALUE;
261         varbinds[2].oid = Age;
262         varbinds[2].len_oid = sizeof(Age);
263         varbinds[2].len_val = 0;
264         varbinds[2].type = NULL_VALUE;
265         varbinds[3].oid = RSSI;
266         varbinds[3].len_oid = sizeof(RSSI);
267         varbinds[3].len_val = 0;
268         varbinds[3].type = NULL_VALUE;
269         if (snmp(varbinds, 4, GET) <= 0) {
270             print_helperr(ERR_RET);
271             getch();
272             goto exit;
273         }
274
275
276         if (memcmp(null, varbinds[0].value, 6)) {
277             if (first == NULL) {
278                 first =
279                     (struct MacListStat *)
280                     malloc(sizeof(struct MacListStat));
281                 curr = first;
282             } else {
283                 curr->next =
284                     (struct MacListStat *)
285                     malloc(sizeof(struct MacListStat));
286                 curr = curr->next;
287             } 
288                 memcpy(curr->addr, varbinds[0].value, 6);
289                 curr->quality = *varbinds[1].value;
290                 curr->idle = *varbinds[2].value;
291                 curr->rssi = *varbinds[3].value;
292                 curr->next = NULL;
293                 mac_num++;
294         }
295
296         varbinds[0].oid = Mac;
297         varbinds[0].len_oid = sizeof(Mac);
298         varbinds[0].len_val = 0;
299         varbinds[0].type = NULL_VALUE;
300         if (snmp(varbinds, 1, GET_NEXT) <= 0) {
301             print_helperr(ERR_RET);
302             goto exit;
303         }
304         next_num = varbinds[0].oid[varbinds[0].len_oid - 1];
305                                                 
306     }
307    sprintf(message, "%s: %d", _("Associated stations"), mac_num);
308    print_title(message);
309    if(mac_num) {
310     begin = 1;
311     end = (MAX_LINES < mac_num+1) ? MAX_LINES : mac_num+1;
312     scroll_rows(first, begin, end, 1, 1);
313     print_help(_("Arrows - scroll; S - save to file; Q - quit to menu."));
314     while (1) {
315         switch (getch()) {
316         case 'S':
317         case 's':
318             save_Stations(first);
319             continue;
320         case KEY_DOWN:
321         case KEY_RIGHT:
322             if (end < mac_num+1) {
323                 begin++;
324                 end++;
325                 scroll_rows(first, begin, end, 1, 1);
326             }
327             continue;
328         case KEY_UP:
329         case KEY_LEFT:
330             if (begin > 1) {
331                 begin--;
332                 end--;
333                 scroll_rows(first, begin, end, 1, 1);
334             }
335             continue;
336         case 'Q':
337         case 'q':
338             goto exit;
339         }
340     }
341    }
342    
343    print_help(ANY_KEY);
344    getch();
345    
346   exit:
347     while ((curr = first)) {
348         first = curr->next;
349         free(curr);
350     }
351     
352     print_title("");
353     clear_main(0);
354 }
355