Project

General

Profile

Download (19.2 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-2021 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("New interface assigned");
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("Interfaces assignement settings changed");
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') ||
320
					    (substr($ifport, 0, 5) == 'gif')) {
321
						unset($config['interfaces'][$ifname]['ipaddr']);
322
						unset($config['interfaces'][$ifname]['subnet']);
323
						unset($config['interfaces'][$ifname]['ipaddrv6']);
324
						unset($config['interfaces'][$ifname]['subnetv6']);
325
					}
326

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

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

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

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

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

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

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

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

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

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

    
406
			write_config("Interface assignement deleted");
407

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

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

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

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

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

    
434
include("head.inc");
435

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

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

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

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

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

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

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

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

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

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

    
572
<?php include("foot.inc")?>
(72-72/227)