Project

General

Profile

Download (143 KB) Statistics
| Branch: | Tag: | Revision:
1 5b237745 Scott Ullrich
<?php
2
/*
3
	interfaces.inc
4 eba938e3 Scott Ullrich
	Copyright (C) 2004-2008 Scott Ullrich
5 a687f866 Namezero
	Copyright (C) 2008-2009 Ermal Lu?i
6 ac3f8318 Espen Johansen
	All rights reserved.
7
8
	function interfaces_wireless_configure is
9
	Copyright (C) 2005 Espen Johansen
10 cfc707f7 Scott Ullrich
	All rights reserved.
11
12
	originally part of m0n0wall (http://m0n0.ch/wall)
13 5b237745 Scott Ullrich
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
14
	All rights reserved.
15 cfc707f7 Scott Ullrich
16 5b237745 Scott Ullrich
	Redistribution and use in source and binary forms, with or without
17
	modification, are permitted provided that the following conditions are met:
18 cfc707f7 Scott Ullrich
19 ac3f8318 Espen Johansen
	1. Redistributions of source code must retain the above copyright notices,
20 5b237745 Scott Ullrich
	   this list of conditions and the following disclaimer.
21 cfc707f7 Scott Ullrich
22 5b237745 Scott Ullrich
	2. Redistributions in binary form must reproduce the above copyright
23 ac3f8318 Espen Johansen
	   notices, this list of conditions and the following disclaimer in the
24 5b237745 Scott Ullrich
	   documentation and/or other materials provided with the distribution.
25 cfc707f7 Scott Ullrich
26 5b237745 Scott Ullrich
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
27
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
28
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
30
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35
	POSSIBILITY OF SUCH DAMAGE.
36 523855b0 Scott Ullrich
37 b0c6a4f1 Ermal
	pfSense_BUILDER_BINARIES:	/sbin/dhclient	/bin/sh	/usr/bin/grep	/usr/bin/xargs	/usr/bin/awk	/usr/local/sbin/choparp
38 89c52814 Ermal
	pfSense_BUILDER_BINARIES:	/sbin/ifconfig	/sbin/route	/usr/sbin/ngctl	/usr/sbin/arp	/bin/kill	/usr/local/sbin/mpd5
39 d53a9a51 smos
	pfSense_BUILDER_BINARIES:	/usr/local/sbin/dhcp6c
40 523855b0 Scott Ullrich
	pfSense_MODULE:	interfaces
41
42 5b237745 Scott Ullrich
*/
43
44
/* include all configuration functions */
45 7387844e Chris Buechler
require_once("globals.inc");
46 9a456170 Darren Embry
require_once("util.inc");
47 36b2d82d smos
require_once("gwlb.inc");
48 5b237745 Scott Ullrich
49 b5b957fe Scott Ullrich
function interfaces_bring_up($interface) {
50
	if(!$interface) {
51 07e40c1f Carlos Eduardo Ramos
		log_error(gettext("interfaces_bring_up() was called but no variable defined."));
52 ec054b7c Scott Ullrich
		log_error( "Backtrace: " . debug_backtrace() );
53 b5b957fe Scott Ullrich
		return;
54
	}
55 871768cf Ermal
	pfSense_interface_flags($interface, IFF_UP);
56 b5b957fe Scott Ullrich
}
57
58 52947718 Ermal Lu?i
/*
59
 * Return the interface array
60
 */
61
function get_interface_arr($flush = false) {
62 1c3ddd9e Renato Botelho
	global $interface_arr_cache;
63 52947718 Ermal Lu?i
64 1c3ddd9e Renato Botelho
	/* If the cache doesn't exist, build it */
65
	if (!isset($interface_arr_cache) or $flush)
66
		$interface_arr_cache = pfSense_interface_listget();
67 52947718 Ermal Lu?i
68 1c3ddd9e Renato Botelho
	return $interface_arr_cache;
69 52947718 Ermal Lu?i
}
70
71
/*
72
 * does_interface_exist($interface): return true or false if a interface is
73
 * detected.
74
 */
75
function does_interface_exist($interface) {
76 8256f324 gnhb
	global $config;
77 be45aa79 Renato Botelho
78 8256f324 gnhb
	if(!$interface)
79 72993196 Ermal
		return false;
80 52947718 Ermal Lu?i
81 72993196 Ermal
	$ints = get_interface_arr(true);
82 6d5446a2 Ermal
	if (in_array($interface, $ints))
83 8256f324 gnhb
		return true;
84
	else
85
		return false;
86 52947718 Ermal Lu?i
}
87
88 2708a5cf Ermal
/*
89
 * does_vip_exist($vip): return true or false if a vip is
90
 * configured.
91
 */
92
function does_vip_exist($vip) {
93
	global $config;
94 be45aa79 Renato Botelho
95 2708a5cf Ermal
	if(!$vip)
96
		return false;
97
98
99 b526daaf Ermal
	switch ($vip['mode']) {
100 2708a5cf Ermal
	case "carp":
101 7b47bd4c Ermal
		$realif = "{$vip['interface']}_vip{$vip['vhid']}";
102 b526daaf Ermal
		if (!does_interface_exist($realif)) {
103
			return false;
104
		}
105
		break;
106 2708a5cf Ermal
	case "ipalias":
107 b526daaf Ermal
		$realif = get_real_interface($vip['interface']);
108
		if (!does_interface_exist($realif)) {
109
			return false;
110 2708a5cf Ermal
		}
111
		break;
112
	case "proxyarp":
113
		/* XXX: Implement this */
114 b526daaf Ermal
	default:
115
		return false;
116
	}
117
118
	$ifacedata = pfSense_getall_interface_addresses($realif);
119
	foreach ($ifacedata as $vipips) {
120
		if ($vipips == "{$vip['subnet']}/{$vip['subnet_bits']}")
121
			return true;
122 2708a5cf Ermal
	}
123
124
	return false;
125
}
126
127 67b057a9 Ermal
function interface_netgraph_needed($interface = "wan") {
128
	global $config;
129
130
	$found = false;
131
	if (!empty($config['pptpd']) &&
132
		$config['pptpd']['mode'] == "server")
133
		$found = true;
134
	if ($found == false && !empty($config['l2tp']) &&
135
		$config['l2tp']['mode'] == "server")
136
		$found = true;
137
	if ($found == false && is_array($config['pppoes']['pppoe'])) {
138
		foreach ($config['pppoes']['pppoe'] as $pppoe) {
139
			if ($pppoe['mode'] != "server")
140
				continue;
141
			if ($pppoe['interface'] == $interface)
142
				$found = true;
143
				break;
144
		}
145
	}
146 3dfc2d1a Ermal
	if ($found == false) {
147
		if (!empty($config['interfaces'][$interface])) {
148
			switch ($config['interfaces'][$interface]['ipaddr']) {
149
			case "ppp":
150
			case "pppoe":
151
			case "l2tp":
152
			case "pptp":
153
				$found = true;
154
				break;
155
			default:
156
				$found = false;
157
				break;
158
			}
159 9d7d2388 Ermal
		}
160
	}
161
	if ($found == false) {
162
		$realif = get_real_interface($interface);
163
		if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
164
			foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
165 20cb9803 gnhb
166
/* This if block doesn't do anything. It can be deleted.
167
PPP interfaces are found above in the previous if ($found == false) block.
168
This block of code is only entered for OPTx interfaces that are configured for PPPoE modem access, so $realif != $ppp['if']
169
170 9d7d2388 Ermal
				if ($realif == $ppp['if']) {
171
					$found = true;
172
					break;
173 3dfc2d1a Ermal
				}
174 be45aa79 Renato Botelho
*/
175 3eb00b49 gnhb
				$ports = explode(',',$ppp['ports']);
176
				foreach($ports as $pid => $port){
177 20cb9803 gnhb
					$port = get_real_interface($port);
178 3eb00b49 gnhb
					if ($realif == $port) {
179
						$found = true;
180
						break;
181
					}
182 be45aa79 Renato Botelho
					/* Find the parent interfaces of the vlans in the MLPPP configs
183
					* there should be only one element in the array here
184 20cb9803 gnhb
					* -- this could be better . . . */
185
					$parent_if = get_parent_interface($port);
186
					if ($realif == $parent_if[0]) {
187
						$found = true;
188
						break;
189
					}
190 3eb00b49 gnhb
				}
191 9d7d2388 Ermal
			}
192 67b057a9 Ermal
		}
193
	}
194 be45aa79 Renato Botelho
195 31eee4a6 Ermal
	if ($found == false) {
196
		$realif = get_real_interface($interface);
197 67b057a9 Ermal
		pfSense_ngctl_detach("{$realif}:", $realif);
198 31eee4a6 Ermal
	}
199 92a1c8e6 Ermal
	/* NOTE: We make sure for this on interface_ppps_configure()
200
	 *	no need to do it here agan.
201
	 *	else
202
	 *		pfSense_ngctl_attach(".", $realif);
203
	 */
204 67b057a9 Ermal
}
205
206 eba938e3 Scott Ullrich
function interfaces_loopback_configure() {
207 7734aea6 Andrew Thompson
	global $g;
208
209
	if ($g['platform'] == 'jail')
210
		return;
211 7a6f7c55 Scott Ullrich
	if($g['booting'])
212 07e40c1f Carlos Eduardo Ramos
		echo gettext("Configuring loopback interface...");
213 871768cf Ermal
	pfSense_interface_setaddress("lo0", "127.0.0.1");
214 b5b957fe Scott Ullrich
	interfaces_bring_up("lo0");
215 7a6f7c55 Scott Ullrich
	if($g['booting'])
216 07e40c1f Carlos Eduardo Ramos
		echo gettext("done.") . "\n";
217 5b237745 Scott Ullrich
	return 0;
218
}
219
220 eba938e3 Scott Ullrich
function interfaces_vlan_configure() {
221 7a6f7c55 Scott Ullrich
	global $config, $g;
222 87519eb7 Scott Ullrich
	if($g['booting'])
223 07e40c1f Carlos Eduardo Ramos
		echo gettext("Configuring VLAN interfaces...");
224 5b6eac01 Scott Ullrich
	if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
225 e1c449c0 Ermal Lu?i
		foreach ($config['vlans']['vlan'] as $vlan) {
226 f620d00d Ermal Luçi
			if(empty($vlan['vlanif']))
227 48315e65 Ermal Luci
				$vlan['vlanif'] = "{$vlan['if']}_vlan{$vlan['tag']}";
228 5b6eac01 Scott Ullrich
			/* XXX: Maybe we should report any errors?! */
229 5f1e1d26 Ermal Lu?i
			interface_vlan_configure($vlan);
230 517feb1c Seth Mos
		}
231 5b6eac01 Scott Ullrich
	}
232 87519eb7 Scott Ullrich
	if($g['booting'])
233 07e40c1f Carlos Eduardo Ramos
		echo gettext("done.") . "\n";
234 2075fadb Ermal Luçi
}
235 cfc707f7 Scott Ullrich
236 abcb2bed Ermal Lu?i
function interface_vlan_configure(&$vlan) {
237 1c3ddd9e Renato Botelho
	global $config, $g;
238 161040eb Scott Ullrich
239 5f1e1d26 Ermal Lu?i
	if (!is_array($vlan)) {
240 07e40c1f Carlos Eduardo Ramos
		log_error(gettext("VLAN: called with wrong options. Problems with config!"));
241 5f1e1d26 Ermal Lu?i
		return;
242
	}
243
	$if = $vlan['if'];
244 48315e65 Ermal Luci
	$vlanif  = empty($vlan['vlanif']) ? "{$if}_vlan{$vlan['tag']}" : $vlan['vlanif'];
245 5f1e1d26 Ermal Lu?i
	$tag = $vlan['tag'];
246
247 871768cf Ermal
	if (empty($if)) {
248 905ea336 Phil Davis
		log_error(gettext("interface_vlan_configure called with if undefined."));
249 3ae4960c Ermal Luçi
		return;
250
	}
251
252 37a53d16 Scott Ullrich
	/* make sure the parent interface is up */
253 07101b63 Ermal Luçi
	interfaces_bring_up($if);
254
	/* Since we are going to add vlan(4) try to enable all that hardware supports. */
255 871768cf Ermal
	pfSense_interface_capabilities($if, IFCAP_VLAN_HWTAGGING|IFCAP_VLAN_MTU|IFCAP_VLAN_HWFILTER);
256 cfc707f7 Scott Ullrich
257 4aca19b3 Scott Ullrich
	if (!empty($vlanif) && does_interface_exist($vlanif)) {
258 df2a0f18 Ermal
		interface_bring_down($vlanif, true);
259 4aca19b3 Scott Ullrich
	} else {
260 871768cf Ermal
		$tmpvlanif = pfSense_interface_create("vlan");
261
		pfSense_interface_rename($tmpvlanif, $vlanif);
262
		pfSense_ngctl_name("{$tmpvlanif}:", $vlanif);
263 abcb2bed Ermal Lu?i
	}
264 871768cf Ermal
265
	pfSense_vlan_create($vlanif, $if, $tag);
266 2075fadb Ermal Luçi
267 07101b63 Ermal Luçi
	interfaces_bring_up($vlanif);
268 cfc707f7 Scott Ullrich
269 40b0b541 Ermal Lu?i
	/* invalidate interface cache */
270
	get_interface_arr(true);
271 3f7d2120 Bill Marquette
272 4aca19b3 Scott Ullrich
	/* XXX: ermal -- for now leave it here at the moment it does not hurt. */
273 07101b63 Ermal Luçi
	interfaces_bring_up($if);
274 cfc707f7 Scott Ullrich
275 4aca19b3 Scott Ullrich
	return $vlanif;
276 5b237745 Scott Ullrich
}
277
278 abcb2bed Ermal Lu?i
function interface_qinq_configure(&$vlan, $fd = NULL) {
279 1c3ddd9e Renato Botelho
	global $config, $g;
280
281
	if (!is_array($vlan)) {
282
		log_error(sprintf(gettext("QinQ compat VLAN: called with wrong options. Problems with config!%s"), "\n"));
283
		return;
284
	}
285
286
	$qinqif = $vlan['if'];
287
	$tag = $vlan['tag'];
288
	if(empty($qinqif)) {
289
		log_error(sprintf(gettext("interface_qinq_configure called with if undefined.%s"), "\n"));
290
		return;
291
	}
292 782e33f8 Renato Botelho
293
	if(!does_interface_exist($qinqif)) {
294
		log_error(sprintf(gettext("interface_qinq_configure called with invalid if.%s"), "\n"));
295
		return;
296
	}
297
298 4400ad66 Ermal Lu?i
	$vlanif = interface_vlan_configure($vlan);
299 5f1e1d26 Ermal Lu?i
300 1c3ddd9e Renato Botelho
	if ($fd == NULL) {
301
		$exec = true;
302
		$fd = fopen("{$g['tmp_path']}/netgraphcmd", "w");
303
	} else
304
		$exec = false;
305
	/* make sure the parent is converted to ng_vlan(4) and is up */
306
	interfaces_bring_up($qinqif);
307 5f1e1d26 Ermal Lu?i
308 9cf46050 Ermal
	pfSense_ngctl_attach(".", $qinqif);
309 1c3ddd9e Renato Botelho
	if (!empty($vlanif) && does_interface_exist($vlanif)) {
310
		fwrite($fd, "shutdown {$qinqif}qinq:\n");
311
		exec("/usr/sbin/ngctl msg {$qinqif}qinq: gettable", $result);
312
		if (empty($result)) {
313
			fwrite($fd, "mkpeer {$qinqif}: vlan lower downstream\n");
314
			fwrite($fd, "name {$qinqif}:lower {$vlanif}qinq\n");
315
			fwrite($fd, "connect {$qinqif}: {$vlanif}qinq: upper nomatch\n");
316
		}
317
	} else {
318
		fwrite($fd, "mkpeer {$qinqif}: vlan lower downstream\n");
319
		fwrite($fd, "name {$qinqif}:lower {$vlanif}qinq\n");
320
		fwrite($fd, "connect {$qinqif}: {$vlanif}qinq: upper nomatch\n");
321
	}
322
323
	/* invalidate interface cache */
324
	get_interface_arr(true);
325
326 76254caa Renato Botelho
	if (!stristr($qinqif, "_vlan"))
327 1c3ddd9e Renato Botelho
		mwexec("/sbin/ifconfig {$qinqif} promisc\n");
328
329
	$macaddr = get_interface_mac($qinqif);
330
	if (!empty($vlan['members'])) {
331
		$members = explode(" ", $vlan['members']);
332
		foreach ($members as $qtag) {
333
			$qinq = array();
334
			$qinq['tag'] = $qtag;
335
			$qinq['if'] = $vlanif;
336
			interface_qinq2_configure($qinq, $fd, $macaddr);
337
		}
338
	}
339
	if ($exec == true) {
340
		fclose($fd);
341
		mwexec("/usr/sbin/ngctl -f {$g['tmp_path']}/netgraphcmd");
342
	}
343
344
	interfaces_bring_up($qinqif);
345
	if (!empty($vlan['members'])) {
346
		$members = explode(" ", $vlan['members']);
347
		foreach ($members as $qif)
348
			interfaces_bring_up("{$vlanif}_{$qif}");
349
	}
350
351
	return $vlanif;
352 5f1e1d26 Ermal Lu?i
}
353
354
function interfaces_qinq_configure() {
355 7a6f7c55 Scott Ullrich
	global $config, $g;
356
	if($g['booting'])
357 07e40c1f Carlos Eduardo Ramos
		echo gettext("Configuring QinQ interfaces...");
358 7a6f7c55 Scott Ullrich
	if (is_array($config['qinqs']['qinqentry']) && count($config['qinqs']['qinqentry'])) {
359
		foreach ($config['qinqs']['qinqentry'] as $qinq) {
360
			/* XXX: Maybe we should report any errors?! */
361 4400ad66 Ermal Lu?i
			interface_qinq_configure($qinq);
362 7a6f7c55 Scott Ullrich
		}
363 4400ad66 Ermal Lu?i
	}
364
	if($g['booting'])
365 07e40c1f Carlos Eduardo Ramos
		echo gettext( "done.") . "\n";
366 5f1e1d26 Ermal Lu?i
}
367
368 abcb2bed Ermal Lu?i
function interface_qinq2_configure(&$qinq, $fd, $macaddr) {
369 1c3ddd9e Renato Botelho
	global $config, $g;
370
371
	if (!is_array($qinq)) {
372
		log_error(sprintf(gettext("QinQ compat VLAN: called with wrong options. Problems with config!%s"), "\n"));
373
		return;
374
	}
375
376
	$if = $qinq['if'];
377
	$tag = $qinq['tag'];
378
	$vlanif = "{$if}_{$tag}";
379
	if(empty($if)) {
380
		log_error(sprintf(gettext("interface_qinq2_configure called with if undefined.%s"), "\n"));
381
		return;
382
	}
383
384
	fwrite($fd, "shutdown {$if}h{$tag}:\n");
385
	fwrite($fd, "mkpeer {$if}qinq: eiface {$if}{$tag} ether\n");
386
	fwrite($fd, "name {$if}qinq:{$if}{$tag} {$if}h{$tag}\n");
387
	fwrite($fd, "msg {$if}qinq: addfilter { vlan={$tag} hook=\"{$if}{$tag}\" }\n");
388
	fwrite($fd, "msg {$if}h{$tag}: setifname \"{$vlanif}\"\n");
389
	fwrite($fd, "msg {$if}h{$tag}: set {$macaddr}\n");
390
391
	/* invalidate interface cache */
392
	get_interface_arr(true);
393
394
	return $vlanif;
395 5f1e1d26 Ermal Lu?i
}
396
397 9f428275 Erik Fonnesbeck
function interfaces_create_wireless_clones() {
398 7bb09580 Erik Fonnesbeck
	global $config, $g;
399 9f428275 Erik Fonnesbeck
400
	if($g['booting'])
401 7bb09580 Erik Fonnesbeck
		echo gettext("Creating wireless clone interfaces...");
402
403
	$iflist = get_configured_interface_list();
404
405 0fbf7315 Ermal
	foreach ($iflist as $if) {
406 7bb09580 Erik Fonnesbeck
		$realif = $config['interfaces'][$if]['if'];
407
		if (is_interface_wireless($realif))
408
			interface_wireless_clone(interface_get_wireless_clone($realif), $config['interfaces'][$if]);
409
	}
410
411 6ef2297b Erik Fonnesbeck
	if (isset($config['wireless']['clone']) && is_array($config['wireless']['clone']) && count($config['wireless']['clone'])) {
412 9f428275 Erik Fonnesbeck
		foreach ($config['wireless']['clone'] as $clone) {
413
			if(empty($clone['cloneif']))
414
				continue;
415
			if(does_interface_exist($clone['cloneif']))
416
				continue;
417
			/* XXX: Maybe we should report any errors?! */
418 7bb09580 Erik Fonnesbeck
			interface_wireless_clone($clone['cloneif'], $clone);
419 9f428275 Erik Fonnesbeck
		}
420
	}
421
	if($g['booting'])
422 7bb09580 Erik Fonnesbeck
		echo gettext("done.") . "\n";
423 a687f866 Namezero
424 9f428275 Erik Fonnesbeck
}
425
426 d7f1891b Ermal
function interfaces_bridge_configure($checkmember = 0) {
427 1c3ddd9e Renato Botelho
	global $config;
428
429
	$i = 0;
430
	if (is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
431
		foreach ($config['bridges']['bridged'] as $bridge) {
432
			if(empty($bridge['bridgeif']))
433
				$bridge['bridgeif'] = "bridge{$i}";
434 ef1c048b Ermal
			if ($checkmember == 1) {
435
				$members = explode(',', $bridge['members']);
436
				foreach ($members as $member) {
437
					if (strstr($bridge['if'], "_vip"))
438
						continue 2;
439
					if (!empty($config['interfaces'][$bridge['if']]) && $config['interfaces'][$bridge['if']]['ipaddrv6'] == "track6")  
440
						continue 2;
441
				}
442
			}
443
			else if ($checkmember == 2) {
444
				$members = explode(',', $bridge['members']);
445
				foreach ($members as $member) {
446
					if (!strstr($bridge['if'], "_vip"))
447
						continue 2;
448
					if (empty($config['interfaces'][$bridge['if']]) || $config['interfaces'][$bridge['if']]['ipaddrv6'] != "track6")  
449
						continue 2;
450
				}
451
			}
452 1c3ddd9e Renato Botelho
			/* XXX: Maybe we should report any errors?! */
453
			interface_bridge_configure($bridge, $checkmember);
454
			$i++;
455
		}
456
	}
457 bad29bc6 Ermal Luçi
}
458
459 02de5c07 Ermal
function interface_bridge_configure(&$bridge, $checkmember = 0) {
460 d7147b1c Scott Ullrich
	global $config, $g;
461 bad29bc6 Ermal Luçi
462 d7147b1c Scott Ullrich
	if (!is_array($bridge))
463 0e0002c2 bcyrill
		return;
464 bad29bc6 Ermal Luçi
465 dc97efaf Ermal Luçi
	if (empty($bridge['members'])) {
466 07e40c1f Carlos Eduardo Ramos
		log_error(sprintf(gettext("No members found on %s"), $bridge['bridgeif']));
467 0e0002c2 bcyrill
		return;
468 dc97efaf Ermal Luçi
	}
469
470 bad29bc6 Ermal Luçi
	$members = explode(',', $bridge['members']);
471 70720671 Ermal Luçi
	if (!count($members))
472 0e0002c2 bcyrill
		return;
473 ea5f6c95 Ermal
474 b64523c1 Ermal Luçi
	/* Calculate smaller mtu and enforce it */
475 69e53ef0 Ermal Luçi
	$smallermtu = 0;
476 07676e36 Ermal
	$commonrx = true;
477
	$commontx = true;
478 02de5c07 Ermal
	$foundgif = false;
479 b64523c1 Ermal Luçi
	foreach ($members as $member) {
480
		$realif = get_real_interface($member);
481 07676e36 Ermal
		$opts = pfSense_get_interface_addresses($realif);
482
		$mtu = $opts['mtu'];
483 02de5c07 Ermal
		if (substr($realif, 0, 3) == "gif") {
484
			$foundgif = true;
485
			if ($checkmember == 1)
486
				return;
487
			if ($mtu <= 1500)
488
				continue;
489
		}
490 07676e36 Ermal
		if (!isset($opts['encaps']['txcsum']))
491
			$commontx = false;
492
		if (!isset($opts['encaps']['rxcsum']))
493
			$commonrx = false;
494 0ac206f9 Ermal
		if (!isset($opts['encaps']['tso4']))
495
			$commontso4 = false;
496
		if (!isset($opts['encaps']['tso6']))
497
			$commontso6 = false;
498
		if (!isset($opts['encaps']['lro']))
499
			$commonlro = false;
500 69e53ef0 Ermal Luçi
		if ($smallermtu == 0 && !empty($mtu))
501
			$smallermtu = $mtu;
502
		else if (!empty($mtu) && $mtu < $smallermtu)
503 b64523c1 Ermal Luçi
			$smallermtu = $mtu;
504
	}
505 02de5c07 Ermal
	if ($foundgif == false && $checkmember == 2)
506
		return;
507
508 69e53ef0 Ermal Luçi
	/* Just in case anything is not working well */
509
	if ($smallermtu == 0)
510 be45aa79 Renato Botelho
		$smallermtu = 1500;
511 69e53ef0 Ermal Luçi
512 07676e36 Ermal
	$flags = 0;
513 0ac206f9 Ermal
	if ($commonrx === false)
514 07676e36 Ermal
		$flags |= IFCAP_RXCSUM;
515 0ac206f9 Ermal
	if ($commontx === false)
516 07676e36 Ermal
		$flags |= IFCAP_TXCSUM;
517 0ac206f9 Ermal
	if ($commontso4 === false)
518
		$flags |= IFCAP_TSO4;
519
	if ($commontso6 === false)
520
		$flags |= IFCAP_TSO6;
521
	if ($commonlro === false)
522
		$flags |= IFCAP_LRO;
523 02de5c07 Ermal
524
	if ($g['booting'] || !empty($bridge['bridgeif'])) {
525
		pfSense_interface_destroy($bridge['bridgeif']);
526
		pfSense_interface_create($bridge['bridgeif']);
527 b3af5453 Renato Botelho
		$bridgeif = escapeshellarg($bridge['bridgeif']);
528 6d53bbb5 Ermal
	} else {
529 02de5c07 Ermal
		$bridgeif = pfSense_interface_create("bridge");
530 6d53bbb5 Ermal
		$bridge['bridgeif'] = $bridgeif;
531
	}
532 02de5c07 Ermal
533
	$checklist = get_configured_interface_list();
534
535 bad29bc6 Ermal Luçi
	/* Add interfaces to bridge */
536 31241000 Ermal Luçi
	foreach ($members as $member) {
537 19defb88 Ermal
		if (empty($checklist[$member]))
538 d7147b1c Scott Ullrich
			continue;
539 19defb88 Ermal
		$realif = get_real_interface($member);
540 07676e36 Ermal
		if (!$realif) {
541 07e40c1f Carlos Eduardo Ramos
			log_error(gettext("realif not defined in interfaces bridge - up"));
542 07676e36 Ermal
			continue;
543
		}
544
		/* make sure the parent interface is up */
545 19defb88 Ermal
		pfSense_interface_mtu($realif, $smallermtu);
546
		pfSense_interface_capabilities($realif, -$flags);
547
		interfaces_bring_up($realif);
548 6d53bbb5 Ermal
		pfSense_bridge_add_member($bridge['bridgeif'], $realif);
549 d7147b1c Scott Ullrich
	}
550 31241000 Ermal Luçi
551 bad29bc6 Ermal Luçi
	if (isset($bridge['enablestp'])) {
552
		/* Choose spanning tree proto */
553 b3af5453 Renato Botelho
		mwexec("/sbin/ifconfig {$bridgeif} proto " . escapeshellarg($bridge['proto']));
554 be45aa79 Renato Botelho
555 dc97efaf Ermal Luçi
		if (!empty($bridge['stp'])) {
556
			$stpifs = explode(',', $bridge['stp']);
557
			foreach ($stpifs as $stpif) {
558
				$realif = get_real_interface($stpif);
559
				mwexec("/sbin/ifconfig {$bridgeif} stp {$realif}");
560
			}
561 bad29bc6 Ermal Luçi
		}
562 dc97efaf Ermal Luçi
		if (!empty($bridge['maxage']))
563 b3af5453 Renato Botelho
			mwexec("/sbin/ifconfig {$bridgeif} maxage " . escapeshellarg($bridge['maxage']));
564 a5571287 Chris Buechler
		if (!empty($bridge['fwdelay']))
565 b3af5453 Renato Botelho
			mwexec("/sbin/ifconfig {$bridgeif} fwddelay " . escapeshellarg($bridge['fwdelay']));
566 a5571287 Chris Buechler
		if (!empty($bridge['hellotime']))
567 b3af5453 Renato Botelho
			mwexec("/sbin/ifconfig {$bridgeif} hellotime " . escapeshellarg($bridge['hellotime']));
568 a5571287 Chris Buechler
		if (!empty($bridge['priority']))
569 b3af5453 Renato Botelho
			mwexec("/sbin/ifconfig {$bridgeif} priority " . escapeshellarg($bridge['priority']));
570 afd825a7 bcyrill
		if (!empty($bridge['holdcnt']))
571 b3af5453 Renato Botelho
			mwexec("/sbin/ifconfig {$bridgeif} holdcnt " . escapeshellarg($bridge['holdcnt']));
572 dc97efaf Ermal Luçi
		if (!empty($bridge['ifpriority'])) {
573
			$pconfig = explode(",", $bridge['ifpriority']);
574
			$ifpriority = array();
575
			foreach ($pconfig as $cfg) {
576 9a456170 Darren Embry
				$embcfg = explode_assoc(":", $cfg);
577 dc97efaf Ermal Luçi
				foreach ($embcfg as $key => $value)
578
					$ifpriority[$key] = $value;
579
			}
580
			foreach ($ifpriority as $key => $value) {
581
				$realif = get_real_interface($key);
582 b3af5453 Renato Botelho
				mwexec("/sbin/ifconfig ${bridgeif} ifpriority {$realif} " . escapeshellarg($value));
583 dc97efaf Ermal Luçi
			}
584 bad29bc6 Ermal Luçi
		}
585 dc97efaf Ermal Luçi
		if (!empty($bridge['ifpathcost'])) {
586 da5895bb Darren Embry
			$pconfig = explode(",", $bridge['ifpathcost']);
587 dc97efaf Ermal Luçi
			$ifpathcost = array();
588
			foreach ($pconfig as $cfg) {
589 9a456170 Darren Embry
				$embcfg = explode_assoc(":", $cfg);
590 dc97efaf Ermal Luçi
				foreach ($embcfg as $key => $value)
591
					$ifpathcost[$key] = $value;
592
			}
593
			foreach ($ifpathcost as $key => $value) {
594 1c3ddd9e Renato Botelho
				$realif = get_real_interface($key);
595 b3af5453 Renato Botelho
				mwexec("/sbin/ifconfig ${bridgeif} ifpathcost {$realif} " . escapeshellarg($value));
596 1c3ddd9e Renato Botelho
			}
597 bad29bc6 Ermal Luçi
		}
598
	}
599
600
	if ($bridge['maxaddr'] <> "")
601
		mwexec("/sbin/ifconfig {$bridgeif} maxaddr {$bridge['maxaddr']}");
602 1c3ddd9e Renato Botelho
	if ($bridge['timeout'] <> "")
603
		mwexec("/sbin/ifconfig {$bridgeif} timeout {$bridge['timeout']}");
604
	if ($bridge['span'] <> "") {
605 85a5da13 Ermal Luçi
		$realif = get_real_interface($bridge['span']);
606 1c3ddd9e Renato Botelho
		mwexec("/sbin/ifconfig {$bridgeif} span {$realif}");
607 bad29bc6 Ermal Luçi
	}
608 a47a5798 Ermal Luçi
	if (!empty($bridge['edge'])) {
609 1c3ddd9e Renato Botelho
		$edgeifs = explode(',', $bridge['edge']);
610
		foreach ($edgeifs as $edgeif) {
611 a47a5798 Ermal Luçi
			$realif = get_real_interface($edgeif);
612 1c3ddd9e Renato Botelho
			mwexec("/sbin/ifconfig {$bridgeif} edge {$realif}");
613
		}
614 a47a5798 Ermal Luçi
	}
615
	if (!empty($bridge['autoedge'])) {
616 1c3ddd9e Renato Botelho
		$edgeifs = explode(',', $bridge['autoedge']);
617
		foreach ($edgeifs as $edgeif) {
618
			$realif = get_real_interface($edgeif);
619
			mwexec("/sbin/ifconfig {$bridgeif} -autoedge {$realif}");
620
		}
621 a47a5798 Ermal Luçi
	}
622
	if (!empty($bridge['ptp'])) {
623 1c3ddd9e Renato Botelho
		$ptpifs = explode(',', $bridge['ptp']);
624
		foreach ($ptpifs as $ptpif) {
625
			$realif = get_real_interface($ptpif);
626
			mwexec("/sbin/ifconfig {$bridgeif} ptp {$realif}");
627
		}
628 a47a5798 Ermal Luçi
	}
629
	if (!empty($bridge['autoptp'])) {
630 1c3ddd9e Renato Botelho
		$ptpifs = explode(',', $bridge['autoptp']);
631
		foreach ($ptpifs as $ptpif) {
632
			$realif = get_real_interface($ptpif);
633
			mwexec("/sbin/ifconfig {$bridgeif} -autoptp {$realif}");
634
		}
635 a47a5798 Ermal Luçi
	}
636
	if (!empty($bridge['static'])) {
637 1c3ddd9e Renato Botelho
		$stickyifs = explode(',', $bridge['static']);
638
		foreach ($stickyifs as $stickyif) {
639
			$realif = get_real_interface($stickyif);
640
			mwexec("/sbin/ifconfig {$bridgeif} sticky {$realif}");
641
		}
642 a47a5798 Ermal Luçi
	}
643
	if (!empty($bridge['private'])) {
644 1c3ddd9e Renato Botelho
		$privateifs = explode(',', $bridge['private']);
645
		foreach ($privateifs as $privateif) {
646
			$realif = get_real_interface($privateif);
647
			mwexec("/sbin/ifconfig {$bridgeif} private {$realif}");
648
		}
649 a47a5798 Ermal Luçi
	}
650 bad29bc6 Ermal Luçi
651 792bdf7f bcyrill
	if ($bridge['bridgeif'])
652 6d53bbb5 Ermal
		interfaces_bring_up($bridge['bridgeif']);
653 be45aa79 Renato Botelho
	else
654 07e40c1f Carlos Eduardo Ramos
		log_error(gettext("bridgeif not defined -- could not bring interface up"));
655 bad29bc6 Ermal Luçi
}
656
657 fcd4a425 Ermal Lu?i
function interface_bridge_add_member($bridgeif, $interface) {
658
659
	if (!does_interface_exist($bridgeif) || !does_interface_exist($interface))
660
		return;
661
662 a5571287 Chris Buechler
	$mtu = get_interface_mtu($bridgeif);
663 fcd4a425 Ermal Lu?i
	$mtum = get_interface_mtu($interface);
664 be45aa79 Renato Botelho
665 73481ad3 Ermal
	if ($mtu != $mtum && !(substr($interface, 0, 3) == "gif" && $mtu <= 1500))
666 871768cf Ermal
		pfSense_interface_mtu($interface, $mtu);
667 fcd4a425 Ermal Lu?i
668 0c77c314 Ermal
	$options = pfSense_get_interface_addresses($bridgeif);
669 51d5aad7 Ermal
	$flags = 0;
670
	if (!isset($options['encaps']['txcsum']))
671
		$flags |= IFCAP_TXCSUM;
672 ea5f6c95 Ermal
673 51d5aad7 Ermal
	if (!isset($options['encaps']['rxcsum']))
674
		$flags |= IFCAP_RXCSUM;
675
676
	pfSense_interface_capabilities($interface, -$flags);
677 3ca774ac Ermal
678 fcd4a425 Ermal Lu?i
	interfaces_bring_up($interface);
679 2064fa2e Ermal
	pfSense_bridge_add_member($bridgeif, $interface);
680 fcd4a425 Ermal Lu?i
}
681
682 1c3ddd9e Renato Botelho
function interfaces_lagg_configure() {
683
	global $config, $g;
684
	if($g['booting'])
685
		echo gettext("Configuring LAGG interfaces...");
686
	$i = 0;
687
	if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
688
		foreach ($config['laggs']['lagg'] as $lagg) {
689
			if(empty($lagg['laggif']))
690
				$lagg['laggif'] = "lagg{$i}";
691
			/* XXX: Maybe we should report any errors?! */
692
			interface_lagg_configure($lagg);
693
			$i++;
694 7a6f7c55 Scott Ullrich
		}
695 1c3ddd9e Renato Botelho
	}
696
	if($g['booting'])
697
		echo gettext("done.") . "\n";
698 cccf624b Ermal Luçi
}
699
700 eba938e3 Scott Ullrich
function interface_lagg_configure(&$lagg) {
701 1c3ddd9e Renato Botelho
	global $config, $g;
702 cccf624b Ermal Luçi
703 1c3ddd9e Renato Botelho
	if (!is_array($lagg))
704 cccf624b Ermal Luçi
		return -1;
705
706
	$members = explode(',', $lagg['members']);
707
	if (!count($members))
708
		return -1;
709 be45aa79 Renato Botelho
710 b64523c1 Ermal Luçi
	if ($g['booting'] || !(empty($lagg['laggif']))) {
711 871768cf Ermal
		pfSense_interface_destroy($lagg['laggif']);
712
		pfSense_interface_create($lagg['laggif']);
713 1c3ddd9e Renato Botelho
		$laggif = $lagg['laggif'];
714
	} else
715 871768cf Ermal
		$laggif = pfSense_interface_create("lagg");
716 b64523c1 Ermal Luçi
717
	/* Calculate smaller mtu and enforce it */
718 1c3ddd9e Renato Botelho
	$smallermtu = 0;
719
	foreach ($members as $member) {
720 0ac206f9 Ermal
		$opts = pfSense_get_interface_addresses($member);
721 1c3ddd9e Renato Botelho
		$mtu = $opts['mtu'];
722 0ac206f9 Ermal
		if (!isset($opts['encaps']['txcsum']))
723 1c3ddd9e Renato Botelho
			$commontx = false;
724
		if (!isset($opts['encaps']['rxcsum']))
725
			$commonrx = false;
726 0ac206f9 Ermal
		if (!isset($opts['encaps']['tso4']))
727
			$commontso4 = false;
728
		if (!isset($opts['encaps']['tso6']))
729
			$commontso6 = false;
730
		if (!isset($opts['encaps']['lro']))
731
			$commonlro = false;
732 69e53ef0 Ermal Luçi
		if ($smallermtu == 0 && !empty($mtu))
733
			$smallermtu = $mtu;
734 1c3ddd9e Renato Botelho
		else if (!empty($mtu) && $mtu < $smallermtu)
735
			$smallermtu = $mtu;
736
	}
737 b64523c1 Ermal Luçi
738 69e53ef0 Ermal Luçi
	/* Just in case anything is not working well */
739 1c3ddd9e Renato Botelho
	if ($smallermtu == 0)
740
		$smallermtu = 1500;
741 69e53ef0 Ermal Luçi
742 0ac206f9 Ermal
	$flags = 0;
743 1c3ddd9e Renato Botelho
	if ($commonrx === false)
744
		$flags |= IFCAP_RXCSUM;
745
	if ($commontx === false)
746
		$flags |= IFCAP_TXCSUM;
747 0ac206f9 Ermal
	if ($commontso4 === false)
748 1c3ddd9e Renato Botelho
		$flags |= IFCAP_TSO4;
749
	if ($commontso6 === false)
750
		$flags |= IFCAP_TSO6;
751
	if ($commonlro === false)
752
		$flags |= IFCAP_LRO;
753 0ac206f9 Ermal
754 02de5c07 Ermal
	$checklist = get_interface_list();
755
756 cccf624b Ermal Luçi
	foreach ($members as $member) {
757
		if (!array_key_exists($member, $checklist))
758
			continue;
759 d7147b1c Scott Ullrich
		/* make sure the parent interface is up */
760 871768cf Ermal
		pfSense_interface_mtu($member, $smallermtu);
761 0ac206f9 Ermal
		pfSense_interface_capabilities($member, -$flags);
762 39fbee97 Ermal Lu?i
		interfaces_bring_up($member);
763 f421cbcc Ermal Lu?i
		mwexec("/sbin/ifconfig {$laggif} laggport {$member}");
764 cccf624b Ermal Luçi
	}
765 be45aa79 Renato Botelho
766 39fbee97 Ermal Lu?i
	mwexec("/sbin/ifconfig {$laggif} laggproto {$lagg['proto']}");
767 acc1e9d0 Scott Ullrich
768 b5b957fe Scott Ullrich
	interfaces_bring_up($laggif);
769 cccf624b Ermal Luçi
770 d7147b1c Scott Ullrich
	return $laggif;
771 cccf624b Ermal Luçi
}
772
773 d7f1891b Ermal
function interfaces_gre_configure($checkparent = 0) {
774 1c3ddd9e Renato Botelho
	global $config;
775 582d2452 Ermal Luçi
776 1c3ddd9e Renato Botelho
	if (is_array($config['gres']['gre']) && count($config['gres']['gre'])) {
777
		foreach ($config['gres']['gre'] as $i => $gre) {
778
			if(empty($gre['greif']))
779
				$gre['greif'] = "gre{$i}";
780 ef1c048b Ermal
			if ($checkparent == 1) {
781
				if (strstr($gre['if'], "_vip"))
782
					continue;
783
				if (!empty($config['interfaces'][$gre['if']]) && $config['interfaces'][$gre['if']]['ipaddrv6'] == "track6")  
784
					continue;
785
			}
786
			else if ($checkparent == 2) {
787
				if (!strstr($gre['if'], "_vip"))
788
					continue;
789
				if (empty($config['interfaces'][$gre['if']]) || $config['interfaces'][$gre['if']]['ipaddrv6'] != "track6")  
790
					continue;
791
			}
792 1c3ddd9e Renato Botelho
			/* XXX: Maybe we should report any errors?! */
793
			interface_gre_configure($gre);
794
		}
795
	}
796 582d2452 Ermal Luçi
}
797
798 ed62880b Ermal
/* NOTE: $grekey is not used but useful for passing this function to array_walk. */
799
function interface_gre_configure(&$gre, $grekey = "") {
800 1c3ddd9e Renato Botelho
	global $config, $g;
801 582d2452 Ermal Luçi
802
	if (!is_array($gre))
803
		return -1;
804
805 85a5da13 Ermal Luçi
	$realif = get_real_interface($gre['if']);
806
	$realifip = get_interface_ip($gre['if']);
807 582d2452 Ermal Luçi
808 d7147b1c Scott Ullrich
	/* make sure the parent interface is up */
809 b5b957fe Scott Ullrich
	interfaces_bring_up($realif);
810 582d2452 Ermal Luçi
811 d7147b1c Scott Ullrich
	if ($g['booting'] || !(empty($gre['greif']))) {
812 871768cf Ermal
		pfSense_interface_destroy($gre['greif']);
813
		pfSense_interface_create($gre['greif']);
814 582d2452 Ermal Luçi
		$greif = $gre['greif'];
815 871768cf Ermal
	} else
816
		$greif = pfSense_interface_create("gre");
817 582d2452 Ermal Luçi
818
	/* Do not change the order here for more see gre(4) NOTES section. */
819
	mwexec("/sbin/ifconfig {$greif} tunnel {$realifip} {$gre['remote-addr']}");
820 a59c7fa6 smos
	if((is_ipaddrv6($gre['tunnel-local-addr'])) || (is_ipaddrv6($gre['tunnel-remote-addr']))) {
821
		mwexec("/sbin/ifconfig {$greif} inet6 {$gre['tunnel-local-addr']} {$gre['tunnel-remote-addr']} prefixlen /{$gre['tunnel-remote-net']} ");
822
	} else {
823 bfede3d4 jim-p
		mwexec("/sbin/ifconfig {$greif} {$gre['tunnel-local-addr']} {$gre['tunnel-remote-addr']} netmask " . gen_subnet_mask($gre['tunnel-remote-net']));
824 a59c7fa6 smos
	}
825 f8edf05d jim-p
	if (isset($gre['link0']))
826 871768cf Ermal
		pfSense_interface_flags($greif, IFF_LINK0);
827 f8edf05d jim-p
	if (isset($gre['link1']))
828 871768cf Ermal
		pfSense_interface_flags($greif, IFF_LINK1);
829 f8edf05d jim-p
	if (isset($gre['link2']))
830 871768cf Ermal
		pfSense_interface_flags($greif, IFF_LINK2);
831 d7147b1c Scott Ullrich
832
	if($greif)
833 b5b957fe Scott Ullrich
		interfaces_bring_up($greif);
834 be45aa79 Renato Botelho
	else
835 07e40c1f Carlos Eduardo Ramos
		log_error(gettext("Could not bring greif up -- variable not defined."));
836 582d2452 Ermal Luçi
837 53b0d9d3 Ermal Lu?i
	if (isset($gre['link1']) && $gre['link1'])
838 61b67ab3 Ermal Lu?i
		mwexec("/sbin/route add {$gre['tunnel-remote-addr']}/{$gre['tunnel-remote-net']} {$gre['tunnel-local-addr']}");
839 283e9180 Seth Mos
	if(is_ipaddrv4($gre['tunnel-remote-addr']))
840
		file_put_contents("{$g['tmp_path']}/{$greif}_router", $gre['tunnel-remote-addr']);
841
	if(is_ipaddrv6($gre['tunnel-remote-addr']))
842
		file_put_contents("{$g['tmp_path']}/{$greif}_routerv6", $gre['tunnel-remote-addr']);
843 582d2452 Ermal Luçi
844
	return $greif;
845
}
846
847 d7f1891b Ermal
function interfaces_gif_configure($checkparent = 0) {
848 9006e9f8 Scott Ullrich
	global $config;
849 f1a93dee Ermal
850 9006e9f8 Scott Ullrich
	if (is_array($config['gifs']['gif']) && count($config['gifs']['gif'])) {
851 f1a93dee Ermal
		foreach ($config['gifs']['gif'] as $i => $gif) {
852 9006e9f8 Scott Ullrich
			if(empty($gif['gifif']))
853
				$gre['gifif'] = "gif{$i}";
854 ef1c048b Ermal
			if ($checkparent == 1) {
855
				if (strstr($gif['if'], "_vip"))
856
					continue;
857
				if (!empty($config['interfaces'][$gif['if']]) && $config['interfaces'][$gif['if']]['ipaddrv6'] == "track6")  
858
					continue;
859
			}
860
			else if ($checkparent == 2) {
861
				if (!strstr($gre['if'], "_vip"))
862
					continue;
863
				if (empty($config['interfaces'][$gif['if']]) || $config['interfaces'][$gif['if']]['ipaddrv6'] != "track6")  
864
					continue;
865
			}
866 9006e9f8 Scott Ullrich
			/* XXX: Maybe we should report any errors?! */
867
			interface_gif_configure($gif);
868
		}
869
	}
870 582d2452 Ermal Luçi
}
871
872 ed62880b Ermal
/* NOTE: $gifkey is not used but useful for passing this function to array_walk. */
873
function interface_gif_configure(&$gif, $gifkey = "") {
874 9006e9f8 Scott Ullrich
	global $config, $g;
875 582d2452 Ermal Luçi
876 9006e9f8 Scott Ullrich
	if (!is_array($gif))
877
		return -1;
878 582d2452 Ermal Luçi
879 9006e9f8 Scott Ullrich
	$realif = get_real_interface($gif['if']);
880 8436caa7 bcyrill
	$ipaddr = $gif['ipaddr'];
881 582d2452 Ermal Luçi
882 8436caa7 bcyrill
	if (is_ipaddrv4($gif['remote-addr'])) {
883
		if (is_ipaddrv4($ipaddr))
884
			$realifip = $ipaddr;
885
		else
886
			$realifip = get_interface_ip($gif['if']);
887 01a58d89 smos
		$realifgw = get_interface_gateway($gif['if']);
888 8436caa7 bcyrill
	} else if (is_ipaddrv6($gif['remote-addr'])) {
889
		if (is_ipaddrv6($ipaddr))
890
			$realifip = $ipaddr;
891
		else
892
			$realifip = get_interface_ipv6($gif['if']);
893 01a58d89 smos
		$realifgw = get_interface_gatewayv6($gif['if']);
894
	}
895 9006e9f8 Scott Ullrich
	/* make sure the parent interface is up */
896
	if($realif)
897
		interfaces_bring_up($realif);
898 be45aa79 Renato Botelho
	else
899 07e40c1f Carlos Eduardo Ramos
		log_error(gettext("could not bring realif up -- variable not defined -- interface_gif_configure()"));
900 582d2452 Ermal Luçi
901 9006e9f8 Scott Ullrich
	if ($g['booting'] || !(empty($gif['gifif']))) {
902 871768cf Ermal
		pfSense_interface_destroy($gif['gifif']);
903
		pfSense_interface_create($gif['gifif']);
904 9006e9f8 Scott Ullrich
		$gifif = $gif['gifif'];
905
	} else
906 871768cf Ermal
		$gifif = pfSense_interface_create("gif");
907 9006e9f8 Scott Ullrich
908
	/* Do not change the order here for more see gif(4) NOTES section. */
909
	mwexec("/sbin/ifconfig {$gifif} tunnel {$realifip} {$gif['remote-addr']}");
910 9b1ff028 Seth Mos
	if((is_ipaddrv6($gif['tunnel-local-addr'])) || (is_ipaddrv6($gif['tunnel-remote-addr']))) {
911 5a8371cd smos
		mwexec("/sbin/ifconfig {$gifif} inet6 {$gif['tunnel-local-addr']} {$gif['tunnel-remote-addr']} prefixlen /{$gif['tunnel-remote-net']} ");
912 9b1ff028 Seth Mos
	} else {
913
		mwexec("/sbin/ifconfig {$gifif} {$gif['tunnel-local-addr']} {$gif['tunnel-remote-addr']} netmask " . gen_subnet_mask($gif['tunnel-remote-net']));
914
	}
915 f8edf05d jim-p
	if (isset($gif['link0']))
916 871768cf Ermal
		pfSense_interface_flags($gifif, IFF_LINK0);
917 f8edf05d jim-p
	if (isset($gif['link1']))
918 871768cf Ermal
		pfSense_interface_flags($gifif, IFF_LINK1);
919 9006e9f8 Scott Ullrich
	if($gifif)
920
		interfaces_bring_up($gifif);
921
	else
922 07e40c1f Carlos Eduardo Ramos
		log_error(gettext("could not bring gifif up -- variable not defined"));
923 9006e9f8 Scott Ullrich
924 7c0571ce Seth Mos
	$iflist = get_configured_interface_list();
925
	foreach($iflist as $ifname) {
926
		if($config['interfaces'][$ifname]['if'] == $gifif) {
927 e2b6e604 Seth Mos
			if(get_interface_gateway($ifname)) {
928
				system_routing_configure($ifname);
929
				break;
930
			}
931 7c0571ce Seth Mos
			if(get_interface_gateway_v6($ifname)) {
932
				system_routing_configure($ifname);
933
				break;
934
			}
935
		}
936
	}
937 283e9180 Seth Mos
938 a687f866 Namezero
939 283e9180 Seth Mos
	if(is_ipaddrv4($gif['tunnel-remote-addr']))
940
		file_put_contents("{$g['tmp_path']}/{$gifif}_router", $gif['tunnel-remote-addr']);
941
	if(is_ipaddrv6($gif['tunnel-remote-addr']))
942
		file_put_contents("{$g['tmp_path']}/{$gifif}_routerv6", $gif['tunnel-remote-addr']);
943 582d2452 Ermal Luçi
944 1c3ddd9e Renato Botelho
	if (is_ipaddrv4($realifgw)) {
945
		mwexec("route change -host {$gif['remote-addr']} {$realifgw}");
946
	}
947
	if (is_ipaddrv6($realifgw)) {
948
		mwexec("route change -host -inet6 {$gif['remote-addr']} {$realifgw}");
949
	}
950 01a58d89 smos
951 9006e9f8 Scott Ullrich
	return $gifif;
952 582d2452 Ermal Luçi
}
953
954 eba938e3 Scott Ullrich
function interfaces_configure() {
955 9b1c39e3 Ermal Luçi
	global $config, $g;
956
957 7734aea6 Andrew Thompson
	if ($g['platform'] == 'jail')
958
		return;
959
960 a5d6f60b Ermal Lu?i
	/* Set up our loopback interface */
961 4aca19b3 Scott Ullrich
	interfaces_loopback_configure();
962 a5d6f60b Ermal Lu?i
963 f3bddb47 Ermal
	/* create the unconfigured wireless clones */
964
	interfaces_create_wireless_clones();
965
966 541b7c56 Scott Ullrich
	/* set up LAGG virtual interfaces */
967
	interfaces_lagg_configure();
968
969 acc1e9d0 Scott Ullrich
	/* set up VLAN virtual interfaces */
970
	interfaces_vlan_configure();
971
972 5f1e1d26 Ermal Lu?i
	interfaces_qinq_configure();
973
974 67ee1ec5 Ermal Luçi
	$iflist = get_configured_interface_with_descr();
975 9b1c39e3 Ermal Luçi
	$delayed_list = array();
976
	$bridge_list = array();
977 ef1c048b Ermal
	$track6_list = array();
978 be45aa79 Renato Botelho
979 871768cf Ermal
	/* This is needed to speedup interfaces on bootup. */
980
	$reload = false;
981 ae17d2e9 Ermal
	if (!$g['booting'])
982 871768cf Ermal
		$reload = true;
983
984 67ee1ec5 Ermal Luçi
	foreach($iflist as $if => $ifname) {
985 0dc702f3 Ermal Lu?i
		$realif = $config['interfaces'][$if]['if'];
986 be45aa79 Renato Botelho
		if (strstr($realif, "bridge"))
987 9b1c39e3 Ermal Luçi
			$bridge_list[$if] = $ifname;
988
		else if (strstr($realif, "gre"))
989
			$delayed_list[$if] = $ifname;
990
		else if (strstr($realif, "gif"))
991
			$delayed_list[$if] = $ifname;
992 d09d53ac Ermal
		else if (strstr($realif, "ovpn")) {
993
			//echo "Delaying OpenVPN interface configuration...done.\n";
994
			continue;
995 a823022d Ermal
		} else if (!empty($config['interfaces'][$if]['ipaddrv6']) && $config['interfaces'][$if]['ipaddrv6'] == "track6") {
996 3d92cd88 Renato Botelho
			$track6_list[$if] = $ifname;
997 d09d53ac Ermal
		} else {
998 9b1c39e3 Ermal Luçi
			if ($g['booting'])
999 07e40c1f Carlos Eduardo Ramos
				printf(gettext("Configuring %s interface..."), $ifname);
1000 a687f866 Namezero
1001 9006e9f8 Scott Ullrich
			if($g['debug'])
1002 07e40c1f Carlos Eduardo Ramos
				log_error(sprintf(gettext("Configuring %s"), $ifname));
1003 871768cf Ermal
			interface_configure($if, $reload);
1004 be45aa79 Renato Botelho
			if ($g['booting'])
1005 07e40c1f Carlos Eduardo Ramos
				echo gettext( "done.") . "\n";
1006 9b1c39e3 Ermal Luçi
		}
1007
	}
1008
1009 d7f1891b Ermal
	/*
1010
	 * NOTE: The following function parameter consists of
1011
	 *	1 - Do not load gre/gif/bridge with parent/member as vip
1012
	 *	2 - Do load gre/gif/bridge with parent/member as vip
1013
	 */
1014
1015 d7147b1c Scott Ullrich
	/* set up GRE virtual interfaces */
1016 d7f1891b Ermal
	interfaces_gre_configure(1);
1017 9b1c39e3 Ermal Luçi
1018 d7147b1c Scott Ullrich
	/* set up GIF virtual interfaces */
1019 d7f1891b Ermal
	interfaces_gif_configure(1);
1020
1021
	/* set up BRIDGe virtual interfaces */
1022
	interfaces_bridge_configure(1);
1023
1024 ef1c048b Ermal
	foreach ($track6_list as $if => $ifname) {
1025
		if ($g['booting'])
1026
			printf(gettext("Configuring %s interface..."), $ifname);
1027
		if ($g['debug'])
1028
			log_error(sprintf(gettext("Configuring %s"), $ifname));
1029
1030
		interface_configure($if, $reload);
1031
1032
		if ($g['booting'])
1033
			echo gettext("done.") . "\n";
1034
	}
1035
1036 d7f1891b Ermal
	/* bring up vip interfaces */
1037
	interfaces_vips_configure();
1038
1039
	/* set up GRE virtual interfaces */
1040
	interfaces_gre_configure(2);
1041
1042
	/* set up GIF virtual interfaces */
1043
	interfaces_gif_configure(2);
1044
1045 9b1c39e3 Ermal Luçi
	foreach ($delayed_list as $if => $ifname) {
1046
		if ($g['booting'])
1047 07e40c1f Carlos Eduardo Ramos
			printf(gettext("Configuring %s interface..."), $ifname);
1048 1c3ddd9e Renato Botelho
		if ($g['debug'])
1049
			log_error(sprintf(gettext("Configuring %s"), $ifname));
1050 67ee1ec5 Ermal Luçi
1051 871768cf Ermal
		interface_configure($if, $reload);
1052 4476d447 Ermal Luçi
1053 9b1c39e3 Ermal Luçi
		if ($g['booting'])
1054 07e40c1f Carlos Eduardo Ramos
			echo gettext("done.") . "\n";
1055 67ee1ec5 Ermal Luçi
	}
1056 cfc707f7 Scott Ullrich
1057 d7147b1c Scott Ullrich
	/* set up BRIDGe virtual interfaces */
1058 d7f1891b Ermal
	interfaces_bridge_configure(2);
1059 9b1c39e3 Ermal Luçi
1060 d7147b1c Scott Ullrich
	foreach ($bridge_list as $if => $ifname) {
1061
		if ($g['booting'])
1062 07e40c1f Carlos Eduardo Ramos
			printf(gettext("Configuring %s interface..."), $ifname);
1063 d7147b1c Scott Ullrich
		if($g['debug'])
1064 07e40c1f Carlos Eduardo Ramos
			log_error(sprintf(gettext("Configuring %s"), $ifname));
1065 9b1c39e3 Ermal Luçi
1066 871768cf Ermal
		interface_configure($if, $reload);
1067 9b1c39e3 Ermal Luçi
1068 d7147b1c Scott Ullrich
		if ($g['booting'])
1069 07e40c1f Carlos Eduardo Ramos
			echo gettext("done.") . "\n";
1070 d7147b1c Scott Ullrich
	}
1071 9b1c39e3 Ermal Luçi
1072 42753d25 Ermal Lu?i
	/* configure interface groups */
1073
	interfaces_group_setup();
1074
1075 5b237745 Scott Ullrich
	if (!$g['booting']) {
1076
		/* reconfigure static routes (kernel may have deleted them) */
1077
		system_routing_configure();
1078 cfc707f7 Scott Ullrich
1079 5b237745 Scott Ullrich
		/* reload IPsec tunnels */
1080
		vpn_ipsec_configure();
1081 cfc707f7 Scott Ullrich
1082 f620d00d Ermal Luçi
		/* reload dhcpd (interface enabled/disabled status may have changed) */
1083 5b237745 Scott Ullrich
		services_dhcpd_configure();
1084 cfc707f7 Scott Ullrich
1085 5b237745 Scott Ullrich
		/* restart dnsmasq */
1086
		services_dnsmasq_configure();
1087 4d18de6a Scott Ullrich
1088 c597d50f Scott Ullrich
		/* reload captive portal */
1089 491652bf Ermal
		if (function_exists('captiveportal_init_rules'))
1090
			captiveportal_init_rules();
1091 5b237745 Scott Ullrich
	}
1092 cfc707f7 Scott Ullrich
1093 5b237745 Scott Ullrich
	return 0;
1094
}
1095
1096 7a18dfa4 lgcosta
function interface_reconfigure($interface = "wan", $reloadall = false) {
1097 80bf3f4a Ermal Luçi
	interface_bring_down($interface);
1098 7a18dfa4 lgcosta
	interface_configure($interface, $reloadall);
1099 80bf3f4a Ermal Luçi
}
1100
1101 91a38e1f Ermal
function interface_vip_bring_down($vip) {
1102 962fd685 Ermal
	global $g;
1103
1104 abcb2bed Ermal Lu?i
	switch ($vip['mode']) {
1105
	case "proxyarp":
1106 962fd685 Ermal
		$vipif = get_real_interface($vip['interface']);
1107 ca942829 Ermal
		if (file_exists("{$g['varrun_path']}/choparp_{$vipif}.pid"))
1108
			killbypid("{$g['varrun_path']}/choparp_{$vipif}.pid");
1109 abcb2bed Ermal Lu?i
		break;
1110
	case "ipalias":
1111 435f11c8 Ermal Lu?i
		$vipif = get_real_interface($vip['interface']);
1112 5918f9b7 Ermal
		if (does_interface_exist($vipif)) {
1113
			if (is_ipaddrv6($vip['subnet']))
1114
				mwexec("/sbin/ifconfig {$vipif} inet6 {$vip['subnet']} -alias");
1115
			else
1116
				pfSense_interface_deladdress($vipif, $vip['subnet']);
1117
		}
1118 abcb2bed Ermal Lu?i
		break;
1119
	case "carp":
1120 7b47bd4c Ermal
		$vipif = "{$vip['interface']}_vip{$vip['vhid']}";
1121 be45aa79 Renato Botelho
		if (does_interface_exist($vipif))
1122 871768cf Ermal
			pfSense_interface_destroy($vipif);
1123 abcb2bed Ermal Lu?i
		break;
1124
	}
1125
}
1126
1127 9343d750 Ermal
function interface_bring_down($interface = "wan", $destroy = false, $ifacecfg = false) {
1128 80bf3f4a Ermal Luçi
	global $config, $g;
1129
1130 99c2a28b Ermal Luçi
	if (!isset($config['interfaces'][$interface]))
1131 be45aa79 Renato Botelho
		return;
1132 203e4bb6 Ermal
1133
	if ($g['debug'])
1134
		log_error("Calling interface down for interface {$interface}, destroy is " . (($destroy) ? 'true' : 'false'));
1135 37fb708c smos
1136 e12ad49f Renato Botelho
	if ($ifacecfg === false) {
1137 9343d750 Ermal
		$ifcfg = $config['interfaces'][$interface];
1138 e12ad49f Renato Botelho
		$ppps = $config['ppps']['ppp'];
1139
		$realif = get_real_interface($interface);
1140
	} elseif (!is_array($ifacecfg)) {
1141 9343d750 Ermal
		log_error(gettext("Wrong parameters used during interface_bring_down"));
1142 e12ad49f Renato Botelho
	} else {
1143
		$ifcfg = $ifacecfg['ifcfg'];
1144
		$ppps = $ifacecfg['ppps'];
1145
		if (isset($ifacecfg['ifcfg']['realif']))
1146
			$realif = $ifacecfg['ifcfg']['realif'];
1147
		else
1148
			$realif = get_real_interface($interface);
1149
	}
1150 80bf3f4a Ermal Luçi
1151
	switch ($ifcfg['ipaddr']) {
1152 0810c115 gnhb
	case "ppp":
1153 80bf3f4a Ermal Luçi
	case "pppoe":
1154
	case "pptp":
1155 39f750b5 gnhb
	case "l2tp":
1156 e12ad49f Renato Botelho
		if (is_array($ppps) && count($ppps)) {
1157
			foreach ($ppps as $pppid => $ppp) {
1158 a138f4fb Ermal
				if ($realif == $ppp['if']) {
1159 c8d23069 gnhb
					if (isset($ppp['ondemand']) && !$destroy){
1160
						send_event("interface reconfigure {$interface}");
1161
						break;
1162
					}
1163 a8d6ac1a Ermal
					if (file_exists("{$g['varrun_path']}/{$ppp['type']}_{$interface}.pid")) {
1164
						killbypid("{$g['varrun_path']}/{$ppp['type']}_{$interface}.pid");
1165 c8d23069 gnhb
						sleep(2);
1166 8d9cbe6f Ermal
					}
1167 64e6490a Ermal
					unlink_if_exists("{$g['varetc_path']}/mpd_{$interface}.conf");
1168 a138f4fb Ermal
					break;
1169
				}
1170
			}
1171
		}
1172 80bf3f4a Ermal Luçi
		break;
1173
	case "dhcp":
1174 5d478ecc Ermal Lu?i
		$pid = find_dhclient_process($realif);
1175 f07bee94 Scott Ullrich
		if($pid)
1176 deb39cf2 Ermal
			posix_kill($pid, SIGTERM);
1177 37fb708c smos
		sleep(1);
1178
		unlink_if_exists("{$g['varetc_path']}/dhclient_{$interface}.conf");
1179
		if(does_interface_exist("$realif")) {
1180
			mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " delete", true);
1181
			if ($destroy == true)
1182
				pfSense_interface_flags($realif, -IFF_UP);
1183
			mwexec("/usr/sbin/arp -d -i {$realif} -a");
1184
		}
1185
		break;
1186
	default:
1187
		if(does_interface_exist("$realif")) {
1188
			mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " delete", true);
1189
			if ($destroy == true)
1190
				pfSense_interface_flags($realif, -IFF_UP);
1191
			mwexec("/usr/sbin/arp -d -i {$realif} -a");
1192
		}
1193
		break;
1194
	}
1195
1196
	switch ($ifcfg['ipaddrv6']) {
1197 feb88a14 smos
	case "slaac":
1198 37fb708c smos
	case "dhcp6":
1199 c65d3051 Seth Mos
		$pidv6 = find_dhcp6c_process($realif);
1200 c495f88b Seth Mos
		if($pidv6)
1201 82b50e76 Ermal
			posix_kill($pidv6, SIGTERM);
1202 74fa57aa smos
		sleep(3);
1203 c495f88b Seth Mos
		unlink_if_exists("{$g['varetc_path']}/dhcp6c_{$interface}.conf");
1204 e017a46a Ermal
		if (does_interface_exist("$realif")) {
1205 66c73aab Ermal
			$ip6 = get_interface_ipv6($interface);
1206
			if (is_ipaddrv6($ip6))
1207
				mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 {$ip6} delete", true);
1208 e49a2031 Ermal
			if ($destroy == true)
1209
				pfSense_interface_flags($realif, -IFF_UP);
1210 5630c91c Ermal Lu?i
			mwexec("/usr/sbin/arp -d -i {$realif} -a");
1211 f07bee94 Scott Ullrich
		}
1212 80bf3f4a Ermal Luçi
		break;
1213 3f383504 smos
	case "6rd":
1214 31c43fd3 smos
	case "6to4":
1215 7d1f2eac Ermal
		$realif = "{$interface}_stf";
1216 31c43fd3 smos
		if(does_interface_exist("$realif")) {
1217 66c73aab Ermal
			$ip6 = get_interface_ipv6($interface);
1218
			if (is_ipaddrv6($ip6))
1219
				mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 {$ip6} delete", true);
1220 31c43fd3 smos
			if ($destroy == true)
1221
				pfSense_interface_flags($realif, -IFF_UP);
1222 be45aa79 Renato Botelho
		}
1223 31c43fd3 smos
		break;
1224 80bf3f4a Ermal Luçi
	default:
1225 f07bee94 Scott Ullrich
		if(does_interface_exist("$realif")) {
1226 66c73aab Ermal
			$ip6 = get_interface_ipv6($interface);
1227
			if (is_ipaddrv6($ip6))
1228
				mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 {$ip6} delete", true);
1229 80fae0e2 Ermal Lu?i
			if (!empty($ifcfg['ipaddrv6']) && is_ipaddrv6($ifcfg['ipaddrv6']))
1230
				mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 {$ifcfg['ipaddrv6']} delete", true);
1231 e49a2031 Ermal
			if ($destroy == true)
1232
				pfSense_interface_flags($realif, -IFF_UP);
1233 5630c91c Ermal Lu?i
			mwexec("/usr/sbin/arp -d -i {$realif} -a");
1234 f07bee94 Scott Ullrich
		}
1235 80bf3f4a Ermal Luçi
		break;
1236
	}
1237 eb772abd Scott Ullrich
1238 97f7a517 jim-p
	if (file_exists("{$g['tmp_path']}/{$realif}_router"))
1239
		$old_router = trim(file_get_contents("{$g['tmp_path']}/{$realif}_router"));
1240 96f7a687 jim-p
//	log_error("Checking for old router states: {$g['tmp_path']}/{$realif}_router = {$old_router}");
1241
	if (!empty($old_router)) {
1242
		log_error("Clearing states to old gateway {$old_router}.");
1243 1befdbf8 Ermal
		mwexec("/sbin/pfctl -i {$realif} -Fs -G {$old_router}");
1244 96f7a687 jim-p
	}
1245 37fb708c smos
1246 73ee49f2 gnhb
	/* remove interface up file if it exists */
1247
	unlink_if_exists("{$g['tmp_path']}/{$realif}up");
1248
	unlink_if_exists("{$g['vardb_path']}/{$interface}ip");
1249 c495f88b Seth Mos
	unlink_if_exists("{$g['vardb_path']}/{$interface}ipv6");
1250 73ee49f2 gnhb
	unlink_if_exists("{$g['tmp_path']}/{$realif}_router");
1251 c495f88b Seth Mos
	unlink_if_exists("{$g['tmp_path']}/{$realif}_routerv6");
1252 86dcdfc9 Ermal
	unlink_if_exists("{$g['varetc_path']}/nameserver_{$realif}");
1253
	unlink_if_exists("{$g['varetc_path']}/searchdomain_{$realif}");
1254 be45aa79 Renato Botelho
1255 b5582f49 Erik Fonnesbeck
	/* hostapd and wpa_supplicant do not need to be running when the interface is down.
1256
	 * They will also use 100% CPU if running after the wireless clone gets deleted. */
1257
	if (is_array($ifcfg['wireless'])) {
1258 97f3ce0f Phil Davis
		kill_hostapd($realif);
1259 b5582f49 Erik Fonnesbeck
		mwexec(kill_wpasupplicant($realif));
1260
	}
1261
1262 97973ed8 Ermal Luçi
	if ($destroy == true) {
1263 1e8a05a2 bcyrill
		if (preg_match("/^[a-z0-9]+_vip|^tun|^ovpn|^gif|^gre|^lagg|^bridge|vlan|_stf$/i", $realif))
1264 871768cf Ermal
			pfSense_interface_destroy($realif);
1265 be45aa79 Renato Botelho
	}
1266 9006e9f8 Scott Ullrich
1267 80bf3f4a Ermal Luçi
	return;
1268 5b237745 Scott Ullrich
}
1269
1270 e5d558bf gnhb
function interfaces_ptpid_used($ptpid) {
1271
	global $config;
1272
1273
	if (is_array($config['ppps']['ppp']))
1274
		foreach ($config['ppps']['ppp'] as & $settings)
1275
			if ($ptpid == $settings['ptpid'])
1276
				return true;
1277
1278
	return false;
1279
}
1280
1281
function interfaces_ptpid_next() {
1282
1283
	$ptpid = 0;
1284
	while(interfaces_ptpid_used($ptpid))
1285
		$ptpid++;
1286
1287
	return $ptpid;
1288
}
1289
1290 70e46e62 Ermal
function getMPDCRONSettings($pppif) {
1291 e5d558bf gnhb
	global $config;
1292 70e46e62 Ermal
1293
	$cron_cmd_file = "{$g['varetc_path']}/pppoe_restart_{$pppif}";
1294 e5d558bf gnhb
	if (is_array($config['cron']['item'])) {
1295 70e46e62 Ermal
		foreach ($config['cron']['item'] as $i => $item) {
1296
			if (stripos($item['command'], $cron_cmd_file) !== false)
1297 e5d558bf gnhb
				return array("ID" => $i, "ITEM" => $item);
1298
		}
1299
	}
1300 70e46e62 Ermal
1301 e5d558bf gnhb
	return NULL;
1302
}
1303
1304
function handle_pppoe_reset($post_array) {
1305
	global $config, $g;
1306
1307 70e46e62 Ermal
	$pppif = "{$post_array['type']}{$post_array['ptpid']}";
1308
	$cron_cmd_file = "{$g['varetc_path']}/pppoe_restart_{$pppif}";
1309 5c8e8a17 gnhb
1310 be45aa79 Renato Botelho
	if (!is_array($config['cron']['item']))
1311
		$config['cron']['item'] = array();
1312 70e46e62 Ermal
1313 1d7e1d6c gnhb
	$itemhash = getMPDCRONSettings($pppif);
1314 be45aa79 Renato Botelho
1315 e5d558bf gnhb
	// reset cron items if necessary and return
1316
	if (empty($post_array['pppoe-reset-type'])) {
1317 70e46e62 Ermal
		if (isset($itemhash))
1318 e5d558bf gnhb
			unset($config['cron']['item'][$itemhash['ID']]);
1319
		sigkillbypid("{$g['varrun_path']}/cron.pid", "HUP");
1320
		return;
1321
	}
1322
1323 be45aa79 Renato Botelho
	if (empty($itemhash))
1324 70e46e62 Ermal
		$itemhash = array();
1325
	$item = array();
1326 e5d558bf gnhb
	if (isset($post_array['pppoe-reset-type']) && $post_array['pppoe-reset-type'] == "custom") {
1327
		$item['minute'] = $post_array['pppoe_resetminute'];
1328
		$item['hour'] = $post_array['pppoe_resethour'];
1329
		if (isset($post_array['pppoe_resetdate']) && $post_array['pppoe_resetdate'] <> "") {
1330
			$date = explode("/", $post_array['pppoe_resetdate']);
1331
			$item['mday'] = $date[1];
1332
			$item['month'] = $date[0];
1333
		} else {
1334
			$item['mday'] = "*";
1335
			$item['month'] = "*";
1336
		}
1337
		$item['wday'] = "*";
1338
		$item['who'] = "root";
1339 70e46e62 Ermal
		$item['command'] = $cron_cmd_file;
1340 e5d558bf gnhb
	} else if (isset($post_array['pppoe-reset-type']) && $post_array['pppoe-reset-type'] == "preset") {
1341
		switch ($post_array['pppoe_pr_preset_val']) {
1342 70e46e62 Ermal
		case "monthly":
1343
			$item['minute'] = "0";
1344
			$item['hour'] = "0";
1345
			$item['mday'] = "1";
1346
			$item['month'] = "*";
1347
			$item['wday'] = "*";
1348
			break;
1349 e5d558bf gnhb
	        case "weekly":
1350 70e46e62 Ermal
			$item['minute'] = "0";
1351
			$item['hour'] = "0";
1352
			$item['mday'] = "*";
1353
			$item['month'] = "*";
1354
			$item['wday'] = "0";
1355
			break;
1356
		case "daily":
1357
			$item['minute'] = "0";
1358
			$item['hour'] = "0";
1359
			$item['mday'] = "*";
1360
			$item['month'] = "*";
1361
			$item['wday'] = "*";
1362
			break;
1363
		case "hourly":
1364
			$item['minute'] = "0";
1365
			$item['hour'] = "*";
1366
			$item['mday'] = "*";
1367
			$item['month'] = "*";
1368
			$item['wday'] = "*";
1369
			break;
1370 e5d558bf gnhb
		} // end switch
1371 70e46e62 Ermal
		$item['who'] = "root";
1372
		$item['command'] = $cron_cmd_file;
1373
	}
1374
	if (empty($item))
1375
		return;
1376 be45aa79 Renato Botelho
	if (isset($item['ID']))
1377 70e46e62 Ermal
		$config['cron']['item'][$item['ID']] = $item;
1378 be45aa79 Renato Botelho
	else
1379 e5d558bf gnhb
		$config['cron']['item'][] = $item;
1380
}
1381
1382 70e46e62 Ermal
/*
1383
 * This function can configure PPPoE, MLPPP (PPPoE), PPTP.
1384
 * It writes the mpd config file to /var/etc every time the link is opened.
1385
 */
1386 cb37d8fa gnhb
function interface_ppps_configure($interface) {
1387
	global $config, $g;
1388 01c201e3 Ermal
1389
	/* Return for unassigned interfaces. This is a minimum requirement. */
1390
	if (empty($config['interfaces'][$interface]))
1391
		return 0;
1392
	$ifcfg = $config['interfaces'][$interface];
1393
	if (!isset($ifcfg['enable']))
1394
		return 0;
1395
1396 3a906378 gnhb
	// mpd5 requires a /var/spool/lock directory for PPP modem links.
1397
	if(!is_dir("/var/spool/lock")) {
1398
		exec("/bin/mkdir -p /var/spool/lock");
1399
		exec("/bin/chmod a+rw /var/spool/lock/.");
1400
	}
1401 7e631290 smos
	// mpd5 modem chat script expected in the same directory as the mpd_xxx.conf files
1402 3a906378 gnhb
	if (!file_exists("{$g['varetc_path']}/mpd.script"))
1403
		mwexec("/bin/ln -s /usr/local/sbin/mpd.script {$g['varetc_path']}/.");
1404 01c201e3 Ermal
1405 cb37d8fa gnhb
	if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
1406
		foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
1407 f7480829 gnhb
			if ($ifcfg['if'] == $ppp['if'])
1408 cb37d8fa gnhb
				break;
1409
		}
1410
	}
1411 f7480829 gnhb
	if (!$ppp || $ifcfg['if'] != $ppp['if']){
1412 07e40c1f Carlos Eduardo Ramos
		log_error(sprintf(gettext("Can't find PPP config for %s in interface_ppps_configure()."), $ifcfg['if']));
1413 3a906378 gnhb
		return 0;
1414 cb37d8fa gnhb
	}
1415 3a906378 gnhb
	$pppif = $ifcfg['if'];
1416 cb37d8fa gnhb
	if ($ppp['type'] == "ppp")
1417
		$type = "modem";
1418
	else
1419
		$type = $ppp['type'];
1420 be45aa79 Renato Botelho
	$upper_type = strtoupper($ppp['type']);
1421 01c201e3 Ermal
1422 3a906378 gnhb
	if($g['booting']) {
1423 bfbb9bc0 Ermal
		$descr = isset($ifcfg['descr']) ? $ifcfg['descr'] : strtoupper($interface);
1424 3a90c973 gnhb
		echo "starting {$pppif} link...";
1425 3a906378 gnhb
		// Do not re-configure the interface if we are booting and it's already been started
1426
		if(file_exists("{$g['varrun_path']}/{$ppp['type']}_{$interface}.pid"))
1427
			return 0;
1428
	}
1429 01c201e3 Ermal
1430 3a906378 gnhb
	$ports = explode(',',$ppp['ports']);
1431 bfbb9bc0 Ermal
	if ($type != "modem") {
1432 8e9d1265 Renato Botelho
		foreach ($ports as $pid => $port) {
1433 bfbb9bc0 Ermal
			$ports[$pid] = get_real_interface($port);
1434 8e9d1265 Renato Botelho
			if (empty($ports[$pid]))
1435
				return 0;
1436
		}
1437 bfbb9bc0 Ermal
	}
1438 3a906378 gnhb
	$localips = explode(',',$ppp['localip']);
1439
	$gateways = explode(',',$ppp['gateway']);
1440
	$subnets = explode(',',$ppp['subnet']);
1441 01c201e3 Ermal
1442 3a906378 gnhb
	/* We bring up the parent interface first because if DHCP is configured on the parent we need
1443 01c201e3 Ermal
	 * to obtain an address first so we can write it in the mpd .conf file for PPTP and L2TP configs
1444
	 */
1445 3a906378 gnhb
	foreach($ports as $pid => $port){
1446 23721285 gnhb
		switch ($ppp['type']) {
1447 be45aa79 Renato Botelho
			case "pppoe":
1448 3a906378 gnhb
				/* Bring the parent interface up */
1449
				interfaces_bring_up($port);
1450 3d04de61 Ermal
				pfSense_ngctl_attach(".", $port);
1451 84086442 Renato Botelho
				/* Enable setautosrc to automatically change mac address if parent interface's changes */
1452
				mwexec("ngctl msg {$port}: setautosrc 1");
1453 3a906378 gnhb
				break;
1454
			case "pptp":
1455
			case "l2tp":
1456
				/* configure interface */
1457 69c1b043 gnhb
				if(is_ipaddr($localips[$pid])){
1458 3a906378 gnhb
					// Manually configure interface IP/subnet
1459 bfbb9bc0 Ermal
					pfSense_interface_setaddress($port, "{$localips[$pid]}/{$subnets[$pid]}");
1460
					interfaces_bring_up($port);
1461 69c1b043 gnhb
				} else if (empty($localips[$pid]))
1462
					$localips[$pid] = get_interface_ip($port); // try to get the interface IP from the port
1463 be45aa79 Renato Botelho
1464 69c1b043 gnhb
				if(!is_ipaddr($localips[$pid])){
1465 d421e319 Ermal
					log_error("Could not get a Local IP address for PPTP/L2TP link on {$port} in interfaces_ppps_configure. Using 0.0.0.0 ip!");
1466
					$localips[$pid] = "0.0.0.0";
1467 3a906378 gnhb
				}
1468 69c1b043 gnhb
				if(!is_ipaddr($gateways[$pid])){
1469 addc0439 Renato Botelho
					log_error(sprintf(gettext('Could not get a PPTP/L2TP Remote IP address from %1$s for %2$s in interfaces_ppps_configure.'), $dhcp_gateway, $gway));
1470 69c1b043 gnhb
					return 0;
1471 3a906378 gnhb
				}
1472 3d04de61 Ermal
				pfSense_ngctl_attach(".", $port);
1473 3a906378 gnhb
				break;
1474
			case "ppp":
1475
				if (!file_exists("{$port}")) {
1476 07e40c1f Carlos Eduardo Ramos
					log_error(sprintf(gettext("Device %s does not exist. PPP link cannot start without the modem device."), $port));
1477 23721285 gnhb
					return 0;
1478 3a906378 gnhb
				}
1479
				break;
1480
			default:
1481 07e40c1f Carlos Eduardo Ramos
				log_error(sprintf(gettext("Unkown %s configured as ppp interface."), $type));
1482 3a906378 gnhb
				break;
1483
		}
1484
	}
1485 be45aa79 Renato Botelho
1486 cb37d8fa gnhb
	if (is_array($ports) && count($ports) > 1)
1487
		$multilink = "enable";
1488
	else
1489
		$multilink = "disable";
1490 be45aa79 Renato Botelho
1491 cb37d8fa gnhb
	if ($type == "modem"){
1492
		if (is_ipaddr($ppp['localip']))
1493
			$localip = $ppp['localip'];
1494
		else
1495
			$localip = '0.0.0.0';
1496
1497
		if (is_ipaddr($ppp['gateway']))
1498
			$gateway = $ppp['gateway'];
1499
		else
1500 23721285 gnhb
			$gateway = "10.64.64.{$pppid}";
1501 cb37d8fa gnhb
		$ranges = "{$localip}/0 {$gateway}/0";
1502 be45aa79 Renato Botelho
1503
		if (empty($ppp['apnum']))
1504 3a906378 gnhb
			$ppp['apnum'] = 1;
1505 23721285 gnhb
	} else
1506 cb37d8fa gnhb
		$ranges = "0.0.0.0/0 0.0.0.0/0";
1507 0661b194 gnhb
1508 be45aa79 Renato Botelho
	if (isset($ppp['ondemand']))
1509 cb37d8fa gnhb
		$ondemand = "enable";
1510
	else
1511
		$ondemand = "disable";
1512
	if (!isset($ppp['idletimeout']))
1513
		$ppp['idletimeout'] = 0;
1514 64d124c5 gnhb
1515 cb37d8fa gnhb
	if (empty($ppp['username']) && $type == "modem"){
1516
		$ppp['username'] = "user";
1517
		$ppp['password'] = "none";
1518
	}
1519
	if (empty($ppp['password']) && $type == "modem")
1520 00b702cc gnhb
		$passwd = "none";
1521
	else
1522
		$passwd = base64_decode($ppp['password']);
1523 0661b194 gnhb
1524
	$bandwidths = explode(',',$ppp['bandwidth']);
1525 6805d2d2 Ermal
	$defaultmtu = "1492";
1526
	if (!empty($ifcfg['mtu']))
1527
		$defaultmtu = intval($ifcfg['mtu']);
1528 0661b194 gnhb
	$mtus = explode(',',$ppp['mtu']);
1529
	$mrus = explode(',',$ppp['mru']);
1530
1531 c1cc447c gnhb
	if (isset($ppp['mrru']))
1532 0661b194 gnhb
		$mrrus = explode(',',$ppp['mrru']);
1533 c1cc447c gnhb
1534 cb37d8fa gnhb
	// Construct the mpd.conf file
1535
	$mpdconf = <<<EOD
1536
startup:
1537
	# configure the console
1538
	set console close
1539
	# configure the web server
1540
	set web close
1541
1542
default:
1543
{$ppp['type']}client:
1544
	create bundle static {$interface}
1545 07dfd121 Seth Mos
	set bundle enable ipv6cp
1546 cb37d8fa gnhb
	set iface name {$pppif}
1547
1548
EOD;
1549 0661b194 gnhb
	$setdefaultgw = false;
1550
	$founddefaultgw = false;
1551
	if (is_array($config['gateways']['gateway_item'])) {
1552
		foreach($config['gateways']['gateway_item'] as $gateway) {
1553
			if($interface == $gateway['interface'] && isset($gateway['defaultgw'])) {
1554
				$setdefaultgw = true;
1555
				break;
1556
			} else if (isset($gateway['defaultgw']) && !empty($gateway['interface'])) {
1557
				$founddefaultgw = true;
1558
				break;
1559
			}
1560
		}
1561
	}
1562 be45aa79 Renato Botelho
1563 82effddb gnhb
	if (($interface == "wan" && $founddefaultgw == false) || $setdefaultgw == true){
1564
		$setdefaultgw = true;
1565 cb37d8fa gnhb
		$mpdconf .= <<<EOD
1566
	set iface route default
1567
1568
EOD;
1569 82effddb gnhb
	}
1570 cb37d8fa gnhb
	$mpdconf .= <<<EOD
1571
	set iface {$ondemand} on-demand
1572
	set iface idle {$ppp['idletimeout']}
1573
1574
EOD;
1575
1576 0661b194 gnhb
	if (isset($ppp['ondemand']))
1577 cb37d8fa gnhb
		$mpdconf .= <<<EOD
1578 55f3ca1d gnhb
	set iface addrs 10.10.1.1 10.10.1.2
1579 cb37d8fa gnhb
1580
EOD;
1581 be45aa79 Renato Botelho
1582 0661b194 gnhb
	if (isset($ppp['tcpmssfix']))
1583 8adc1e49 gnhb
		$tcpmss = "disable";
1584
	else
1585
		$tcpmss = "enable";
1586 64d124c5 gnhb
		$mpdconf .= <<<EOD
1587 8adc1e49 gnhb
	set iface {$tcpmss} tcpmssfix
1588 64d124c5 gnhb
1589
EOD;
1590 0661b194 gnhb
1591 cb37d8fa gnhb
	$mpdconf .= <<<EOD
1592
	set iface up-script /usr/local/sbin/ppp-linkup
1593
	set iface down-script /usr/local/sbin/ppp-linkdown
1594
	set ipcp ranges {$ranges}
1595
1596
EOD;
1597 0661b194 gnhb
	if (isset($ppp['vjcomp']))
1598 cb37d8fa gnhb
		$mpdconf .= <<<EOD
1599 64d124c5 gnhb
	set ipcp no vjcomp
1600 cb37d8fa gnhb
1601
EOD;
1602
1603 bfbb9bc0 Ermal
	if (isset($config['system']['dnsallowoverride']))
1604 64d124c5 gnhb
		$mpdconf .= <<<EOD
1605
	set ipcp enable req-pri-dns
1606
	set ipcp enable req-sec-dns
1607
1608
EOD;
1609 23721285 gnhb
	if (!isset($ppp['verbose_log']))
1610
		$mpdconf .= <<<EOD
1611 5d9d443a gnhb
	#log -bund -ccp -chat -iface -ipcp -lcp -link
1612 0661b194 gnhb
1613 23721285 gnhb
EOD;
1614 64d124c5 gnhb
	foreach($ports as $pid => $port){
1615 bfbb9bc0 Ermal
		$port = get_real_interface($port);
1616 00b702cc gnhb
		$mpdconf .= <<<EOD
1617 cb37d8fa gnhb
1618 0661b194 gnhb
	create link static {$interface}_link{$pid} {$type}
1619 cb37d8fa gnhb
	set link action bundle {$interface}
1620
	set link {$multilink} multilink
1621
	set link keep-alive 10 60
1622
	set link max-redial 0
1623 64d124c5 gnhb
1624
EOD;
1625 0661b194 gnhb
		if (isset($ppp['shortseq']))
1626 00b702cc gnhb
			$mpdconf .= <<<EOD
1627 64d124c5 gnhb
	set link no shortseq
1628
1629
EOD;
1630 0661b194 gnhb
1631
		if (isset($ppp['acfcomp']))
1632 00b702cc gnhb
			$mpdconf .= <<<EOD
1633 64d124c5 gnhb
	set link no acfcomp
1634
1635
EOD;
1636 0661b194 gnhb
1637
		if (isset($ppp['protocomp']))
1638 00b702cc gnhb
			$mpdconf .= <<<EOD
1639 64d124c5 gnhb
	set link no protocomp
1640
1641
EOD;
1642 0661b194 gnhb
1643 00b702cc gnhb
		$mpdconf .= <<<EOD
1644 cb37d8fa gnhb
	set link disable chap pap
1645
	set link accept chap pap eap
1646 64d124c5 gnhb
	set link disable incoming
1647 cb37d8fa gnhb
1648
EOD;
1649 00b702cc gnhb
1650
1651 0661b194 gnhb
		if (!empty($bandwidths[$pid]))
1652 00b702cc gnhb
			$mpdconf .= <<<EOD
1653
	set link bandwidth {$bandwidths[$pid]}
1654 cb37d8fa gnhb
1655
EOD;
1656 0661b194 gnhb
1657 8adc1e49 gnhb
		if (empty($mtus[$pid]))
1658 6805d2d2 Ermal
			$mtus[$pid] = $defaultmtu;
1659 00b702cc gnhb
			$mpdconf .= <<<EOD
1660
	set link mtu {$mtus[$pid]}
1661 cb37d8fa gnhb
1662
EOD;
1663 0661b194 gnhb
1664
		if (!empty($mrus[$pid]))
1665 00b702cc gnhb
			$mpdconf .= <<<EOD
1666
	set link mru {$mrus[$pid]}
1667
1668 6a30f701 gnhb
EOD;
1669
1670
		if (!empty($mrrus[$pid]))
1671
			$mpdconf .= <<<EOD
1672
	set link mrru {$mrrus[$pid]}
1673
1674 00b702cc gnhb
EOD;
1675 0661b194 gnhb
1676 00b702cc gnhb
		$mpdconf .= <<<EOD
1677 cb37d8fa gnhb
	set auth authname "{$ppp['username']}"
1678
	set auth password {$passwd}
1679
1680
EOD;
1681 00b702cc gnhb
		if ($type == "modem") {
1682
			$mpdconf .= <<<EOD
1683 cb37d8fa gnhb
	set modem device {$ppp['ports']}
1684
	set modem script DialPeer
1685 73472985 Ermal
	set modem idle-script Ringback
1686 cb37d8fa gnhb
	set modem watch -cd
1687
	set modem var \$DialPrefix "DT"
1688
	set modem var \$Telephone "{$ppp['phone']}"
1689
1690
EOD;
1691 00b702cc gnhb
		}
1692
		if (isset($ppp['connect-timeout']) && $type == "modem") {
1693
			$mpdconf .= <<<EOD
1694 cb37d8fa gnhb
	set modem var \$ConnectTimeout "{$ppp['connect-timeout']}"
1695
1696
EOD;
1697 00b702cc gnhb
		}
1698
		if (isset($ppp['initstr']) && $type == "modem") {
1699
			$initstr = base64_decode($ppp['initstr']);
1700
			$mpdconf .= <<<EOD
1701 cb37d8fa gnhb
	set modem var \$InitString "{$initstr}"
1702
1703
EOD;
1704 00b702cc gnhb
		}
1705
		if (isset($ppp['simpin']) && $type == "modem") {
1706 03f7925a jim-p
			if($ppp['pin-wait'] == "")
1707 2a210730 smos
				$ppp['pin-wait'] = 0;
1708 00b702cc gnhb
			$mpdconf .= <<<EOD
1709 cb37d8fa gnhb
	set modem var \$SimPin "{$ppp['simpin']}"
1710
	set modem var \$PinWait "{$ppp['pin-wait']}"
1711
1712
EOD;
1713 00b702cc gnhb
		}
1714
		if (isset($ppp['apn']) && $type == "modem") {
1715
			$mpdconf .= <<<EOD
1716 cb37d8fa gnhb
	set modem var \$APN "{$ppp['apn']}"
1717
	set modem var \$APNum "{$ppp['apnum']}"
1718
1719
EOD;
1720 00b702cc gnhb
		}
1721 233e2af1 jim-p
		if ($type == "pppoe") {
1722
			// Send a null service name if none is set.
1723
			$provider = isset($ppp['provider']) ? $ppp['provider'] : "";
1724 00b702cc gnhb
			$mpdconf .= <<<EOD
1725 233e2af1 jim-p
	set pppoe service "{$provider}"
1726 cb37d8fa gnhb
1727
EOD;
1728 00b702cc gnhb
		}
1729 0661b194 gnhb
		if ($type == "pppoe")
1730 00b702cc gnhb
			$mpdconf .= <<<EOD
1731 64d124c5 gnhb
	set pppoe iface {$port}
1732 cb37d8fa gnhb
1733
EOD;
1734 0661b194 gnhb
1735 39f750b5 gnhb
		if ($type == "pptp" || $type == "l2tp") {
1736 00b702cc gnhb
			$mpdconf .= <<<EOD
1737 18ec0f13 Ermal
	set {$type} self {$localips[$pid]}
1738
	set {$type} peer {$gateways[$pid]}
1739 cb37d8fa gnhb
1740
EOD;
1741 00b702cc gnhb
		}
1742 be45aa79 Renato Botelho
1743 04f357bc Ermal
		$mpdconf .= "\topen\n";
1744 cb37d8fa gnhb
	} //end foreach($port)
1745
1746 df309b37 gnhb
1747
	/* Generate mpd.conf. If mpd_[interface].conf exists in the conf path, then link to it instead of generating a fresh conf file. */
1748
	if (file_exists("{$g['conf_path']}/mpd_{$interface}.conf"))
1749
		mwexec("/bin/ln -s {$g['conf_path']}/mpd_{$interface}.conf {$g['varetc_path']}/.");
1750
	else {
1751
		$fd = fopen("{$g['varetc_path']}/mpd_{$interface}.conf", "w");
1752
		if (!$fd) {
1753 07e40c1f Carlos Eduardo Ramos
			log_error(sprintf(gettext("Error: cannot open mpd_%s.conf in interface_ppps_configure().%s"), $interface, "\n"));
1754 df309b37 gnhb
			return 0;
1755
		}
1756
		// Write out mpd_ppp.conf
1757
		fwrite($fd, $mpdconf);
1758
		fclose($fd);
1759 14d079b3 Ermal
		unset($mpdconf);
1760 df309b37 gnhb
	}
1761 cb37d8fa gnhb
1762
	// Create the uptime log if requested and if it doesn't exist already, or delete it if it is no longer requested.
1763
	if (isset($ppp['uptime'])) {
1764
		if (!file_exists("/conf/{$pppif}.log")) {
1765
			conf_mount_rw();
1766
			mwexec("echo /dev/null > /conf/{$pppif}.log");
1767
			conf_mount_ro();
1768
		}
1769
	} else {
1770
		if (file_exists("/conf/{$pppif}.log")) {
1771
			conf_mount_rw();
1772
			mwexec("rm -f /conf/{$pppif}.log");
1773
			conf_mount_ro();
1774
		}
1775
	}
1776 92a1c8e6 Ermal
1777 7e631290 smos
	/* clean up old lock files */
1778
	foreach($ports as $port) {
1779 17d656fc smos
		if(file_exists("{$g['var_path']}/spool/lock/LCK..{$port}"))
1780
			unlink("{$g['var_path']}/spool/lock/LCK..{$port}");
1781 7e631290 smos
	}
1782
1783 3a906378 gnhb
	/* fire up mpd */
1784
	mwexec("/usr/local/sbin/mpd5 -b -k -d {$g['varetc_path']} -f mpd_{$interface}.conf -p {$g['varrun_path']}/{$ppp['type']}_{$interface}.pid -s ppp {$ppp['type']}client");
1785
1786 be45aa79 Renato Botelho
	// Check for PPPoE periodic reset request
1787 bfbb9bc0 Ermal
	if ($type == "pppoe") {
1788 70e46e62 Ermal
		if (!empty($ppp['pppoe-reset-type']))
1789
			interface_setup_pppoe_reset_file($ppp['if'], $interface);
1790 766bd6d0 gnhb
		else
1791 70e46e62 Ermal
			interface_setup_pppoe_reset_file($ppp['if']);
1792 cb37d8fa gnhb
	}
1793 302d646e smos
	/* wait for upto 10 seconds for the interface to appear (ppp(oe)) */
1794
	$i = 0;
1795
	while($i < 10) {
1796
		exec("/sbin/ifconfig {$ppp['if']} 2>&1", $out, $ret);
1797
		if($ret == 0)
1798
			break;
1799
		sleep(1);
1800
		$i++;
1801
	}
1802 cb37d8fa gnhb
1803 117f8e6f smos
	/* we only support the 3gstats.php for huawei modems for now. Will add more later. */
1804
	/* We should be able to launch the right version for each modem */
1805
	/* We can also guess the mondev from the manufacturer */
1806
	exec("usbconfig | egrep -ie '(huawei)'", $usbmodemoutput);
1807
	mwexec("/bin/ps auxww|grep \"{$interface}\" |grep \"[3]gstats\" | awk '{print $2}' |xargs kill");
1808 284101d3 smos
	foreach($ports as $port) {
1809 7056e4ed smos
		if(preg_match("/huawei/i", implode("\n", $usbmodemoutput))) {
1810 117f8e6f smos
			$mondev  = substr(basename($port), 0, -1);
1811
			$devlist = glob("/dev/{$mondev}?");
1812
			$mondev = basename(end($devlist));
1813 284101d3 smos
		}
1814 7056e4ed smos
		if(preg_match("/zte/i", implode("\n", $usbmodemoutput))) {
1815 284101d3 smos
			$mondev  = substr(basename($port), 0, -1) . "1";
1816
		}
1817
		log_error("Starting 3gstats.php on device '{$mondev}' for interface '{$interface}'");
1818
		mwexec_bg("/usr/local/bin/3gstats.php {$mondev} {$interface}");
1819 5e589685 smos
	}
1820
1821 23721285 gnhb
	return 1;
1822 cb37d8fa gnhb
}
1823
1824 abcb2bed Ermal Lu?i
function interfaces_carp_setup() {
1825 87a2efd1 Ermal Luçi
	global $g, $config;
1826 abcb2bed Ermal Lu?i
1827 84b32407 Ermal
	if (isset($config['system']['developerspew'])) {
1828 b932ef16 Scott Ullrich
		$mt = microtime();
1829 abcb2bed Ermal Lu?i
		echo "interfaces_carp_setup() being called $mt\n";
1830 b932ef16 Scott Ullrich
	}
1831 abcb2bed Ermal Lu?i
1832 b932ef16 Scott Ullrich
	if ($g['booting']) {
1833 07e40c1f Carlos Eduardo Ramos
		echo gettext("Configuring CARP settings...");
1834 7d0f4544 Scott Ullrich
		mute_kernel_msgs();
1835 a5250ebc Scott Ullrich
	}
1836 abcb2bed Ermal Lu?i
1837 b932ef16 Scott Ullrich
	/* suck in configuration items */
1838 84b32407 Ermal
	if ($config['hasync']) {
1839 f97a5b04 Darren Embry
		$pfsyncenabled = $config['hasync']['pfsyncenabled'];
1840
		$balanacing = $config['hasync']['balancing'];
1841
		$pfsyncinterface = $config['hasync']['pfsyncinterface'];
1842
		$pfsyncpeerip = $config['hasync']['pfsyncpeerip'];
1843 b932ef16 Scott Ullrich
	} else {
1844
		unset($pfsyncinterface);
1845
		unset($balanacing);
1846
		unset($pfsyncenabled);
1847 6008210b Scott Ullrich
	}
1848 abcb2bed Ermal Lu?i
1849 84b32407 Ermal
	if ($balanacing) {
1850
		mwexec("/sbin/sysctl net.inet.carp.arpbalance=1", true);
1851
		mwexec("/sbin/sysctl net.inet.carp.preempt=0", true);
1852 abcb2bed Ermal Lu?i
	} else
1853 be45aa79 Renato Botelho
		mwexec("/sbin/sysctl net.inet.carp.preempt=1", true);
1854 abcb2bed Ermal Lu?i
1855 84b32407 Ermal
	mwexec("sbin/sysctl net.inet.carp.log=1", true);
1856 abcb2bed Ermal Lu?i
	if (!empty($pfsyncinterface))
1857
		$carp_sync_int = get_real_interface($pfsyncinterface);
1858 84b32407 Ermal
	else
1859
		unset($carp_sync_int);
1860 abcb2bed Ermal Lu?i
1861 b932ef16 Scott Ullrich
	/* setup pfsync interface */
1862 84b32407 Ermal
	if ($carp_sync_int and $pfsyncenabled) {
1863 abcb2bed Ermal Lu?i
		if (is_ipaddr($pfsyncpeerip))
1864 dc2e5552 Renato Botelho
			$syncpeer = "syncpeer {$pfsyncpeerip}";
1865 abcb2bed Ermal Lu?i
		else
1866 dc2e5552 Renato Botelho
			$syncpeer = "-syncpeer";
1867
1868
		mwexec("/sbin/ifconfig pfsync0 syncdev {$carp_sync_int} {$syncpeer} up", false);
1869 abcb2bed Ermal Lu?i
1870 84b32407 Ermal
		sleep(1);
1871 2eb9c02f Ermal
1872 84b32407 Ermal
		/* XXX: Handle an issue with pfsync(4) and carp(4). In a cluster carp will come up before pfsync(4) has updated and so will cause issues
1873
		 * for existing sessions.
1874
		 */
1875 b32329fc smos
		log_error("waiting for pfsync...");
1876 1be1a67a PiBa-NL
		$i = 0;
1877
		while (intval(trim(`/sbin/ifconfig pfsync0 | /usr/bin/grep 'syncok: 0' | /usr/bin/grep -v grep | /usr/bin/wc -l`)) == 0 && $i < 30) {
1878
			$i++;
1879
			sleep(1);
1880
		}
1881 b32329fc smos
		log_error("pfsync done in $i seconds.");
1882
		log_error("Configuring CARP settings finalize...");
1883 b32ea59d Renato Botelho
	} else {
1884 fb6a3e7a Renato Botelho
		mwexec("/sbin/ifconfig pfsync0 -syncdev -syncpeer down", false);
1885 6930e805 Ermal
	}
1886 abcb2bed Ermal Lu?i
1887
	if($config['virtualip']['vip'])
1888 be45aa79 Renato Botelho
		mwexec("/sbin/sysctl net.inet.carp.allow=1", true);
1889 abcb2bed Ermal Lu?i
	else
1890 be45aa79 Renato Botelho
		mwexec("/sbin/sysctl net.inet.carp.allow=0", true);
1891
1892 abcb2bed Ermal Lu?i
	if ($g['booting']) {
1893
		unmute_kernel_msgs();
1894 07e40c1f Carlos Eduardo Ramos
		echo gettext("done.") . "\n";
1895 abcb2bed Ermal Lu?i
	}
1896 67ee1ec5 Ermal Luçi
}
1897
1898 962fd685 Ermal
function interface_proxyarp_configure($interface = "") {
1899 9006e9f8 Scott Ullrich
	global $config, $g;
1900
	if(isset($config['system']['developerspew'])) {
1901
		$mt = microtime();
1902
		echo "interface_proxyarp_configure() being called $mt\n";
1903
	}
1904 67ee1ec5 Ermal Luçi
1905 9006e9f8 Scott Ullrich
	/* kill any running choparp */
1906 962fd685 Ermal
	if (empty($interface))
1907
		killbyname("choparp");
1908 7c73f504 Ermal
	else {
1909
		$vipif = get_real_interface($interface);
1910
		if (file_exists("{$g['varrun_path']}/choparp_{$vipif}.pid"))
1911
			killbypid("{$g['varrun_path']}/choparp_{$vipif}.pid");
1912
	}
1913 1b58b513 Scott Ullrich
1914 7c73f504 Ermal
	$paa = array();
1915
	if (!empty($config['virtualip']) && is_array($config['virtualip']['vip'])) {
1916 e5d43d93 Scott Ullrich
1917 9006e9f8 Scott Ullrich
		/* group by interface */
1918
		foreach ($config['virtualip']['vip'] as $vipent) {
1919
			if ($vipent['mode'] === "proxyarp") {
1920
				if ($vipent['interface'])
1921
					$proxyif = $vipent['interface'];
1922
				else
1923
					$proxyif = "wan";
1924 be45aa79 Renato Botelho
1925 7e96ca27 Ermal
				if (!empty($interface) && $interface != $proxyif)
1926
					continue;
1927 abcb2bed Ermal Lu?i
1928 7c73f504 Ermal
				if (!is_array($paa[$proxyif]))
1929 9006e9f8 Scott Ullrich
					$paa[$proxyif] = array();
1930 7b2d4769 Bill Marquette
1931 9006e9f8 Scott Ullrich
				$paa[$proxyif][] = $vipent;
1932
			}
1933 962fd685 Ermal
		}
1934 9006e9f8 Scott Ullrich
	}
1935 e5d43d93 Scott Ullrich
1936 962fd685 Ermal
	if (!empty($interface)) {
1937
		if (is_array($paa[$interface])) {
1938
			$paaifip = get_interface_ip($interface);
1939 1c3ddd9e Renato Botelho
			if (!is_ipaddr($paaifip))
1940
				return;
1941
			$args = get_real_interface($interface) . " auto";
1942
			foreach ($paa[$interface] as $paent) {
1943
				if (isset($paent['subnet']))
1944
					$args .= " " . escapeshellarg("{$paent['subnet']}/{$paent['subnet_bits']}");
1945
				else if (isset($paent['range']))
1946
					$args .= " " . escapeshellarg($paent['range']['from'] . "-" . $paent['range']['to']);
1947
			}
1948
			mwexec_bg("/usr/local/sbin/choparp " . $args);
1949 962fd685 Ermal
		}
1950 7c73f504 Ermal
	} else if (count($paa) > 0) {
1951
		foreach ($paa as $paif => $paents)  {
1952 9006e9f8 Scott Ullrich
			$paaifip = get_interface_ip($paif);
1953 f814d3a6 Ermal
			if (!is_ipaddr($paaifip))
1954 9006e9f8 Scott Ullrich
				continue;
1955
			$args = get_real_interface($paif) . " auto";
1956
			foreach ($paents as $paent) {
1957
				if (isset($paent['subnet']))
1958
					$args .= " " . escapeshellarg("{$paent['subnet']}/{$paent['subnet_bits']}");
1959
				else if (isset($paent['range']))
1960 962fd685 Ermal
					$args .= " " . escapeshellarg($paent['range']['from'] . "-" . $paent['range']['to']);
1961 9006e9f8 Scott Ullrich
			}
1962
			mwexec_bg("/usr/local/sbin/choparp " . $args);
1963
		}
1964
	}
1965 9f6b1429 Scott Ullrich
}
1966
1967 e5ac67ed Ermal Lu?i
function interfaces_vips_configure($interface = "") {
1968 87a2efd1 Ermal Luçi
	global $g, $config;
1969 a04de17f Chris Buechler
	if(isset($config['system']['developerspew'])) {
1970
		$mt = microtime();
1971 123f030c Chris Buechler
		echo "interfaces_vips_configure() being called $mt\n";
1972 a04de17f Chris Buechler
	}
1973 abcb2bed Ermal Lu?i
	$paa = array();
1974
	if(is_array($config['virtualip']['vip'])) {
1975
		$carp_setuped = false;
1976 e5ac67ed Ermal Lu?i
		$anyproxyarp = false;
1977 abcb2bed Ermal Lu?i
		foreach ($config['virtualip']['vip'] as $vip) {
1978
			switch ($vip['mode']) {
1979
			case "proxyarp":
1980 123f030c Chris Buechler
				/* nothing it is handled on interface_proxyarp_configure() */
1981 e5ac67ed Ermal Lu?i
				if ($interface <> "" && $vip['interface'] <> $interface)
1982
					continue;
1983
				$anyproxyarp = true;
1984 abcb2bed Ermal Lu?i
				break;
1985
			case "ipalias":
1986 e5ac67ed Ermal Lu?i
				if ($interface <> "" && $vip['interface'] <> $interface)
1987
					continue;
1988 3dacbd7c Renato Botelho
				interface_ipalias_configure($vip);
1989 abcb2bed Ermal Lu?i
				break;
1990
			case "carp":
1991 e5ac67ed Ermal Lu?i
				if ($interface <> "" && $vip['interface'] <> $interface)
1992
					continue;
1993 bce14123 Ermal
				if ($carp_setuped == false)
1994 abcb2bed Ermal Lu?i
					$carp_setuped = true;
1995
				interface_carp_configure($vip);
1996
				break;
1997 6a74c90e Scott Ullrich
			}
1998 a04de17f Chris Buechler
		}
1999 bce14123 Ermal
		if ($carp_setuped == true)
2000
			interfaces_carp_setup();
2001 e5ac67ed Ermal Lu?i
		if ($anyproxyarp == true)
2002
			interface_proxyarp_configure();
2003 abcb2bed Ermal Lu?i
	}
2004
}
2005
2006
function interface_ipalias_configure(&$vip) {
2007
	if ($vip['mode'] == "ipalias") {
2008
		$if = get_real_interface($vip['interface']);
2009 ce73b2c5 smos
		$af = "inet";
2010
		if(is_ipaddrv6($vip['subnet']))
2011
			$af = "inet6";
2012
		mwexec("/sbin/ifconfig " . escapeshellarg($if) ." {$af} ". escapeshellarg($vip['subnet']) ."/" . escapeshellarg($vip['subnet_bits']) . " alias");
2013 a04de17f Chris Buechler
	}
2014
}
2015
2016 abcb2bed Ermal Lu?i
function interface_reload_carps($cif) {
2017
	global $config;
2018
2019
	$carpifs = link_ip_to_carp_interface(find_interface_ip($cif));
2020 9006e9f8 Scott Ullrich
	if (empty($carpifs))
2021 abcb2bed Ermal Lu?i
		return;
2022
2023
	$carps = explode(" ", $carpifs);
2024
	if(is_array($config['virtualip']['vip'])) {
2025 9006e9f8 Scott Ullrich
		$viparr = &$config['virtualip']['vip'];
2026
		foreach ($viparr as $vip) {
2027 abcb2bed Ermal Lu?i
			if (in_array($vip['carpif'], $carps)) {
2028 9006e9f8 Scott Ullrich
				switch ($vip['mode']) {
2029 89830b60 Ermal
				case "carp":
2030 abcb2bed Ermal Lu?i
					interface_vip_bring_down($vip);
2031
					sleep(1);
2032 9006e9f8 Scott Ullrich
					interface_carp_configure($vip);
2033
					break;
2034 89830b60 Ermal
				case "ipalias":
2035
					interface_vip_bring_down($vip);
2036
					sleep(1);
2037
					interface_ipalias_configure($vip);
2038
					break;
2039 abcb2bed Ermal Lu?i
				}
2040 9006e9f8 Scott Ullrich
			}
2041
		}
2042
	}
2043 abcb2bed Ermal Lu?i
}
2044
2045
function interface_carp_configure(&$vip) {
2046
	global $config, $g;
2047
	if(isset($config['system']['developerspew'])) {
2048 58ebf6bb Scott Ullrich
		$mt = microtime();
2049 0a595d84 Ermal Lu?i
		echo "interface_carp_configure() being called $mt\n";
2050 58ebf6bb Scott Ullrich
	}
2051 abcb2bed Ermal Lu?i
2052
	if ($vip['mode'] != "carp")
2053
		return;
2054
2055
	/*
2056
	 * ensure the interface containing the VIP really exists
2057 1c3ddd9e Renato Botelho
	 * prevents a panic if the interface is missing or invalid
2058 58ebf6bb Scott Ullrich
	 */
2059
	$realif = get_real_interface($vip['interface']);
2060
	if (!does_interface_exist($realif)) {
2061 07e40c1f Carlos Eduardo Ramos
		file_notice("CARP", sprintf(gettext("Interface specified for the virtual IP address %s does not exist. Skipping this VIP."), $vip['subnet']), "Firewall: Virtual IP", "");
2062 58ebf6bb Scott Ullrich
		return;
2063
	}
2064 abcb2bed Ermal Lu?i
2065 3502b5b1 Seth Mos
	if(is_ipaddrv4($vip['subnet'])) {
2066
		/* Ensure CARP IP really exists prior to loading up. */
2067
		$ww_subnet_ip = find_interface_ip($realif);
2068
		$ww_subnet_bits = find_interface_subnet($realif);
2069
		if (!ip_in_subnet($vip['subnet'], gen_subnet($ww_subnet_ip, $ww_subnet_bits) . "/" . $ww_subnet_bits) && !ip_in_interface_alias_subnet($vip['interface'], $vip['subnet'])) {
2070 8b6313a4 jim-p
			file_notice("CARP", sprintf(gettext("Sorry but we could not find a matching real interface subnet for the virtual IP address %s."), $vip['subnet']), "Firewall: Virtual IP", "");
2071 3502b5b1 Seth Mos
			return;
2072
		}
2073
	}
2074
	if(is_ipaddrv6($vip['subnet'])) {
2075
		/* Ensure CARP IP really exists prior to loading up. */
2076
		$ww_subnet_ip = find_interface_ipv6($realif);
2077
		$ww_subnet_bits = find_interface_subnetv6($realif);
2078
		if (!ip_in_subnet($vip['subnet'], gen_subnetv6($ww_subnet_ip, $ww_subnet_bits) . "/" . $ww_subnet_bits) && !ip_in_interface_alias_subnet($vip['interface'], $vip['subnet'])) {
2079 8b6313a4 jim-p
			file_notice("CARP", sprintf(gettext("Sorry but we could not find a matching real interface subnet for the virtual IPv6 address %s."), $vip['subnet']), "Firewall: Virtual IP", "");
2080 3502b5b1 Seth Mos
			return;
2081
		}
2082 f99aa333 Ermal
	}
2083
2084 7b47bd4c Ermal
	// set the vip interface to the vhid
2085
	$vipif = "{$vip['interface']}_vip{$vip['vhid']}";
2086 abcb2bed Ermal Lu?i
2087
	/* create the carp interface and setup */
2088 37a53d16 Scott Ullrich
	if (does_interface_exist($vipif)) {
2089 871768cf Ermal
		pfSense_interface_flags($vipif, -IFF_UP);
2090 37a53d16 Scott Ullrich
	} else {
2091 871768cf Ermal
		$carpif = pfSense_interface_create("carp");
2092
		pfSense_interface_rename($carpif, $vipif);
2093
		pfSense_ngctl_name("{$carpif}:", $vipif);
2094 abcb2bed Ermal Lu?i
	}
2095
2096
	/* invalidate interface cache */
2097
	get_interface_arr(true);
2098
2099 7b47bd4c Ermal
	$vip_password = $vip['password'];
2100
	$vip_password = escapeshellarg(addslashes(str_replace(" ", "", $vip_password)));
2101
	if ($vip['password'] != "")
2102
		$password = " pass {$vip_password}";
2103 a687f866 Namezero
2104 7b47bd4c Ermal
	$broadcast_address = gen_subnet_max($vip['subnet'], $vip['subnet_bits']);
2105 100b7219 Ermal
	$advbase = "";
2106
	if (!empty($vip['advbase']))
2107
		$advbase = "advbase {$vip['advbase']}";
2108 1f74cd2d Seth Mos
2109 3502b5b1 Seth Mos
	if(is_ipaddrv4($vip['subnet'])) {
2110
		$broadcast_address = gen_subnet_max($vip['subnet'], $vip['subnet_bits']);
2111 9caffe86 Seth Mos
		mwexec("/sbin/ifconfig {$vipif} {$vip['subnet']}/{$vip['subnet_bits']} vhid {$vip['vhid']} advskew {$vip['advskew']} {$advbase} {$password}");
2112 3502b5b1 Seth Mos
	}
2113
	if(is_ipaddrv6($vip['subnet'])) {
2114
		$broadcast_address = gen_subnet_max($vip['subnet'], $vip['subnet_bits']);
2115 9caffe86 Seth Mos
		mwexec("/sbin/ifconfig {$vipif} inet6 {$vip['subnet']} prefixlen {$vip['subnet_bits']} vhid {$vip['vhid']} advskew {$vip['advskew']} {$advbase} {$password}");
2116 3502b5b1 Seth Mos
	}
2117 abcb2bed Ermal Lu?i
2118
	interfaces_bring_up($vipif);
2119 7b47bd4c Ermal
2120 abcb2bed Ermal Lu?i
	return $vipif;
2121
}
2122
2123 854aed18 Ermal Lu?i
function interface_wireless_clone($realif, $wlcfg) {
2124 568b1358 Scott Ullrich
	global $config, $g;
2125 be45aa79 Renato Botelho
	/*   Check to see if interface has been cloned as of yet.
2126 88157f66 Scott Ullrich
	 *   If it has not been cloned then go ahead and clone it.
2127
	 */
2128 2a203afd Seth Mos
	$needs_clone = false;
2129 9f428275 Erik Fonnesbeck
	if(is_array($wlcfg['wireless']))
2130
		$wlcfg_mode = $wlcfg['wireless']['mode'];
2131
	else
2132
		$wlcfg_mode = $wlcfg['mode'];
2133
	switch($wlcfg_mode) {
2134 2a203afd Seth Mos
		 case "hostap":
2135
			$mode = "wlanmode hostap";
2136
			break;
2137
		 case "adhoc":
2138
			$mode = "wlanmode adhoc";
2139
			break;
2140
		 default:
2141
			$mode = "";
2142
			break;
2143
	}
2144 34808d4e Erik Fonnesbeck
	$baseif = interface_get_wireless_base($wlcfg['if']);
2145 854aed18 Ermal Lu?i
	if(does_interface_exist($realif)) {
2146
		exec("/sbin/ifconfig {$realif}", $output, $ret);
2147 2a203afd Seth Mos
		$ifconfig_str = implode($output);
2148 9f428275 Erik Fonnesbeck
		if(($wlcfg_mode == "hostap") && (! preg_match("/hostap/si", $ifconfig_str))) {
2149 07e40c1f Carlos Eduardo Ramos
			log_error(sprintf(gettext("Interface %s changed to hostap mode"), $realif));
2150 2a203afd Seth Mos
			$needs_clone = true;
2151
		}
2152 9f428275 Erik Fonnesbeck
		if(($wlcfg_mode == "adhoc") && (! preg_match("/adhoc/si", $ifconfig_str))) {
2153 07e40c1f Carlos Eduardo Ramos
			log_error(sprintf(gettext("Interface %s changed to adhoc mode"), $realif));
2154 2a203afd Seth Mos
			$needs_clone = true;
2155
		}
2156 9f428275 Erik Fonnesbeck
		if(($wlcfg_mode == "bss") && (preg_match("/hostap|adhoc/si", $ifconfig_str))) {
2157 07e40c1f Carlos Eduardo Ramos
			log_error(sprintf(gettext("Interface %s changed to infrastructure mode"), $realif));
2158 2a203afd Seth Mos
			$needs_clone = true;
2159
		}
2160
	} else {
2161
		$needs_clone = true;
2162 88157f66 Scott Ullrich
	}
2163 2a203afd Seth Mos
2164 19e83210 Scott Ullrich
	if($needs_clone == true) {
2165 2a203afd Seth Mos
		/* remove previous instance if it exists */
2166 854aed18 Ermal Lu?i
		if(does_interface_exist($realif))
2167 871768cf Ermal
			pfSense_interface_destroy($realif);
2168 854aed18 Ermal Lu?i
2169 07e40c1f Carlos Eduardo Ramos
		log_error(sprintf(gettext("Cloning new wireless interface %s"), $realif));
2170 b99256c1 Scott Ullrich
		// Create the new wlan interface. FreeBSD returns the new interface name.
2171
		// example:  wlan2
2172 6d54e865 Erik Fonnesbeck
		exec("/sbin/ifconfig wlan create wlandev {$baseif} {$mode} bssid 2>&1", $out, $ret);
2173 2a203afd Seth Mos
		if($ret <> 0) {
2174 addc0439 Renato Botelho
			log_error(sprintf(gettext('Failed to clone interface %1$s with error code %2$s, output %3$s'), $baseif, $ret, $out[0]));
2175 9f428275 Erik Fonnesbeck
			return false;
2176 2a203afd Seth Mos
		}
2177
		$newif = trim($out[0]);
2178
		// Rename the interface to {$parentnic}_wlan{$number}#: EX: ath0_wlan0
2179 871768cf Ermal
		pfSense_interface_rename($newif, $realif);
2180 2a203afd Seth Mos
		// FIXME: not sure what ngctl is for. Doesn't work.
2181 fa71a9b6 Erik Fonnesbeck
		// mwexec("/usr/sbin/ngctl name {$newif}: {$realif}", false);
2182 acb0bce0 Erik Fonnesbeck
		file_put_contents("{$g['tmp_path']}/{$realif}_oldmac", get_interface_mac($realif));
2183 88157f66 Scott Ullrich
	}
2184 9f428275 Erik Fonnesbeck
	return true;
2185 88157f66 Scott Ullrich
}
2186
2187 8f0289e7 Erik Fonnesbeck
function interface_sync_wireless_clones(&$ifcfg, $sync_changes = false) {
2188
	global $config, $g;
2189
2190 56626335 Erik Fonnesbeck
	$shared_settings = array('standard', 'turbo', 'protmode', 'txpower', 'channel',
2191
	                         'diversity', 'txantenna', 'rxantenna', 'distance',
2192
	                         'regdomain', 'regcountry', 'reglocation');
2193 8f0289e7 Erik Fonnesbeck
2194 263e2b7e Erik Fonnesbeck
	if(!is_interface_wireless($ifcfg['if']))
2195 7de319a1 Erik Fonnesbeck
		return;
2196
2197 34808d4e Erik Fonnesbeck
	$baseif = interface_get_wireless_base($ifcfg['if']);
2198 8f0289e7 Erik Fonnesbeck
2199 062023a5 Erik Fonnesbeck
	// Sync shared settings for assigned clones
2200 38b7d47d Erik Fonnesbeck
	$iflist = get_configured_interface_list(false, true);
2201 8f0289e7 Erik Fonnesbeck
	foreach ($iflist as $if) {
2202 34808d4e Erik Fonnesbeck
		if ($baseif == interface_get_wireless_base($config['interfaces'][$if]['if']) && $ifcfg['if'] != $config['interfaces'][$if]['if']) {
2203 8f0289e7 Erik Fonnesbeck
			if (isset($config['interfaces'][$if]['wireless']['standard']) || $sync_changes) {
2204
				foreach ($shared_settings as $setting) {
2205
					if ($sync_changes) {
2206 56626335 Erik Fonnesbeck
						if (isset($ifcfg['wireless'][$setting]))
2207
							$config['interfaces'][$if]['wireless'][$setting] = $ifcfg['wireless'][$setting];
2208
						else if (isset($config['interfaces'][$if]['wireless'][$setting]))
2209
							unset($config['interfaces'][$if]['wireless'][$setting]);
2210 8f0289e7 Erik Fonnesbeck
					} else {
2211 56626335 Erik Fonnesbeck
						if (isset($config['interfaces'][$if]['wireless'][$setting]))
2212
							$ifcfg['wireless'][$setting] = $config['interfaces'][$if]['wireless'][$setting];
2213
						else if (isset($ifcfg['wireless'][$setting]))
2214
							unset($ifcfg['wireless'][$setting]);
2215 8f0289e7 Erik Fonnesbeck
					}
2216
				}
2217
				if (!$sync_changes)
2218
					break;
2219
			}
2220
		}
2221
	}
2222 263e2b7e Erik Fonnesbeck
2223 062023a5 Erik Fonnesbeck
	// Read or write settings at shared area
2224 6ef2297b Erik Fonnesbeck
	if (isset($config['wireless']['interfaces'][$baseif]) && is_array($config['wireless']['interfaces'][$baseif])) {
2225 f62c44d8 Erik Fonnesbeck
		foreach ($shared_settings as $setting) {
2226
			if ($sync_changes) {
2227 56626335 Erik Fonnesbeck
				if (isset($ifcfg['wireless'][$setting]))
2228
					$config['wireless']['interfaces'][$baseif][$setting] = $ifcfg['wireless'][$setting];
2229
				else if (isset($config['wireless']['interfaces'][$baseif][$setting]))
2230
					unset($config['wireless']['interfaces'][$baseif][$setting]);
2231 f62c44d8 Erik Fonnesbeck
			} else if (isset($config['wireless']['interfaces'][$baseif][$setting])) {
2232 56626335 Erik Fonnesbeck
				if (isset($config['wireless']['interfaces'][$baseif][$setting]))
2233
					$ifcfg['wireless'][$setting] = $config['wireless']['interfaces'][$baseif][$setting];
2234
				else if (isset($ifcfg['wireless'][$setting]))
2235
					unset($ifcfg['wireless'][$setting]);
2236 f62c44d8 Erik Fonnesbeck
			}
2237 062023a5 Erik Fonnesbeck
		}
2238
	}
2239
2240
	// Sync the mode on the clone creation page with the configured mode on the interface
2241 6ef2297b Erik Fonnesbeck
	if (interface_is_wireless_clone($ifcfg['if']) && isset($config['wireless']['clone']) && is_array($config['wireless']['clone'])) {
2242 263e2b7e Erik Fonnesbeck
		foreach ($config['wireless']['clone'] as &$clone) {
2243
			if ($clone['cloneif'] == $ifcfg['if']) {
2244
				if ($sync_changes) {
2245
					$clone['mode'] = $ifcfg['wireless']['mode'];
2246
				} else {
2247
					$ifcfg['wireless']['mode'] = $clone['mode'];
2248
				}
2249
				break;
2250
			}
2251
		}
2252 867d444b Erik Fonnesbeck
		unset($clone);
2253 263e2b7e Erik Fonnesbeck
	}
2254 8f0289e7 Erik Fonnesbeck
}
2255
2256 19e83210 Scott Ullrich
function interface_wireless_configure($if, &$wl, &$wlcfg) {
2257 ac3f8318 Espen Johansen
	global $config, $g;
2258 eb772abd Scott Ullrich
2259 4742e927 Scott Ullrich
	/*    open up a shell script that will be used to output the commands.
2260
	 *    since wireless is changing a lot, these series of commands are fragile
2261 905ea336 Phil Davis
	 *    and will sometimes need to be verified by a operator by executing the command
2262
	 *    and returning the output of the command to the developers for inspection.  please
2263
	 *    do not change this routine from a shell script to individual exec commands.  -sullrich
2264 4742e927 Scott Ullrich
	 */
2265 eb772abd Scott Ullrich
2266 b99256c1 Scott Ullrich
	// Remove script file
2267 490b8b2a Scott Ullrich
	unlink_if_exists("{$g['tmp_path']}/{$if}_setup.sh");
2268 eb772abd Scott Ullrich
2269 0a28d385 Erik Fonnesbeck
	// Clone wireless nic if needed.
2270
	interface_wireless_clone($if, $wl);
2271
2272 8f0289e7 Erik Fonnesbeck
	// Reject inadvertent changes to shared settings in case the interface hasn't been configured.
2273
	interface_sync_wireless_clones($wl, false);
2274
2275 6955830f Ermal Lu?i
	$fd_set = fopen("{$g['tmp_path']}/{$if}_setup.sh","w");
2276 4742e927 Scott Ullrich
	fwrite($fd_set, "#!/bin/sh\n");
2277 36d0358b Scott Ullrich
	fwrite($fd_set, "# {$g['product_name']} wireless configuration script.\n\n");
2278 eb772abd Scott Ullrich
2279 2ac908dd Espen Johansen
	/* set values for /path/program */
2280
	$hostapd = "/usr/sbin/hostapd";
2281
	$wpa_supplicant = "/usr/sbin/wpa_supplicant";
2282 4742e927 Scott Ullrich
	$ifconfig = "/sbin/ifconfig";
2283 56626335 Erik Fonnesbeck
	$sysctl = "/sbin/sysctl";
2284 4742e927 Scott Ullrich
	$killall = "/usr/bin/killall";
2285 2ac908dd Espen Johansen
2286 905ea336 Phil Davis
	/* Set all wireless ifconfig variables (split up to get rid of needed checking) */
2287 5508cf57 Scott Ullrich
2288 2a203afd Seth Mos
	$wlcmd = array();
2289 56626335 Erik Fonnesbeck
	$wl_sysctl = array();
2290 2a203afd Seth Mos
	/* Make sure it's up */
2291
	$wlcmd[] = "up";
2292 ac3f8318 Espen Johansen
	/* Set a/b/g standard */
2293 9be20928 Erik Fonnesbeck
	$standard = str_replace(" Turbo", "", $wlcfg['standard']);
2294
	$wlcmd[] = "mode " . escapeshellarg($standard);
2295 2a203afd Seth Mos
2296 5030b5eb Erik Fonnesbeck
	/* XXX: Disable ampdu for now on mwl when running in 11n mode
2297
	 * to prevent massive packet loss under certain conditions. */
2298 9be20928 Erik Fonnesbeck
	if(preg_match("/^mwl/i", $if) && ($standard == "11ng" || $standard == "11na"))
2299 5030b5eb Erik Fonnesbeck
		$wlcmd[] = "-ampdu";
2300
2301 2a203afd Seth Mos
	/* Set ssid */
2302
	if($wlcfg['ssid'])
2303
		$wlcmd[] = "ssid " .escapeshellarg($wlcfg['ssid']);
2304 5508cf57 Scott Ullrich
2305 0856c4ac Scott Ullrich
	/* Set 802.11g protection mode */
2306 2a203afd Seth Mos
	$wlcmd[] = "protmode " . escapeshellarg($wlcfg['protmode']);
2307 0856c4ac Scott Ullrich
2308 ac3f8318 Espen Johansen
	/* set wireless channel value */
2309 2a203afd Seth Mos
	if(isset($wlcfg['channel'])) {
2310
		if($wlcfg['channel'] == "0") {
2311
			$wlcmd[] = "channel any";
2312
		} else {
2313
			$wlcmd[] = "channel " . escapeshellarg($wlcfg['channel']);
2314
		}
2315
	}
2316 2ac908dd Espen Johansen
2317 56626335 Erik Fonnesbeck
	/* Set antenna diversity value */
2318
	if(isset($wlcfg['diversity']))
2319
		$wl_sysctl[] = "diversity=" . escapeshellarg($wlcfg['diversity']);
2320
2321
	/* Set txantenna value */
2322
	if(isset($wlcfg['txantenna']))
2323
		$wl_sysctl[] = "txantenna=" . escapeshellarg($wlcfg['txantenna']);
2324
2325
	/* Set rxantenna value */
2326
	if(isset($wlcfg['rxantenna']))
2327
		$wl_sysctl[] = "rxantenna=" . escapeshellarg($wlcfg['rxantenna']);
2328
2329 f134033e Scott Ullrich
	/* set Distance value */
2330 eb772abd Scott Ullrich
	if($wlcfg['distance'])
2331 f134033e Scott Ullrich
		$distance = escapeshellarg($wlcfg['distance']);
2332
2333 ac3f8318 Espen Johansen
	/* Set wireless hostap mode */
2334 2a203afd Seth Mos
	if ($wlcfg['mode'] == "hostap") {
2335
		$wlcmd[] = "mediaopt hostap";
2336
	} else {
2337
		$wlcmd[] = "-mediaopt hostap";
2338
	}
2339 ac3f8318 Espen Johansen
2340
	/* Set wireless adhoc mode */
2341 2a203afd Seth Mos
	if ($wlcfg['mode'] == "adhoc") {
2342
		$wlcmd[] = "mediaopt adhoc";
2343
	} else {
2344
		$wlcmd[] = "-mediaopt adhoc";
2345
	}
2346 ac3f8318 Espen Johansen
2347
	/* Not neccesary to set BSS mode as this is default if adhoc and/or hostap is NOT set */
2348
2349
	/* handle hide ssid option */
2350 2a203afd Seth Mos
	if(isset($wlcfg['hidessid']['enable'])) {
2351
		$wlcmd[] = "hidessid";
2352
	} else {
2353
		$wlcmd[] = "-hidessid";
2354
	}
2355 ac3f8318 Espen Johansen
2356
	/* handle pureg (802.11g) only option */
2357 2a203afd Seth Mos
	if(isset($wlcfg['pureg']['enable'])) {
2358
		$wlcmd[] = "mode 11g pureg";
2359
	} else {
2360
		$wlcmd[] = "-pureg";
2361
	}
2362 ac3f8318 Espen Johansen
2363 ed459692 Erik Fonnesbeck
	/* handle puren (802.11n) only option */
2364
	if(isset($wlcfg['puren']['enable'])) {
2365
		$wlcmd[] = "puren";
2366
	} else {
2367
		$wlcmd[] = "-puren";
2368
	}
2369
2370 ac3f8318 Espen Johansen
	/* enable apbridge option */
2371 2a203afd Seth Mos
	if(isset($wlcfg['apbridge']['enable'])) {
2372
		$wlcmd[] = "apbridge";
2373
	} else {
2374
		$wlcmd[] = "-apbridge";
2375
	}
2376 ac3f8318 Espen Johansen
2377
	/* handle turbo option */
2378 2a203afd Seth Mos
	if(isset($wlcfg['turbo']['enable'])) {
2379
		$wlcmd[] = "mediaopt turbo";
2380
	} else {
2381
		$wlcmd[] = "-mediaopt turbo";
2382
	}
2383 ac3f8318 Espen Johansen
2384
	/* handle txpower setting */
2385 2a203afd Seth Mos
	/* if($wlcfg['txpower'] <> "")
2386
		$wlcmd[] = "txpower " . escapeshellarg($wlcfg['txpower']);
2387
	*/
2388 ac3f8318 Espen Johansen
	/* handle wme option */
2389 2a203afd Seth Mos
	if(isset($wlcfg['wme']['enable'])) {
2390
		$wlcmd[] = "wme";
2391
	} else {
2392
		$wlcmd[] = "-wme";
2393
	}
2394 eb772abd Scott Ullrich
2395 ac3f8318 Espen Johansen
	/* set up wep if enabled */
2396 2a203afd Seth Mos
	$wepset = "";
2397
	if (isset($wlcfg['wep']['enable']) && is_array($wlcfg['wep']['key'])) {
2398
		switch($wlcfg['wpa']['auth_algs']) {
2399
			case "1":
2400
				$wepset .= "authmode open wepmode on ";
2401
				break;
2402
			case "2":
2403
				$wepset .= "authmode shared wepmode on ";
2404
				break;
2405
			case "3":
2406
				$wepset .= "authmode mixed wepmode on ";
2407
		}
2408 2f19fa14 Scott Ullrich
		$i = 1;
2409
		foreach ($wlcfg['wep']['key'] as $wepkey) {
2410
			$wepset .= "wepkey " . escapeshellarg("{$i}:{$wepkey['value']}") . " ";
2411 2a203afd Seth Mos
			if (isset($wepkey['txkey'])) {
2412
				$wlcmd[] = "weptxkey {$i} ";
2413
			}
2414 2f19fa14 Scott Ullrich
			$i++;
2415
		}
2416 2a203afd Seth Mos
		$wlcmd[] = $wepset;
2417
	} else {
2418
		$wlcmd[] = "authmode open wepmode off ";
2419 ac3f8318 Espen Johansen
	}
2420
2421 97f3ce0f Phil Davis
	kill_hostapd($if);
2422 c8178bb7 Erik Fonnesbeck
	mwexec(kill_wpasupplicant("{$if}"));
2423
2424 ac3f8318 Espen Johansen
	/* generate wpa_supplicant/hostap config if wpa is enabled */
2425 2a203afd Seth Mos
	conf_mount_rw();
2426 ac3f8318 Espen Johansen
2427
	switch ($wlcfg['mode']) {
2428 b67d192d Scott Ullrich
		case 'bss':
2429 ac3f8318 Espen Johansen
			if (isset($wlcfg['wpa']['enable'])) {
2430
				$wpa .= <<<EOD
2431 454756b9 Scott Ullrich
ctrl_interface={$g['varrun_path']}/wpa_supplicant
2432 50ad3b7c Scott Ullrich
ctrl_interface_group=0
2433
ap_scan=1
2434 2ac908dd Espen Johansen
#fast_reauth=1
2435 249558a2 Scott Ullrich
network={
2436 454756b9 Scott Ullrich
ssid="{$wlcfg['ssid']}"
2437
scan_ssid=1
2438 2ac908dd Espen Johansen
priority=5
2439
key_mgmt={$wlcfg['wpa']['wpa_key_mgmt']}
2440 454756b9 Scott Ullrich
psk="{$wlcfg['wpa']['passphrase']}"
2441 2ac908dd Espen Johansen
pairwise={$wlcfg['wpa']['wpa_pairwise']}
2442
group={$wlcfg['wpa']['wpa_pairwise']}
2443 50ad3b7c Scott Ullrich
}
2444
EOD;
2445
2446 80ec5eaa Scott Ullrich
				$fd = fopen("{$g['varetc_path']}/wpa_supplicant_{$if}.conf", "w");
2447 ac3f8318 Espen Johansen
				fwrite($fd, "{$wpa}");
2448
				fclose($fd);
2449
			}
2450 2a203afd Seth Mos
			break;
2451 ac3f8318 Espen Johansen
		case 'hostap':
2452 be45aa79 Renato Botelho
			if($wlcfg['wpa']['passphrase'])
2453 7eadaa9c Scott Ullrich
				$wpa_passphrase = "wpa_passphrase={$wlcfg['wpa']['passphrase']}\n";
2454 be45aa79 Renato Botelho
			else
2455 abfd0c9b Scott Ullrich
				$wpa_passphrase = "";
2456 ac3f8318 Espen Johansen
			if (isset($wlcfg['wpa']['enable'])) {
2457
				$wpa .= <<<EOD
2458 459d6351 Scott Ullrich
interface={$if}
2459
driver=bsd
2460
logger_syslog=-1
2461
logger_syslog_level=0
2462
logger_stdout=-1
2463
logger_stdout_level=0
2464 2ac908dd Espen Johansen
dump_file={$g['tmp_path']}/hostapd_{$if}.dump
2465
ctrl_interface={$g['varrun_path']}/hostapd
2466 459d6351 Scott Ullrich
ctrl_interface_group=wheel
2467 2ac908dd Espen Johansen
#accept_mac_file={$g['tmp_path']}/hostapd_{$if}.accept
2468
#deny_mac_file={$g['tmp_path']}/hostapd_{$if}.deny
2469 b67d192d Scott Ullrich
#macaddr_acl={$wlcfg['wpa']['macaddr_acl']}
2470 459d6351 Scott Ullrich
ssid={$wlcfg['ssid']}
2471 2ac908dd Espen Johansen
debug={$wlcfg['wpa']['debug_mode']}
2472
auth_algs={$wlcfg['wpa']['auth_algs']}
2473
wpa={$wlcfg['wpa']['wpa_mode']}
2474
wpa_key_mgmt={$wlcfg['wpa']['wpa_key_mgmt']}
2475
wpa_pairwise={$wlcfg['wpa']['wpa_pairwise']}
2476 ac3f8318 Espen Johansen
wpa_group_rekey={$wlcfg['wpa']['wpa_group_rekey']}
2477
wpa_gmk_rekey={$wlcfg['wpa']['wpa_gmk_rekey']}
2478
wpa_strict_rekey={$wlcfg['wpa']['wpa_strict_rekey']}
2479 7eadaa9c Scott Ullrich
{$wpa_passphrase}
2480 525d565b Scott Ullrich
2481 459d6351 Scott Ullrich
EOD;
2482 2ac908dd Espen Johansen
2483 c9e7d30d Scott Ullrich
if (isset($wlcfg['wpa']['rsn_preauth'])) {
2484
	$wpa .= <<<EOD
2485
# Enable the next lines for preauth when roaming. Interface = wired or wireless interface talking to the AP you want to roam from/to
2486
rsn_preauth=1
2487
rsn_preauth_interfaces={$if}
2488
2489
EOD;
2490
2491
}
2492 5949124c Scott Ullrich
				if($wlcfg['auth_server_addr'] && $wlcfg['auth_server_shared_secret']) {
2493
					$auth_server_port = "1812";
2494 be45aa79 Renato Botelho
					if($wlcfg['auth_server_port'])
2495 5949124c Scott Ullrich
						$auth_server_port = $wlcfg['auth_server_port'];
2496 a687f866 Namezero
					$auth_server_port2 = "1812";
2497 be45aa79 Renato Botelho
					if($wlcfg['auth_server_port2'])
2498 a687f866 Namezero
						$auth_server_port2 = $wlcfg['auth_server_port2'];
2499 5949124c Scott Ullrich
					$wpa .= <<<EOD
2500 525d565b Scott Ullrich
2501 5949124c Scott Ullrich
ieee8021x=1
2502
auth_server_addr={$wlcfg['auth_server_addr']}
2503
auth_server_port={$auth_server_port}
2504
auth_server_shared_secret={$wlcfg['auth_server_shared_secret']}
2505 a687f866 Namezero
auth_server_addr={$wlcfg['auth_server_addr2']}
2506
auth_server_port={$auth_server_port2}
2507
auth_server_shared_secret={$wlcfg['auth_server_shared_secret2']}
2508 525d565b Scott Ullrich
2509 459d6351 Scott Ullrich
EOD;
2510 5949124c Scott Ullrich
				} else {
2511
					$wpa .= "ieee8021x={$wlcfg['wpa']['ieee8021x']}\n";
2512
				}
2513 2ac908dd Espen Johansen
2514 80ec5eaa Scott Ullrich
				$fd = fopen("{$g['varetc_path']}/hostapd_{$if}.conf", "w");
2515 ac3f8318 Espen Johansen
				fwrite($fd, "{$wpa}");
2516
				fclose($fd);
2517 2ac908dd Espen Johansen
2518 ac3f8318 Espen Johansen
			}
2519 2a203afd Seth Mos
			break;
2520 eb772abd Scott Ullrich
	}
2521 ac3f8318 Espen Johansen
2522 4742e927 Scott Ullrich
	/*
2523
	 *    all variables are set, lets start up everything
2524 2a203afd Seth Mos
	 */
2525 eb772abd Scott Ullrich
2526 bbfc810e Erik Fonnesbeck
	$baseif = interface_get_wireless_base($if);
2527 56626335 Erik Fonnesbeck
	preg_match("/^(.*?)([0-9]*)$/", $baseif, $baseif_split);
2528
	$wl_sysctl_prefix = 'dev.' . $baseif_split[1] . '.' . $baseif_split[2];
2529
2530
	/* set sysctls for the wireless interface */
2531
	if (!empty($wl_sysctl)) {
2532
		fwrite($fd_set, "# sysctls for {$baseif}\n");
2533
		foreach ($wl_sysctl as $wl_sysctl_line) {
2534
			fwrite($fd_set, "{$sysctl} {$wl_sysctl_prefix}.{$wl_sysctl_line}\n");
2535
		}
2536
	}
2537 bbfc810e Erik Fonnesbeck
2538 78922914 Scott Ullrich
	/* set ack timers according to users preference (if he/she has any) */
2539
	if($distance) {
2540 4742e927 Scott Ullrich
		fwrite($fd_set, "# Enable ATH distance settings\n");
2541 e327021d Erik Fonnesbeck
		fwrite($fd_set, "/sbin/athctrl.sh -i {$baseif} -d {$distance}\n");
2542 78922914 Scott Ullrich
	}
2543 eb772abd Scott Ullrich
2544 ac3f8318 Espen Johansen
	if (isset($wlcfg['wpa']['enable'])) {
2545 2a203afd Seth Mos
		if ($wlcfg['mode'] == "bss") {
2546 4742e927 Scott Ullrich
			fwrite($fd_set, "{$wpa_supplicant} -B -i {$if} -c {$g['varetc_path']}/wpa_supplicant_{$if}.conf\n");
2547 2a203afd Seth Mos
		}
2548
		if ($wlcfg['mode'] == "hostap") {
2549 864bf774 Erik Fonnesbeck
			/* add line to script to restore old mac to make hostapd happy */
2550 acb0bce0 Erik Fonnesbeck
			if (file_exists("{$g['tmp_path']}/{$if}_oldmac")) {
2551
				$if_oldmac = file_get_contents("{$g['tmp_path']}/{$if}_oldmac");
2552
				if (is_macaddr($if_oldmac))
2553
					fwrite($fd_set, "{$ifconfig} " . escapeshellarg($if) .
2554
						" link " . escapeshellarg($if_oldmac) . "\n");
2555
			}
2556
2557 97f3ce0f Phil Davis
			fwrite($fd_set, "{$hostapd} -B -P {$g['varrun_path']}/hostapd_{$if}.pid {$g['varetc_path']}/hostapd_{$if}.conf\n");
2558 864bf774 Erik Fonnesbeck
2559
			/* add line to script to restore spoofed mac after running hostapd */
2560
			if (file_exists("{$g['tmp_path']}/{$if}_oldmac")) {
2561
				if ($wl['spoofmac'])
2562
					$if_curmac = $wl['spoofmac'];
2563
				else
2564
					$if_curmac = get_interface_mac($if);
2565
				if (is_macaddr($if_curmac))
2566
					fwrite($fd_set, "{$ifconfig} " . escapeshellarg($if) .
2567
						" link " . escapeshellarg($if_curmac) . "\n");
2568
			}
2569 2a203afd Seth Mos
		}
2570 ac3f8318 Espen Johansen
	}
2571 191a8175 Scott Ullrich
2572 4742e927 Scott Ullrich
	fclose($fd_set);
2573 8a958125 Scott Ullrich
	conf_mount_ro();
2574
2575 bbfc810e Erik Fonnesbeck
	/* Making sure regulatory settings have actually changed
2576
	 * before applying, because changing them requires bringing
2577
	 * down all wireless networks on the interface. */
2578
	exec("{$ifconfig} " . escapeshellarg($if), $output);
2579
	$ifconfig_str = implode($output);
2580
	unset($output);
2581
	$reg_changing = false;
2582
2583 89e7778f Erik Fonnesbeck
	/* special case for the debug country code */
2584
	if ($wlcfg['regcountry'] == 'DEBUG' && !preg_match("/\sregdomain\s+DEBUG\s/si", $ifconfig_str))
2585
		$reg_changing = true;
2586
	else if ($wlcfg['regdomain'] && !preg_match("/\sregdomain\s+{$wlcfg['regdomain']}\s/si", $ifconfig_str))
2587 bbfc810e Erik Fonnesbeck
		$reg_changing = true;
2588
	else if ($wlcfg['regcountry'] && !preg_match("/\scountry\s+{$wlcfg['regcountry']}\s/si", $ifconfig_str))
2589
		$reg_changing = true;
2590 89e7778f Erik Fonnesbeck
	else if ($wlcfg['reglocation'] == 'anywhere' && preg_match("/\s(indoor|outdoor)\s/si", $ifconfig_str))
2591
		$reg_changing = true;
2592 06cb2656 Erik Fonnesbeck
	else if ($wlcfg['reglocation'] && $wlcfg['reglocation'] != 'anywhere' && !preg_match("/\s{$wlcfg['reglocation']}\s/si", $ifconfig_str))
2593 bbfc810e Erik Fonnesbeck
		$reg_changing = true;
2594
2595
	if ($reg_changing) {
2596
		/* set regulatory domain */
2597
		if($wlcfg['regdomain'])
2598
			$wlregcmd[] = "regdomain " . escapeshellarg($wlcfg['regdomain']);
2599
2600
		/* set country */
2601
		if($wlcfg['regcountry'])
2602
			$wlregcmd[] = "country " . escapeshellarg($wlcfg['regcountry']);
2603
2604
		/* set location */
2605
		if($wlcfg['reglocation'])
2606
			$wlregcmd[] = escapeshellarg($wlcfg['reglocation']);
2607
2608
		$wlregcmd_args = implode(" ", $wlregcmd);
2609
2610
		/* build a complete list of the wireless clones for this interface */
2611
		$clone_list = array();
2612
		if (does_interface_exist(interface_get_wireless_clone($baseif)))
2613
			$clone_list[] = interface_get_wireless_clone($baseif);
2614 6ef2297b Erik Fonnesbeck
		if (isset($config['wireless']['clone']) && is_array($config['wireless']['clone'])) {
2615 bbfc810e Erik Fonnesbeck
			foreach ($config['wireless']['clone'] as $clone) {
2616
				if ($clone['if'] == $baseif)
2617
					$clone_list[] = $clone['cloneif'];
2618
			}
2619
		}
2620
2621
		/* find which clones are up and bring them down */
2622
		$clones_up = array();
2623
		foreach ($clone_list as $clone_if) {
2624 1cf76394 Erik Fonnesbeck
			$clone_status = pfSense_get_interface_addresses($clone_if);
2625 bbfc810e Erik Fonnesbeck
			if ($clone_status['status'] == 'up') {
2626
				$clones_up[] = $clone_if;
2627
				mwexec("{$ifconfig} " . escapeshellarg($clone_if) . " down");
2628
			}
2629
		}
2630
2631
		/* apply the regulatory settings */
2632
		mwexec("{$ifconfig} " . escapeshellarg($if) . " {$wlregcmd_args}");
2633
2634
		/* bring the clones back up that were previously up */
2635
		foreach ($clones_up as $clone_if) {
2636
			mwexec("{$ifconfig} " . escapeshellarg($clone_if) . " up");
2637 67e77adf Erik Fonnesbeck
2638
			/*
2639
			 * Rerun the setup script for the interface if it isn't this interface, the interface
2640
			 * is in infrastructure mode, and WPA is enabled.
2641
			 * This can be removed if wpa_supplicant stops dying when you bring the interface down.
2642
			 */
2643
			if ($clone_if != $if) {
2644
				$friendly_if = convert_real_interface_to_friendly_interface_name($clone_if);
2645
				if ( !empty($friendly_if)
2646
				    && $config['interfaces'][$friendly_if]['wireless']['mode'] == "bss"
2647
				    && isset($config['interfaces'][$friendly_if]['wireless']['wpa']['enable']) ) {
2648
					mwexec("/bin/sh {$g['tmp_path']}/{$clone_if}_setup.sh");
2649
				}
2650
			}
2651 bbfc810e Erik Fonnesbeck
		}
2652
	}
2653
2654 23fdc06e Erik Fonnesbeck
	/* The mode must be specified in a separate command before ifconfig
2655
	 * will allow the mode and channel at the same time in the next. */
2656 9be20928 Erik Fonnesbeck
	mwexec("/sbin/ifconfig {$if} mode " . escapeshellarg($standard));
2657 23fdc06e Erik Fonnesbeck
2658 2a48a885 Erik Fonnesbeck
	/* configure wireless */
2659
	$wlcmd_args = implode(" ", $wlcmd);
2660
	mwexec("/sbin/ifconfig {$if} $wlcmd_args", false);
2661
2662 be45aa79 Renato Botelho
2663 2a203afd Seth Mos
	sleep(1);
2664
	/* execute hostapd and wpa_supplicant if required in shell */
2665 6955830f Ermal Lu?i
	mwexec("/bin/sh {$g['tmp_path']}/{$if}_setup.sh");
2666 191a8175 Scott Ullrich
2667 ac3f8318 Espen Johansen
	return 0;
2668 cfc707f7 Scott Ullrich
2669 5b237745 Scott Ullrich
}
2670
2671 eba938e3 Scott Ullrich
function kill_hostapd($interface) {
2672 97f3ce0f Phil Davis
	global $g;
2673
2674
	if (isvalidpid("{$g['varrun_path']}/hostapd_{$interface}.pid"))
2675
		return killbypid("{$g['varrun_path']}/hostapd_{$interface}.pid");
2676 4b2a6180 Scott Ullrich
}
2677
2678 eba938e3 Scott Ullrich
function kill_wpasupplicant($interface) {
2679 31b958d5 Erik Fonnesbeck
	return "/bin/pkill -f \"wpa_supplicant .*{$interface}\\.conf\"\n";
2680 4b2a6180 Scott Ullrich
}
2681
2682 eba938e3 Scott Ullrich
function find_dhclient_process($interface) {
2683 319cbd5e Ermal
	if ($interface)
2684 05c4bfa0 Ermal
		$pid = `/bin/pgrep -axf "dhclient: {$interface}"`;
2685 319cbd5e Ermal
	else
2686
		$pid = 0;
2687
2688 bcfe4ae5 Ermal
	return intval($pid);
2689 0311dbd5 Scott Ullrich
}
2690
2691 c495f88b Seth Mos
function find_dhcp6c_process($interface) {
2692 b0059636 Ermal
	global $g;
2693
2694 4e6667b2 Renato Botelho
	if ($interface && isvalidpid("{$g['varrun_path']}/dhcp6c_{$interface}.pid"))
2695
		$pid = trim(file_get_contents("{$g['varrun_path']}/dhcp6c_{$interface}.pid"), " \n");
2696
	else
2697 74fa57aa smos
		return(false);
2698 c495f88b Seth Mos
2699
	return intval($pid);
2700
}
2701
2702 4ffa46bf Ermal
function interface_vlan_mtu_configured($realhwif, $mtu) {
2703
	global $config;
2704
2705
	if (is_array($config['vlans']['vlan'])) {
2706
		foreach ($config['vlans']['vlan'] as $vlan) {
2707
			if ($vlan['if'] != $realhwif)
2708
				continue;
2709 a1d36777 Renato Botelho
			$assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
2710
			if (!empty($assignedport)) {
2711
				$portmtu = $config['interfaces'][$assignedport]['mtu'];
2712 4ffa46bf Ermal
				if (!empty($portmtu) && $portmtu > $mtu)
2713
					$mtu = $portmtu;
2714
			}
2715
		}
2716
	}
2717
2718
	return $mtu;
2719
}
2720
2721 7413cbfd Ermal
function interface_configure($interface = "wan", $reloadall = false, $linkupevent = false) {
2722 675aac3d Ermal Luçi
	global $config, $g;
2723 31b24870 Ermal Luçi
	global $interface_sn_arr_cache, $interface_ip_arr_cache;
2724 3502b5b1 Seth Mos
	global $interface_snv6_arr_cache, $interface_ipv6_arr_cache;
2725 cfc707f7 Scott Ullrich
2726 67ee1ec5 Ermal Luçi
	$wancfg = $config['interfaces'][$interface];
2727
2728 e017a46a Ermal
	if (!isset($wancfg['enable']))
2729
		return;
2730
2731 85a5da13 Ermal Luçi
	$realif = get_real_interface($interface);
2732 20cb9803 gnhb
	$realhwif_array = get_parent_interface($interface);
2733
	// Need code to handle MLPPP if we ever use $realhwif for MLPPP handling
2734
	$realhwif = $realhwif_array[0];
2735 cfc707f7 Scott Ullrich
2736 5a3031ea smos
	/* Disable Accepting router advertisements unless specifically requested */
2737 9cd6b950 Ermal
	if ($g['debug'])
2738
		log_error("Deny router advertisements for interface {$interface}");
2739 5a3031ea smos
	mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 -accept_rtadv");
2740 be45aa79 Renato Botelho
2741 f382c6de Ermal
	if (!$g['booting'] && !(substr($realif, 0, 4) == "ovpn")) {
2742 3c5e10fc Seth Mos
		/* remove all IPv4 and IPv6 addresses */
2743 332683cb Seth Mos
		while (mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " -alias", true) == 0);
2744 3502b5b1 Seth Mos
		while (mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 -alias", true) == 0);
2745 3896d93e Erik Fonnesbeck
2746 8103bd1e Seth Mos
		/* only bring down the interface when both v4 and v6 are set to NONE */
2747 733829a9 Renato Botelho
		if(empty($wancfg['ipaddr']) && empty($wancfg['ipaddrv6'])) {
2748 8103bd1e Seth Mos
			interface_bring_down($interface);
2749 3896d93e Erik Fonnesbeck
		}
2750 28d22199 Scott Ullrich
	}
2751 acc1e9d0 Scott Ullrich
2752 0a28d385 Erik Fonnesbeck
	/* wireless configuration? */
2753 5b237745 Scott Ullrich
	if (is_array($wancfg['wireless']))
2754 0a28d385 Erik Fonnesbeck
		interface_wireless_configure($realif, $wancfg, $wancfg['wireless']);
2755 cfc707f7 Scott Ullrich
2756 49db607f jim-p
	$mac = get_interface_mac($realhwif);
2757 1489e8c8 Renato Botelho
	/*
2758
	 * Don't try to reapply the spoofed MAC if it's already applied.
2759
	 * When ifconfig link is used, it cycles the interface down/up, which triggers
2760
	 * the interface config again, which attempts to spoof the MAC again,
2761
	 * which cycles the link again...
2762
	 */
2763 49db607f jim-p
	if ($wancfg['spoofmac'] && ($wancfg['spoofmac'] != $mac)) {
2764 3e5d0d1d Ermal
		mwexec("/sbin/ifconfig " . escapeshellarg($realhwif) .
2765 5b237745 Scott Ullrich
			" link " . escapeshellarg($wancfg['spoofmac']));
2766 ac8ff0a4 Ermal
2767 1489e8c8 Renato Botelho
		/*
2768
		 * All vlans need to spoof their parent mac address, too.  see
2769
		 * ticket #1514: http://cvstrac.pfsense.com/tktview?tn=1514,33
2770
		 */
2771
		if (is_array($config['vlans']['vlan'])) {
2772
			foreach ($config['vlans']['vlan'] as $vlan) {
2773
				if ($vlan['if'] == $realhwif)
2774
					mwexec("/sbin/ifconfig " . escapeshellarg($vlan['vlanif']) .
2775
					" link " . escapeshellarg($wancfg['spoofmac']));
2776
			}
2777
		}
2778 f36d4bd2 Scott Ullrich
	}  else {
2779 a687f866 Namezero
2780 3e5d0d1d Ermal
		if ($mac == "ff:ff:ff:ff:ff:ff") {
2781 f36d4bd2 Scott Ullrich
			/*   this is not a valid mac address.  generate a
2782
			 *   temporary mac address so the machine can get online.
2783
			 */
2784 07e40c1f Carlos Eduardo Ramos
			echo gettext("Generating new MAC address.");
2785 f36d4bd2 Scott Ullrich
			$random_mac = generate_random_mac_address();
2786 3e5d0d1d Ermal
			mwexec("/sbin/ifconfig " . escapeshellarg($realhwif) .
2787 f36d4bd2 Scott Ullrich
				" link " . escapeshellarg($random_mac));
2788
			$wancfg['spoofmac'] = $random_mac;
2789
			write_config();
2790 addc0439 Renato Botelho
			file_notice("MAC Address altered", sprintf(gettext('The INVALID MAC address (ff:ff:ff:ff:ff:ff) on interface %1$s has been automatically replaced with %2$s'), $realif, $random_mac), "Interfaces");
2791 f36d4bd2 Scott Ullrich
		}
2792
	}
2793 cfc707f7 Scott Ullrich
2794 5b237745 Scott Ullrich
	/* media */
2795
	if ($wancfg['media'] || $wancfg['mediaopt']) {
2796 3e5d0d1d Ermal
		$cmd = "/sbin/ifconfig " . escapeshellarg($realhwif);
2797 5b237745 Scott Ullrich
		if ($wancfg['media'])
2798
			$cmd .= " media " . escapeshellarg($wancfg['media']);
2799
		if ($wancfg['mediaopt'])
2800
			$cmd .= " mediaopt " . escapeshellarg($wancfg['mediaopt']);
2801
		mwexec($cmd);
2802
	}
2803 3e5d0d1d Ermal
	$options = pfSense_get_interface_addresses($realhwif);
2804 9a4c3eed Ermal
	if (is_array($options) && isset($options['caps']['polling'])) {
2805
		if (isset($config['system']['polling']))
2806
			pfSense_interface_capabilities($realif, IFCAP_POLLING);
2807
		else
2808
			pfSense_interface_capabilities($realif, -IFCAP_POLLING);
2809
	}
2810
2811 51d5aad7 Ermal
	/* skip vlans for checksumming and polling */
2812 7965c38f Ermal
	if (!stristr($realif, "_vlan") && is_array($options)) {
2813 51d5aad7 Ermal
		$flags = 0;
2814
		if(isset($config['system']['disablechecksumoffloading'])) {
2815
			if (isset($options['encaps']['txcsum']))
2816
				$flags |= IFCAP_TXCSUM;
2817
			if (isset($options['encaps']['rxcsum']))
2818
				$flags |= IFCAP_RXCSUM;
2819 1489e8c8 Renato Botelho
		} else {
2820
			if (!isset($options['caps']['txcsum']))
2821 51d5aad7 Ermal
				$flags |= IFCAP_TXCSUM;
2822
			if (!isset($options['caps']['rxcsum']))
2823
				$flags |= IFCAP_RXCSUM;
2824 1489e8c8 Renato Botelho
		}
2825 51d5aad7 Ermal
2826 1489e8c8 Renato Botelho
		if(isset($config['system']['disablesegmentationoffloading'])) {
2827
			if (isset($options['encaps']['tso4']))
2828 51d5aad7 Ermal
				$flags |= IFCAP_TSO;
2829 1489e8c8 Renato Botelho
			if (isset($options['encaps']['tso6']))
2830 51d5aad7 Ermal
				$flags |= IFCAP_TSO;
2831 1489e8c8 Renato Botelho
		} else {
2832
			if (!isset($options['caps']['tso4']))
2833 51d5aad7 Ermal
				$flags |= IFCAP_TSO;
2834 1489e8c8 Renato Botelho
			if (!isset($options['caps']['tso6']))
2835 51d5aad7 Ermal
				$flags |= IFCAP_TSO;
2836 1489e8c8 Renato Botelho
		}
2837 51d5aad7 Ermal
2838 1489e8c8 Renato Botelho
		if(isset($config['system']['disablelargereceiveoffloading'])) {
2839
			if (isset($options['encaps']['lro']))
2840 51d5aad7 Ermal
				$flags |= IFCAP_LRO;
2841 1489e8c8 Renato Botelho
		} else {
2842
			if (!isset($options['caps']['lro']))
2843 51d5aad7 Ermal
				$flags |= IFCAP_LRO;
2844 1489e8c8 Renato Botelho
		}
2845 51d5aad7 Ermal
2846 1489e8c8 Renato Botelho
		/* if the NIC supports polling *AND* it is enabled in the GUI */
2847
		if (!isset($config['system']['polling']) || !isset($options['caps']['polling'])) {
2848 51d5aad7 Ermal
			$flags |= IFCAP_POLLING;
2849
		}
2850 1489e8c8 Renato Botelho
		pfSense_interface_capabilities($realhwif, -$flags);
2851 51d5aad7 Ermal
	}
2852
2853 31b24870 Ermal Luçi
	/* invalidate interface/ip/sn cache */
2854 eba938e3 Scott Ullrich
	get_interface_arr(true);
2855 31b24870 Ermal Luçi
	unset($interface_ip_arr_cache[$realif]);
2856
	unset($interface_sn_arr_cache[$realif]);
2857 5a5413bb Seth Mos
	unset($interface_ipv6_arr_cache[$realif]);
2858
	unset($interface_snv6_arr_cache[$realif]);
2859 ccbd2447 Ermal Luçi
2860 5b237745 Scott Ullrich
	switch ($wancfg['ipaddr']) {
2861
		case 'dhcp':
2862 1fb7c265 Ermal Luçi
			interface_dhcp_configure($interface);
2863 5b237745 Scott Ullrich
			break;
2864
		case 'pppoe':
2865 8af6c46d gnhb
		case 'l2tp':
2866 5b237745 Scott Ullrich
		case 'pptp':
2867 9ebe7028 gnhb
		case 'ppp':
2868 64d124c5 gnhb
			interface_ppps_configure($interface);
2869 9ebe7028 gnhb
			break;
2870 5b237745 Scott Ullrich
		default:
2871 8103bd1e Seth Mos
			if (is_ipaddr($wancfg['ipaddr']) && $wancfg['subnet'] <> "") {
2872 871768cf Ermal
				pfSense_interface_setaddress($realif, "{$wancfg['ipaddr']}/{$wancfg['subnet']}");
2873 d1eea523 Ermal
			} else if (substr($realif, 0, 3) == "gre") {
2874
				if (is_array($config['gres']['gre'])) {
2875
					foreach ($config['gres']['gre'] as $gre)
2876
						if ($gre['greif'] == $realif)
2877
							interface_gre_configure($gre);
2878
				}
2879
			} else if (substr($realif, 0, 3) == "gif") {
2880 1489e8c8 Renato Botelho
				if (is_array($config['gifs']['gif'])) {
2881 d1eea523 Ermal
					foreach ($config['gifs']['gif'] as $gif)
2882 d1ae9705 Ermal
						if($gif['gifif'] == $realif)
2883 d1eea523 Ermal
							interface_gif_configure($gif);
2884
				}
2885
			} else if (substr($realif, 0, 4) == "ovpn") {
2886
				/* XXX: Should be done anything?! */
2887 acc1e9d0 Scott Ullrich
			}
2888 d1eea523 Ermal
			break;
2889 5b237745 Scott Ullrich
	}
2890 ffeb5acf Scott Ullrich
2891 5a5413bb Seth Mos
	switch ($wancfg['ipaddrv6']) {
2892 feb88a14 smos
		case 'slaac':
2893 8103bd1e Seth Mos
		case 'dhcp6':
2894 7a04cd20 Ermal
			interface_dhcpv6_configure($interface, $wancfg);
2895 8103bd1e Seth Mos
			break;
2896 3f383504 smos
		case '6rd':
2897 7a04cd20 Ermal
			interface_6rd_configure($interface, $wancfg);
2898 3f383504 smos
			break;
2899 31c43fd3 smos
		case '6to4':
2900 7a04cd20 Ermal
			interface_6to4_configure($interface, $wancfg);
2901 31c43fd3 smos
			break;
2902 20a7cb15 smos
		case 'track6':
2903 d1878053 Renato Botelho
			interface_track6_configure($interface, $wancfg);
2904 20a7cb15 smos
			break;
2905 5a5413bb Seth Mos
		default:
2906 8103bd1e Seth Mos
			if (is_ipaddr($wancfg['ipaddrv6']) && $wancfg['subnetv6'] <> "") {
2907 5a5413bb Seth Mos
				pfSense_interface_setaddress($realif, "{$wancfg['ipaddrv6']}/{$wancfg['subnetv6']}");
2908 3c5e10fc Seth Mos
				// FIXME: Add IPv6 Support to the pfSense module
2909 5a5413bb Seth Mos
				mwexec("/sbin/ifconfig {$realif} inet6 {$wancfg['ipaddrv6']} prefixlen {$wancfg['subnetv6']} ");
2910
			}
2911
			break;
2912
	}
2913
2914 4a735210 Renato Botelho
	$mtu = get_interface_default_mtu(remove_ifindex($realhwif));
2915 20eb8203 Renato Botelho
	$assignedparent = convert_real_interface_to_friendly_interface_name($realhwif);
2916 08e9c732 Ermal
	if (!empty($assignedparent) && !empty($config['interfaces'][$assignedparent]['mtu']))
2917 20eb8203 Renato Botelho
		$mtu = $config['interfaces'][$assignedparent]['mtu'];
2918 4a735210 Renato Botelho
2919 a976c633 Renato Botelho
	$vlanifs = link_interface_to_vlans($realhwif);
2920
	if (empty($vlanifs))
2921
		$vlanifs = array();
2922
2923 d35233da Ermal
	if (!empty($wancfg['mtu'])) {
2924 7965c38f Ermal
		if (stristr($realif, "_vlan")) {
2925 a1d36777 Renato Botelho
			if (!empty($assignedparent)) {
2926
				$parentmtu = $config['interfaces'][$assignedparent]['mtu'];
2927 d35233da Ermal
				if (empty($parentmtu))
2928 6d1594eb Ermal
					$parentmtu = interface_vlan_mtu_configured($realhwif, $wancfg['mtu']);
2929 2fff3ba2 Ermal
				if ($wancfg['mtu'] > $parentmtu) {
2930 43c6c9af Renato Botelho
					if (get_interface_mtu($realhwif) != $wancfg['mtu'])
2931
						pfSense_interface_mtu($realhwif, $wancfg['mtu']);
2932 2fff3ba2 Ermal
2933
					/* All vlans need to use the same mtu value as their parent. */
2934 a976c633 Renato Botelho
					foreach ($vlanifs as $vlan) {
2935
						if ($vlan['vlanif'] == $realif)
2936
							continue;
2937
						$assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
2938
						if (!empty($assignedport)) {
2939
							$portmtu = $config['interfaces'][$assignedport]['mtu'];
2940 43c6c9af Renato Botelho
							if (empty($portmtu) && (get_interface_mtu($vlan['vlanif']) != $wancfg['mtu']))
2941 2fff3ba2 Ermal
								pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']);
2942 43c6c9af Renato Botelho
						} else if (get_interface_mtu($vlan['vlanif']) != $wancfg['mtu'])
2943 a976c633 Renato Botelho
							pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']);
2944 2fff3ba2 Ermal
					}
2945
				}
2946 4ffa46bf Ermal
			} else {
2947 be2c39b6 Renato Botelho
				/* Parent is not assigned, back to default */
2948
				if (get_interface_mtu($realhwif) != $mtu)
2949
					pfSense_interface_mtu($realhwif, $mtu);
2950
2951
				/* All vlans need to use the same mtu value as their parent. */
2952
				foreach ($vlanifs as $vlan) {
2953
					if ($vlan['vlanif'] == $realif)
2954
						continue;
2955
					$assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
2956
					if (!empty($assignedport)) {
2957
						$portmtu = $config['interfaces'][$assignedport]['mtu'];
2958 43c6c9af Renato Botelho
						if (empty($portmtu) && (get_interface_mtu($vlan['vlanif']) != $mtu))
2959 be2c39b6 Renato Botelho
							pfSense_interface_mtu($vlan['vlanif'], $mtu);
2960 43c6c9af Renato Botelho
					} else if (get_interface_mtu($vlan['vlanif']) != $mtu)
2961 be2c39b6 Renato Botelho
						pfSense_interface_mtu($vlan['vlanif'], $mtu);
2962 4ffa46bf Ermal
				}
2963 be2c39b6 Renato Botelho
2964
				if (get_interface_mtu($realif) != $wancfg['mtu'])
2965
					pfSense_interface_mtu($realif, $wancfg['mtu']);
2966 4ffa46bf Ermal
			}
2967 a362a23a Ermal
		} else {
2968 a976c633 Renato Botelho
			foreach ($vlanifs as $vlan) {
2969
				$assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
2970 43c6c9af Renato Botelho
				if (empty($assignedport)) {
2971
					if (get_interface_mtu($vlan['vlanif']) != $wancfg['mtu'])
2972
						pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']);
2973
				} else {
2974 a976c633 Renato Botelho
					$vlanmtu = $config['interfaces'][$assignedport]['mtu'];
2975 f5c2bf1e Renato Botelho
					if ((empty($vlanmtu) || ($vlanmtu >= $wancfg['mtu'])) && (get_interface_mtu($vlan['vlanif']) != $wancfg['mtu']))
2976 a362a23a Ermal
						pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']);
2977
				}
2978
			}
2979 1e08ce64 Ermal
		}
2980
		if ($wancfg['mtu'] != get_interface_mtu($realif))
2981 b1939343 Ermal
			pfSense_interface_mtu($realif, $wancfg['mtu']);
2982 76254caa Renato Botelho
	} else if (stristr($realif, "_vlan")) {
2983 59297ade Ermal
		/* XXX: This is really dangerous for example with vlans changing their parent mtu! */
2984 4ffa46bf Ermal
		$bigmtu = interface_vlan_mtu_configured($realhwif, $mtu);
2985
		if ($mtu < $bigmtu)
2986
			$mtu = $bigmtu;
2987 43c6c9af Renato Botelho
2988
		if (get_interface_mtu($realhwif) != $mtu)
2989
			pfSense_interface_mtu($realhwif, $mtu);
2990 4ffa46bf Ermal
2991
		/* All vlans need to use the same mtu value as their parent. */
2992 a976c633 Renato Botelho
		foreach ($vlanifs as $vlan) {
2993
			if ($vlan['vlanif'] == $realif)
2994
				continue;
2995
			$assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
2996
			if (!empty($assignedport)) {
2997
				$portmtu = $config['interfaces'][$assignedport]['mtu'];
2998 43c6c9af Renato Botelho
				if (empty($portmtu) && (get_interface_mtu($vlan['vlanif']) != $mtu))
2999 1dedfdd1 Ermal
					pfSense_interface_mtu($vlan['vlanif'], $mtu);
3000 43c6c9af Renato Botelho
			} else if (get_interface_mtu($vlan['vlanif']) != $mtu)
3001 a976c633 Renato Botelho
				pfSense_interface_mtu($vlan['vlanif'], $mtu);
3002 4ffa46bf Ermal
		}
3003 43c6c9af Renato Botelho
		if (get_interface_mtu($realif) != $mtu)
3004
			pfSense_interface_mtu($realif, $mtu);
3005 3f3252f6 Renato Botelho
	} else {
3006
		/* All vlans need to use the same mtu value as their parent. */
3007
		foreach ($vlanifs as $vlan) {
3008
			$assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
3009
			if (!empty($assignedport)) {
3010
				$portmtu = $config['interfaces'][$assignedport]['mtu'];
3011 43c6c9af Renato Botelho
				if (empty($portmtu) && (get_interface_mtu($vlan['vlanif']) != $mtu))
3012 3f3252f6 Renato Botelho
					pfSense_interface_mtu($vlan['vlanif'], $mtu);
3013 43c6c9af Renato Botelho
			} else if (get_interface_mtu($vlan['vlanif']) != $mtu)
3014 3f3252f6 Renato Botelho
				pfSense_interface_mtu($vlan['vlanif'], $mtu);
3015
		}
3016
		if ($mtu != get_interface_mtu($realhwif))
3017
			pfSense_interface_mtu($realhwif, $mtu);
3018
	}
3019 4a735210 Renato Botelho
3020 a976c633 Renato Botelho
	unset($vlanifs);
3021
3022 435f11c8 Ermal Lu?i
	if(does_interface_exist($wancfg['if']))
3023 7284d850 Scott Ullrich
		interfaces_bring_up($wancfg['if']);
3024 67b057a9 Ermal
3025
	interface_netgraph_needed($interface);
3026 be45aa79 Renato Botelho
3027 5b237745 Scott Ullrich
	if (!$g['booting']) {
3028 dcadda55 Ermal
		link_interface_to_vips($interface, "update");
3029 6991dcb1 Ermal
3030 a639bb91 Ermal
		unset($gre);
3031
		$gre = link_interface_to_gre($interface);
3032
		if (!empty($gre))
3033 ed62880b Ermal
			array_walk($gre, 'interface_gre_configure');
3034 a639bb91 Ermal
3035
		unset($gif);
3036
		$gif = link_interface_to_gif($interface);
3037
		if (!empty($gif))
3038 8103bd1e Seth Mos
			array_walk($gif, 'interface_gif_configure');
3039 a639bb91 Ermal
3040 bf17eb72 Ermal
		if ($linkupevent == false || substr($realif, 0, 4) == "ovpn") {
3041 7413cbfd Ermal
			unset($bridgetmp);
3042
			$bridgetmp = link_interface_to_bridge($interface);
3043
			if (!empty($bridgetmp))
3044
				interface_bridge_add_member($bridgetmp, $realif);
3045
		}
3046 ccbd2447 Ermal Luçi
3047 48f23632 Ermal
		$grouptmp = link_interface_to_group($interface);
3048
		if (!empty($grouptmp))
3049 ed62880b Ermal
			array_walk($grouptmp, 'interface_group_add_member');
3050 48f23632 Ermal
3051 a5d6f60b Ermal Lu?i
		if ($interface == "lan")
3052 4476d447 Ermal Luçi
			/* make new hosts file */
3053 ffeb5acf Scott Ullrich
			system_hosts_generate();
3054 4476d447 Ermal Luçi
3055 a5d6f60b Ermal Lu?i
		if ($reloadall == true) {
3056 cfc707f7 Scott Ullrich
3057 a5d6f60b Ermal Lu?i
			/* reconfigure static routes (kernel may have deleted them) */
3058 1ea67f2e Ermal
			system_routing_configure($interface);
3059 cfc707f7 Scott Ullrich
3060 a5d6f60b Ermal Lu?i
			/* reload ipsec tunnels */
3061
			vpn_ipsec_configure();
3062 cfc707f7 Scott Ullrich
3063 b5eeef07 Ermal
			/* restart dnsmasq */
3064
			services_dnsmasq_configure();
3065
3066 a5d6f60b Ermal Lu?i
			/* update dyndns */
3067 422bc2a7 Ermal
			send_event("service reload dyndns {$interface}");
3068 a23d7248 Scott Ullrich
3069 a5d6f60b Ermal Lu?i
			/* reload captive portal */
3070 769e254e Ermal
			captiveportal_init_rules();
3071 a5d6f60b Ermal Lu?i
		}
3072 5b237745 Scott Ullrich
	}
3073 cfc707f7 Scott Ullrich
3074 5b237745 Scott Ullrich
	return 0;
3075
}
3076
3077 7a04cd20 Ermal
function interface_track6_configure($interface = "lan", $wancfg) {
3078 20a7cb15 smos
	global $config, $g;
3079
3080 7a04cd20 Ermal
	if (!is_array($wancfg))
3081
		return;
3082
3083
	if (!isset($wancfg['enable']))
3084 b0059636 Ermal
		return;
3085 be45aa79 Renato Botelho
3086 20a7cb15 smos
	/* If the interface is not configured via another, exit */
3087 b0059636 Ermal
	if (empty($wancfg['track6-interface']))
3088
		return;
3089 20a7cb15 smos
3090 e90c833a smos
	/* always configure a link-local of fe80::1:1 on the track6 interfaces */
3091
	$realif = get_real_interface($interface);
3092
	mwexec("/sbin/ifconfig {$realif} inet6 fe80::1:1%{$realif}");
3093
3094 7a04cd20 Ermal
	$trackcfg = $config['interfaces'][$wancfg['track6-interface']];
3095
	if (!isset($trackcfg['enable'])) {
3096
		log_error("Interface {$interface} tracking non-existant interface {$wancfg['track6-interface']}");
3097
		return;
3098
	}
3099
3100
	switch($trackcfg['ipaddrv6']) {
3101 6fb66736 Ermal
	case "6to4":
3102
		if ($g['debug'])
3103
			log_error("Interface {$interface} configured via {$wancfg['track6-interface']}  type {$type}");
3104
		interface_track6_6to4_configure($interface, $wancfg);
3105
		break;
3106
	case "6rd":
3107
		if ($g['debug'])
3108
			log_error("Interface {$interface} configured via {$wancfg['track6-interface']}  type {$type}");
3109
		interface_track6_6rd_configure($interface, $wancfg);
3110
		break;
3111
	case "dhcp6":
3112
		if ($g['debug'])
3113
			log_error("Interface {$interface} configured via {$wancfg['track6-interface']}  type {$type}");
3114
		interface_track6_dhcp6_configure($interface, $wancfg);
3115
		break;
3116 20a7cb15 smos
	}
3117 b0059636 Ermal
3118 7fd67662 Ermal
	if (!$g['booting']) {
3119
		if (!function_exists('services_dhcpd_configure'))
3120
			require_once("services.inc");
3121 6387590f Ermal
3122 7fd67662 Ermal
		services_dhcpd_configure("inet6");
3123
	}
3124 6387590f Ermal
3125 20a7cb15 smos
	return 0;
3126
}
3127
3128 7a04cd20 Ermal
function interface_track6_6rd_configure($interface = "lan", $lancfg) {
3129 20a7cb15 smos
	global $config, $g;
3130 da9dd1b4 Ermal
	global $interface_ipv6_arr_cache;
3131
        global $interface_snv6_arr_cache;
3132 20a7cb15 smos
3133 7a04cd20 Ermal
	if (!is_array($lancfg))
3134 b0059636 Ermal
		return;
3135 be45aa79 Renato Botelho
3136 20a7cb15 smos
	/* If the interface is not configured via another, exit */
3137 b0059636 Ermal
	if (empty($lancfg['track6-interface']))
3138
		return;
3139
3140
	if (!is_numeric($lancfg['track6-prefix-id']))
3141 20a7cb15 smos
		$lancfg['track6-prefix-id'] = 0;
3142 be45aa79 Renato Botelho
3143 20a7cb15 smos
	$wancfg = $config['interfaces'][$lancfg['track6-interface']];
3144 7a04cd20 Ermal
	if (empty($wancfg)) {
3145
		log_error("Interface {$interface} tracking non-existant interface {$lancfg['track6-interface']}");
3146 b0059636 Ermal
		return;
3147 7a04cd20 Ermal
	}
3148 be45aa79 Renato Botelho
3149 ff5674dc Ermal
	$ip4address = get_interface_ip($lancfg['track6-interface']);
3150 7a04cd20 Ermal
	if (!is_ipaddrv4($ip4address)) { /* XXX: This should not be needed by 6rd || (is_private_ip($ip4address))) { */
3151 ff5674dc Ermal
		log_error("The interface IPv4 '{$ip4address}' address on interface '{$lancfg['track6-interface']}' is not public, not configuring 6RD tunnel");
3152 b0059636 Ermal
		return;
3153 20a7cb15 smos
	}
3154
	$hexwanv4 = return_hex_ipv4($ip4address);
3155 be45aa79 Renato Botelho
3156 20a7cb15 smos
	/* create the long prefix notation for math, save the prefix length */
3157
	$rd6prefix = explode("/", $wancfg['prefix-6rd']);
3158
	$rd6prefixlen = $rd6prefix[1];
3159
	$rd6prefix = Net_IPv6::uncompress($rd6prefix[0]);
3160
3161
	/* binary presentation of the prefix for all 128 bits. */
3162
	$rd6lanbin = convert_ipv6_to_128bit($rd6prefix);
3163 be45aa79 Renato Botelho
3164 20a7cb15 smos
	/* just save the left prefix length bits */
3165
	$rd6lanbin = substr($rd6lanbin, 0, $rd6prefixlen);
3166
	/* add the v4 address, offset n bits from the left */
3167
	$rd6lanbin .= substr(sprintf("%032b", hexdec($hexwanv4)), (0 + $wancfg['prefix-6rd-v4plen']), 32);
3168
3169
	/* add the custom prefix id, max 32bits long? (64 bits - (prefixlen + (32 - v4plen)) */
3170
	/* 64 - (37 + (32 - 17)) = 8 == /52 */
3171
	$restbits = 64 - ($rd6prefixlen + (32 - $wancfg['prefix-6rd-v4plen']));
3172
	// echo "64 - (prefixlen {$rd6prefixlen} + v4len (32 - {$wancfg['prefix-6rd-v4plen']})) = {$restbits} \n";
3173
	$rd6lanbin .= substr(sprintf("%032b", str_pad($lancfg['track6-prefix-id'], 32, "0", STR_PAD_LEFT)), (32 - $restbits), 32);
3174
	/* fill the rest out with zeros */
3175
	$rd6lanbin = str_pad($rd6lanbin, 128, "0", STR_PAD_RIGHT);;
3176
3177 be45aa79 Renato Botelho
	/* convert the 128 bits for the lan address back into a valid IPv6 address */
3178 20a7cb15 smos
	$rd6lan = convert_128bit_to_ipv6($rd6lanbin) ."1";
3179 be45aa79 Renato Botelho
3180 b0059636 Ermal
	$lanif = get_real_interface($interface);
3181 c4fc2eae Ermal
	$oip = find_interface_ipv6($lanif);
3182
	if (is_ipaddrv6($oip))
3183
		mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete");
3184 da9dd1b4 Ermal
	unset($interface_ipv6_arr_cache[$lanif]);
3185
	unset($interface_snv6_arr_cache[$lanif]);
3186 20a7cb15 smos
	log_error("rd6 {$interface} with ipv6 address {$rd6lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}");
3187
	mwexec("/sbin/ifconfig {$lanif} inet6 {$rd6lan} prefixlen 64");
3188 b0059636 Ermal
3189 20a7cb15 smos
	return 0;
3190
}
3191
3192 7a04cd20 Ermal
function interface_track6_6to4_configure($interface = "lan", $lancfg) {
3193 20a7cb15 smos
	global $config, $g;
3194 da9dd1b4 Ermal
	global $interface_ipv6_arr_cache;
3195
        global $interface_snv6_arr_cache;
3196 20a7cb15 smos
3197 7a04cd20 Ermal
	if (!is_array($lancfg))
3198 b0059636 Ermal
		return;
3199 be45aa79 Renato Botelho
3200 20a7cb15 smos
	/* If the interface is not configured via another, exit */
3201 b0059636 Ermal
	if (empty($lancfg['track6-interface']))
3202
		return;
3203
3204 7a04cd20 Ermal
	$wancfg = $config['interfaces'][$lancfg['track6-interface']];
3205
	if (empty($wancfg)) {
3206
		log_error("Interface {$interface} tracking non-existant interface {$lancfg['track6-interface']}");
3207
		return;
3208
	}
3209
3210 b0059636 Ermal
	if (!is_numeric($lancfg['track6-prefix-id']))
3211 20a7cb15 smos
		$lancfg['track6-prefix-id'] = 0;
3212 be45aa79 Renato Botelho
3213 ff5674dc Ermal
	$ip4address = get_interface_ip($lancfg['track6-interface']);
3214 b0059636 Ermal
	if (!is_ipaddrv4($ip4address) || is_private_ip($ip4address)) {
3215 ff5674dc Ermal
		log_error("The interface IPv4 '{$ip4address}' address on interface '{$lancfg['track6-interface']}' is not public, not configuring 6RD tunnel");
3216 b0059636 Ermal
		return;
3217 20a7cb15 smos
	}
3218
	$hexwanv4 = return_hex_ipv4($ip4address);
3219 be45aa79 Renato Botelho
3220 20a7cb15 smos
	/* create the long prefix notation for math, save the prefix length */
3221
	$sixto4prefix = "2002::";
3222
	$sixto4prefixlen = 16;
3223
	$sixto4prefix = Net_IPv6::uncompress($sixto4prefix);
3224
3225
	/* binary presentation of the prefix for all 128 bits. */
3226
	$sixto4lanbin = convert_ipv6_to_128bit($sixto4prefix);
3227 be45aa79 Renato Botelho
3228 20a7cb15 smos
	/* just save the left prefix length bits */
3229
	$sixto4lanbin = substr($sixto4lanbin, 0, $sixto4prefixlen);
3230
	/* add the v4 address */
3231
	$sixto4lanbin .= sprintf("%032b", hexdec($hexwanv4));
3232
	/* add the custom prefix id */
3233
	$sixto4lanbin .= sprintf("%016b", $lancfg['track6-prefix-id']);
3234
	/* fill the rest out with zeros */
3235
	$sixto4lanbin = str_pad($sixto4lanbin, 128, "0", STR_PAD_RIGHT);;
3236 be45aa79 Renato Botelho
3237
	/* convert the 128 bits for the lan address back into a valid IPv6 address */
3238 20a7cb15 smos
	$sixto4lan = convert_128bit_to_ipv6($sixto4lanbin) ."1";
3239 be45aa79 Renato Botelho
3240 b0059636 Ermal
	$lanif = get_real_interface($interface);
3241 c4fc2eae Ermal
	$oip = find_interface_ipv6($lanif);
3242
	if (is_ipaddrv6($oip))
3243
		mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete");
3244 da9dd1b4 Ermal
	unset($interface_ipv6_arr_cache[$lanif]);
3245
	unset($interface_snv6_arr_cache[$lanif]);
3246 20a7cb15 smos
	log_error("sixto4 {$interface} with ipv6 address {$sixto4lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}");
3247
	mwexec("/sbin/ifconfig {$lanif} inet6 {$sixto4lan} prefixlen 64");
3248 b0059636 Ermal
3249 20a7cb15 smos
	return 0;
3250
}
3251
3252 7a41d737 Ermal
function interface_track6_dhcp6_configure($interface = "lan", $lancfg) {
3253
	global $config, $g;
3254 da9dd1b4 Ermal
	global $interface_ipv6_arr_cache;
3255
        global $interface_snv6_arr_cache;
3256 7a41d737 Ermal
3257
	if (!is_array($lancfg))
3258
		return;
3259
3260
	/* If the interface is not configured via another, exit */
3261
	if (empty($lancfg['track6-interface']))
3262
		return;
3263
3264
	if (!is_numeric($lancfg['track6-prefix-id']))
3265
		$lancfg['track6-prefix-id'] = 0;
3266
3267
	$wancfg = $config['interfaces'][$lancfg['track6-interface']];
3268
	if (empty($wancfg)) {
3269
		log_error("Interface {$interface} tracking non-existant interface {$lancfg['track6-interface']}");
3270
		return;
3271
	}
3272
3273 1fadb9d1 Ermal
	$lanif = get_real_interface($interface);
3274
	$oip = find_interface_ipv6($lanif);
3275
	if (is_ipaddrv6($oip))
3276
		mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete");
3277 da9dd1b4 Ermal
	unset($interface_ipv6_arr_cache[$lanif]);
3278
	unset($interface_snv6_arr_cache[$lanif]);
3279 1fadb9d1 Ermal
3280 e082d2f4 Ermal
	if ($wancfg['ipaddrv6'] == "slaac") {
3281 ff5674dc Ermal
		$ifcfgipv6 = get_interface_ipv6($lancfg['track6-interface']);
3282 e082d2f4 Ermal
		if (is_ipaddrv6($ifcfgipv6)) {
3283
			$dhcp6lanarr = explode(":", Net_IPv6::uncompress($ifcfgipv6));
3284
			$dhcp6lanarr[4] = 0;
3285
			$dhcp6lanarr[5] = 0;
3286
			$dhcp6lanarr[6] = 0;
3287
			$dhcp6lanarr[7] = 1;
3288
			$dhcp6lan =  Net_IPv6::compress(implode(":", $dhcp6lanarr));
3289
			log_error("dhcp6 {$interface} with ipv6 address {$dhcp6lan} based on {$lancfg['track6-interface']}");
3290
			mwexec("/sbin/ifconfig {$lanif} inet6 {$dhcp6lan} prefixlen 64");
3291
		}
3292
	}
3293
3294 7a41d737 Ermal
	return 0;
3295
}
3296
3297 7a04cd20 Ermal
function interface_6rd_configure($interface = "wan", $wancfg) {
3298 668e8961 smos
	global $config, $g;
3299
3300 be45aa79 Renato Botelho
	/* because this is a tunnel interface we can only function
3301 668e8961 smos
	 *	with a public IPv4 address on the interface */
3302
3303 7a04cd20 Ermal
	if (!is_array($wancfg))
3304 b0059636 Ermal
		return;
3305 668e8961 smos
3306
	$wanif = get_real_interface($interface);
3307
	$ip4address = find_interface_ip($wanif);
3308 b0059636 Ermal
	if ((!is_ipaddrv4($ip4address)) || (is_private_ip($ip4address))) {
3309 668e8961 smos
		log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel");
3310 1f78ab3a smos
		return false;
3311 668e8961 smos
	}
3312 20a7cb15 smos
	$hexwanv4 = return_hex_ipv4($ip4address);
3313 be45aa79 Renato Botelho
3314 b0059636 Ermal
	if (!is_numeric($wancfg['prefix-6rd-v4plen']))
3315 20a7cb15 smos
		$wancfg['prefix-6rd-v4plen'] = 0;
3316 668e8961 smos
3317 51c57aae smos
	/* create the long prefix notation for math, save the prefix length */
3318 f87ccbed smos
	$rd6prefix = explode("/", $wancfg['prefix-6rd']);
3319
	$rd6prefixlen = $rd6prefix[1];
3320
	$rd6prefix = Net_IPv6::uncompress($rd6prefix[0]);
3321 51c57aae smos
3322
	/* we need the hex form of the broker IPv4 address */
3323 20a7cb15 smos
	$hexbrv4 = return_hex_ipv4($wancfg['gateway-6rd']);
3324 be45aa79 Renato Botelho
3325 51c57aae smos
	/* binary presentation of the prefix for all 128 bits. */
3326 20a7cb15 smos
	$rd6prefixbin = convert_ipv6_to_128bit($rd6prefix);
3327 be45aa79 Renato Botelho
3328 4aa569bd smos
	/* just save the left prefix length bits */
3329
	$rd6brprefixbin = substr($rd6prefixbin, 0, $rd6prefixlen);
3330
	/* if the prefix length is not 32 bits we need to shave bits off from the left of the v4 address. */
3331
	$rd6brprefixbin .= substr(sprintf("%032b", hexdec($hexbrv4)), $wancfg['prefix-6rd-v4plen'], 32);
3332
	/* fill out the rest with 0's */
3333 dcddb2fa Ermal
	$rd6brprefixbin = str_pad($rd6brprefixbin, 128, "0", STR_PAD_RIGHT);
3334 4aa569bd smos
3335 be45aa79 Renato Botelho
	/* convert the 128 bits for the broker address back into a valid IPv6 address */
3336 4aa569bd smos
	$rd6brgw = convert_128bit_to_ipv6($rd6brprefixbin);
3337
3338 51c57aae smos
	/* just save the left prefix length bits */
3339 20a7cb15 smos
	$rd6prefixbin = substr($rd6prefixbin, 0, $rd6prefixlen);
3340 51c57aae smos
	/* if the prefix length is not 32 bits we need to shave bits off from the left of the v4 address. */
3341 4aa569bd smos
	$rd6prefixbin .= substr(sprintf("%032b", hexdec($hexwanv4)), $wancfg['prefix-6rd-v4plen'], 32);
3342 20a7cb15 smos
	/* fill out the rest with 0's */
3343
	$rd6prefixbin = str_pad($rd6prefixbin, 128, "0", STR_PAD_RIGHT);;
3344 51c57aae smos
3345 be45aa79 Renato Botelho
	/* convert the 128 bits for the broker address back into a valid IPv6 address */
3346 4aa569bd smos
	$rd6prefix = convert_128bit_to_ipv6($rd6prefixbin);
3347 f87ccbed smos
3348 7d1f2eac Ermal
	/* XXX: need to extend to support variable prefix size for v4 */
3349 b686e5d0 Ermal
	if (!is_module_loaded("if_stf"))
3350
		mwexec("/sbin/kldload if_stf.ko");
3351 7d1f2eac Ermal
	$stfiface = "{$interface}_stf";
3352 c4fc2eae Ermal
	if (does_interface_exist($stfiface))
3353
		pfSense_interface_destroy($stfiface);
3354
	$tmpstfiface = pfSense_interface_create("stf");
3355
	pfSense_interface_rename($tmpstfiface, $stfiface);
3356 7d1f2eac Ermal
	pfSense_interface_flags($stfiface, IFF_LINK2);
3357
	mwexec("/sbin/ifconfig {$stfiface} inet6 {$rd6prefix}/{$rd6prefixlen}");
3358 b0059636 Ermal
	if ($g['debug'])
3359 7d1f2eac Ermal
		log_error("Created 6rd interface {$stfiface} {$rd6prefix}/{$rd6prefixlen}");
3360 668e8961 smos
3361 f55b6cbb smos
	/* write out a default router file */
3362 20a7cb15 smos
	file_put_contents("{$g['tmp_path']}/{$wanif}_routerv6", "{$rd6brgw}\n");
3363
	file_put_contents("{$g['tmp_path']}/{$wanif}_defaultgwv6", "{$rd6brgw}\n");
3364 2d5ca06e smos
3365 5ee79d32 Ermal
	$ip4gateway = get_interface_gateway($interface);
3366 66c73aab Ermal
	if (is_ipaddrv4($ip4gateway))
3367 b0059636 Ermal
		mwexec("/sbin/route change -host " . $wancfg['gateway-6rd'] . " {$ip4gateway}");
3368 c8ed8142 smos
3369 2d5ca06e smos
	/* configure dependent interfaces */
3370 7a04cd20 Ermal
	if (!$g['booting'])
3371
		link_interface_to_track6($interface, "update");
3372 66c73aab Ermal
3373 f55b6cbb smos
	return 0;
3374 668e8961 smos
}
3375
3376 7a04cd20 Ermal
function interface_6to4_configure($interface = "wan", $wancfg){
3377 31c43fd3 smos
	global $config, $g;
3378
3379 be45aa79 Renato Botelho
	/* because this is a tunnel interface we can only function
3380 31c43fd3 smos
	 *	with a public IPv4 address on the interface */
3381
3382 7a04cd20 Ermal
	if (!is_array($wancfg))
3383
		return;
3384 31c43fd3 smos
3385
	$wanif = get_real_interface($interface);
3386
	$ip4address = find_interface_ip($wanif);
3387
	if((!is_ipaddrv4($ip4address)) || (is_private_ip($ip4address))) {
3388
		log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel");
3389
		return false;
3390
	}
3391 be45aa79 Renato Botelho
3392 31c43fd3 smos
	/* create the long prefix notation for math, save the prefix length */
3393
	$stfprefixlen = 16;
3394
	$stfprefix = Net_IPv6::uncompress("2002::");
3395
	$stfarr = explode(":", $stfprefix);
3396
	$v4prefixlen = "0";
3397 be45aa79 Renato Botelho
3398 31c43fd3 smos
	/* we need the hex form of the interface IPv4 address */
3399
	$ip4arr = explode(".", $ip4address);
3400
	$hexwanv4 = "";
3401
	foreach($ip4arr as $octet)
3402
		$hexwanv4 .= sprintf("%02x", $octet);
3403
3404
	/* we need the hex form of the broker IPv4 address */
3405
	$ip4arr = explode(".", "192.88.99.1");
3406
	$hexbrv4 = "";
3407
	foreach($ip4arr as $octet)
3408
		$hexbrv4 .= sprintf("%02x", $octet);
3409 be45aa79 Renato Botelho
3410 31c43fd3 smos
	/* binary presentation of the prefix for all 128 bits. */
3411
	$stfprefixbin = "";
3412
	foreach($stfarr as $element) {
3413
		$stfprefixbin .= sprintf("%016b", hexdec($element));
3414
	}
3415
	/* just save the left prefix length bits */
3416
	$stfprefixstartbin = substr($stfprefixbin, 0, $stfprefixlen);
3417
3418
	/* if the prefix length is not 32 bits we need to shave bits off from the left of the v4 address. */
3419
	$stfbrokerbin = substr(sprintf("%032b", hexdec($hexbrv4)), $v4prefixlen, 32);
3420
	$stfbrokerbin = str_pad($stfprefixstartbin . $stfbrokerbin, 128, "0", STR_PAD_RIGHT);;
3421
3422
	/* for the local subnet too. */
3423
	$stflanbin = substr(sprintf("%032b", hexdec($hexwanv4)), $v4prefixlen, 32);
3424
	$stflanbin = str_pad($stfprefixstartbin . $stflanbin, 128, "0", STR_PAD_RIGHT);;
3425
3426 be45aa79 Renato Botelho
	/* convert the 128 bits for the broker address back into a valid IPv6 address */
3427 31c43fd3 smos
	$stfbrarr = array();
3428
	$stfbrbinarr = array();
3429
	$stfbrbinarr = str_split($stfbrokerbin, 16);
3430
	foreach($stfbrbinarr as $bin)
3431
		$stfbrarr[] = dechex(bindec($bin));
3432
	$stfbrgw = Net_IPv6::compress(implode(":", $stfbrarr));
3433
3434 be45aa79 Renato Botelho
	/* convert the 128 bits for the broker address back into a valid IPv6 address */
3435 31c43fd3 smos
	$stflanarr = array();
3436
	$stflanbinarr = array();
3437
	$stflanbinarr = str_split($stflanbin, 16);
3438
	foreach($stflanbinarr as $bin)
3439
		$stflanarr[] = dechex(bindec($bin));
3440
	$stflanpr = Net_IPv6::compress(implode(":", $stflanarr));
3441
	$stflanarr[7] = 1;
3442
	$stflan = Net_IPv6::compress(implode(":", $stflanarr));
3443
3444
	/* setup the stf interface */
3445 b686e5d0 Ermal
	if (!is_module_loaded("if_stf"))
3446
		mwexec("/sbin/kldload if_stf.ko");
3447 7d1f2eac Ermal
	$stfiface = "{$interface}_stf";
3448 c4fc2eae Ermal
	if (does_interface_exist($stfiface))
3449
		pfSense_interface_destroy($stfiface);
3450
	$tmpstfiface = pfSense_interface_create("stf");
3451
	pfSense_interface_rename($tmpstfiface, $stfiface);
3452 7d1f2eac Ermal
	pfSense_interface_flags($stfiface, IFF_LINK2);
3453
	mwexec("/sbin/ifconfig {$stfiface} inet6 {$stflanpr} prefixlen 16");
3454 31c43fd3 smos
3455 7d1f2eac Ermal
	if ($g['debug'])
3456
		log_error("Set IPv6 address inet6 {$stflanpr} prefixlen 16 for {$stfiface}, route {$stfbrgw}");
3457 be45aa79 Renato Botelho
3458 31c43fd3 smos
	/* write out a default router file */
3459
	file_put_contents("{$g['tmp_path']}/{$wanif}_routerv6", "{$stfbrgw}");
3460
	file_put_contents("{$g['tmp_path']}/{$wanif}_defaultgwv6", "{$stfbrgw}");
3461 2d5ca06e smos
3462 5ee79d32 Ermal
	$ip4gateway = get_interface_gateway($interface);
3463
	if (is_ipaddrv4($ip4gateway))
3464 c8ed8142 smos
		mwexec("route change -host 192.88.99.1 {$ip4gateway}");
3465
3466 7a04cd20 Ermal
	if (!$g['booting'])
3467
		link_interface_to_track6($interface, "update");
3468 be45aa79 Renato Botelho
3469 31c43fd3 smos
	return 0;
3470
}
3471
3472 7a04cd20 Ermal
function interface_dhcpv6_configure($interface = "wan", $wancfg) {
3473 ed395640 Seth Mos
	global $config, $g;
3474
3475 7a04cd20 Ermal
	if (!is_array($wancfg))
3476 b0059636 Ermal
		return;
3477 ed395640 Seth Mos
3478
	$wanif = get_real_interface($interface);
3479 d53a9a51 smos
	$dhcp6cconf = "";
3480
	$dhcp6cconf .= "interface {$wanif} {\n";
3481 feb88a14 smos
3482 d53a9a51 smos
	/* for SLAAC interfaces we do fire off a dhcp6 client for just our name servers */
3483
	if($wancfg['ipaddrv6'] == "slaac") {
3484
		$dhcp6cconf .= "	information-only;\n";
3485
		$dhcp6cconf .= "	request domain-name-servers;\n";
3486
		$dhcp6cconf .= "	request domain-name;\n";
3487
		$dhcp6cconf .= "	script \"{$g['varetc_path']}/dhcp6c_{$interface}_script.sh\"; # we'd like some nameservers please\n";
3488
		$dhcp6cconf .= "};\n";
3489
	} else {
3490 be45aa79 Renato Botelho
3491 d53a9a51 smos
		$dhcp6cconf .= " 	send ia-na 0;	# request stateful address\n";
3492 b0059636 Ermal
		if(is_numeric($wancfg['dhcp6-ia-pd-len']))
3493 d53a9a51 smos
			$dhcp6cconf .= "	send ia-pd 0;	# request prefix delegation\n";
3494
		$dhcp6cconf .= "request domain-name-servers;\n";
3495
		$dhcp6cconf .= "request domain-name;\n";
3496
		$dhcp6cconf .= "script \"{$g['varetc_path']}/dhcp6c_{$interface}_script.sh\"; # we'd like some nameservers please\n";
3497
3498
		$dhcp6cconf .= "};\n";
3499
		$dhcp6cconf .= "id-assoc na 0 { };\n";
3500
		if(is_numeric($wancfg['dhcp6-ia-pd-len'])) {
3501
			/* Setup the prefix delegation */
3502
			$dhcp6cconf .= "id-assoc pd 0 {\n";
3503 7a04cd20 Ermal
			$iflist = link_interface_to_track6($interface);
3504
			foreach ($iflist as $friendly => $ifcfg) {
3505
				if (is_numeric($ifcfg['track6-prefix-id'])) {
3506
					if ($g['debug'])
3507
						log_error("setting up $ifdescr - {$ifcfg['track6-prefix-id']}");
3508 d53a9a51 smos
					$realif = get_real_interface($friendly);
3509
					$dhcp6cconf .= "	prefix-interface {$realif} {\n";
3510 7a04cd20 Ermal
					$dhcp6cconf .= "		sla-id {$ifcfg['track6-prefix-id']};\n";
3511 d53a9a51 smos
					$dhcp6cconf .= "		sla-len {$wancfg['dhcp6-ia-pd-len']};\n";
3512
					$dhcp6cconf .= "	};\n";
3513
				}
3514
			}
3515 7a04cd20 Ermal
			unset($iflist, $ifcfg);
3516 d53a9a51 smos
			$dhcp6cconf .= "};\n";
3517
		}
3518
	}
3519 b0059636 Ermal
	/* wide-dhcp6c works for now. */
3520
	if (!@file_put_contents("{$g['varetc_path']}/dhcp6c_{$interface}.conf", $dhcp6cconf)) {
3521
		printf("Error: cannot open dhcp6c_{$interface}.conf in interface_dhcpv6_configure() for writing.\n");
3522 d12ae241 Renato Botelho
		unset($dhcp6cconf);
3523 b0059636 Ermal
		return 1;
3524
	}
3525 d12ae241 Renato Botelho
	unset($dhcp6cconf);
3526 ed395640 Seth Mos
3527 b0059636 Ermal
	$dhcp6cscript = "#!/bin/sh\n";
3528
	$dhcp6cscript .= "# This shell script launches /etc/rc.newwanipv6 with a interface argument.\n";
3529
	$dhcp6cscript .= "/etc/rc.newwanipv6 {$wanif} \n";
3530 d53a9a51 smos
	/* Add wide-dhcp6c shell script here. Because we can not pass a argument to it. */
3531 b0059636 Ermal
	if (!@file_put_contents("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh", $dhcp6cscript)) {
3532 d53a9a51 smos
		printf("Error: cannot open dhcp6c_{$interface}_script.sh in interface_dhcpv6_configure() for writing.\n");
3533 d12ae241 Renato Botelho
		unset($dhcp6cscript);
3534 d53a9a51 smos
		return 1;
3535
	}
3536 d12ae241 Renato Botelho
	unset($dhcp6cscript);
3537 b0059636 Ermal
	@chmod("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh", 0755);
3538 d53a9a51 smos
3539 29f2f07a Ermal
	$rtsoldscript = "#!/bin/sh\n";
3540
	$rtsoldscript .= "# This shell script launches dhcp6c and configured gateways for this interface.\n";
3541
	$rtsoldscript .= "echo $2 > {$g['tmp_path']}/{$wanif}_routerv6\n";
3542
	$rtsoldscript .= "echo $2 > {$g['tmp_path']}/{$wanif}_defaultgwv6\n";
3543
	$rtsoldscript .= "if [ -f {$g['varrun_path']}/dhcp6c_{$wanif}.pid ]; then\n";
3544 b8ded125 Ermal
	$rtsoldscript .= "\t/bin/pkill -F {$g['varrun_path']}/dhcp6c_{$wanif}.pid\n";
3545 29f2f07a Ermal
	$rtsoldscript .= "fi\n";
3546
	$rtsoldscript .= "/usr/local/sbin/dhcp6c -d -c {$g['varetc_path']}/dhcp6c_{$interface}.conf -p {$g['varrun_path']}/dhcp6c_{$wanif}.pid {$wanif}\n";
3547
	/* Add wide-dhcp6c shell script here. Because we can not pass a argument to it. */
3548
	if (!@file_put_contents("{$g['varetc_path']}/rtsold_{$wanif}_script.sh", $rtsoldscript)) {
3549
		printf("Error: cannot open rtsold_{$interface}_script.sh in interface_dhcpv6_configure() for writing.\n");
3550
		unset($rtsoldscript);
3551
		return 1;
3552
	}
3553
	unset($rtsoldscript);
3554
	@chmod("{$g['varetc_path']}/rtsold_{$wanif}_script.sh", 0755);
3555 d53a9a51 smos
3556 c65d3051 Seth Mos
	/* accept router advertisements for this interface */
3557 ef851fed smos
	mwexec("/sbin/sysctl -w net.inet6.ip6.accept_rtadv=1");
3558 49047fb4 smos
	log_error("Accept router advertisements on interface {$wanif} ");
3559 100c7be0 Seth Mos
	mwexec("/sbin/ifconfig {$wanif} inet6 accept_rtadv");
3560 61c4383d smos
3561 29f2f07a Ermal
	/* fire up rtsold for IPv6 RAs first, this backgrounds immediately. It will call dhcp6c */
3562
	if (isvalidpid("{$g['varrun_path']}/rtsold_{$wanif}.pid"))
3563
		killbypid("{$g['varrun_path']}/rtsold_{$wanif}.pid");
3564 9b6010ff Ermal
	mwexec("/usr/sbin/rtsold -1 -p {$g['varrun_path']}/rtsold_{$wanif}.pid -O {$g['varetc_path']}/rtsold_{$wanif}_script.sh {$wanif}");
3565 82769dfe smos
3566 29f2f07a Ermal
	/* NOTE: will be called from rtsold invoked script 
3567
	 * link_interface_to_track6($interface, "update");
3568
	 */
3569 b0059636 Ermal
3570 ed395640 Seth Mos
	return 0;
3571
}
3572
3573 8103bd1e Seth Mos
function interface_dhcp_configure($interface = "wan") {
3574 ed395640 Seth Mos
	global $config, $g;
3575
3576
	$wancfg = $config['interfaces'][$interface];
3577
	$wanif = $wancfg['if'];
3578 df9e93f0 Ermal
	if (empty($wancfg))
3579
		$wancfg = array();
3580 5b237745 Scott Ullrich
3581 0311dbd5 Scott Ullrich
	/* generate dhclient_wan.conf */
3582 67ee1ec5 Ermal Luçi
	$fd = fopen("{$g['varetc_path']}/dhclient_{$interface}.conf", "w");
3583 5b237745 Scott Ullrich
	if (!$fd) {
3584 905ea336 Phil Davis
		printf(printf(gettext("Error: cannot open dhclient_%s.conf in interface_dhcp_configure() for writing.%s"), $interface, "\n"));
3585 5b237745 Scott Ullrich
		return 1;
3586
	}
3587 eb772abd Scott Ullrich
3588 2305d4c5 Scott Ullrich
	if ($wancfg['dhcphostname']) {
3589
		$dhclientconf_hostname = "send dhcp-client-identifier \"{$wancfg['dhcphostname']}\";\n";
3590
		$dhclientconf_hostname .= "\tsend host-name \"{$wancfg['dhcphostname']}\";\n";
3591
	} else {
3592
		$dhclientconf_hostname = "";
3593
	}
3594
3595 85a5da13 Ermal Luçi
	$wanif = get_real_interface($interface);
3596 df9e93f0 Ermal
	if (empty($wanif)) {
3597 07e40c1f Carlos Eduardo Ramos
		log_error(sprintf(gettext("Invalid interface \"%s\" in interface_dhcp_configure()"), $interface));
3598 c1cc447c gnhb
		return 0;
3599 3a906378 gnhb
	}
3600 1c3ddd9e Renato Botelho
	$dhclientconf = "";
3601 be45aa79 Renato Botelho
3602 6d76590c Scott Ullrich
	$dhclientconf .= <<<EOD
3603 67ee1ec5 Ermal Luçi
interface "{$wanif}" {
3604 76d3b9a3 Chris Buechler
timeout 60;
3605 88810240 smos
retry 15;
3606 ce69a638 Scott Ullrich
select-timeout 0;
3607
initial-interval 1;
3608 2305d4c5 Scott Ullrich
	{$dhclientconf_hostname}
3609
	script "/sbin/dhclient-script";
3610 5b237745 Scott Ullrich
}
3611
3612
EOD;
3613
3614 bc40d758 Seth Mos
if(is_ipaddr($wancfg['alias-address'])) {
3615
	$subnetmask = gen_subnet_mask($wancfg['alias-subnet']);
3616
	$dhclientconf .= <<<EOD
3617
alias {
3618 67ee1ec5 Ermal Luçi
	interface  "{$wanif}";
3619 bc40d758 Seth Mos
	fixed-address {$wancfg['alias-address']};
3620
	option subnet-mask {$subnetmask};
3621
}
3622
3623
EOD;
3624
}
3625 5b237745 Scott Ullrich
	fwrite($fd, $dhclientconf);
3626
	fclose($fd);
3627 eb772abd Scott Ullrich
3628 d7147b1c Scott Ullrich
	/* bring wan interface up before starting dhclient */
3629 3a906378 gnhb
	if($wanif)
3630
		interfaces_bring_up($wanif);
3631 be45aa79 Renato Botelho
	else
3632 07e40c1f Carlos Eduardo Ramos
		log_error(printf(gettext("Could not bring up %s interface in interface_dhcp_configure()"), $wanif));
3633 eacc8c14 Scott Ullrich
3634 7149c4e7 Seth Mos
	/* fire up dhclient */
3635 15d15c7f bcyrill
	mwexec("/sbin/dhclient -c {$g['varetc_path']}/dhclient_{$interface}.conf {$wanif} > {$g['tmp_path']}/{$wanif}_output 2> {$g['tmp_path']}/{$wanif}_error_output");
3636 0119d2f7 Scott Ullrich
3637 5b237745 Scott Ullrich
	return 0;
3638
}
3639
3640 42753d25 Ermal Lu?i
function interfaces_group_setup() {
3641
	global $config;
3642
3643
	if (!is_array($config['ifgroups']['ifgroupentry']))
3644
		return;
3645
3646 482961e3 Ermal Lu?i
	foreach ($config['ifgroups']['ifgroupentry'] as $groupar)
3647 42753d25 Ermal Lu?i
		interface_group_setup($groupar);
3648
3649
	return;
3650
}
3651
3652 abcb2bed Ermal Lu?i
function interface_group_setup(&$groupname /* The parameter is an array */) {
3653 42753d25 Ermal Lu?i
	global $config;
3654
3655
	if (!is_array($groupname))
3656
		return;
3657
	$members = explode(" ", $groupname['members']);
3658
	foreach($members as $ifs) {
3659
		$realif = get_real_interface($ifs);
3660
		if ($realif)
3661
			mwexec("/sbin/ifconfig {$realif} group {$groupname['ifname']}");
3662
	}
3663
3664
	return;
3665
}
3666 48f23632 Ermal
3667 06182467 Renato Botelho
function is_interface_group($if) {
3668
	global $config;
3669
3670
	if (is_array($config['ifgroups']['ifgroupentry']))
3671
		foreach ($config['ifgroups']['ifgroupentry'] as $groupentry) {
3672
			if ($groupentry['ifname'] === $if)
3673
				return true;
3674
		}
3675
3676
	return false;
3677
}
3678
3679 48f23632 Ermal
function interface_group_add_member($interface, $groupname) {
3680 ed62880b Ermal
	$interface = get_real_interface($interface);
3681 48f23632 Ermal
	mwexec("/sbin/ifconfig {$interface} group {$groupname}", true);
3682
}
3683 be45aa79 Renato Botelho
3684 e8910ad4 Ermal Lu?i
/* COMPAT Function */
3685 afb2de1b Ermal Lu?i
function convert_friendly_interface_to_real_interface_name($interface) {
3686
	return get_real_interface($interface);
3687
}
3688
3689 e8910ad4 Ermal Lu?i
/* COMPAT Function */
3690 eba938e3 Scott Ullrich
function get_real_wan_interface($interface = "wan") {
3691 abb31ea4 Ermal Luçi
	return get_real_interface($interface);
3692
}
3693 afb2de1b Ermal Lu?i
3694 e8910ad4 Ermal Lu?i
/* COMPAT Function */
3695 eba938e3 Scott Ullrich
function get_current_wan_address($interface = "wan") {
3696 abb31ea4 Ermal Luçi
	return get_interface_ip($interface);
3697
}
3698
3699 afb2de1b Ermal Lu?i
/*
3700
 * convert_real_interface_to_friendly_interface_name($interface): convert fxp0 -> wan, etc.
3701
 */
3702
function convert_real_interface_to_friendly_interface_name($interface = "wan") {
3703 7061ba0f Renato Botelho
	global $config;
3704 afb2de1b Ermal Lu?i
3705 7b47bd4c Ermal
	if (stristr($interface, "_vip")) {
3706 7061ba0f Renato Botelho
		foreach ($config['virtualip']['vip'] as $counter => $vip) {
3707
			if ($vip['mode'] == "carp")  {
3708
				if ($interface == "{$vip['interface']}_vip{$vip['vhid']}")
3709
					return $vip['interface'];
3710
			}
3711
		}
3712
	}
3713 afb2de1b Ermal Lu?i
3714 7061ba0f Renato Botelho
	/* XXX: For speed reasons reference directly the interface array */
3715 74e1e658 jim-p
	$ifdescrs = &$config['interfaces'];
3716 7061ba0f Renato Botelho
	//$ifdescrs = get_configured_interface_list(false, true);
3717 afb2de1b Ermal Lu?i
3718 1d66a364 Ermal
	if (strstr($interface, "_stf"))
3719
		$interface = str_replace("_stf", "", $interface);
3720
3721 7061ba0f Renato Botelho
	foreach ($ifdescrs as $if => $ifname) {
3722
		if ($if == $interface || $config['interfaces'][$if]['if'] == $interface)
3723
			return $if;
3724 afb2de1b Ermal Lu?i
3725 7061ba0f Renato Botelho
		if (stristr($interface, "_wlan0") && $config['interfaces'][$if]['if'] == interface_get_wireless_base($interface))
3726
			return $if;
3727 af637766 Erik Fonnesbeck
3728 d11e01f4 Erik Fonnesbeck
		// XXX: This case doesn't work anymore (segfaults - recursion?) - should be replaced with something else or just removed.
3729
		//      Not to be replaced with get_real_interface - causes slow interface listings here because of recursion!
3730
		/*
3731 7061ba0f Renato Botelho
		$int = get_parent_interface($if);
3732
		if ($int[0] == $interface)
3733
			return $ifname;
3734
		 */
3735
	}
3736 1d66a364 Ermal
3737 7061ba0f Renato Botelho
	return NULL;
3738 afb2de1b Ermal Lu?i
}
3739
3740
/* attempt to resolve interface to friendly descr */
3741
function convert_friendly_interface_to_friendly_descr($interface) {
3742 1c3ddd9e Renato Botelho
	global $config;
3743 afb2de1b Ermal Lu?i
3744 1c3ddd9e Renato Botelho
	switch ($interface) {
3745
	case "l2tp":
3746
		$ifdesc = "L2TP";
3747
		break;
3748 68ef6e03 Ermal
	case "pptp":
3749
		$ifdesc = "PPTP";
3750
		break;
3751
	case "pppoe":
3752
		$ifdesc = "PPPoE";
3753
		break;
3754
	case "openvpn":
3755
		$ifdesc = "OpenVPN";
3756
		break;
3757
	case "enc0":
3758
	case "ipsec":
3759
		$ifdesc = "IPsec";
3760
		break;
3761 1c3ddd9e Renato Botelho
	default:
3762
		if (isset($config['interfaces'][$interface])) {
3763
			if (empty($config['interfaces'][$interface]['descr']))
3764
				$ifdesc = strtoupper($interface);
3765
			else
3766
				$ifdesc = strtoupper($config['interfaces'][$interface]['descr']);
3767 57c52d45 Erik Fonnesbeck
			break;
3768 7b47bd4c Ermal
		} else if (stristr($interface, "_vip")) {
3769 68ef6e03 Ermal
			if (is_array($config['virtualip']['vip'])) {
3770
				foreach ($config['virtualip']['vip'] as $counter => $vip) {
3771 3e662cb0 Ermal
					if ($vip['mode'] == "carp")  {
3772 7b47bd4c Ermal
						if ($interface == "{$vip['interface']}_vip{$vip['vhid']}")
3773 68ef6e03 Ermal
							return "{$vip['subnet']} - {$vip['descr']}";
3774
					}
3775
				}
3776 1c3ddd9e Renato Botelho
			}
3777
		} else {
3778 68ef6e03 Ermal
			/* if list */
3779
			$ifdescrs = get_configured_interface_with_descr(false, true);
3780
			foreach ($ifdescrs as $if => $ifname) {
3781 7b47bd4c Ermal
				if ($if == $interface || $ifname == $interface)
3782
					return $ifname;
3783 68ef6e03 Ermal
			}
3784 57c52d45 Erik Fonnesbeck
		}
3785 1c3ddd9e Renato Botelho
		break;
3786
	}
3787 afb2de1b Ermal Lu?i
3788 1c3ddd9e Renato Botelho
	return $ifdesc;
3789 afb2de1b Ermal Lu?i
}
3790
3791
function convert_real_interface_to_friendly_descr($interface) {
3792 1c3ddd9e Renato Botelho
	global $config;
3793 afb2de1b Ermal Lu?i
3794 1c3ddd9e Renato Botelho
	$ifdesc = convert_real_interface_to_friendly_interface_name("{$interface}");
3795 afb2de1b Ermal Lu?i
3796 1c3ddd9e Renato Botelho
	if ($ifdesc) {
3797
		$iflist = get_configured_interface_with_descr(false, true);
3798
		return $iflist[$ifdesc];
3799
	}
3800 afb2de1b Ermal Lu?i
3801 1c3ddd9e Renato Botelho
	return $interface;
3802 afb2de1b Ermal Lu?i
}
3803
3804 532b0fb8 Ermal Lu?i
/*
3805 d5dfcb52 gnhb
 *  get_parent_interface($interface):
3806 20cb9803 gnhb
 *			--returns the (real or virtual) parent interface(s) array for a given interface friendly name (i.e. wan)
3807
 *				or virtual interface (i.e. vlan)
3808
 *				(We need array because MLPPP and bridge interfaces have more than one parent.)
3809
 *			-- returns $interface passed in if $interface parent is not found
3810
 *			-- returns empty array if an invalid interface is passed
3811
 *	(Only handles ppps and vlans now.)
3812 532b0fb8 Ermal Lu?i
 */
3813 d5dfcb52 gnhb
function get_parent_interface($interface) {
3814
	global $config;
3815 532b0fb8 Ermal Lu?i
3816 20cb9803 gnhb
	$parents = array();
3817
	//Check that we got a valid interface passed
3818
	$realif = get_real_interface($interface);
3819
	if ($realif == NULL)
3820
		return $parents;
3821
3822
	// If we got a real interface, find it's friendly assigned name
3823
	$interface = convert_real_interface_to_friendly_interface_name($interface);
3824 be45aa79 Renato Botelho
3825 20cb9803 gnhb
	if (!empty($interface) && isset($config['interfaces'][$interface])) {
3826
		$ifcfg = $config['interfaces'][$interface];
3827
		switch ($ifcfg['ipaddr']) {
3828
			case "ppp":
3829
			case "pppoe":
3830
			case "pptp":
3831
			case "l2tp":
3832
				if (empty($parents))
3833
					if (is_array($config['ppps']['ppp']))
3834
						foreach ($config['ppps']['ppp'] as $pppidx => $ppp) {
3835 02b8bfae Renato Botelho
							if ($ifcfg['if'] == $ppp['if']) {
3836 20cb9803 gnhb
								$ports = explode(',', $ppp['ports']);
3837 be45aa79 Renato Botelho
								foreach ($ports as $pid => $parent_if)
3838 20cb9803 gnhb
									$parents[$pid] = get_real_interface($parent_if);
3839
								break;
3840
							}
3841
						}
3842
				break;
3843
			case "dhcp":
3844
			case "static":
3845
			default:
3846
				// Handle _vlans
3847 76254caa Renato Botelho
				if (stristr($realif,"_vlan"))
3848 be45aa79 Renato Botelho
					if (is_array($config['vlans']['vlan']))
3849 20cb9803 gnhb
						foreach ($config['vlans']['vlan'] as $vlanidx => $vlan)
3850
							if ($ifcfg['if'] == $vlan['vlanif']){
3851
								$parents[0] = $vlan['if'];
3852
								break;
3853
							}
3854
				break;
3855 3e5d0d1d Ermal
		}
3856
	}
3857 be45aa79 Renato Botelho
3858 20cb9803 gnhb
	if (empty($parents))
3859
		$parents[0] = $realif;
3860 be45aa79 Renato Botelho
3861 20cb9803 gnhb
	return $parents;
3862 532b0fb8 Ermal Lu?i
}
3863
3864 263e2b7e Erik Fonnesbeck
function interface_is_wireless_clone($wlif) {
3865
	if(!stristr($wlif, "_wlan")) {
3866
		return false;
3867
	} else {
3868
		return true;
3869
	}
3870
}
3871
3872 1d072761 Erik Fonnesbeck
function interface_get_wireless_base($wlif) {
3873 34808d4e Erik Fonnesbeck
	if(!stristr($wlif, "_wlan")) {
3874
		return $wlif;
3875
	} else {
3876
		return substr($wlif, 0, stripos($wlif, "_wlan"));
3877
	}
3878
}
3879
3880 1d072761 Erik Fonnesbeck
function interface_get_wireless_clone($wlif) {
3881 34808d4e Erik Fonnesbeck
	if(!stristr($wlif, "_wlan")) {
3882
		return $wlif . "_wlan0";
3883
	} else {
3884
		return $wlif;
3885
	}
3886
}
3887
3888 b6c1f22f Ermal
function get_real_interface($interface = "wan", $family = "all") {
3889 ee3576dd Ermal
	global $config, $g;
3890 cfc707f7 Scott Ullrich
3891 521cfa2f Ermal Lu?i
	$wanif = NULL;
3892 c515ea57 Scott Ullrich
3893 67ee1ec5 Ermal Luçi
	switch ($interface) {
3894 acc1e9d0 Scott Ullrich
	case "l2tp":
3895
		$wanif = "l2tp";
3896
		break;
3897 67ee1ec5 Ermal Luçi
	case "pptp":
3898
		$wanif = "pptp";
3899
		break;
3900
	case "pppoe":
3901
		$wanif = "pppoe";
3902
		break;
3903
	case "openvpn":
3904
		$wanif = "openvpn";
3905
		break;
3906 4563d12f Seth Mos
	case "ipsec":
3907 67ee1ec5 Ermal Luçi
	case "enc0":
3908
		$wanif = "enc0";
3909
		break;
3910
	case "ppp":
3911
		$wanif = "ppp";
3912
		break;
3913
	default:
3914 6d5446a2 Ermal
		// If a real interface was alread passed simply
3915
		// pass the real interface back.  This encourages
3916
		// the usage of this function in more cases so that
3917
		// we can combine logic for more flexibility.
3918
		if(does_interface_exist($interface)) {
3919
			$wanif = $interface;
3920
			break;
3921
		}
3922 bf001dec smos
3923 6d5446a2 Ermal
		if (empty($config['interfaces'][$interface]))
3924
			break;
3925 568b1358 Scott Ullrich
3926 6447bde5 jim-p
		$cfg = &$config['interfaces'][$interface];
3927 2ebf3945 Scott Ullrich
3928 b6c1f22f Ermal
		if ($family == "inet6") {
3929
			switch ($cfg['ipaddrv6']) {
3930
			case "6rd":
3931
			case "6to4":
3932
				$wanif = "{$interface}_stf";
3933
				break;
3934
			default:
3935
				if( is_array($cfg['wireless']) || preg_match($g['wireless_regex'], $cfg['if']))
3936
					$wanif = interface_get_wireless_clone($cfg['if']);
3937
				else
3938
					$wanif = $cfg['if'];
3939
				break;
3940
			}
3941
		} else {
3942
			// Wireless cloned NIC support (FreeBSD 8+)
3943
			// interface name format: $parentnic_wlanparentnic#
3944
			// example: ath0_wlan0
3945
			if( is_array($cfg['wireless']) || preg_match($g['wireless_regex'], $cfg['if']))
3946
				$wanif = interface_get_wireless_clone($cfg['if']);
3947
			else
3948
				$wanif = $cfg['if'];
3949
		}
3950 67ee1ec5 Ermal Luçi
		break;
3951 c515ea57 Scott Ullrich
	}
3952
3953 1c3ddd9e Renato Botelho
	return $wanif;
3954 5b237745 Scott Ullrich
}
3955
3956 9ff8c299 Seth Mos
/* Guess the physical interface by providing a IP address */
3957 afb2de1b Ermal Lu?i
function guess_interface_from_ip($ipaddress) {
3958 80a2c1e6 Seth Mos
	if(! is_ipaddr($ipaddress)) {
3959 9ff8c299 Seth Mos
		return false;
3960
	}
3961 a05b2f42 Seth Mos
	if(is_ipaddrv4($ipaddress)) {
3962
		/* create a route table we can search */
3963
		exec("netstat -rnWf inet", $output, $ret);
3964
		foreach($output as $line) {
3965
			if(preg_match("/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+[ ]+link[#]/", $line)) {
3966
				$fields = preg_split("/[ ]+/", $line);
3967
				if(ip_in_subnet($ipaddress, $fields[0])) {
3968
					return $fields[6];
3969
				}
3970
			}
3971
		}
3972
	}
3973
	/* FIXME: This works from cursory testing, regexp might need fine tuning */
3974
	if(is_ipaddrv6($ipaddress)) {
3975
		/* create a route table we can search */
3976
		exec("netstat -rnWf inet6", $output, $ret);
3977
		foreach($output as $line) {
3978
			if(preg_match("/[0-9a-f]+[:]+[0-9a-f]+[:]+[\/][0-9]+/", $line)) {
3979
				$fields = preg_split("/[ ]+/", $line);
3980
				if(ip_in_subnet($ipaddress, $fields[0])) {
3981
					return $fields[6];
3982
				}
3983 9ff8c299 Seth Mos
			}
3984
		}
3985
	}
3986
	$ret = exec_command("/sbin/route -n get {$ipaddress} | /usr/bin/awk '/interface/ { print \$2; };'");
3987
	if(empty($ret)) {
3988 1c3ddd9e Renato Botelho
		return false;
3989 9ff8c299 Seth Mos
	}
3990
	return $ret;
3991 afb2de1b Ermal Lu?i
}
3992
3993
/*
3994
 * find_ip_interface($ip): return the interface where an ip is defined
3995 59231855 Darren Embry
 *   (or if $bits is specified, where an IP within the subnet is defined)
3996 afb2de1b Ermal Lu?i
 */
3997 2027b4c7 bcyrill
function find_ip_interface($ip, $bits = null) {
3998
	if (!is_ipaddr($ip))
3999
		return false;
4000
	
4001
	$isv6ip = is_ipaddrv6($ip);
4002
	
4003 59231855 Darren Embry
	/* if list */
4004
	$ifdescrs = get_configured_interface_list();
4005 be45aa79 Renato Botelho
4006 59231855 Darren Embry
	foreach ($ifdescrs as $ifdescr => $ifname) {
4007 2027b4c7 bcyrill
		$ifip = ($isv6ip) ? get_interface_ipv6($ifname) : get_interface_ip($ifname);
4008 ec8b4d8d Ermal
		if (is_null($ifip))
4009 2027b4c7 bcyrill
			continue;
4010 ec8b4d8d Ermal
		if (is_null($bits)) {
4011 2027b4c7 bcyrill
			if ($ip == $ifip) {
4012 59231855 Darren Embry
				$int = get_real_interface($ifname);
4013
				return $int;
4014
			}
4015
		}
4016
		else {
4017 2027b4c7 bcyrill
			if (ip_in_subnet($ifip, $ip . "/" . $bits)) {
4018 59231855 Darren Embry
				$int = get_real_interface($ifname);
4019
				return $int;
4020
			}
4021
		}
4022
	}
4023 ec8b4d8d Ermal
4024 59231855 Darren Embry
	return false;
4025
}
4026 afb2de1b Ermal Lu?i
4027 59231855 Darren Embry
/*
4028
 * find_virtual_ip_alias($ip): return the virtual IP alias where an IP is found
4029
 *   (or if $bits is specified, where an IP within the subnet is found)
4030
 */
4031
function find_virtual_ip_alias($ip, $bits = null) {
4032
	global $config;
4033 6b207f73 bcyrill
	
4034 59231855 Darren Embry
	if (!is_array($config['virtualip']['vip'])) {
4035
		return false;
4036
	}
4037 6b207f73 bcyrill
	if (!is_ipaddr($ip))
4038
		return false;
4039
	
4040
	$isv6ip = is_ipaddrv6($ip);
4041
	
4042 59231855 Darren Embry
	foreach ($config['virtualip']['vip'] as $vip) {
4043
		if ($vip['mode'] === "ipalias") {
4044 6b207f73 bcyrill
			if (is_ipaddrv6($vip['subnet']) != $isv6ip)
4045
				continue;
4046 ec8b4d8d Ermal
			if (is_null($bits)) {
4047 59231855 Darren Embry
				if (ip_in_subnet($ip, $vip['subnet'] . "/" . $vip['subnet_bits'])) {
4048
					return $vip;
4049
				}
4050
			}
4051
			else {
4052 dbea91b3 bcyrill
				if (($isv6ip && check_subnetsv6_overlap($ip, $bits, $vip['subnet'], $vip['subnet_bits']))
4053
					|| (!$isv6ip && check_subnets_overlap($ip, $bits, $vip['subnet'], $vip['subnet_bits']))) {
4054 59231855 Darren Embry
					return $vip;
4055
				}
4056
			}
4057 abcb2bed Ermal Lu?i
		}
4058 59231855 Darren Embry
	}
4059
	return false;
4060 afb2de1b Ermal Lu?i
}
4061
4062 a71b32d2 Scott Ullrich
/*
4063
 *   find_number_of_created_carp_interfaces: return the number of carp interfaces
4064
 */
4065
function find_number_of_created_carp_interfaces() {
4066
	return `/sbin/ifconfig | grep "carp:" | wc -l`;
4067
}
4068
4069
function get_all_carp_interfaces() {
4070
	$ints = str_replace("\n", " ", `ifconfig | grep "carp:" -B2 | grep ": flag" | cut -d: -f1`);
4071 81c64284 Chris Buechler
	$ints = explode(" ", $ints);
4072 a71b32d2 Scott Ullrich
	return $ints;
4073
}
4074
4075 abcb2bed Ermal Lu?i
/*
4076
 * find_carp_interface($ip): return the carp interface where an ip is defined
4077
 */
4078
function find_carp_interface($ip) {
4079 27625b39 Scott Ullrich
	global $config;
4080 abcb2bed Ermal Lu?i
	if (is_array($config['virtualip']['vip'])) {
4081
		foreach ($config['virtualip']['vip'] as $vip) {
4082 3e662cb0 Ermal
			if ($vip['mode'] == "carp") {
4083 645ad665 Seth Mos
				if(is_ipaddrv4($ip)) {
4084
					$carp_ip = get_interface_ip($vip['interface']);
4085
				}
4086
				if(is_ipaddrv6($ip)) {
4087
					$carp_ip = get_interface_ipv6($vip['interface']);
4088
				}
4089
				exec("/sbin/ifconfig", $output, $return);
4090
				foreach($output as $line) {
4091
					$elements = preg_split("/[ ]+/i", $line);
4092
					if(strstr($elements[0], "vip"))
4093
						$curif = str_replace(":", "", $elements[0]);
4094
					if(stristr($line, $ip)) {
4095
						$if = $curif;
4096
						continue;
4097
					}
4098
				}
4099 a687f866 Namezero
4100 27625b39 Scott Ullrich
				if ($if)
4101
					return $if;
4102 abcb2bed Ermal Lu?i
			}
4103
		}
4104
	}
4105
}
4106
4107
function link_carp_interface_to_parent($interface) {
4108 6fb26a17 smos
	global $config;
4109 abcb2bed Ermal Lu?i
4110 6fb26a17 smos
	if ($interface == "")
4111
		return;
4112 abcb2bed Ermal Lu?i
4113 6fb26a17 smos
	$carp_ip = get_interface_ip($interface);
4114
	$carp_ipv6 = get_interface_ipv6($interface);
4115 abcb2bed Ermal Lu?i
4116 6fb26a17 smos
	if((!is_ipaddrv4($carp_ip)) && (!is_ipaddrv6($carp_ipv6)))
4117
		return;
4118 abcb2bed Ermal Lu?i
4119 6fb26a17 smos
	/* if list */
4120
	$ifdescrs = get_configured_interface_list();
4121
	foreach ($ifdescrs as $ifdescr => $ifname) {
4122
		/* check IPv4 */
4123
		if(is_ipaddrv4($carp_ip)) {
4124
			$interfaceip = get_interface_ip($ifname);
4125
			$subnet_bits = get_interface_subnet($ifname);
4126
			$subnet_ip = gen_subnet("{$interfaceip}", "{$subnet_bits}");
4127
			if(ip_in_subnet($carp_ip, "{$subnet_ip}/{$subnet_bits}"))
4128
				return $ifname;
4129
		}
4130
		/* Check IPv6 */
4131
		if(is_ipaddrv6($carp_ipv6)) {
4132
			$interfaceipv6 = get_interface_ipv6($ifname);
4133
			$prefixlen = get_interface_subnetv6($ifname);
4134
			if(ip_in_subnet($carp_ipv6, "{$interfaceipv6}/{$prefixlen}"))
4135
				return $ifname;
4136
		}
4137
	}
4138
	return "";
4139 abcb2bed Ermal Lu?i
}
4140
4141 6fb26a17 smos
4142 abcb2bed Ermal Lu?i
/****f* interfaces/link_ip_to_carp_interface
4143
 * NAME
4144
 *   link_ip_to_carp_interface - Find where a CARP interface links to.
4145
 * INPUTS
4146
 *   $ip
4147
 * RESULT
4148
 *   $carp_ints
4149
 ******/
4150
function link_ip_to_carp_interface($ip) {
4151 1c3ddd9e Renato Botelho
	global $config;
4152 abcb2bed Ermal Lu?i
4153 1c3ddd9e Renato Botelho
	if (!is_ipaddr($ip))
4154
		return;
4155 abcb2bed Ermal Lu?i
4156 1c3ddd9e Renato Botelho
	$carp_ints = "";
4157
	if (is_array($config['virtualip']['vip'])) {
4158 1d002dc9 Ermal
		$first = 0;
4159 3fbc3487 Ermal
		$carp_int = array();
4160 1c3ddd9e Renato Botelho
		foreach ($config['virtualip']['vip'] as $vip) {
4161
			if ($vip['mode'] == "carp") {
4162
				$carp_ip = $vip['subnet'];
4163
				$carp_sn = $vip['subnet_bits'];
4164
				$carp_nw = gen_subnet($carp_ip, $carp_sn);
4165
				if (ip_in_subnet($ip, "{$carp_nw}/{$carp_sn}")) {
4166 7b47bd4c Ermal
					$carp_int[] = "{$vip['interface']}_vip{$vip['vhid']}";
4167
				}
4168 1c3ddd9e Renato Botelho
			}
4169
		}
4170 3fbc3487 Ermal
		if (!empty($carp_int))
4171
			$carp_ints = implode(" ", array_unique($carp_int));
4172 1c3ddd9e Renato Botelho
	}
4173 abcb2bed Ermal Lu?i
4174 1c3ddd9e Renato Botelho
	return $carp_ints;
4175 abcb2bed Ermal Lu?i
}
4176
4177 7a04cd20 Ermal
function link_interface_to_track6($int, $action = "") {
4178
	global $config;
4179
4180
	if (empty($int))
4181
		return;
4182
4183
	if (is_array($config['interfaces'])) {
4184
		$list = array();
4185
		foreach ($config['interfaces'] as $ifname => $ifcfg) {
4186
			if (!isset($ifcfg['enable']))
4187
				continue;
4188
			if (!empty($ifcfg['ipaddrv6']) && $ifcfg['track6-interface'] == $int) {
4189
				if ($action == "update")
4190
					interface_track6_configure($ifname, $ifcfg);
4191
				else if ($action == "")
4192
					$list[$ifname] = $ifcfg;
4193
			}
4194
		}
4195
		return $list;
4196
	}
4197
}
4198
4199 7850de1c Ermal Lu?i
function link_interface_to_vlans($int, $action = "") {
4200
	global $config;
4201
4202
	if (empty($int))
4203
		return;
4204
4205
	if (is_array($config['vlans']['vlan'])) {
4206 a362a23a Ermal
		$ifaces = array();
4207 1c3ddd9e Renato Botelho
		foreach ($config['vlans']['vlan'] as $vlan) {
4208 fa4a331f Ermal
			if ($int == $vlan['if']) {
4209 7850de1c Ermal Lu?i
				if ($action == "update") {
4210 fa4a331f Ermal
					interfaces_bring_up($int);
4211 7850de1c Ermal Lu?i
				} else if ($action == "")
4212 a362a23a Ermal
					$ifaces[$vlan['tag']] = $vlan;
4213 7850de1c Ermal Lu?i
			}
4214
		}
4215 a362a23a Ermal
		if (!empty($ifaces))
4216
			return $ifaces;
4217 7850de1c Ermal Lu?i
	}
4218
}
4219
4220
function link_interface_to_vips($int, $action = "") {
4221 1c3ddd9e Renato Botelho
	global $config;
4222 e5ac67ed Ermal Lu?i
4223 1c3ddd9e Renato Botelho
	if (is_array($config['virtualip']['vip'])) {
4224 75201355 Ermal
		$result = array();
4225 dcadda55 Ermal
		foreach ($config['virtualip']['vip'] as $vip) {
4226
			if ($int == $vip['interface']) {
4227 7b47bd4c Ermal
				if ($action == "update")
4228
					interfaces_vips_configure($int);
4229
				else
4230 75201355 Ermal
					$result[] = $vip;
4231 7850de1c Ermal Lu?i
			}
4232 dcadda55 Ermal
		}
4233 75201355 Ermal
		return $result;
4234 dcadda55 Ermal
	}
4235 e5ac67ed Ermal Lu?i
}
4236
4237 afb2de1b Ermal Lu?i
/****f* interfaces/link_interface_to_bridge
4238
 * NAME
4239
 *   link_interface_to_bridge - Finds out a bridge group for an interface
4240
 * INPUTS
4241
 *   $ip
4242
 * RESULT
4243
 *   bridge[0-99]
4244
 ******/
4245
function link_interface_to_bridge($int) {
4246 1c3ddd9e Renato Botelho
	global $config;
4247 afb2de1b Ermal Lu?i
4248 1c3ddd9e Renato Botelho
	if (is_array($config['bridges']['bridged'])) {
4249
		foreach ($config['bridges']['bridged'] as $bridge) {
4250 a639bb91 Ermal
			if (in_array($int, explode(',', $bridge['members'])))
4251 1c3ddd9e Renato Botelho
				return "{$bridge['bridgeif']}";
4252 a639bb91 Ermal
		}
4253
	}
4254 afb2de1b Ermal Lu?i
}
4255
4256 48f23632 Ermal
function link_interface_to_group($int) {
4257 1c3ddd9e Renato Botelho
	global $config;
4258 48f23632 Ermal
4259 ed62880b Ermal
	$result = array();
4260
4261 1c3ddd9e Renato Botelho
	if (is_array($config['ifgroups']['ifgroupentry'])) {
4262
		foreach ($config['ifgroups']['ifgroupentry'] as $group) {
4263 1dbc0c43 Ermal
			if (in_array($int, explode(" ", $group['members'])))
4264 ed62880b Ermal
				$result[$group['ifname']] = $int;
4265 48f23632 Ermal
		}
4266
	}
4267 ed62880b Ermal
4268
	return $result;
4269 48f23632 Ermal
}
4270
4271 afb2de1b Ermal Lu?i
function link_interface_to_gre($interface) {
4272 1c3ddd9e Renato Botelho
	global $config;
4273 afb2de1b Ermal Lu?i
4274 ed62880b Ermal
	$result = array();
4275
4276 1c3ddd9e Renato Botelho
	if (is_array($config['gres']['gre'])) {
4277
		foreach ($config['gres']['gre'] as $gre)
4278
			if($gre['if'] == $interface)
4279 ed62880b Ermal
				$result[] = $gre;
4280
	}
4281
4282
	return $result;
4283 afb2de1b Ermal Lu?i
}
4284
4285
function link_interface_to_gif($interface) {
4286 1c3ddd9e Renato Botelho
	global $config;
4287 afb2de1b Ermal Lu?i
4288 ed62880b Ermal
	$result = array();
4289
4290 1c3ddd9e Renato Botelho
	if (is_array($config['gifs']['gif'])) {
4291
		foreach ($config['gifs']['gif'] as $gif)
4292
			if($gif['if'] == $interface)
4293
				$result[] = $gif;
4294 ed62880b Ermal
	}
4295
4296
	return $result;
4297 afb2de1b Ermal Lu?i
}
4298
4299
/*
4300
 * find_interface_ip($interface): return the interface ip (first found)
4301
 */
4302
function find_interface_ip($interface, $flush = false)
4303
{
4304
	global $interface_ip_arr_cache;
4305 01f1b601 Ermal
	global $interface_sn_arr_cache;
4306 afb2de1b Ermal Lu?i
4307
	$interface = str_replace("\n", "", $interface);
4308 be45aa79 Renato Botelho
4309 8256f324 gnhb
	if (!does_interface_exist($interface))
4310 afb2de1b Ermal Lu?i
		return;
4311
4312
	/* Setup IP cache */
4313
	if (!isset($interface_ip_arr_cache[$interface]) or $flush) {
4314 3f70e618 Ermal Lu?i
		$ifinfo = pfSense_get_interface_addresses($interface);
4315
		$interface_ip_arr_cache[$interface] = $ifinfo['ipaddr'];
4316 01f1b601 Ermal
		$interface_sn_arr_cache[$interface] = $ifinfo['subnetbits'];
4317 afb2de1b Ermal Lu?i
	}
4318
4319
	return $interface_ip_arr_cache[$interface];
4320
}
4321
4322 47593ac6 Seth Mos
/*
4323
 * find_interface_ipv6($interface): return the interface ip (first found)
4324
 */
4325
function find_interface_ipv6($interface, $flush = false)
4326
{
4327
	global $interface_ipv6_arr_cache;
4328
	global $interface_snv6_arr_cache;
4329 31ace4ea Seth Mos
	global $config;
4330 be45aa79 Renato Botelho
4331 31bdb9e5 smos
	$interface = trim($interface);
4332
	$interface = get_real_interface($interface);
4333 be45aa79 Renato Botelho
4334 47593ac6 Seth Mos
	if (!does_interface_exist($interface))
4335
		return;
4336
4337
	/* Setup IP cache */
4338
	if (!isset($interface_ipv6_arr_cache[$interface]) or $flush) {
4339 3c5e10fc Seth Mos
		// FIXME: Add IPv6 support to the pfSense module
4340 1d66a364 Ermal
		$ifinfo = array();
4341 31ace4ea Seth Mos
		exec("/sbin/ifconfig {$interface} inet6", $output);
4342
		foreach($output as $line) {
4343
			if(preg_match("/inet6/", $line)) {
4344
				$parts = explode(" ", $line);
4345 c9d174df Seth Mos
				if(! preg_match("/fe80::/", $parts[1])) {
4346 31ace4ea Seth Mos
					$ifinfo['ipaddrv6'] = $parts[1];
4347 a23a99cb Seth Mos
					if($parts[2] == "-->") {
4348 cf6bc278 Seth Mos
						$parts[5] = "126";
4349 9991ff2c Seth Mos
						$ifinfo['subnetbitsv6'] = $parts[5];
4350 a23a99cb Seth Mos
					} else {
4351 9991ff2c Seth Mos
						$ifinfo['subnetbitsv6'] = $parts[3];
4352 a23a99cb Seth Mos
					}
4353 acc68ffa Renato Botelho
					break;
4354 31ace4ea Seth Mos
				}
4355
			}
4356
		}
4357 47593ac6 Seth Mos
		$interface_ipv6_arr_cache[$interface] = $ifinfo['ipaddrv6'];
4358
		$interface_snv6_arr_cache[$interface] = $ifinfo['subnetbitsv6'];
4359
	}
4360
4361
	return $interface_ipv6_arr_cache[$interface];
4362
}
4363
4364 81a3b6f5 smos
/*
4365
 * find_interface_ipv6_ll($interface): return the interface ipv6 link local (first found)
4366
 */
4367
function find_interface_ipv6_ll($interface, $flush = false)
4368
{
4369 58418355 smos
	global $interface_llv6_arr_cache;
4370 81a3b6f5 smos
	global $config;
4371 be45aa79 Renato Botelho
4372 81a3b6f5 smos
	$interface = str_replace("\n", "", $interface);
4373 be45aa79 Renato Botelho
4374 81a3b6f5 smos
	if (!does_interface_exist($interface))
4375
		return;
4376
4377
	/* Setup IP cache */
4378 58418355 smos
	if (!isset($interface_llv6_arr_cache[$interface]) or $flush) {
4379 81a3b6f5 smos
		$ifinfo = pfSense_get_interface_addresses($interface);
4380
		// FIXME: Add IPv6 support to the pfSense module
4381
		exec("/sbin/ifconfig {$interface} inet6", $output);
4382
		foreach($output as $line) {
4383
			if(preg_match("/inet6/", $line)) {
4384
				$parts = explode(" ", $line);
4385
				if(preg_match("/fe80::/", $parts[1])) {
4386 58418355 smos
					$partsaddress = explode("%", $parts[1]);
4387
					$ifinfo['linklocal'] = $partsaddress[0];
4388 81a3b6f5 smos
				}
4389
			}
4390
		}
4391 58418355 smos
		$interface_llv6_arr_cache[$interface] = $ifinfo['linklocal'];
4392 81a3b6f5 smos
	}
4393 58418355 smos
	return $interface_llv6_arr_cache[$interface];
4394 81a3b6f5 smos
}
4395
4396 afb2de1b Ermal Lu?i
function find_interface_subnet($interface, $flush = false)
4397
{
4398
	global $interface_sn_arr_cache;
4399 01f1b601 Ermal
	global $interface_ip_arr_cache;
4400 afb2de1b Ermal Lu?i
4401
	$interface = str_replace("\n", "", $interface);
4402
	if (does_interface_exist($interface) == false)
4403
		return;
4404
4405
	if (!isset($interface_sn_arr_cache[$interface]) or $flush) {
4406 bd96e1fe Ermal Lu?i
		$ifinfo = pfSense_get_interface_addresses($interface);
4407 01f1b601 Ermal
		$interface_ip_arr_cache[$interface] = $ifinfo['ipaddr'];
4408 bd96e1fe Ermal Lu?i
		$interface_sn_arr_cache[$interface] = $ifinfo['subnetbits'];
4409 1c3ddd9e Renato Botelho
	}
4410 afb2de1b Ermal Lu?i
4411
	return $interface_sn_arr_cache[$interface];
4412
}
4413
4414 47593ac6 Seth Mos
function find_interface_subnetv6($interface, $flush = false)
4415
{
4416
	global $interface_snv6_arr_cache;
4417
	global $interface_ipv6_arr_cache;
4418
4419
	$interface = str_replace("\n", "", $interface);
4420
	if (does_interface_exist($interface) == false)
4421
		return;
4422
4423 c4fc2eae Ermal
	$foundv6 = false;
4424 47593ac6 Seth Mos
	if (!isset($interface_snv6_arr_cache[$interface]) or $flush) {
4425 a56d8b08 Ermal
		$ifinfo = array();
4426 3c5e10fc Seth Mos
		// FIXME: Add IPv6 support to the pfSense module
4427 c4fc2eae Ermal
		unset($output);
4428 9991ff2c Seth Mos
		exec("/sbin/ifconfig {$interface} inet6", $output);
4429
		foreach($output as $line) {
4430 c4fc2eae Ermal
			$line = trim($line);
4431 9991ff2c Seth Mos
			if(preg_match("/inet6/", $line)) {
4432
				$parts = explode(" ", $line);
4433
				if(! preg_match("/fe80::/", $parts[1])) {
4434
					$ifinfo['ipaddrv6'] = $parts[1];
4435 a23a99cb Seth Mos
					if($parts[2] == "-->") {
4436 cf6bc278 Seth Mos
						$parts[5] = "126";
4437 9991ff2c Seth Mos
						$ifinfo['subnetbitsv6'] = $parts[5];
4438 a23a99cb Seth Mos
					} else {
4439 9991ff2c Seth Mos
						$ifinfo['subnetbitsv6'] = $parts[3];
4440 a23a99cb Seth Mos
					}
4441 c4fc2eae Ermal
					$foundv6 = true;
4442
					break;
4443 9991ff2c Seth Mos
				}
4444
			}
4445
		}
4446 c4fc2eae Ermal
		if ($foundv6 === true) {
4447
			$interface_ipv6_arr_cache[$interface] = $ifinfo['ipaddrv6'];
4448
			$interface_snv6_arr_cache[$interface] = $ifinfo['subnetbitsv6'];
4449
		} else
4450
			unset($interface_ipv6_arr_cache[$interface], $interface_snv6_arr_cache[$interface]);
4451 1c3ddd9e Renato Botelho
	}
4452 47593ac6 Seth Mos
4453
	return $interface_snv6_arr_cache[$interface];
4454
}
4455
4456 e19b7d1e Ermal
function ip_in_interface_alias_subnet($interface, $ipalias) {
4457
	global $config;
4458
4459
	if (empty($interface) || !is_ipaddr($ipalias))
4460 e8471084 Ermal
		return false;
4461 e19b7d1e Ermal
	if (is_array($config['virtualip']['vip'])) {
4462 1c3ddd9e Renato Botelho
		foreach ($config['virtualip']['vip'] as $vip) {
4463
			switch ($vip['mode']) {
4464
			case "ipalias":
4465
				if ($vip['interface'] <> $interface)
4466
					break;
4467 e19b7d1e Ermal
				if (ip_in_subnet($ipalias, gen_subnet($vip['subnet'], $vip['subnet_bits']) . "/" . $vip['subnet_bits']))
4468 e8471084 Ermal
					return true;
4469 1c3ddd9e Renato Botelho
				break;
4470
			}
4471
		}
4472 e19b7d1e Ermal
	}
4473 e8471084 Ermal
4474
	return false;
4475 e19b7d1e Ermal
}
4476
4477 e88fbe50 Ermal Lu?i
function get_interface_ip($interface = "wan")
4478
{
4479 bf001dec smos
	$realif = get_failover_interface($interface);
4480 afb2de1b Ermal Lu?i
	if (!$realif) {
4481
		if (preg_match("/^carp/i", $interface))
4482
			$realif = $interface;
4483 5a61fd69 smos
		else if (preg_match("/^[a-z0-9]+_vip/i", $interface))
4484 564df7c2 Ermal Lu?i
			$realif = $interface;
4485 afb2de1b Ermal Lu?i
		else
4486
			return null;
4487
	}
4488
4489 5e041d5f Scott Ullrich
	$curip = find_interface_ip($realif);
4490
	if ($curip && is_ipaddr($curip) && ($curip != "0.0.0.0"))
4491
		return $curip;
4492 8256f324 gnhb
	else
4493
		return null;
4494 5b237745 Scott Ullrich
}
4495
4496 b6c1f22f Ermal
function get_interface_ipv6($interface = "wan", $flush = false)
4497 47593ac6 Seth Mos
{
4498 479f0fda smos
	global $config;
4499 c4fc2eae Ermal
4500 909de400 Ermal
	$realif = get_failover_interface($interface, "inet6");
4501 47593ac6 Seth Mos
	if (!$realif) {
4502 c4fc2eae Ermal
		if (preg_match("/^[a-z0-9]+_vip/i", $interface))
4503 47593ac6 Seth Mos
			$realif = $interface;
4504
		else
4505
			return null;
4506
	}
4507
4508 b6c1f22f Ermal
	$curip = find_interface_ipv6($realif, $flush);
4509 47593ac6 Seth Mos
	if ($curip && is_ipaddrv6($curip) && ($curip != "::"))
4510
		return $curip;
4511
	else
4512
		return null;
4513
}
4514
4515 58418355 smos
function get_interface_linklocal($interface = "wan")
4516
{
4517 bf001dec smos
	$realif = get_failover_interface($interface);
4518 58418355 smos
	if (!$realif) {
4519
		if (preg_match("/^carp/i", $interface))
4520
			$realif = $interface;
4521 5a61fd69 smos
		else if (preg_match("/^[a-z0-9]+_vip/i", $interface))
4522 58418355 smos
			$realif = $interface;
4523
		else
4524
			return null;
4525
	}
4526
4527
	$curip = find_interface_ipv6_ll($realif);
4528
	if ($curip && is_ipaddrv6($curip) && ($curip != "::"))
4529
		return $curip;
4530
	else
4531
		return null;
4532
}
4533
4534 e88fbe50 Ermal Lu?i
function get_interface_subnet($interface = "wan")
4535
{
4536 31b24870 Ermal Luçi
	$realif = get_real_interface($interface);
4537 e88fbe50 Ermal Lu?i
	if (!$realif) {
4538 1c3ddd9e Renato Botelho
		if (preg_match("/^carp/i", $interface))
4539
			$realif = $interface;
4540
		else if (preg_match("/^[a-z0-9]+_vip/i", $interface))
4541
			$realif = $interface;
4542
		else
4543
			return null;
4544
	}
4545 e88fbe50 Ermal Lu?i
4546 5e041d5f Scott Ullrich
	$cursn = find_interface_subnet($realif);
4547
	if (!empty($cursn))
4548 31b24870 Ermal Luçi
		return $cursn;
4549
4550
	return null;
4551
}
4552
4553 47593ac6 Seth Mos
function get_interface_subnetv6($interface = "wan")
4554
{
4555 c4fc2eae Ermal
	global $config;
4556
4557 6fb66736 Ermal
	$realif = get_real_interface($interface, "inet6");
4558 47593ac6 Seth Mos
	if (!$realif) {
4559 c4fc2eae Ermal
		if (preg_match("/^[a-z0-9]+_vip/i", $interface))
4560 1c3ddd9e Renato Botelho
			$realif = $interface;
4561
		else
4562
			return null;
4563
	}
4564 47593ac6 Seth Mos
4565
	$cursn = find_interface_subnetv6($realif);
4566
	if (!empty($cursn))
4567
		return $cursn;
4568
4569
	return null;
4570
}
4571
4572 52947718 Ermal Lu?i
/* return outside interfaces with a gateway */
4573
function get_interfaces_with_gateway() {
4574 77ccab82 Scott Ullrich
	global $config;
4575 52947718 Ermal Lu?i
4576
	$ints = array();
4577
4578
	/* loop interfaces, check config for outbound */
4579 77ccab82 Scott Ullrich
	foreach($config['interfaces'] as $ifdescr => $ifname) {
4580
		switch ($ifname['ipaddr']) {
4581
			case "dhcp":
4582 39f750b5 gnhb
			case "ppp";
4583 77ccab82 Scott Ullrich
			case "pppoe":
4584
			case "pptp":
4585 6d5446a2 Ermal
			case "l2tp":
4586 9ebe7028 gnhb
			case "ppp";
4587 6d5446a2 Ermal
				$ints[$ifdescr] = $ifdescr;
4588 77ccab82 Scott Ullrich
			break;
4589
			default:
4590 c822154c jim-p
				if (substr($ifname['if'], 0, 4) ==  "ovpn" ||
4591 f6b30142 Ermal
				    !empty($ifname['gateway']))
4592 6d5446a2 Ermal
					$ints[$ifdescr] = $ifdescr;
4593 77ccab82 Scott Ullrich
			break;
4594
		}
4595
	}
4596
	return $ints;
4597 52947718 Ermal Lu?i
}
4598
4599
/* return true if interface has a gateway */
4600
function interface_has_gateway($friendly) {
4601 6d5446a2 Ermal
	global $config;
4602 52947718 Ermal Lu?i
4603 6d5446a2 Ermal
	if (!empty($config['interfaces'][$friendly])) {
4604 43a22ee2 jim-p
		$ifname = &$config['interfaces'][$friendly];
4605 6d5446a2 Ermal
		switch ($ifname['ipaddr']) {
4606
			case "dhcp":
4607
			case "pppoe":
4608
			case "pptp":
4609
			case "l2tp":
4610
			case "ppp";
4611
				return true;
4612
			break;
4613
			default:
4614 c822154c jim-p
				if (substr($ifname['if'], 0, 4) ==  "ovpn")
4615 e9d7afeb Ermal
					return true;
4616 6d5446a2 Ermal
				if (!empty($ifname['gateway']))
4617
					return true;
4618
			break;
4619
		}
4620
	}
4621 52947718 Ermal Lu?i
4622
	return false;
4623
}
4624
4625 2feb85af Seth Mos
/* return true if interface has a gateway */
4626
function interface_has_gatewayv6($friendly) {
4627
	global $config;
4628
4629
	if (!empty($config['interfaces'][$friendly])) {
4630
		$ifname = &$config['interfaces'][$friendly];
4631
		switch ($ifname['ipaddrv6']) {
4632 67102344 smos
			case "slaac":
4633 2feb85af Seth Mos
			case "dhcp6":
4634 a11a839d smos
			case "6to4":
4635 d500e296 smos
			case "6rd":
4636
				return true;
4637 a11a839d smos
				break;
4638 2feb85af Seth Mos
			default:
4639 c822154c jim-p
				if (substr($ifname['if'], 0, 4) ==  "ovpn")
4640 2feb85af Seth Mos
					return true;
4641
				if (!empty($ifname['gatewayv6']))
4642
					return true;
4643 a11a839d smos
				break;
4644 2feb85af Seth Mos
		}
4645
	}
4646
4647
	return false;
4648
}
4649
4650 a57b119e Bill Marquette
/****f* interfaces/is_altq_capable
4651
 * NAME
4652
 *   is_altq_capable - Test if interface is capable of using ALTQ
4653
 * INPUTS
4654
 *   $int            - string containing interface name
4655
 * RESULT
4656
 *   boolean         - true or false
4657
 ******/
4658
4659 eba938e3 Scott Ullrich
function is_altq_capable($int) {
4660 1c3ddd9e Renato Botelho
	/* Per:
4661
	 * http://www.freebsd.org/cgi/man.cgi?query=altq&manpath=FreeBSD+7.2-current&format=html
4662
	 * Only the following drivers have ALTQ support
4663
	 */
4664 c2d7074e Ermal
	$capable = array("age", "alc", "ale", "an", "ath", "aue", "awi", "bce",
4665 a5ccf623 jim-p
			"bfe", "bge", "bridge", "cas", "dc", "de", "ed", "em", "ep", "fxp", "gem",
4666 be888d7f Ermal
			"hme", "igb", "ipw", "iwi", "jme", "le", "lem", "msk", "mxge", "my", "nfe",
4667 8c62fa48 jim-p
			"npe", "nve", "ral", "re", "rl", "rum", "run", "bwn", "sf", "sis", "sk",
4668 64fe3233 Seth Mos
			"ste", "stge", "txp", "udav", "ural", "vge", "vr", "wi", "xl",
4669 febca7e8 Ermal
			"ndis", "tun", "ovpns", "ovpnc", "vlan", "pppoe", "pptp", "ng",
4670 cf205dca Ermal
			"l2tp", "ppp", "vtnet");
4671 a57b119e Bill Marquette
4672 2ccac125 Renato Botelho
	$int_family = remove_ifindex($int);
4673 a57b119e Bill Marquette
4674 2163ace9 phildd
	if (in_array($int_family, $capable))
4675 1c3ddd9e Renato Botelho
		return true;
4676 dbe67167 Ermal
	else if (stristr($int, "l2tp")) /* VLANs are name $parent_$vlan now */
4677
		return true;
4678 76254caa Renato Botelho
	else if (stristr($int, "_vlan")) /* VLANs are name $parent_$vlan now */
4679 7e627719 Ermal
		return true;
4680 21699e76 Ermal
	else if (stristr($int, "_wlan")) /* WLANs are name $parent_$wlan now */
4681 2f3446db Ermal Lu?i
		return true;
4682 1c3ddd9e Renato Botelho
	else
4683
		return false;
4684 a57b119e Bill Marquette
}
4685
4686 52947718 Ermal Lu?i
/****f* interfaces/is_interface_wireless
4687
 * NAME
4688
 *   is_interface_wireless - Returns if an interface is wireless
4689
 * RESULT
4690
 *   $tmp       - Returns if an interface is wireless
4691
 ******/
4692
function is_interface_wireless($interface) {
4693 1c3ddd9e Renato Botelho
	global $config, $g;
4694
4695
	$friendly = convert_real_interface_to_friendly_interface_name($interface);
4696
	if(!isset($config['interfaces'][$friendly]['wireless'])) {
4697
		if (preg_match($g['wireless_regex'], $interface)) {
4698
			if (isset($config['interfaces'][$friendly]))
4699
				$config['interfaces'][$friendly]['wireless'] = array();
4700
			return true;
4701
		}
4702
		return false;
4703
	} else
4704
		return true;
4705 52947718 Ermal Lu?i
}
4706
4707 eba938e3 Scott Ullrich
function get_wireless_modes($interface) {
4708 d8c67d69 Scott Ullrich
	/* return wireless modes and channels */
4709 92f7d37d Ermal Luçi
	$wireless_modes = array();
4710
4711 5357f386 Erik Fonnesbeck
	$cloned_interface = get_real_interface($interface);
4712 1b773d20 Ermal Lu?i
4713 5357f386 Erik Fonnesbeck
	if($cloned_interface && is_interface_wireless($cloned_interface)) {
4714 1b773d20 Ermal Lu?i
		$chan_list = "/sbin/ifconfig {$cloned_interface} list chan";
4715
		$stack_list = "/usr/bin/awk -F\"Channel \" '{ gsub(/\\*/, \" \"); print \$2 \"\\\n\" \$3 }'";
4716 1de74081 Ermal Lu?i
		$format_list = "/usr/bin/awk '{print \$5 \" \" \$6 \",\" \$1}'";
4717 d8c67d69 Scott Ullrich
4718 4b0e71db Scott Ullrich
		$interface_channels = "";
4719 d8c67d69 Scott Ullrich
		exec("$chan_list | $stack_list | sort -u | $format_list 2>&1", $interface_channels);
4720
		$interface_channel_count = count($interface_channels);
4721
4722
		$c = 0;
4723
		while ($c < $interface_channel_count)
4724
		{
4725
			$channel_line = explode(",", $interface_channels["$c"]);
4726
			$wireless_mode = trim($channel_line[0]);
4727
			$wireless_channel = trim($channel_line[1]);
4728 4066776d Scott Ullrich
			if(trim($wireless_mode) != "") {
4729
				/* if we only have 11g also set 11b channels */
4730
				if($wireless_mode == "11g") {
4731 1ae54336 Erik Fonnesbeck
					if(!isset($wireless_modes["11b"]))
4732
						$wireless_modes["11b"] = array();
4733 39c1349c Erik Fonnesbeck
				} else if($wireless_mode == "11g ht") {
4734 1ae54336 Erik Fonnesbeck
					if(!isset($wireless_modes["11b"]))
4735
						$wireless_modes["11b"] = array();
4736
					if(!isset($wireless_modes["11g"]))
4737
						$wireless_modes["11g"] = array();
4738 39c1349c Erik Fonnesbeck
					$wireless_mode = "11ng";
4739
				} else if($wireless_mode == "11a ht") {
4740 1ae54336 Erik Fonnesbeck
					if(!isset($wireless_modes["11a"]))
4741
						$wireless_modes["11a"] = array();
4742 39c1349c Erik Fonnesbeck
					$wireless_mode = "11na";
4743 4066776d Scott Ullrich
				}
4744
				$wireless_modes["$wireless_mode"]["$c"] = $wireless_channel;
4745
			}
4746 d8c67d69 Scott Ullrich
			$c++;
4747
		}
4748
	}
4749 4066776d Scott Ullrich
	return($wireless_modes);
4750 d8c67d69 Scott Ullrich
}
4751
4752 f4094f0d Erik Fonnesbeck
/* return channel numbers, frequency, max txpower, and max regulation txpower */
4753
function get_wireless_channel_info($interface) {
4754
	$wireless_channels = array();
4755
4756 5357f386 Erik Fonnesbeck
	$cloned_interface = get_real_interface($interface);
4757 f4094f0d Erik Fonnesbeck
4758 5357f386 Erik Fonnesbeck
	if($cloned_interface && is_interface_wireless($cloned_interface)) {
4759 f4094f0d Erik Fonnesbeck
		$chan_list = "/sbin/ifconfig {$cloned_interface} list txpower";
4760
		$stack_list = "/usr/bin/awk -F\"Channel \" '{ gsub(/\\*/, \" \"); print \$2 \"\\\n\" \$3 }'";
4761
		$format_list = "/usr/bin/awk '{print \$1 \",\" \$3 \" \" \$4 \",\" \$5 \",\" \$7}'";
4762
4763
		$interface_channels = "";
4764
		exec("$chan_list | $stack_list | sort -u | $format_list 2>&1", $interface_channels);
4765
4766
		foreach ($interface_channels as $channel_line) {
4767
			$channel_line = explode(",", $channel_line);
4768
			if(!isset($wireless_channels[$channel_line[0]]))
4769
				$wireless_channels[$channel_line[0]] = $channel_line;
4770
		}
4771
	}
4772
	return($wireless_channels);
4773
}
4774
4775 52947718 Ermal Lu?i
/****f* interfaces/get_interface_mtu
4776
 * NAME
4777
 *   get_interface_mtu - Return the mtu of an interface
4778
 * RESULT
4779
 *   $tmp       - Returns the mtu of an interface
4780
 ******/
4781
function get_interface_mtu($interface) {
4782 1c3ddd9e Renato Botelho
	$mtu = pfSense_get_interface_addresses($interface);
4783
	return $mtu['mtu'];
4784 52947718 Ermal Lu?i
}
4785
4786 eba938e3 Scott Ullrich
function get_interface_mac($interface) {
4787 7d6076f3 Ermal Lu?i
4788 3f70e618 Ermal Lu?i
	$macinfo = pfSense_get_interface_addresses($interface);
4789
	return $macinfo["macaddr"];
4790 f2ba47f8 Ermal Lu?i
}
4791
4792
/****f* pfsense-utils/generate_random_mac_address
4793
 * NAME
4794
 *   generate_random_mac - generates a random mac address
4795
 * INPUTS
4796
 *   none
4797
 * RESULT
4798
 *   $mac - a random mac address
4799
 ******/
4800
function generate_random_mac_address() {
4801 1c3ddd9e Renato Botelho
	$mac = "02";
4802
	for($x=0; $x<5; $x++)
4803
		$mac .= ":" . dechex(rand(16, 255));
4804
	return $mac;
4805 53c82ef9 Scott Ullrich
}
4806 b7ec2b9e Scott Ullrich
4807 52947718 Ermal Lu?i
/****f* interfaces/is_jumbo_capable
4808
 * NAME
4809
 *   is_jumbo_capable - Test if interface is jumbo frame capable.  Useful for determining VLAN capability.
4810
 * INPUTS
4811
 *   $int             - string containing interface name
4812
 * RESULT
4813
 *   boolean          - true or false
4814
 ******/
4815 47ee6926 Ermal
function is_jumbo_capable($iface) {
4816
	$iface = trim($iface);
4817
	$capable = pfSense_get_interface_addresses($iface);
4818 a687f866 Namezero
4819 1c3ddd9e Renato Botelho
	if (isset($capable['caps']['vlanmtu']))
4820
		return true;
4821 a687f866 Namezero
4822 47ee6926 Ermal
	return false;
4823 52947718 Ermal Lu?i
}
4824
4825 70e46e62 Ermal
function interface_setup_pppoe_reset_file($pppif, $iface="") {
4826 55f3ca1d gnhb
	global $g;
4827 70e46e62 Ermal
4828 5c8e8a17 gnhb
	$cron_file = "{$g['varetc_path']}/pppoe_restart_{$pppif}";
4829 766bd6d0 gnhb
4830 5c8e8a17 gnhb
	if(!empty($iface) && !empty($pppif)){
4831 7673cdb5 Ermal
		$cron_cmd = <<<EOD
4832
#!/bin/sh
4833
/usr/local/sbin/pfSctl -c 'interface reload {$iface}'
4834 70e46e62 Ermal
/usr/bin/logger -t {$pppif} "PPPoE periodic reset executed on {$iface}"
4835 7673cdb5 Ermal
4836
EOD;
4837
4838 70e46e62 Ermal
		@file_put_contents($cron_file, $cron_cmd);
4839
		chmod($cron_file, 0755);
4840 55f3ca1d gnhb
		sigkillbypid("{$g['varrun_path']}/cron.pid", "HUP");
4841 a5d6f60b Ermal Lu?i
	} else
4842 766bd6d0 gnhb
		unlink_if_exists($cron_file);
4843 b7ec2b9e Scott Ullrich
}
4844
4845 56da23dc Ermal
function get_interface_default_mtu($type = "ethernet") {
4846
	switch ($type) {
4847
	case "gre":
4848
		return 1476;
4849
		break;
4850
	case "gif":
4851
		return 1280;
4852
		break;
4853
	case "tun":
4854
	case "vlan":
4855
	case "tap":
4856
	case "ethernet":
4857
	default:
4858
		return 1500;
4859
		break;
4860
	}
4861
4862
	/* Never reached */
4863
	return 1500;
4864
}
4865
4866 dd62256f Pierre POMES
function get_vip_descr($ipaddress) {
4867
	global $config;
4868
4869
	foreach ($config['virtualip']['vip'] as $vip) {
4870
		if ($vip['subnet'] == $ipaddress) {
4871
			return ($vip['descr']);
4872
		}
4873
	}
4874
	return "";
4875
}
4876
4877 d368b334 jim-p
function interfaces_staticarp_configure($if) {
4878
	global $config, $g;
4879
	if(isset($config['system']['developerspew'])) {
4880
		$mt = microtime();
4881
		echo "interfaces_staticarp_configure($if) being called $mt\n";
4882
	}
4883
4884
	$ifcfg = $config['interfaces'][$if];
4885
4886 873e49ec Renato Botelho
	if (empty($if) || empty($ifcfg['if']) || !isset($ifcfg['enable']))
4887 d368b334 jim-p
		return 0;
4888
4889
	/* Enable staticarp, if enabled */
4890
	if(isset($config['dhcpd'][$if]['staticarp'])) {
4891
		mwexec("/sbin/ifconfig " . escapeshellarg($ifcfg['if']) . " staticarp " );
4892
		mwexec("/usr/sbin/arp -d -i " . escapeshellarg($ifcfg['if']) . " -a > /dev/null 2>&1 ");
4893
		if (is_array($config['dhcpd'][$if]['staticmap'])) {
4894
4895
			foreach ($config['dhcpd'][$if]['staticmap'] as $arpent) {
4896
				mwexec("/usr/sbin/arp -s " . escapeshellarg($arpent['ipaddr']) . " " . escapeshellarg($arpent['mac']));
4897
4898
			}
4899
4900
		}
4901
	} else {
4902
		mwexec("/sbin/ifconfig " . escapeshellarg($ifcfg['if']) . " -staticarp " );
4903
		mwexec("/usr/sbin/arp -d -i " . escapeshellarg($ifcfg['if']) . " -a > /dev/null 2>&1 ");
4904 25c1ebd5 N0YB
		if (is_array($config['dhcpd'][$if]['staticmap'])) {
4905
			foreach ($config['dhcpd'][$if]['staticmap'] as $arpent) {
4906
				if (isset($arpent['arp_table_static_entry'])) {
4907
					mwexec("/usr/sbin/arp -s " . escapeshellarg($arpent['ipaddr']) . " " . escapeshellarg($arpent['mac']));
4908
				}
4909
			}
4910
		}
4911 d368b334 jim-p
	}
4912
4913
	return 0;
4914
}
4915
4916 909de400 Ermal
function get_failover_interface($interface, $family = "all") {
4917 bf001dec smos
	global $config;
4918 e90c833a smos
	/* shortcut to get_real_interface if we find it in the config */
4919
	if(is_array($config['interfaces'][$interface])) {
4920 909de400 Ermal
		$wanif = get_real_interface($interface, $family);
4921 e90c833a smos
		return $wanif;
4922
	}
4923
4924 bf001dec smos
	/* compare against gateway groups */
4925
	$a_groups = return_gateway_groups_array();
4926
	if(is_array($a_groups[$interface])) {
4927
		/* we found a gateway group, fetch the interface or vip */
4928
		if($a_groups[$interface][0]['vip'] <> "")
4929
			$wanif = $a_groups[$interface][0]['vip'];
4930
		else
4931
			$wanif = $a_groups[$interface][0]['int'];
4932 be45aa79 Renato Botelho
4933 bf001dec smos
		return $wanif;
4934
	}
4935
	/* fall through to get_real_interface */
4936 909de400 Ermal
	$wanif = get_real_interface($interface, $family);
4937 bf001dec smos
	return $wanif;
4938
}
4939
4940 2ccac125 Renato Botelho
function remove_ifindex($ifname) {
4941
	return preg_replace("/[0-9]+$/", "", $ifname);
4942
}
4943
4944 6a7dd9bb Ermal
?>