1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML
4.0//EN'
>
4 Copyright (C) 2006-2010 Jonathan Zarate
5 http://www.polarcloud.com/tomato/
7 For use with Tomato Firmware only.
8 No part of this file may be used without permission.
12 <meta http-equiv='content-type' content='text/html;charset=utf-
8'
>
13 <meta name='robots' content='noindex,nofollow'
>
14 <meta name=
"viewport" content=
"width=device-width">
15 <title>[<%
ident(); %>] Advanced: MAC Address
</title>
16 <link rel='stylesheet' type='text/css' href='tomato.css'
>
18 <script type='text/javascript' src='tomato.js'
></script>
22 <script type='text/javascript' src='debug.js'
></script>
24 <script type='text/javascript' src='wireless.jsx?_http_id=<%
nv(http_id
); %>'
></script>
25 <script type='text/javascript'
>
27 // <% nvram("et0macaddr,mac_wan,wl_macaddr,wl_hwaddr"); %>
29 function et0plus(plus
)
31 var mac
= nvram
.et0macaddr
.split(':');
32 if (mac
.length
!= 6) return '';
34 for (var i
= 5; i
>= 3; --i
) {
35 var n
= (parseInt(mac
[i
], 16) + 1) & 0xFF;
43 function defmac(which
)
49 // trying to mimic the behaviour of static int set_wlmac(int idx, int unit, int subunit, void *param) in router/rc/network.c when we have wlX or wlX.X
52 u
= which
.substr(2, which
.length
) * 1;
53 s
= parseInt(u
.toString().substr(u
.toString().indexOf(".") + 1, u
.toString().length
) * 1);
54 u
= parseInt(u
.toString().substr(0, u
.toString().indexOf(".") - 1) * 1);
55 t
= et0plus(2 + u
+ ((s
> 0) ? (u
* 0x10 + s
) : 0)).split(':');
56 v
= (parseInt(t
[0], 16) + ((s
> 0) ? (u
* 0x10 + 2) : 0) ) & 0xFF;
62 function bdefault(which
)
64 E('_f_' + which
+ '_hwaddr').value
= defmac(which
);
65 verifyFields(null, true);
74 for (i
= 5; i
> 0; --i
)
75 mac
.push(Math
.floor(Math
.random() * 255).hex(2));
76 E('_f_' + which
+ '_hwaddr').value
= mac
.join(':');
77 verifyFields(null, true);
80 function bclone(which
)
82 E('_f_' + which
+ '_hwaddr').value
= '<% compmac(); %>';
83 verifyFields(null, true);
86 function findPrevMAC(mac
, maxidx
)
88 if (E('_f_wan_hwaddr').value
== mac
) return 1;
90 for (var uidx
= 0; uidx
< maxidx
; ++uidx
) {
91 if (E('_f_wl'+wl_fface(uidx
)+'_hwaddr').value
== mac
) return 1;
97 function verifyFields(focused
, quiet
)
101 if (!v_mac('_f_wan_hwaddr', quiet
)) return 0;
103 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
105 a
= E('_f_wl'+u
+'_hwaddr');
106 if (!v_mac(a
, quiet
)) return 0;
108 if (findPrevMAC(a
.value
, uidx
)) {
109 ferror
.set(a
, 'Addresses must be unique', quiet
);
120 if (!verifyFields(null, false)) return;
121 if (!confirm("Warning: Changing the MAC address may require that you reboot all devices, computers or modem connected to this router. Continue anyway?")) return;
124 fom
.mac_wan
.value
= (fom
._f_wan_hwaddr
.value
== defmac('wan')) ? '' : fom
._f_wan_hwaddr
.value
;
126 for (uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
128 v
= E('_f_wl'+u
+'_hwaddr').value
;
129 E('_wl'+u
+'_hwaddr').value
= (v
== defmac('wl' + u
)) ? '' : v
;
139 <form id='_fom' method='post' action='tomato.cgi'
>
140 <table id='container' cellspacing=
0>
141 <tr><td colspan=
2 id='header'
>
142 <div class='title'
>Tomato
</div>
143 <div class='version'
>Version <%
version(); %></div>
145 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
147 <div id='ident'
><%
ident(); %></div>
151 <input type='hidden' name='_nextpage' value='advanced-mac.asp'
>
152 <input type='hidden' name='_nextwait' value='
10'
>
153 <input type='hidden' name='_service' value='*'
>
155 <input type='hidden' name='mac_wan'
>
157 <script type='text/javascript'
>
158 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
159 var u
= wl_fface(uidx
);
160 W('<input type=\'hidden\' id=\'_wl'+u
+'_hwaddr\' name=\'wl'+u
+'_hwaddr\'>');
164 <div class='section-title'
>MAC Address
</div>
165 <div class='section'
>
166 <script type='text/javascript'
>
169 { title
: 'WAN Port', indent
: 1, name
: 'f_wan_hwaddr', type
: 'text', maxlen
: 17, size
: 20,
170 suffix
: ' <input type="button" value="Default" onclick="bdefault(\'wan\')"> <input type="button" value="Random" onclick="brand(\'wan\')"> <input type="button" value="Clone PC" onclick="bclone(\'wan\')">',
171 value
: nvram
.mac_wan
|| defmac('wan') }
174 for (var uidx
= 0; uidx
< wl_ifaces
.length
; ++uidx
) {
175 var u
= wl_fface(uidx
);
177 { title
: 'Wireless Interface ' + ((wl_ifaces
.length
> 1) ? wl_ifaces
[uidx
][0] : ''), indent
: 1, name
: 'f_wl'+u
+'_hwaddr', type
: 'text', maxlen
: 17, size
: 20,
178 suffix
:' <input type="button" value="Default" onclick="bdefault(\'wl'+u
+'\')"> <input type="button" value="Random" onclick="brand(\'wl'+u
+'\')"> <input type="button" value="Clone PC" onclick="bclone(\'wl'+u
+'\')">',
179 value
: nvram
['wl'+u
+'_hwaddr'] || defmac('wl' + u
) }
183 createFieldTable('', f
);
187 <table border=
0 cellpadding=
1>
188 <tr><td>Router's LAN MAC Address:
</td><td><b><script type='text/javascript'
>W(('<% nv('et0macaddr
'); %>').toUpperCase());</script></b></td></tr>
189 <tr><td>Computer's MAC Address:
</td><td><b><script type='text/javascript'
>W(('<% compmac(); %>').toUpperCase());</script></b></td></tr>
198 <tr><td id='footer' colspan=
2>
199 <span id='footer-msg'
></span>
200 <input type='button' value='Save' id='save-button' onclick='save()'
>
201 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'
>
205 <script type='text/javascript'
>verifyFields(null, 1);</script>