libsodium: Needed for Dnscrypto-proxy Release 1.3.0
[tomato.git] / release / src / router / shared / id.c
blobbe32280b7262f8429cdf18d6b1a4a7291357a224
1 /*
3 Tomato Firmware
4 Copyright (C) 2006-2009 Jonathan Zarate
6 */
7 #include <string.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <unistd.h>
12 #include <bcmnvram.h>
13 #include <bcmdevs.h>
14 #include <trxhdr.h>
15 #include "shared.h"
19 HW_* boardtype boardnum boardrev boardflags others
20 --------------------- ------------ --------- --------- ----------- ---------------
21 WRT54G 1.x BCM4702 bcm94710dev 42
22 WRT54G 2.0 BCM4712 0x0101 42 0x10 0x0188
23 WRT54G 2.2, 3.x BCM5325E 0x0708 42 0x10 0x0118
24 WRT54G 4.0 BCM5352E 0x0467 42 0x10 0x2558
25 WRT54GL 1.0, 1.1 BCM5352E 0x0467 42 0x10 0x2558
26 WRT54GS 1.0 BCM4712 0x0101 42 0x10 0x0388
27 WRT54GS 1.1, 2.x BCM5325E 0x0708 42 0x10 0x0318
28 WRT54GS 3.0, 4.0 BCM5352E 0x0467 42 0x10 0x2758
29 WRT300N 1.0 BCM4704_BCM5325F_EWC 0x0472 42 0x10 0x10
30 WRTSL54GS BCM4704_BCM5325F 0x042f 42 0x10 0x0018
31 WTR54GS v1, v2 BCM5350 0x456 56 0x10 0xb18 (source: BaoWeiQuan)
32 WRT160Nv1 BCM4704_BCM5325F_EWC 0x0472 42 0x11 0x0010 boot_hw_model=WRT160N boot_hw_ver=1.0
33 WRT160Nv3, M10 BCM4716 0x04cd 42 0x1700 boot_hw_model=WRT160N boot_hw_ver=3.0 (M10: boot_hw_model=M10 boot_hw_ver=1.0)
34 E900 BCM53572 0x058e 42 0x1155 (64k/8MB flash)
35 E1000v2/E1500 BCM5357 0xf53b 42 0x1100 0x0710 E1500(64k/8MB flash)
36 E1000v2.1/E1200v1 BCM5357 0xf53a 42 0x1100 0x0710 E1200v1(64k/4MB flash)
37 E1550 BCM5358U 0xc550 42 0x1100 0x0710 (60k/16MB flash)
38 E2500 BCM5358U 0xf550 42 0x1101 0x0710 (60k/16MB)
39 E3200 BCM47186 0xf52a 42 0x1100 (60k/16MB)
40 WRT320N/E2000 BCM4717 0x04ef 42/66 0x1304/0x1305/0x1307 boardflags: 0x0040F10 / 0x00000602 (??)
41 WRT610Nv2/E3000 BCM4718 0x04cf 42/?? ?? boot_hw_model=WRT610N/E300
42 E4200 BCM4718 0xf52c 42 0x1101 boot_hw_model=E4200
44 WHR-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30182
45 WHR-HP-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30189
46 WZR-G300N BCM4704_BCM5325F_EWC 0x0472 ? 0x10 0x10 melco_id=31120
47 WZR-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115 melco_id=30061 (source: piggy)
48 WBR-G54 bcm94710ap 42 melco_id=ca020906
49 WHR2-A54G54 BCM4704_BCM5325F 0x042f 42 0x10 0x0210 melco_id=290441dd
50 WBR2-G54 BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29bb0332
51 WZR-G108 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30153 melco_id=31095 (source: BaoWeiQuan)
52 WHR-G125 BCM5354G 0x048E 00 0x11 0x750 melco_id=32093
53 SE505 BCM4712 0x0101 0x10 0x0388
54 WR850G v1 BCM4702 bcm94710dev 2 GemtekPmonVer=9
55 WR850G v2 (& v3?) BCM4712 0x0101 44 0x0188 CFEver=MotoWRv203
56 WR850G ? BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv207
57 WR850G v3 BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv301
58 WL-500G Deluxe BCM5365 bcm95365r 45 0x10 hardware_version=WL500gd-01-04-01-50 regulation_domain=0x30DE sdram_init=0x2008
59 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gp-01-02-00-00 regulation_domain=0X10US sdram_init=0x0009
60 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gH-01-00-00-00 regulation_domain=0X30DE sdram_init=0x000b
61 WL-500W BCM4704_BCM5325F_EWC 0x0472 45 0x23 0x0010 hardware_version=WL500gW-01-00-00-00 regulation_domain=0X10US sdram_init=0x0009
62 WL-500G Premium v2 HW_BCM5354G 0x48E 45 0x10 0x0750
63 WL-330GE HW_BCM5354G 0x048e 45 0x10 0x0650 hardware_version=WL330GE-02-06-00-05 //MIPSR1, 4MB flash w/o USB
64 WL-520GU HW_BCM5354G 0x48E 45 0x10 0x0750 hardware_version=WL520GU-01-07-02-00
65 ZTE H618B HW_BCM5354G 0x048e 1105 0x35 0x0750
66 Ovislink WL1600GL HW_BCM5354G 0x048E 8 0x11
67 RT-N16 BCM4718 0x04cf 45 0x1218 0x0310 hardware_version=RT-N16-00-07-01-00 regulation_domain=0X10US sdram_init=0x419
68 RT-N15U BCM5357 0x052b 45 0x1204 0x80001710|0x1000
69 RT-N12 BCM4716 0x04cd 45 0x1201 0x????
70 RT-N12B1 BCM5357 0x054d 45 0x1101 0x710
71 RT-N10 BCM5356 0x04ec 45 0x1402 0x????
72 RT-N10U BCM5357 0x0550 45 0x1102 0x710
73 RT-N53 BCM5357 0x0550 45 0x1442 0x710
74 RT-N66U BCM4706 0xf5b2 00 0x1100 0x0110
75 WNR3500L BCM4718 0x04cf 3500 0x1213|02 0x0710|0x1710
76 WNR3500Lv2 BCM47186 0x052b 3500(L) 02 0x710|0x1000
77 WNR2000v2 BCM4716B0 0xe4cd 1 0x1700
79 F7D4301 v1 BCM4718 0xd4cf 12345 0x1204
80 F7D3301/F7D3302/F7D4302 v1 BCM4718 0xa4cf 12345 0x1102
81 F5D8235-4 v3 BCM4718 0xa4cf 12345 0x1100
83 CW-5358U BCM5357 0x0550 1234 0x1100 0x710 //500MHz/8MB/32MB/2.4G/USB
84 FiberHome HG320 BCM5357 0x053d 0527 0x1202 0x710 //16MB/64MB/2.4G/USB
85 ChinaNet RG-200E BCM5357 0x058e 1 0x1153 0x710 //16MB/64MB/2.4G/USB/FE
86 Rosewill L600N BCM5358U 0x1015 0x1400 0x710 //500MHz/8MB/64MB/2.4-5GHz/USB
87 WL-550gE BCM5352E 0x0467 45 0x10 0x0758 hardware_version=WL550gE-01-05-01-00 sdram_init=0x2000
88 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-10-01-00 regulation_domain=0X30DE
89 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-08-01-00 regulation_domain=0X30DE
91 WX-6615GT BCM4712 0x0101 44 0x10 0x0188 CFEver=GW_WR110G_v100
92 MN-700 bcm94710ap mn700 hardware_version=WL500-02-02-01-00 regulation_domain=0X30DE
93 source: piggy
94 WZR-HP-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30026
95 WZR-RS-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30083
96 WZR-RS-G54HP BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30103
97 WVR-G54-NF BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=28100
98 WHR2-A54-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=290441dd
99 WHR3-AG54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29130
100 WZR SERIES BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115
101 RT390W generic BCM4702 bcm94710r4 100 clkfreq=264
102 WR850G v1 BCM4702 bcm94710r4 100
103 *WRH54G BCM5354G 0x048E ? 0x10 ?
104 Viewsonic WR100 BCM4712 0x0101 44 0x10 0x0188 CFEver=SparkLanv100
105 WLA2-G54L BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29129
106 TrueMobile 2300 bcm94710ap 44 "ModelId=WX-5565", Rev A00
108 * not supported/not tested
110 BFL_ENETADM 0x0080
111 BFL_ENETVLAN 0x0100
116 int check_hw_type(void)
118 const char *s;
119 unsigned long bf;
121 bf = strtoul(nvram_safe_get("boardflags"), NULL, 0);
122 s = nvram_safe_get("boardtype");
123 switch (strtoul(s, NULL, 0)) {
124 case 0x467:
125 return HW_BCM5352E;
126 case 0x101:
127 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4712_BCM5325E : HW_BCM4712;
128 case 0x708:
129 return ((bf & BFL_ENETADM) == 0) ? HW_BCM5325E : HW_UNKNOWN;
130 case 0x42f:
131 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F : HW_UNKNOWN;
132 case 0x472:
133 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F_EWC : HW_UNKNOWN;
134 case 0x478:
135 return HW_BCM4705L_BCM5325E_EWC;
136 case 0x48E:
137 return HW_BCM5354G;
138 case 0x456:
139 return HW_BCM5350;
140 case 0x4ec:
141 return HW_BCM5356;
142 case 0x489:
143 return HW_BCM4785;
144 #ifdef CONFIG_BCMWL5
145 case 0x04cd:
146 case 0xe4cd:
147 case 0x04fb:
148 return HW_BCM4716;
149 case 0x04ef:
150 return HW_BCM4717;
151 case 0x04cf:
152 case 0xa4cf:
153 case 0xd4cf:
154 case 0xf52c:
155 return HW_BCM4718;
156 case 0xf5b2:
157 return HW_BCM4706;
158 case 0x052b:
159 if (nvram_match("boardrev", "0x1204")) return HW_BCM5357; //rt-n15u
160 if (nvram_match("boardrev", "02")) return HW_BCM47186; //WNR3500Lv2
161 case 0xf53a:
162 case 0xf53b:
163 case 0x0550: //RT-N10U, RT-N53, CW-5358U
164 case 0x054d:
165 case 0x053d:
166 return HW_BCM5357;
167 case 0xf52a:
168 return HW_BCM47186;
169 case 0xf550:
170 case 0xc500:
171 case 0xc550:
172 return HW_BCM5358U;
173 case 0x058e:
174 if (nvram_match("boardrev", "0x1153")) return HW_BCM5357; //RG100E-CA
175 if (nvram_match("boardrev", "0x1155")) return HW_BCM53572; //E900
176 case 0x1015:
177 if (nvram_match("boardrev", "0x1400")) return HW_BCM5358U; //L600N
178 #endif
181 // WR850G may have "bcm94710dev " (extra space)
182 if ((strncmp(s, "bcm94710dev", 11) == 0) || (strcmp(s, "bcm94710r4") == 0)) {
183 return HW_BCM4702;
186 if ((strcmp(s, "bcm95365r") == 0)) {
187 return HW_BCM5365;
190 return HW_UNKNOWN;
193 int get_model(void)
195 int hw;
196 char *c;
198 hw = check_hw_type();
200 switch (strtoul(nvram_safe_get("melco_id"), NULL, 16)) {
201 case 0x29115:
202 case 0x30061:
203 return MODEL_WZRG54;
204 case 0x30182:
205 return MODEL_WHRG54S;
206 case 0x30189:
207 return MODEL_WHRHPG54;
208 case 0xCA020906:
209 return MODEL_WBRG54;
210 case 0x30026:
211 return MODEL_WZRHPG54;
212 case 0x30083:
213 return MODEL_WZRRSG54;
214 case 0x30103:
215 return MODEL_WZRRSG54HP;
216 case 0x28100:
217 return MODEL_WVRG54NF;
218 case 0x29130:
219 return MODEL_WHR3AG54;
220 case 0x290441DD:
221 return MODEL_WHR2A54G54;
222 case 0x32093:
223 return MODEL_WHRG125;
224 case 0x30153:
225 case 0x31095:
226 return MODEL_WZRG108;
227 case 0x31120:
228 return MODEL_WZRG300N;
229 case 0:
230 break;
231 default:
232 return MODEL_UNKNOWN;
235 switch (strtoul(nvram_safe_get("buffalo_id"), NULL, 16)) {
236 case 0x29BB0332:
237 return MODEL_WBR2G54;
238 case 0x29129:
239 return MODEL_WLA2G54L;
240 case 0:
241 break;
242 default:
243 return MODEL_UNKNOWN;
246 if (nvram_match("boardtype", "bcm94710ap")) {
247 if (nvram_match("boardnum", "mn700")) return MODEL_MN700;
248 if (nvram_match("ModelId", "WX-5565")) return MODEL_TM2300;
251 if (hw == HW_UNKNOWN) return MODEL_UNKNOWN;
254 if (hw == HW_BCM5354G) {
255 if (nvram_match("boardrev", "0x11")) {
256 return MODEL_WRH54G;
261 #ifdef CONFIG_BCMWL5
262 if (hw == HW_BCM4718) {
263 if (nvram_match("boot_hw_model", "WRT610N") ||
264 nvram_match("boot_hw_model", "E300"))
265 return MODEL_WRT610Nv2;
266 if (nvram_match("boot_hw_model", "E4200"))
267 return MODEL_E4200;
268 switch (strtoul(nvram_safe_get("boardtype"), NULL, 0)) {
269 case 0xd4cf:
270 if (nvram_match("boardrev", "0x1204")) return MODEL_F7D4301;
271 break;
272 case 0xa4cf:
273 if (nvram_match("boardrev", "0x1100")) return MODEL_F5D8235v3;
274 if (nvram_match("boardrev", "0x1102")) {
275 FILE *fp;
276 unsigned char s[18];
277 uint32 sig = TRX_MAGIC;
278 sprintf(s, MTD_DEV(%dro), 1);
279 if ((fp = fopen(s, "rb"))) {
280 fread(&sig, sizeof(sig), 1, fp);
281 fclose(fp);
283 switch (sig) {
284 case TRX_MAGIC_F7D3301:
285 return MODEL_F7D3301;
286 case TRX_MAGIC_F7D3302:
287 return MODEL_F7D3302;
288 default:
289 return MODEL_F7D4302;
292 break;
295 #endif
297 switch (strtoul(nvram_safe_get("boardnum"), NULL, 0)) {
298 case 42:
299 switch (hw) {
300 case HW_BCM4704_BCM5325F:
301 return MODEL_WRTSL54GS;
302 case HW_BCM4704_BCM5325F_EWC:
303 if (nvram_match("boardrev", "0x10")) return MODEL_WRT300N;
304 if (nvram_match("boardrev", "0x11")) return MODEL_WRT160Nv1;
305 break;
306 case HW_BCM4785:
307 if (nvram_match("boardrev", "0x10")) return MODEL_WRT310Nv1;
308 break;
309 #ifdef CONFIG_BCMWL5
310 case HW_BCM4716:
311 return MODEL_WRT160Nv3;
312 case HW_BCM4717:
313 return MODEL_WRT320N;
314 case HW_BCM4718:
315 return MODEL_WRT610Nv2;
316 case HW_BCM47186:
317 if (nvram_match("boot_hw_model", "E3200")) return MODEL_E3200;
318 break;
319 case HW_BCM5357:
320 if (nvram_match("boot_hw_model", "M10") && nvram_match("boot_hw_ver", "2.0"))
321 return MODEL_E1000v2;
322 if (nvram_match("boot_hw_model", "E1000")) return MODEL_E1000v2;
323 if (nvram_match("boot_hw_model", "E1200") && nvram_match("boot_hw_ver", "1.0"))
324 return MODEL_E1500;
325 if (nvram_match("boot_hw_model", "E1500")) return MODEL_E1500;
326 break;
327 case HW_BCM53572:
328 if (nvram_match("boot_hw_model", "E900")) return MODEL_E900;
329 if (nvram_match("boot_hw_model", "E1200") && nvram_match("boot_hw_ver", "2.0"))
330 return MODEL_E900;
331 break;
332 case HW_BCM5358U:
333 if (nvram_match("boot_hw_model", "E1550")) return MODEL_E1550;
334 if (nvram_match("boot_hw_model", "E2500")) return MODEL_E2500;
335 break;
336 #endif
338 return MODEL_WRT54G;
339 case 45:
340 switch (hw) {
341 case HW_BCM4704_BCM5325F:
342 return MODEL_WL500GP;
343 case HW_BCM4704_BCM5325F_EWC:
344 return MODEL_WL500W;
345 case HW_BCM5352E:
346 return MODEL_WL500GE;
347 case HW_BCM5354G:
348 if (strncmp(nvram_safe_get("hardware_version"), "WL520GU", 7) == 0) return MODEL_WL520GU;
349 if (strncmp(nvram_safe_get("hardware_version"), "WL330GE", 7) == 0) return MODEL_WL330GE;
350 return MODEL_WL500GPv2;
351 case HW_BCM5365:
352 return MODEL_WL500GD;
353 #ifdef CONFIG_BCMWL5
354 case HW_BCM5356:
355 if (nvram_match("boardrev", "0x1402")) return MODEL_RTN10;
356 break;
357 case HW_BCM5357:
358 if (nvram_match("boardrev", "0x1102")) return MODEL_RTN10U;
359 if (nvram_match("boardrev", "0x1101")) return MODEL_RTN12B1;
360 if (nvram_match("boardrev", "0x1204")) return MODEL_RTN15U;
361 if (nvram_match("boardrev", "0x1442")) return MODEL_RTN53;
362 break;
363 case HW_BCM4716:
364 if (nvram_match("boardrev", "0x1201")) return MODEL_RTN12;
365 break;
366 case HW_BCM4718:
367 if (nvram_match("boardrev", "0x1218")) return MODEL_RTN16;
368 break;
369 case HW_BCM5358U:
370 if (nvram_match("boardrev", "0x1400")) return MODEL_L600N;
371 #endif
373 break;
374 #ifdef CONFIG_BCMWL5
375 case 66:
376 switch (hw) {
377 case HW_BCM4717:
378 return MODEL_WRT320N;
380 break;
381 case 1234:
382 switch (hw) {
383 case HW_BCM5357:
384 //if (nvram_match("boardrev", "0x1100"))
385 return MODEL_CW5358U;
387 break;
388 case 0527:
389 switch (hw) {
390 case HW_BCM5357:
391 //if (nvram_match("boardrev", "0x1202"))
392 return MODEL_HG320;
394 break;
395 case 1:
396 switch (hw) {
397 case HW_BCM4716:
398 //if (nvram_match("boardrev", "0x1700"))
399 return MODEL_WNR2000v2;
400 break;
401 case HW_BCM5357:
402 //if (nvram_match("boardrev", "0x1153"))
403 return MODEL_RG200E_CA;
404 break;
406 /* fall through */
407 case 3500:
408 switch (hw) {
409 case HW_BCM4718:
410 //if (nvram_match("boardrev", "0x1213") || nvram_match("boardrev", "02"))
411 return MODEL_WNR3500L;
412 break;
413 case HW_BCM47186:
414 return MODEL_WNR3500LV2;
415 break;
417 break;
418 #endif
419 case 0:
420 switch (hw) {
421 case HW_BCM5354G:
422 if (nvram_match("boardrev", "0x35")) return MODEL_DIR320;
423 break;
424 case HW_BCM4706:
425 if (nvram_match("boardrev", "0x1100")) return MODEL_RTN66U;
426 break;
428 break;
429 case 1105:
430 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x35")) return MODEL_H618B;
431 break;
432 case 8:
433 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x11")) return MODEL_WL1600GL;
434 break;
435 case 2:
436 if (nvram_match("GemtekPmonVer", "9")) return MODEL_WR850GV1;
437 break;
438 case 44:
439 c = nvram_safe_get("CFEver");
440 if (strncmp(c, "MotoWRv", 7) == 0) return MODEL_WR850GV2;
441 if (strncmp(c, "GW_WR110G", 9) == 0) return MODEL_WX6615GT;
442 if (strcmp(c, "SparkLanv100") == 0) return MODEL_WR100;
443 break;
444 case 100:
445 if (strcmp(nvram_safe_get("clkfreq"), "264") == 0) return MODEL_RT390W;
446 break;
447 case 56:
448 if (hw == HW_BCM5350) return MODEL_WTR54GS;
449 break;
452 return MODEL_UNKNOWN;
455 int supports(unsigned long attr)
457 return (strtoul(nvram_safe_get("t_features"), NULL, 0) & attr) != 0;