Project

General

Profile

Download (19 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/*
3
 * interfaces_assign.php
4
 *
5
 * part of pfSense (https://www.pfsense.org)
6
 * Copyright (c) 2004-2013 BSD Perimeter
7
 * Copyright (c) 2013-2016 Electric Sheep Fencing
8
 * Copyright (c) 2014-2020 Rubicon Communications, LLC (Netgate)
9
 * All rights reserved.
10
 *
11
 * originally based on m0n0wall (http://m0n0.ch/wall)
12
 * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>.
13
 * Written by Jim McBeath based on existing m0n0wall files
14
 * All rights reserved.
15
 *
16
 * Licensed under the Apache License, Version 2.0 (the "License");
17
 * you may not use this file except in compliance with the License.
18
 * You may obtain a copy of the License at
19
 *
20
 * http://www.apache.org/licenses/LICENSE-2.0
21
 *
22
 * Unless required by applicable law or agreed to in writing, software
23
 * distributed under the License is distributed on an "AS IS" BASIS,
24
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25
 * See the License for the specific language governing permissions and
26
 * limitations under the License.
27
 */
28

    
29
##|+PRIV
30
##|*IDENT=page-interfaces-assignnetworkports
31
##|*NAME=Interfaces: Interface Assignments
32
##|*DESCR=Allow access to the 'Interfaces: Interface Assignments' page.
33
##|*MATCH=interfaces_assign.php*
34
##|-PRIV
35

    
36
//$timealla = microtime(true);
37

    
38
$pgtitle = array(gettext("Interfaces"), gettext("Interface Assignments"));
39
$shortcut_section = "interfaces";
40

    
41
require_once("guiconfig.inc");
42
require_once("functions.inc");
43
require_once("filter.inc");
44
require_once("shaper.inc");
45
require_once("ipsec.inc");
46
require_once("vpn.inc");
47
require_once("captiveportal.inc");
48
require_once("rrd.inc");
49
require_once("interfaces_fast.inc");
50

    
51
global $friendlyifnames;
52

    
53
/*moved most gettext calls to here, we really don't want to be repeatedly calling gettext() within loops if it can be avoided.*/
54
$gettextArray = array('add'=>gettext('Add'),'addif'=>gettext('Add interface'),'delete'=>gettext('Delete'),'deleteif'=>gettext('Delete interface'),'edit'=>gettext('Edit'),'on'=>gettext('on'));
55

    
56
/*
57
	In this file, "port" refers to the physical port name,
58
	while "interface" refers to LAN, WAN, or OPTn.
59
*/
60

    
61
/* get list without VLAN interfaces */
62
$portlist = get_interface_list();
63

    
64
/*another *_fast function from interfaces_fast.inc. These functions are basically the same as the
65
ones they're named after, except they (usually) take an array and (always) return an array. This means that they only
66
need to be called once per script run, the returned array contains all the data necessary for repeated use */
67
$friendlyifnames = convert_real_interface_to_friendly_interface_name_fast();
68

    
69
/* add wireless clone interfaces */
70
if (isset($config['wireless']['clone']) && is_array($config['wireless']['clone']) && count($config['wireless']['clone'])) {
71
	foreach ($config['wireless']['clone'] as $clone) {
72
		$portlist[$clone['cloneif']] = $clone;
73
		$portlist[$clone['cloneif']]['iswlclone'] = true;
74
	}
75
}
76

    
77
/* add VLAN interfaces */
78
if (isset($config['vlans']['vlan']) && is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
79
	//$timea = microtime(true);
80
	foreach ($config['vlans']['vlan'] as $vlan) {
81
		$portlist[$vlan['vlanif']] = $vlan;
82
		$portlist[$vlan['vlanif']]['isvlan'] = true;
83
	}
84
}
85

    
86
/* add Bridge interfaces */
87
if (isset($config['bridges']['bridged']) && is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
88
	foreach ($config['bridges']['bridged'] as $bridge) {
89
		$portlist[$bridge['bridgeif']] = $bridge;
90
		$portlist[$bridge['bridgeif']]['isbridge'] = true;
91
	}
92
}
93

    
94
/* add GIF interfaces */
95
if (isset($config['gifs']['gif']) && is_array($config['gifs']['gif']) && count($config['gifs']['gif'])) {
96
	foreach ($config['gifs']['gif'] as $gif) {
97
		$portlist[$gif['gifif']] = $gif;
98
		$portlist[$gif['gifif']]['isgif'] = true;
99
	}
100
}
101

    
102
/* add GRE interfaces */
103
if (isset($config['gres']['gre']) && is_array($config['gres']['gre']) && count($config['gres']['gre'])) {
104
	foreach ($config['gres']['gre'] as $gre) {
105
		$portlist[$gre['greif']] = $gre;
106
		$portlist[$gre['greif']]['isgre'] = true;
107
	}
108
}
109

    
110
/* add LAGG interfaces */
111
if (isset($config['laggs']['lagg']) && is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
112
	foreach ($config['laggs']['lagg'] as $lagg) {
113
		$portlist[$lagg['laggif']] = $lagg;
114
		$portlist[$lagg['laggif']]['islagg'] = true;
115
		/* LAGG members cannot be assigned */
116
		$lagifs = explode(',', $lagg['members']);
117
		foreach ($lagifs as $lagif) {
118
			if (isset($portlist[$lagif])) {
119
				unset($portlist[$lagif]);
120
			}
121
		}
122
	}
123
}
124

    
125
/* add QinQ interfaces */
126
if (isset($config['qinqs']['qinqentry']) && is_array($config['qinqs']['qinqentry']) && count($config['qinqs']['qinqentry'])) {
127
	foreach ($config['qinqs']['qinqentry'] as $qinq) {
128
		$portlist["{$qinq['vlanif']}"]['descr'] = "VLAN {$qinq['tag']} on {$qinq['if']}";
129
		$portlist["{$qinq['vlanif']}"]['isqinq'] = true;
130
		/* QinQ members */
131
		$qinqifs = explode(' ', $qinq['members']);
132
		foreach ($qinqifs as $qinqif) {
133
			$portlist["{$qinq['vlanif']}.{$qinqif}"]['descr'] = "QinQ {$qinqif} on VLAN {$qinq['tag']} on {$qinq['if']}";
134
			$portlist["{$qinq['vlanif']}.{$qinqif}"]['isqinq'] = true;
135
		}
136
	}
137
}
138

    
139
/* add PPP interfaces */
140
if (isset($config['ppps']['ppp']) && is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
141
	foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
142
		$portname = $ppp['if'];
143
		$portlist[$portname] = $ppp;
144
		$portlist[$portname]['isppp'] = true;
145
		$ports_base = basename($ppp['ports']);
146
		if (isset($ppp['descr'])) {
147
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base}) - {$ppp['descr']}";
148
		} else if (isset($ppp['username'])) {
149
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base}) - {$ppp['username']}";
150
		} else {
151
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base})";
152
		}
153
	}
154
}
155

    
156
$ovpn_descrs = array();
157
if (isset($config['openvpn']) && is_array($config['openvpn'])) {
158
	if (isset($config['openvpn']['openvpn-server']) && is_array($config['openvpn']['openvpn-server'])) {
159
		foreach ($config['openvpn']['openvpn-server'] as $s) {
160
			$portname = "ovpns{$s['vpnid']}";
161
			$portlist[$portname] = $s;
162
			$ovpn_descrs[$s['vpnid']] = $s['description'];
163
		}
164
	}
165
	if (isset($config['openvpn']['openvpn-client']) && is_array($config['openvpn']['openvpn-client'])) {
166
		foreach ($config['openvpn']['openvpn-client'] as $c) {
167
			$portname = "ovpnc{$c['vpnid']}";
168
			$portlist[$portname] = $c;
169
			$ovpn_descrs[$c['vpnid']] = $c['description'];
170
		}
171
	}
172
}
173

    
174
global $ipsec_descrs;
175
$ipsec_descrs = interface_ipsec_vti_list_all();
176
foreach ($ipsec_descrs as $ifname => $ifdescr) {
177
	$portlist[$ifname] = array('descr' => $ifdescr);
178
}
179

    
180

    
181
$ifdescrs = interface_assign_description_fast($portlist,$friendlyifnames);
182

    
183
if (isset($_REQUEST['add']) && isset($_REQUEST['if_add'])) {
184
	/* Be sure this port is not being used */
185
	$portused = false;
186
	foreach ($config['interfaces'] as $ifname => $ifdata) {
187
		if ($ifdata['if'] == $_REQUEST['if_add']) {
188
			$portused = true;
189
			break;
190
		}
191
	}
192

    
193
	if ($portused === false) {
194
		/* find next free optional interface number */
195
		if (!$config['interfaces']['lan']) {
196
			$newifname = "lan";
197
			$descr = "LAN";
198
		} else {
199
			for ($i = 1; $i <= count($config['interfaces']); $i++) {
200
				if (!$config['interfaces']["opt{$i}"]) {
201
					break;
202
				}
203
			}
204
			$newifname = 'opt' . $i;
205
			$descr = "OPT" . $i;
206
		}
207

    
208
		$config['interfaces'][$newifname] = array();
209
		$config['interfaces'][$newifname]['descr'] = $descr;
210
		$config['interfaces'][$newifname]['if'] = $_POST['if_add'];
211
		if (preg_match($g['wireless_regex'], $_POST['if_add'])) {
212
			$config['interfaces'][$newifname]['wireless'] = array();
213
			interface_sync_wireless_clones($config['interfaces'][$newifname], false);
214
		}
215

    
216

    
217
		uksort($config['interfaces'], "compare_interface_friendly_names");
218

    
219
		/* XXX: Do not remove this. */
220
		unlink_if_exists("{$g['tmp_path']}/config.cache");
221

    
222
		write_config();
223

    
224
		$action_msg = gettext("Interface has been added.");
225
		$class = "success";
226
	}
227

    
228
} else if (isset($_POST['apply'])) {
229
	if (file_exists("/var/run/interface_mismatch_reboot_needed")) {
230
		system_reboot();
231
		$rebootingnow = true;
232
	} else {
233
		write_config();
234

    
235
		$changes_applied = true;
236
		$retval = 0;
237
		$retval |= filter_configure();
238
	}
239

    
240
} else if (isset($_POST['Submit'])) {
241

    
242
	unset($input_errors);
243

    
244
	/* input validation */
245

    
246
	/* Build a list of the port names so we can see how the interfaces map */
247
	$portifmap = array();
248
	foreach ($portlist as $portname => $portinfo) {
249
		$portifmap[$portname] = array();
250
	}
251

    
252
	/* Go through the list of ports selected by the user,
253
	build a list of port-to-interface mappings in portifmap */
254
	foreach ($_POST as $ifname => $ifport) {
255
		if (($ifname == 'lan') || ($ifname == 'wan') || (substr($ifname, 0, 3) == 'opt')) {
256
			if (array_key_exists($ifport, $portlist)) {
257
				$portifmap[$ifport][] = strtoupper($ifname);
258
			} else {
259
				$input_errors[] = sprintf(gettext('Cannot set port %1$s because the submitted interface does not exist.'), $ifname);
260
			}
261
		}
262
	}
263

    
264
	/* Deliver error message for any port with more than one assignment */
265
	foreach ($portifmap as $portname => $ifnames) {
266
		if (count($ifnames) > 1) {
267
			$errstr = sprintf(gettext('Port %1$s '.
268
				' was assigned to %2$s' .
269
				' interfaces:'), $portname, count($ifnames));
270

    
271
			foreach ($portifmap[$portname] as $ifn) {
272
				$errstr .= " " . convert_friendly_interface_to_friendly_descr(strtolower($ifn)) . " (" . $ifn . ")";
273
			}
274

    
275
			$input_errors[] = $errstr;
276
		} else if (count($ifnames) == 1 && preg_match('/^bridge[0-9]/', $portname) && is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
277
			foreach ($config['bridges']['bridged'] as $bridge) {
278
				if ($bridge['bridgeif'] != $portname) {
279
					continue;
280
				}
281

    
282
				$members = explode(",", strtoupper($bridge['members']));
283
				foreach ($members as $member) {
284
					if ($member == $ifnames[0]) {
285
						$input_errors[] = sprintf(gettext('Cannot set port %1$s to interface %2$s because this interface is a member of %3$s.'), $portname, $member, $portname);
286
						break;
287
					}
288
				}
289
			}
290
		}
291
	}
292

    
293
	if (is_array($config['vlans']['vlan'])) {
294
		foreach ($config['vlans']['vlan'] as $vlan) {
295
			if (does_interface_exist($vlan['if']) == false) {
296
				$input_errors[] = sprintf(gettext('Vlan parent interface %1$s does not exist anymore so vlan id %2$s cannot be created please fix the issue before continuing.'), $vlan['if'], $vlan['tag']);
297
			}
298
		}
299
	}
300

    
301
	if (!$input_errors) {
302
		/* No errors detected, so update the config */
303
		foreach ($_POST as $ifname => $ifport) {
304

    
305
			if (($ifname == 'lan') || ($ifname == 'wan') || (substr($ifname, 0, 3) == 'opt')) {
306

    
307
				if (!is_array($ifport)) {
308
					$reloadif = false;
309
					if (!empty($config['interfaces'][$ifname]['if']) && $config['interfaces'][$ifname]['if'] <> $ifport) {
310
						interface_bring_down($ifname);
311
						/* Mark this to be reconfigured in any case. */
312
						$reloadif = true;
313
					}
314
					$config['interfaces'][$ifname]['if'] = $ifport;
315
					if (isset($portlist[$ifport]['isppp'])) {
316
						$config['interfaces'][$ifname]['ipaddr'] = $portlist[$ifport]['type'];
317
					}
318

    
319
					if (substr($ifport, 0, 3) == 'gre' || substr($ifport, 0, 3) == 'gif') {
320
						unset($config['interfaces'][$ifname]['ipaddr']);
321
						unset($config['interfaces'][$ifname]['subnet']);
322
						unset($config['interfaces'][$ifname]['ipaddrv6']);
323
						unset($config['interfaces'][$ifname]['subnetv6']);
324
					}
325

    
326
					/* check for wireless interfaces, set or clear ['wireless'] */
327
					if (preg_match($g['wireless_regex'], $ifport)) {
328
						if (!is_array($config['interfaces'][$ifname]['wireless'])) {
329
							$config['interfaces'][$ifname]['wireless'] = array();
330
						}
331
					} else {
332
						unset($config['interfaces'][$ifname]['wireless']);
333
					}
334

    
335
					/* make sure there is a descr for all interfaces */
336
					if (!isset($config['interfaces'][$ifname]['descr'])) {
337
						$config['interfaces'][$ifname]['descr'] = strtoupper($ifname);
338
					}
339

    
340
					if ($reloadif == true) {
341
						if (preg_match($g['wireless_regex'], $ifport)) {
342
							interface_sync_wireless_clones($config['interfaces'][$ifname], false);
343
						}
344
						/* Reload all for the interface. */
345
						interface_configure($ifname, true);
346
					}
347
				}
348
			}
349
		}
350
		write_config();
351

    
352
		enable_rrd_graphing();
353
	}
354
} else {
355
	unset($delbtn);
356
	if (!empty($_POST['del'])) {
357
		$delbtn = key($_POST['del']);
358
	}
359

    
360
	if (isset($delbtn)) {
361
		$id = $delbtn;
362

    
363
		if (link_interface_to_group($id)) {
364
			$input_errors[] = gettext("The interface is part of a group. Please remove it from the group to continue");
365
		} else if (link_interface_to_bridge($id)) {
366
			$input_errors[] = gettext("The interface is part of a bridge. Please remove it from the bridge to continue");
367
		} else if (link_interface_to_gre($id)) {
368
			$input_errors[] = gettext("The interface is part of a gre tunnel. Please delete the tunnel to continue");
369
		} else if (link_interface_to_gif($id)) {
370
			$input_errors[] = gettext("The interface is part of a gif tunnel. Please delete the tunnel to continue");
371
		} else if (interface_has_queue($id)) {
372
			$input_errors[] = gettext("The interface has a traffic shaper queue configured.\nPlease remove all queues on the interface to continue.");
373
		} else {
374
			unset($config['interfaces'][$id]['enable']);
375
			$realid = get_real_interface($id);
376
			interface_bring_down($id);   /* down the interface */
377

    
378
			unset($config['interfaces'][$id]);	/* delete the specified OPTn or LAN*/
379

    
380
			if (is_array($config['dhcpd']) && is_array($config['dhcpd'][$id])) {
381
				unset($config['dhcpd'][$id]);
382
				services_dhcpd_configure('inet');
383
			}
384

    
385
			if (is_array($config['dhcpdv6']) && is_array($config['dhcpdv6'][$id])) {
386
				unset($config['dhcpdv6'][$id]);
387
				services_dhcpd_configure('inet6');
388
			}
389

    
390
			if (count($config['filter']['rule']) > 0) {
391
				foreach ($config['filter']['rule'] as $x => $rule) {
392
					if ($rule['interface'] == $id) {
393
						unset($config['filter']['rule'][$x]);
394
					}
395
				}
396
			}
397
			if (is_array($config['nat']['rule']) && count($config['nat']['rule']) > 0) {
398
				foreach ($config['nat']['rule'] as $x => $rule) {
399
					if ($rule['interface'] == $id) {
400
						unset($config['nat']['rule'][$x]['interface']);
401
					}
402
				}
403
			}
404

    
405
			write_config();
406

    
407
			/* If we are in firewall/routing mode (not single interface)
408
			 * then ensure that we are not running DHCP on the wan which
409
			 * will make a lot of ISPs unhappy.
410
			 */
411
			if ($config['interfaces']['lan'] && $config['dhcpd']['wan']) {
412
				unset($config['dhcpd']['wan']);
413
			}
414

    
415
			link_interface_to_vlans($realid, "update");
416

    
417
			$action_msg = gettext("Interface has been deleted.");
418
			$class = "success";
419
		}
420
	}
421
}
422

    
423
/* Create a list of unused ports */
424
$unused_portlist = array();
425
$portArray = array_keys($portlist);
426

    
427
$ifaceArray = array_column($config['interfaces'],'if');
428
$unused = array_diff($portArray,$ifaceArray);
429
$unused = array_flip($unused);
430
$unused_portlist = array_intersect_key($portlist,$unused);//*/
431
unset($unused,$portArray,$ifaceArray);
432

    
433
include("head.inc");
434

    
435
if (file_exists("/var/run/interface_mismatch_reboot_needed")) {
436
	if ($_POST) {
437
		if ($rebootingnow) {
438
			$action_msg = gettext("The system is now rebooting. Please wait.");
439
			$class = "success";
440
		} else {
441
			$applymsg = gettext("Reboot is needed. Please apply the settings in order to reboot.");
442
			$class = "warning";
443
		}
444
	} else {
445
		$action_msg = gettext("Interface mismatch detected. Please resolve the mismatch, save and then click 'Apply Changes'. The firewall will reboot afterwards.");
446
		$class = "warning";
447
	}
448
}
449

    
450
if (file_exists("/tmp/reload_interfaces")) {
451
	echo "<p>\n";
452
	print_apply_box(gettext("The interface configuration has been changed.") . "<br />" . gettext("The changes must be applied for them to take effect."));
453
	echo "<br /></p>\n";
454
} elseif ($applymsg) {
455
	print_apply_box($applymsg);
456
} elseif ($action_msg) {
457
	print_info_box($action_msg, $class);
458
} elseif ($changes_applied) {
459
	print_apply_result_box($retval);
460
}
461

    
462
pfSense_handle_custom_code("/usr/local/pkg/interfaces_assign/pre_input_errors");
463

    
464
if ($input_errors) {
465
	print_input_errors($input_errors);
466
}
467

    
468
$tab_array = array();
469
$tab_array[] = array(gettext("Interface Assignments"), true, "interfaces_assign.php");
470
$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
471
$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
472
$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
473
$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
474
$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
475
$tab_array[] = array(gettext("GREs"), false, "interfaces_gre.php");
476
$tab_array[] = array(gettext("GIFs"), false, "interfaces_gif.php");
477
$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
478
$tab_array[] = array(gettext("LAGGs"), false, "interfaces_lagg.php");
479
display_top_tabs($tab_array);
480

    
481
/*Generate the port select box only once.
482
Not indenting the HTML to produce smaller code
483
and faster page load times */
484

    
485
$portselect='';
486
foreach ($portlist as $portname => $portinfo) {
487
	$portselect.='<option value="'.$portname.'"';
488
	$portselect.=">".$ifdescrs[$portname]."</option>\n";
489
}
490

    
491
?>
492
<form action="interfaces_assign.php" method="post">
493
	<div class="table-responsive">
494
	<table class="table table-striped table-hover">
495
	<thead>
496
		<tr>
497
			<th><?=gettext("Interface")?></th>
498
			<th><?=gettext("Network port")?></th>
499
			<th>&nbsp;</th>
500
		</tr>
501
	</thead>
502
	<tbody>
503
<?php
504
	$i=0;
505
	foreach ($config['interfaces'] as $ifname => $iface):
506
		if ($iface['descr']) {
507
			$ifdescr = $iface['descr'];
508
		} else {
509
			$ifdescr = strtoupper($ifname);
510
		}
511
?>
512
		<tr>
513
			<td><a href="/interfaces.php?if=<?=$ifname?>"><?=$ifdescr?></a></td>
514
			<td>
515
				<select name="<?=$ifname?>" id="<?=$ifname?>" class="form-control">
516
<?php
517
/*port select menu generation loop replaced with pre-prepared select menu to reduce page generation time */
518
echo str_replace('value="'.$iface['if'].'">','value="'.$iface['if'].'" selected>',$portselect);
519
?>
520
				</select>
521
			</td>
522
			<td>
523
<?php if ($ifname != 'wan'):?>
524
				<button type="submit" name="del[<?=$ifname?>]" class="btn btn-danger btn-sm" title="<?=$gettextArray['deleteif']?>">
525
					<i class="fa fa-trash icon-embed-btn"></i>
526
					<?=$gettextArray["delete"]?>
527
				</button>
528
<?php endif;?>
529
			</td>
530
		</tr>
531
<?php $i++;
532
endforeach;
533
	if (count($config['interfaces']) < count($portlist)):
534
?>
535
		<tr>
536
			<th>
537
				<?=gettext("Available network ports:")?>
538
			</th>
539
			<td>
540
				<select name="if_add" id="if_add" class="form-control">
541
<?php
542
/* HTML not indented to save on transmission/render time */
543
foreach ($unused_portlist as $portname => $portinfo):?>
544
<option value="<?=$portname?>" <?=($portname == $iface['if']) ? ' selected': ''?>><?=$ifdescrs[$portname]?></option>
545
<?php endforeach;
546
?>
547
				</select>
548
			</td>
549
			<td>
550
				<button type="submit" name="add" title="<?=gettext("Add selected interface")?>" value="add interface" class="btn btn-success btn-sm" >
551
					<i class="fa fa-plus icon-embed-btn"></i>
552
					<?=$gettextArray["add"]?>
553
				</button>
554
			</td>
555
		</tr>
556
<?php endif;?>
557
		</tbody>
558
	</table>
559
	</div>
560

    
561
	<button name="Submit" type="submit" class="btn btn-primary" value="<?=gettext('Save')?>"><i class="fa fa-save icon-embed-btn"></i><?=gettext('Save')?></button>
562
</form>
563
<br />
564

    
565
<?php
566
print_info_box(gettext("Interfaces that are configured as members of a lagg(4) interface will not be shown.") .
567
    '<br/><br/>' .
568
    gettext("Wireless interfaces must be created on the Wireless tab before they can be assigned."), 'info', false);
569
?>
570

    
571
<?php include("foot.inc")?>
(73-73/228)