usbmodeswitch: Updated to v.1.2.6 from shibby's branch.
[tomato.git] / release / src / router / httpd / devlist.c
blobf6d41c9c034af37b7ff1233def4f34dd4cc26779
1 /*
3 Tomato Firmware
4 Copyright (C) 2006-2009 Jonathan Zarate
6 */
8 #include "tomato.h"
10 #include <ctype.h>
11 #include <sys/ioctl.h>
12 #include <net/if.h>
13 #include <sys/stat.h>
14 #include <sys/types.h>
16 #include <wlutils.h>
19 void asp_arplist(int argc, char **argv)
21 FILE *f;
22 char s[512];
23 char ip[16];
24 char mac[18];
25 char dev[17];
26 char comma;
27 unsigned int flags;
30 cat /proc/net/arp
31 IP address HW type Flags HW address Mask Device
32 192.168.0.1 0x1 0x2 00:01:02:03:04:05 * vlan1
35 web_puts("\narplist = [");
36 comma = ' ';
37 if ((f = fopen("/proc/net/arp", "r")) != NULL) {
38 while (fgets(s, sizeof(s), f)) {
39 if (sscanf(s, "%15s %*s 0x%X %17s %*s %16s", ip, &flags, mac, dev) != 4) continue;
40 if ((strlen(mac) != 17) || (strcmp(mac, "00:00:00:00:00:00") == 0)) continue;
41 if (flags == 0) continue;
42 // if ((nvram_match("wan_ifname", dev)) && (!nvram_match("wan_ipaddr", ip))) continue; // half
43 web_printf("%c['%s','%s','%s']", comma, ip, mac, dev);
44 comma = ',';
46 fclose(f);
48 web_puts("];\n");
51 // checkme: any easier way to do this? zzz
52 static int get_wds_ifname(const struct ether_addr *ea, char *ifname)
54 struct ifreq ifr;
55 int sd;
56 int i;
57 struct ether_addr e;
59 if ((sd = socket(PF_INET, SOCK_DGRAM, 0)) >= 0) {
60 // wds doesn't show up under SIOCGIFCONF; seems to start at 17 (?)
61 for (i = 1; i < 32; ++i) {
62 ifr.ifr_ifindex = i;
63 if ((ioctl(sd, SIOCGIFNAME, &ifr) == 0) &&
64 (strncmp(ifr.ifr_name, "wds", 3) == 0) &&
65 (wl_ioctl(ifr.ifr_name, WLC_WDS_GET_REMOTE_HWADDR, &e.octet, sizeof(e.octet)) == 0)) {
66 if (memcmp(ea->octet, e.octet, sizeof(e.octet)) == 0) {
67 close(sd);
68 strlcpy(ifname, ifr.ifr_name, 16);
69 return 1;
73 close(sd);
75 return 0;
78 static int get_wl_clients(int idx, int unit, int subunit, void *param)
80 char *comma = param;
81 int i;
82 char *p;
83 char buf[32];
84 #if 1
85 char *wlif;
86 scb_val_t rssi;
87 sta_info_t sti;
88 int cmd;
89 struct maclist *mlist;
90 int mlsize;
91 char ifname[16];
93 mlsize = sizeof(struct maclist) + (255 * sizeof(struct ether_addr));
94 if ((mlist = malloc(mlsize)) != NULL) {
95 // wlif = nvram_safe_get(wl_nvname("ifname", unit, 0));
96 wlif = nvram_safe_get(wl_nvname("ifname", unit, subunit)); // AB multiSSID
97 cmd = WLC_GET_ASSOCLIST;
98 while (1) {
99 mlist->count = 255;
100 if (wl_ioctl(wlif, cmd, mlist, mlsize) == 0) {
101 for (i = 0; i < mlist->count; ++i) {
102 rssi.ea = mlist->ea[i];
103 rssi.val = 0;
104 if (wl_ioctl(wlif, WLC_GET_RSSI, &rssi, sizeof(rssi)) != 0) continue;
106 // sta_info0<mac>
107 memset(&sti, 0, sizeof(sti));
108 strcpy((char *)&sti, "sta_info");
109 memcpy((char *)&sti + 9, rssi.ea.octet, 6);
110 if (wl_ioctl(wlif, WLC_GET_VAR, &sti, sizeof(sti)) != 0) continue;
112 p = wlif;
113 if (sti.flags & WL_STA_WDS) {
114 if (cmd != WLC_GET_WDSLIST) continue;
115 if ((sti.flags & WL_WDS_LINKUP) == 0) continue;
116 if (get_wds_ifname(&rssi.ea, ifname)) p = ifname;
119 web_printf("%c['%s','%s',%d,%u,%u,%u,%d]",
120 *comma,
122 ether_etoa(rssi.ea.octet, buf),
123 rssi.val,
124 sti.tx_rate, sti.rx_rate, sti.in, unit);
125 *comma = ',';
128 if (cmd == WLC_GET_WDSLIST) break;
129 cmd = WLC_GET_WDSLIST;
131 free(mlist);
133 #else
134 char *wlif;
135 scb_val_t rssi;
136 sta_info_t sti;
137 int j;
138 struct maclist *mlist;
139 int mlsize;
140 char ifname[16];
142 mlsize = sizeof(struct maclist) + (127 * sizeof(struct ether_addr));
143 if ((mlist = malloc(mlsize)) != NULL) {
144 for (j = 0; j < 2; ++j) {
145 wlif = nvram_safe_get("wl0_ifname");
146 strcpy((char *)mlist, j ? "autho_sta_list" : "authe_sta_list");
147 if (wl_ioctl(wlif, WLC_GET_VAR, mlist, mlsize) == 0) {
148 for (i = 0; i < mlist->count; ++i) {
149 rssi.ea = mlist->ea[i];
150 rssi.val = 0;
151 if (wl_ioctl(wlif, WLC_GET_RSSI, &rssi, sizeof(rssi)) != 0) continue;
153 // sta_info0<mac>
154 memset(&sti, 0, sizeof(sti));
155 strcpy((char *)&sti, "sta_info");
156 memcpy((char *)&sti + 9, rssi.ea.octet, 6);
157 if (wl_ioctl(wlif, WLC_GET_VAR, &sti, sizeof(sti)) != 0) continue;
159 p = wlif;
160 if (sti.flags & WL_STA_WDS) {
161 if ((sti.flags & WL_WDS_LINKUP) == 0) continue;
162 if (get_wds_ifname(&rssi.ea, ifname)) p = ifname;
165 web_printf("%c['%s','%s',%d]",
166 *comma,
168 ether_etoa(rssi.ea.octet, buf),
169 rssi.val);
170 *comma = ',';
174 free(mlist);
176 #endif
178 return 0;
181 void asp_devlist(int argc, char **argv)
183 char *p;
184 FILE *f;
185 char buf[1024];
186 char comma;
188 // must be here for easier call via update.cgi. arg is ignored
189 asp_arplist(0, NULL);
190 asp_wlnoise(0, NULL);
194 p = js_string(nvram_safe_get("dhcpd_static"));
195 web_printf("dhcpd_static = '%s'.split('>');\n", p ? p : "");
196 free(p);
200 web_puts("wldev = [");
201 comma = ' ';
202 foreach_wif(1, &comma, get_wl_clients);
203 web_puts("];\n");
207 unsigned long expires;
208 char mac[32];
209 char ip[32];
210 char hostname[256];
211 char *host;
213 web_puts("dhcpd_lease = [");
214 #ifdef TCONFIG_VLAN
215 if ((nvram_match("lan_proto", "dhcp")) || (nvram_match("lan1_proto", "dhcp")) || (nvram_match("lan2_proto", "dhcp")) || (nvram_match("lan3_proto", "dhcp")) ) {
216 #else
217 if (nvram_match("lan_proto", "dhcp")) {
218 #endif
219 f_write("/var/tmp/dhcp/leases.!", NULL, 0, 0, 0666);
221 // dump the leases to a file
222 if (killall("dnsmasq", SIGUSR2) == 0) {
223 // helper in dnsmasq will remove this when it's done
224 f_wait_notexists("/var/tmp/dhcp/leases.!", 5);
227 if ((f = fopen("/var/tmp/dhcp/leases", "r")) != NULL) {
228 comma = ' ';
229 while (fgets(buf, sizeof(buf), f)) {
230 if (sscanf(buf, "%lu %17s %15s %255s", &expires, mac, ip, hostname) != 4) continue;
231 host = js_string((hostname[0] == '*') ? "" : hostname);
232 web_printf("%c['%s','%s','%s','%s']", comma,
233 (host ? host : ""), ip, mac, ((expires == 0) ? "non-expiring" : reltime(buf, expires)));
234 free(host);
235 comma = ',';
237 fclose(f);
239 unlink("/var/tmp/dhcp/leases");
241 web_puts("];");