Project

General

Profile

Download (141 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
	if (!stristr($qinqif, "vlan"))
327
		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 bcfe4ae5 Ermal
			mwexec("/bin/kill {$pid}");
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 c495f88b Seth Mos
	if ($interface)
2695 b0059636 Ermal
		if (isvalidpid("{$g['varrun_path']}/dhcp6c_{$interface}.pid"))
2696
			$pid = trim(file_get_contents("{$g['varrun_path']}/dhcp6c_{$interface}.pid"), " \n");
2697 c495f88b Seth Mos
	else
2698 74fa57aa smos
		return(false);
2699 c495f88b Seth Mos
2700
	return intval($pid);
2701
}
2702
2703 4ffa46bf Ermal
function interface_vlan_mtu_configured($realhwif, $mtu) {
2704
	global $config;
2705
2706
	if (is_array($config['vlans']['vlan'])) {
2707
		foreach ($config['vlans']['vlan'] as $vlan) {
2708
			if ($vlan['if'] != $realhwif)
2709
				continue;
2710
			$assginedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
2711
			if (!empty($assginedport)) {
2712
				$portmtu = $config['interfaces'][$assginedport]['mtu'];
2713
				if (!empty($portmtu) && $portmtu > $mtu)
2714
					$mtu = $portmtu;
2715
			}
2716
		}
2717
	}
2718
2719
	return $mtu;
2720
}
2721
2722 7413cbfd Ermal
function interface_configure($interface = "wan", $reloadall = false, $linkupevent = false) {
2723 675aac3d Ermal Luçi
	global $config, $g;
2724 31b24870 Ermal Luçi
	global $interface_sn_arr_cache, $interface_ip_arr_cache;
2725 3502b5b1 Seth Mos
	global $interface_snv6_arr_cache, $interface_ipv6_arr_cache;
2726 cfc707f7 Scott Ullrich
2727 67ee1ec5 Ermal Luçi
	$wancfg = $config['interfaces'][$interface];
2728
2729 e017a46a Ermal
	if (!isset($wancfg['enable']))
2730
		return;
2731
2732 85a5da13 Ermal Luçi
	$realif = get_real_interface($interface);
2733 20cb9803 gnhb
	$realhwif_array = get_parent_interface($interface);
2734
	// Need code to handle MLPPP if we ever use $realhwif for MLPPP handling
2735
	$realhwif = $realhwif_array[0];
2736 cfc707f7 Scott Ullrich
2737 5a3031ea smos
	/* Disable Accepting router advertisements unless specifically requested */
2738 9cd6b950 Ermal
	if ($g['debug'])
2739
		log_error("Deny router advertisements for interface {$interface}");
2740 5a3031ea smos
	mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 -accept_rtadv");
2741 be45aa79 Renato Botelho
2742 f382c6de Ermal
	if (!$g['booting'] && !(substr($realif, 0, 4) == "ovpn")) {
2743 3c5e10fc Seth Mos
		/* remove all IPv4 and IPv6 addresses */
2744 332683cb Seth Mos
		while (mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " -alias", true) == 0);
2745 3502b5b1 Seth Mos
		while (mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 -alias", true) == 0);
2746 3896d93e Erik Fonnesbeck
2747 8103bd1e Seth Mos
		/* only bring down the interface when both v4 and v6 are set to NONE */
2748 733829a9 Renato Botelho
		if(empty($wancfg['ipaddr']) && empty($wancfg['ipaddrv6'])) {
2749 8103bd1e Seth Mos
			interface_bring_down($interface);
2750 3896d93e Erik Fonnesbeck
		}
2751 28d22199 Scott Ullrich
	}
2752 acc1e9d0 Scott Ullrich
2753 0a28d385 Erik Fonnesbeck
	/* wireless configuration? */
2754 5b237745 Scott Ullrich
	if (is_array($wancfg['wireless']))
2755 0a28d385 Erik Fonnesbeck
		interface_wireless_configure($realif, $wancfg, $wancfg['wireless']);
2756 cfc707f7 Scott Ullrich
2757 49db607f jim-p
	$mac = get_interface_mac($realhwif);
2758 1489e8c8 Renato Botelho
	/*
2759
	 * Don't try to reapply the spoofed MAC if it's already applied.
2760
	 * When ifconfig link is used, it cycles the interface down/up, which triggers
2761
	 * the interface config again, which attempts to spoof the MAC again,
2762
	 * which cycles the link again...
2763
	 */
2764 49db607f jim-p
	if ($wancfg['spoofmac'] && ($wancfg['spoofmac'] != $mac)) {
2765 3e5d0d1d Ermal
		mwexec("/sbin/ifconfig " . escapeshellarg($realhwif) .
2766 5b237745 Scott Ullrich
			" link " . escapeshellarg($wancfg['spoofmac']));
2767 ac8ff0a4 Ermal
2768 1489e8c8 Renato Botelho
		/*
2769
		 * All vlans need to spoof their parent mac address, too.  see
2770
		 * ticket #1514: http://cvstrac.pfsense.com/tktview?tn=1514,33
2771
		 */
2772
		if (is_array($config['vlans']['vlan'])) {
2773
			foreach ($config['vlans']['vlan'] as $vlan) {
2774
				if ($vlan['if'] == $realhwif)
2775
					mwexec("/sbin/ifconfig " . escapeshellarg($vlan['vlanif']) .
2776
					" link " . escapeshellarg($wancfg['spoofmac']));
2777
			}
2778
		}
2779 f36d4bd2 Scott Ullrich
	}  else {
2780 a687f866 Namezero
2781 3e5d0d1d Ermal
		if ($mac == "ff:ff:ff:ff:ff:ff") {
2782 f36d4bd2 Scott Ullrich
			/*   this is not a valid mac address.  generate a
2783
			 *   temporary mac address so the machine can get online.
2784
			 */
2785 07e40c1f Carlos Eduardo Ramos
			echo gettext("Generating new MAC address.");
2786 f36d4bd2 Scott Ullrich
			$random_mac = generate_random_mac_address();
2787 3e5d0d1d Ermal
			mwexec("/sbin/ifconfig " . escapeshellarg($realhwif) .
2788 f36d4bd2 Scott Ullrich
				" link " . escapeshellarg($random_mac));
2789
			$wancfg['spoofmac'] = $random_mac;
2790
			write_config();
2791 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");
2792 f36d4bd2 Scott Ullrich
		}
2793
	}
2794 cfc707f7 Scott Ullrich
2795 5b237745 Scott Ullrich
	/* media */
2796
	if ($wancfg['media'] || $wancfg['mediaopt']) {
2797 3e5d0d1d Ermal
		$cmd = "/sbin/ifconfig " . escapeshellarg($realhwif);
2798 5b237745 Scott Ullrich
		if ($wancfg['media'])
2799
			$cmd .= " media " . escapeshellarg($wancfg['media']);
2800
		if ($wancfg['mediaopt'])
2801
			$cmd .= " mediaopt " . escapeshellarg($wancfg['mediaopt']);
2802
		mwexec($cmd);
2803
	}
2804 3e5d0d1d Ermal
	$options = pfSense_get_interface_addresses($realhwif);
2805 9a4c3eed Ermal
	if (is_array($options) && isset($options['caps']['polling'])) {
2806
		if (isset($config['system']['polling']))
2807
			pfSense_interface_capabilities($realif, IFCAP_POLLING);
2808
		else
2809
			pfSense_interface_capabilities($realif, -IFCAP_POLLING);
2810
	}
2811
2812 51d5aad7 Ermal
	/* skip vlans for checksumming and polling */
2813 3fe5080c Ermal
	if (!stristr($realif, "vlan") && is_array($options)) {
2814 51d5aad7 Ermal
		$flags = 0;
2815
		if(isset($config['system']['disablechecksumoffloading'])) {
2816
			if (isset($options['encaps']['txcsum']))
2817
				$flags |= IFCAP_TXCSUM;
2818
			if (isset($options['encaps']['rxcsum']))
2819
				$flags |= IFCAP_RXCSUM;
2820 1489e8c8 Renato Botelho
		} else {
2821
			if (!isset($options['caps']['txcsum']))
2822 51d5aad7 Ermal
				$flags |= IFCAP_TXCSUM;
2823
			if (!isset($options['caps']['rxcsum']))
2824
				$flags |= IFCAP_RXCSUM;
2825 1489e8c8 Renato Botelho
		}
2826 51d5aad7 Ermal
2827 1489e8c8 Renato Botelho
		if(isset($config['system']['disablesegmentationoffloading'])) {
2828
			if (isset($options['encaps']['tso4']))
2829 51d5aad7 Ermal
				$flags |= IFCAP_TSO;
2830 1489e8c8 Renato Botelho
			if (isset($options['encaps']['tso6']))
2831 51d5aad7 Ermal
				$flags |= IFCAP_TSO;
2832 1489e8c8 Renato Botelho
		} else {
2833
			if (!isset($options['caps']['tso4']))
2834 51d5aad7 Ermal
				$flags |= IFCAP_TSO;
2835 1489e8c8 Renato Botelho
			if (!isset($options['caps']['tso6']))
2836 51d5aad7 Ermal
				$flags |= IFCAP_TSO;
2837 1489e8c8 Renato Botelho
		}
2838 51d5aad7 Ermal
2839 1489e8c8 Renato Botelho
		if(isset($config['system']['disablelargereceiveoffloading'])) {
2840
			if (isset($options['encaps']['lro']))
2841 51d5aad7 Ermal
				$flags |= IFCAP_LRO;
2842 1489e8c8 Renato Botelho
		} else {
2843
			if (!isset($options['caps']['lro']))
2844 51d5aad7 Ermal
				$flags |= IFCAP_LRO;
2845 1489e8c8 Renato Botelho
		}
2846 51d5aad7 Ermal
2847 1489e8c8 Renato Botelho
		/* if the NIC supports polling *AND* it is enabled in the GUI */
2848
		if (!isset($config['system']['polling']) || !isset($options['caps']['polling'])) {
2849 51d5aad7 Ermal
			$flags |= IFCAP_POLLING;
2850
		}
2851 1489e8c8 Renato Botelho
		pfSense_interface_capabilities($realhwif, -$flags);
2852 51d5aad7 Ermal
	}
2853
2854 31b24870 Ermal Luçi
	/* invalidate interface/ip/sn cache */
2855 eba938e3 Scott Ullrich
	get_interface_arr(true);
2856 31b24870 Ermal Luçi
	unset($interface_ip_arr_cache[$realif]);
2857
	unset($interface_sn_arr_cache[$realif]);
2858 5a5413bb Seth Mos
	unset($interface_ipv6_arr_cache[$realif]);
2859
	unset($interface_snv6_arr_cache[$realif]);
2860 ccbd2447 Ermal Luçi
2861 5b237745 Scott Ullrich
	switch ($wancfg['ipaddr']) {
2862
		case 'dhcp':
2863 1fb7c265 Ermal Luçi
			interface_dhcp_configure($interface);
2864 5b237745 Scott Ullrich
			break;
2865
		case 'pppoe':
2866 8af6c46d gnhb
		case 'l2tp':
2867 5b237745 Scott Ullrich
		case 'pptp':
2868 9ebe7028 gnhb
		case 'ppp':
2869 64d124c5 gnhb
			interface_ppps_configure($interface);
2870 9ebe7028 gnhb
			break;
2871 5b237745 Scott Ullrich
		default:
2872 8103bd1e Seth Mos
			if (is_ipaddr($wancfg['ipaddr']) && $wancfg['subnet'] <> "") {
2873 871768cf Ermal
				pfSense_interface_setaddress($realif, "{$wancfg['ipaddr']}/{$wancfg['subnet']}");
2874 d1eea523 Ermal
			} else if (substr($realif, 0, 3) == "gre") {
2875
				if (is_array($config['gres']['gre'])) {
2876
					foreach ($config['gres']['gre'] as $gre)
2877
						if ($gre['greif'] == $realif)
2878
							interface_gre_configure($gre);
2879
				}
2880
			} else if (substr($realif, 0, 3) == "gif") {
2881 1489e8c8 Renato Botelho
				if (is_array($config['gifs']['gif'])) {
2882 d1eea523 Ermal
					foreach ($config['gifs']['gif'] as $gif)
2883 d1ae9705 Ermal
						if($gif['gifif'] == $realif)
2884 d1eea523 Ermal
							interface_gif_configure($gif);
2885
				}
2886
			} else if (substr($realif, 0, 4) == "ovpn") {
2887
				/* XXX: Should be done anything?! */
2888 acc1e9d0 Scott Ullrich
			}
2889 d1eea523 Ermal
			break;
2890 5b237745 Scott Ullrich
	}
2891 ffeb5acf Scott Ullrich
2892 5a5413bb Seth Mos
	switch ($wancfg['ipaddrv6']) {
2893 feb88a14 smos
		case 'slaac':
2894 8103bd1e Seth Mos
		case 'dhcp6':
2895 7a04cd20 Ermal
			interface_dhcpv6_configure($interface, $wancfg);
2896 8103bd1e Seth Mos
			break;
2897 3f383504 smos
		case '6rd':
2898 7a04cd20 Ermal
			interface_6rd_configure($interface, $wancfg);
2899 3f383504 smos
			break;
2900 31c43fd3 smos
		case '6to4':
2901 7a04cd20 Ermal
			interface_6to4_configure($interface, $wancfg);
2902 31c43fd3 smos
			break;
2903 20a7cb15 smos
		case 'track6':
2904 d1878053 Renato Botelho
			interface_track6_configure($interface, $wancfg);
2905 20a7cb15 smos
			break;
2906 5a5413bb Seth Mos
		default:
2907 8103bd1e Seth Mos
			if (is_ipaddr($wancfg['ipaddrv6']) && $wancfg['subnetv6'] <> "") {
2908 5a5413bb Seth Mos
				pfSense_interface_setaddress($realif, "{$wancfg['ipaddrv6']}/{$wancfg['subnetv6']}");
2909 3c5e10fc Seth Mos
				// FIXME: Add IPv6 Support to the pfSense module
2910 5a5413bb Seth Mos
				mwexec("/sbin/ifconfig {$realif} inet6 {$wancfg['ipaddrv6']} prefixlen {$wancfg['subnetv6']} ");
2911
			}
2912
			break;
2913
	}
2914
2915 4a735210 Renato Botelho
	$mtu = get_interface_default_mtu(remove_ifindex($realhwif));
2916
2917 d35233da Ermal
	if (!empty($wancfg['mtu'])) {
2918
		if (stristr($realif, "vlan")) {
2919
			$assginedparent = convert_real_interface_to_friendly_interface_name($realhwif);
2920
			if (!empty($assginedparent)) {
2921
				$parentmtu = $config['interfaces'][$assginedparent]['mtu'];
2922
				if (empty($parentmtu))
2923 6d1594eb Ermal
					$parentmtu = interface_vlan_mtu_configured($realhwif, $wancfg['mtu']);
2924 2fff3ba2 Ermal
				if ($wancfg['mtu'] > $parentmtu) {
2925 d35233da Ermal
					pfSense_interface_mtu($realhwif, $wancfg['mtu']);
2926 2fff3ba2 Ermal
2927
					/* All vlans need to use the same mtu value as their parent. */
2928
					if (is_array($config['vlans']['vlan'])) {
2929
						foreach ($config['vlans']['vlan'] as $vlan) {
2930 694f2b72 Ermal
							if ($vlan['if'] != $realhwif)
2931
								continue;
2932 e17e1b8a Ermal
							if ($vlan['vlanif'] == $realif)
2933
								continue;
2934 2fff3ba2 Ermal
							$assginedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
2935
							if (!empty($assginedport)) {
2936
								$portmtu = $config['interfaces'][$assginedport]['mtu'];
2937
								if (empty($portmtu))
2938
									pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']);
2939 6d1594eb Ermal
							} else
2940 2fff3ba2 Ermal
								pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']);
2941
						}
2942
					}
2943
				}
2944 4ffa46bf Ermal
			} else {
2945
				$bigmtu = interface_vlan_mtu_configured($realhwif, $wancfg['mtu']);
2946
				if ($wancfg['mtu'] >= $bigmtu) {
2947
					/* All vlans need to use the same mtu value as their parent. */
2948
					if (is_array($config['vlans']['vlan'])) {
2949
						foreach ($config['vlans']['vlan'] as $vlan) {
2950
							if ($vlan['if'] != $realhwif)
2951
								continue;
2952
							if ($vlan['vlanif'] == $realif)
2953
								continue;
2954
							pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']);
2955
						}
2956
					}
2957
					pfSense_interface_mtu($realhwif, $wancfg['mtu']);
2958
				}
2959
			}
2960 1e08ce64 Ermal
		}
2961
		if ($wancfg['mtu'] != get_interface_mtu($realif))
2962 b1939343 Ermal
			pfSense_interface_mtu($realif, $wancfg['mtu']);
2963 4ffa46bf Ermal
	} else if (stristr($realif, "vlan")) {
2964 59297ade Ermal
		/* XXX: This is really dangerous for example with vlans changing their parent mtu! */
2965 4ffa46bf Ermal
		$bigmtu = interface_vlan_mtu_configured($realhwif, $mtu);
2966
		if ($mtu < $bigmtu)
2967
			$mtu = $bigmtu;
2968
		pfSense_interface_mtu($realhwif, $mtu);
2969
2970
		/* All vlans need to use the same mtu value as their parent. */
2971
		if (is_array($config['vlans']['vlan'])) {
2972
			foreach ($config['vlans']['vlan'] as $vlan) {
2973
				if ($vlan['if'] != $realhwif)
2974
					continue;
2975
				if ($vlan['vlanif'] == $realif)
2976
					continue;
2977
				pfSense_interface_mtu($vlan['vlanif'], $mtu);
2978
			}
2979
		}
2980
		pfSense_interface_mtu($realif, $mtu);
2981
	} else if ($mtu != get_interface_mtu($realhwif))
2982 4a735210 Renato Botelho
		pfSense_interface_mtu($realhwif, $mtu);
2983
2984 435f11c8 Ermal Lu?i
	if(does_interface_exist($wancfg['if']))
2985 7284d850 Scott Ullrich
		interfaces_bring_up($wancfg['if']);
2986 67b057a9 Ermal
2987
	interface_netgraph_needed($interface);
2988 be45aa79 Renato Botelho
2989 5b237745 Scott Ullrich
	if (!$g['booting']) {
2990 dcadda55 Ermal
		link_interface_to_vips($interface, "update");
2991 6991dcb1 Ermal
2992 a639bb91 Ermal
		unset($gre);
2993
		$gre = link_interface_to_gre($interface);
2994
		if (!empty($gre))
2995 ed62880b Ermal
			array_walk($gre, 'interface_gre_configure');
2996 a639bb91 Ermal
2997
		unset($gif);
2998
		$gif = link_interface_to_gif($interface);
2999
		if (!empty($gif))
3000 8103bd1e Seth Mos
			array_walk($gif, 'interface_gif_configure');
3001 a639bb91 Ermal
3002 bf17eb72 Ermal
		if ($linkupevent == false || substr($realif, 0, 4) == "ovpn") {
3003 7413cbfd Ermal
			unset($bridgetmp);
3004
			$bridgetmp = link_interface_to_bridge($interface);
3005
			if (!empty($bridgetmp))
3006
				interface_bridge_add_member($bridgetmp, $realif);
3007
		}
3008 ccbd2447 Ermal Luçi
3009 48f23632 Ermal
		$grouptmp = link_interface_to_group($interface);
3010
		if (!empty($grouptmp))
3011 ed62880b Ermal
			array_walk($grouptmp, 'interface_group_add_member');
3012 48f23632 Ermal
3013 a5d6f60b Ermal Lu?i
		if ($interface == "lan")
3014 4476d447 Ermal Luçi
			/* make new hosts file */
3015 ffeb5acf Scott Ullrich
			system_hosts_generate();
3016 4476d447 Ermal Luçi
3017 a5d6f60b Ermal Lu?i
		if ($reloadall == true) {
3018 cfc707f7 Scott Ullrich
3019 a5d6f60b Ermal Lu?i
			/* reconfigure static routes (kernel may have deleted them) */
3020 1ea67f2e Ermal
			system_routing_configure($interface);
3021 cfc707f7 Scott Ullrich
3022 a5d6f60b Ermal Lu?i
			/* reload ipsec tunnels */
3023
			vpn_ipsec_configure();
3024 cfc707f7 Scott Ullrich
3025 b5eeef07 Ermal
			/* restart dnsmasq */
3026
			services_dnsmasq_configure();
3027
3028 a5d6f60b Ermal Lu?i
			/* update dyndns */
3029 422bc2a7 Ermal
			send_event("service reload dyndns {$interface}");
3030 a23d7248 Scott Ullrich
3031 a5d6f60b Ermal Lu?i
			/* reload captive portal */
3032 769e254e Ermal
			captiveportal_init_rules();
3033 a5d6f60b Ermal Lu?i
		}
3034 5b237745 Scott Ullrich
	}
3035 cfc707f7 Scott Ullrich
3036 5b237745 Scott Ullrich
	return 0;
3037
}
3038
3039 7a04cd20 Ermal
function interface_track6_configure($interface = "lan", $wancfg) {
3040 20a7cb15 smos
	global $config, $g;
3041
3042 7a04cd20 Ermal
	if (!is_array($wancfg))
3043
		return;
3044
3045
	if (!isset($wancfg['enable']))
3046 b0059636 Ermal
		return;
3047 be45aa79 Renato Botelho
3048 20a7cb15 smos
	/* If the interface is not configured via another, exit */
3049 b0059636 Ermal
	if (empty($wancfg['track6-interface']))
3050
		return;
3051 20a7cb15 smos
3052 e90c833a smos
	/* always configure a link-local of fe80::1:1 on the track6 interfaces */
3053
	$realif = get_real_interface($interface);
3054
	mwexec("/sbin/ifconfig {$realif} inet6 fe80::1:1%{$realif}");
3055
3056 7a04cd20 Ermal
	$trackcfg = $config['interfaces'][$wancfg['track6-interface']];
3057
	if (!isset($trackcfg['enable'])) {
3058
		log_error("Interface {$interface} tracking non-existant interface {$wancfg['track6-interface']}");
3059
		return;
3060
	}
3061
3062
	switch($trackcfg['ipaddrv6']) {
3063 20a7cb15 smos
		case "6to4":
3064 b0059636 Ermal
			if ($g['debug'])
3065
				log_error("Interface {$interface} configured via {$wancfg['track6-interface']}  type {$type}");
3066 7a04cd20 Ermal
			interface_track6_6to4_configure($interface, $wancfg);
3067 20a7cb15 smos
			break;
3068
		case "6rd":
3069 b0059636 Ermal
			if ($g['debug'])
3070
				log_error("Interface {$interface} configured via {$wancfg['track6-interface']}  type {$type}");
3071 7a04cd20 Ermal
			interface_track6_6rd_configure($interface, $wancfg);
3072 20a7cb15 smos
			break;
3073
		case "dhcp6":
3074 b0059636 Ermal
			if ($g['debug'])
3075
				log_error("Interface {$interface} configured via {$wancfg['track6-interface']}  type {$type}");
3076 7a41d737 Ermal
			interface_track6_dhcp6_configure($interface, $wancfg);
3077 20a7cb15 smos
			break;
3078
	}
3079 b0059636 Ermal
3080 3084ba6e Ermal
	if (!function_exists('services_dhcpd_configure'))
3081 6387590f Ermal
		require_once("services.inc");
3082
3083 3084ba6e Ermal
	services_dhcpd_configure("inet6");
3084 6387590f Ermal
3085 20a7cb15 smos
	return 0;
3086
}
3087
3088 7a04cd20 Ermal
function interface_track6_6rd_configure($interface = "lan", $lancfg) {
3089 20a7cb15 smos
	global $config, $g;
3090
3091 7a04cd20 Ermal
	if (!is_array($lancfg))
3092 b0059636 Ermal
		return;
3093 be45aa79 Renato Botelho
3094 20a7cb15 smos
	/* If the interface is not configured via another, exit */
3095 b0059636 Ermal
	if (empty($lancfg['track6-interface']))
3096
		return;
3097
3098
	if (!is_numeric($lancfg['track6-prefix-id']))
3099 20a7cb15 smos
		$lancfg['track6-prefix-id'] = 0;
3100 be45aa79 Renato Botelho
3101 20a7cb15 smos
	$wancfg = $config['interfaces'][$lancfg['track6-interface']];
3102 7a04cd20 Ermal
	if (empty($wancfg)) {
3103
		log_error("Interface {$interface} tracking non-existant interface {$lancfg['track6-interface']}");
3104 b0059636 Ermal
		return;
3105 7a04cd20 Ermal
	}
3106 be45aa79 Renato Botelho
3107 b0059636 Ermal
	$wanif = get_real_interface($lancfg['track6-interface']);
3108 20a7cb15 smos
	$ip4address = find_interface_ip($wanif);
3109 7a04cd20 Ermal
	if (!is_ipaddrv4($ip4address)) { /* XXX: This should not be needed by 6rd || (is_private_ip($ip4address))) { */
3110 20a7cb15 smos
		log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel");
3111 b0059636 Ermal
		return;
3112 20a7cb15 smos
	}
3113
	$hexwanv4 = return_hex_ipv4($ip4address);
3114 be45aa79 Renato Botelho
3115 20a7cb15 smos
	/* create the long prefix notation for math, save the prefix length */
3116
	$rd6prefix = explode("/", $wancfg['prefix-6rd']);
3117
	$rd6prefixlen = $rd6prefix[1];
3118
	$rd6prefix = Net_IPv6::uncompress($rd6prefix[0]);
3119
3120
	/* binary presentation of the prefix for all 128 bits. */
3121
	$rd6lanbin = convert_ipv6_to_128bit($rd6prefix);
3122 be45aa79 Renato Botelho
3123 20a7cb15 smos
	/* just save the left prefix length bits */
3124
	$rd6lanbin = substr($rd6lanbin, 0, $rd6prefixlen);
3125
	/* add the v4 address, offset n bits from the left */
3126
	$rd6lanbin .= substr(sprintf("%032b", hexdec($hexwanv4)), (0 + $wancfg['prefix-6rd-v4plen']), 32);
3127
3128
	/* add the custom prefix id, max 32bits long? (64 bits - (prefixlen + (32 - v4plen)) */
3129
	/* 64 - (37 + (32 - 17)) = 8 == /52 */
3130
	$restbits = 64 - ($rd6prefixlen + (32 - $wancfg['prefix-6rd-v4plen']));
3131
	// echo "64 - (prefixlen {$rd6prefixlen} + v4len (32 - {$wancfg['prefix-6rd-v4plen']})) = {$restbits} \n";
3132
	$rd6lanbin .= substr(sprintf("%032b", str_pad($lancfg['track6-prefix-id'], 32, "0", STR_PAD_LEFT)), (32 - $restbits), 32);
3133
	/* fill the rest out with zeros */
3134
	$rd6lanbin = str_pad($rd6lanbin, 128, "0", STR_PAD_RIGHT);;
3135
3136 be45aa79 Renato Botelho
	/* convert the 128 bits for the lan address back into a valid IPv6 address */
3137 20a7cb15 smos
	$rd6lan = convert_128bit_to_ipv6($rd6lanbin) ."1";
3138 be45aa79 Renato Botelho
3139 b0059636 Ermal
	$lanif = get_real_interface($interface);
3140 c4fc2eae Ermal
	$oip = find_interface_ipv6($lanif);
3141
	if (is_ipaddrv6($oip))
3142
		mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete");
3143 20a7cb15 smos
	log_error("rd6 {$interface} with ipv6 address {$rd6lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}");
3144
	mwexec("/sbin/ifconfig {$lanif} inet6 {$rd6lan} prefixlen 64");
3145 b0059636 Ermal
3146 20a7cb15 smos
	return 0;
3147
}
3148
3149 7a04cd20 Ermal
function interface_track6_6to4_configure($interface = "lan", $lancfg) {
3150 20a7cb15 smos
	global $config, $g;
3151
3152 7a04cd20 Ermal
	if (!is_array($lancfg))
3153 b0059636 Ermal
		return;
3154 be45aa79 Renato Botelho
3155 20a7cb15 smos
	/* If the interface is not configured via another, exit */
3156 b0059636 Ermal
	if (empty($lancfg['track6-interface']))
3157
		return;
3158
3159 7a04cd20 Ermal
	$wancfg = $config['interfaces'][$lancfg['track6-interface']];
3160
	if (empty($wancfg)) {
3161
		log_error("Interface {$interface} tracking non-existant interface {$lancfg['track6-interface']}");
3162
		return;
3163
	}
3164
3165 b0059636 Ermal
	if (!is_numeric($lancfg['track6-prefix-id']))
3166 20a7cb15 smos
		$lancfg['track6-prefix-id'] = 0;
3167 be45aa79 Renato Botelho
3168 b0059636 Ermal
	$wanif = get_real_interface($lancfg['track6-interface']);
3169 20a7cb15 smos
	$ip4address = find_interface_ip($wanif);
3170 b0059636 Ermal
	if (!is_ipaddrv4($ip4address) || is_private_ip($ip4address)) {
3171 20a7cb15 smos
		log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel");
3172 b0059636 Ermal
		return;
3173 20a7cb15 smos
	}
3174
	$hexwanv4 = return_hex_ipv4($ip4address);
3175 be45aa79 Renato Botelho
3176 20a7cb15 smos
	/* create the long prefix notation for math, save the prefix length */
3177
	$sixto4prefix = "2002::";
3178
	$sixto4prefixlen = 16;
3179
	$sixto4prefix = Net_IPv6::uncompress($sixto4prefix);
3180
3181
	/* binary presentation of the prefix for all 128 bits. */
3182
	$sixto4lanbin = convert_ipv6_to_128bit($sixto4prefix);
3183 be45aa79 Renato Botelho
3184 20a7cb15 smos
	/* just save the left prefix length bits */
3185
	$sixto4lanbin = substr($sixto4lanbin, 0, $sixto4prefixlen);
3186
	/* add the v4 address */
3187
	$sixto4lanbin .= sprintf("%032b", hexdec($hexwanv4));
3188
	/* add the custom prefix id */
3189
	$sixto4lanbin .= sprintf("%016b", $lancfg['track6-prefix-id']);
3190
	/* fill the rest out with zeros */
3191
	$sixto4lanbin = str_pad($sixto4lanbin, 128, "0", STR_PAD_RIGHT);;
3192 be45aa79 Renato Botelho
3193
	/* convert the 128 bits for the lan address back into a valid IPv6 address */
3194 20a7cb15 smos
	$sixto4lan = convert_128bit_to_ipv6($sixto4lanbin) ."1";
3195 be45aa79 Renato Botelho
3196 b0059636 Ermal
	$lanif = get_real_interface($interface);
3197 c4fc2eae Ermal
	$oip = find_interface_ipv6($lanif);
3198
	if (is_ipaddrv6($oip))
3199
		mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete");
3200 20a7cb15 smos
	log_error("sixto4 {$interface} with ipv6 address {$sixto4lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}");
3201
	mwexec("/sbin/ifconfig {$lanif} inet6 {$sixto4lan} prefixlen 64");
3202 b0059636 Ermal
3203 20a7cb15 smos
	return 0;
3204
}
3205
3206 7a41d737 Ermal
function interface_track6_dhcp6_configure($interface = "lan", $lancfg) {
3207
	global $config, $g;
3208
3209
	if (!is_array($lancfg))
3210
		return;
3211
3212
	/* If the interface is not configured via another, exit */
3213
	if (empty($lancfg['track6-interface']))
3214
		return;
3215
3216
	if (!is_numeric($lancfg['track6-prefix-id']))
3217
		$lancfg['track6-prefix-id'] = 0;
3218
3219
	$wancfg = $config['interfaces'][$lancfg['track6-interface']];
3220
	if (empty($wancfg)) {
3221
		log_error("Interface {$interface} tracking non-existant interface {$lancfg['track6-interface']}");
3222
		return;
3223
	}
3224
3225 1fadb9d1 Ermal
	$lanif = get_real_interface($interface);
3226
	$oip = find_interface_ipv6($lanif);
3227
	if (is_ipaddrv6($oip))
3228
		mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete");
3229
3230 e082d2f4 Ermal
	if ($wancfg['ipaddrv6'] == "slaac") {
3231
		$wanif = get_real_interface($lancfg['track6-interface']);
3232
		$ifcfgipv6 = find_interface_ipv6($wanif);
3233
		if (is_ipaddrv6($ifcfgipv6)) {
3234
			$dhcp6lanarr = explode(":", Net_IPv6::uncompress($ifcfgipv6));
3235
			$dhcp6lanarr[4] = 0;
3236
			$dhcp6lanarr[5] = 0;
3237
			$dhcp6lanarr[6] = 0;
3238
			$dhcp6lanarr[7] = 1;
3239
			$dhcp6lan =  Net_IPv6::compress(implode(":", $dhcp6lanarr));
3240
			log_error("dhcp6 {$interface} with ipv6 address {$dhcp6lan} based on {$lancfg['track6-interface']}");
3241
			mwexec("/sbin/ifconfig {$lanif} inet6 {$dhcp6lan} prefixlen 64");
3242
		}
3243
	}
3244
3245 7a41d737 Ermal
	return 0;
3246
}
3247
3248 7a04cd20 Ermal
function interface_6rd_configure($interface = "wan", $wancfg) {
3249 668e8961 smos
	global $config, $g;
3250
3251 be45aa79 Renato Botelho
	/* because this is a tunnel interface we can only function
3252 668e8961 smos
	 *	with a public IPv4 address on the interface */
3253
3254 7a04cd20 Ermal
	if (!is_array($wancfg))
3255 b0059636 Ermal
		return;
3256 668e8961 smos
3257
	$wanif = get_real_interface($interface);
3258
	$ip4address = find_interface_ip($wanif);
3259 b0059636 Ermal
	if ((!is_ipaddrv4($ip4address)) || (is_private_ip($ip4address))) {
3260 668e8961 smos
		log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel");
3261 1f78ab3a smos
		return false;
3262 668e8961 smos
	}
3263 20a7cb15 smos
	$hexwanv4 = return_hex_ipv4($ip4address);
3264 be45aa79 Renato Botelho
3265 b0059636 Ermal
	if (!is_numeric($wancfg['prefix-6rd-v4plen']))
3266 20a7cb15 smos
		$wancfg['prefix-6rd-v4plen'] = 0;
3267 668e8961 smos
3268 51c57aae smos
	/* create the long prefix notation for math, save the prefix length */
3269 f87ccbed smos
	$rd6prefix = explode("/", $wancfg['prefix-6rd']);
3270
	$rd6prefixlen = $rd6prefix[1];
3271
	$rd6prefix = Net_IPv6::uncompress($rd6prefix[0]);
3272 51c57aae smos
3273
	/* we need the hex form of the broker IPv4 address */
3274 20a7cb15 smos
	$hexbrv4 = return_hex_ipv4($wancfg['gateway-6rd']);
3275 be45aa79 Renato Botelho
3276 51c57aae smos
	/* binary presentation of the prefix for all 128 bits. */
3277 20a7cb15 smos
	$rd6prefixbin = convert_ipv6_to_128bit($rd6prefix);
3278 be45aa79 Renato Botelho
3279 4aa569bd smos
	/* just save the left prefix length bits */
3280
	$rd6brprefixbin = substr($rd6prefixbin, 0, $rd6prefixlen);
3281
	/* if the prefix length is not 32 bits we need to shave bits off from the left of the v4 address. */
3282
	$rd6brprefixbin .= substr(sprintf("%032b", hexdec($hexbrv4)), $wancfg['prefix-6rd-v4plen'], 32);
3283
	/* fill out the rest with 0's */
3284 dcddb2fa Ermal
	$rd6brprefixbin = str_pad($rd6brprefixbin, 128, "0", STR_PAD_RIGHT);
3285 4aa569bd smos
3286 be45aa79 Renato Botelho
	/* convert the 128 bits for the broker address back into a valid IPv6 address */
3287 4aa569bd smos
	$rd6brgw = convert_128bit_to_ipv6($rd6brprefixbin);
3288
3289 51c57aae smos
	/* just save the left prefix length bits */
3290 20a7cb15 smos
	$rd6prefixbin = substr($rd6prefixbin, 0, $rd6prefixlen);
3291 51c57aae smos
	/* if the prefix length is not 32 bits we need to shave bits off from the left of the v4 address. */
3292 4aa569bd smos
	$rd6prefixbin .= substr(sprintf("%032b", hexdec($hexwanv4)), $wancfg['prefix-6rd-v4plen'], 32);
3293 20a7cb15 smos
	/* fill out the rest with 0's */
3294
	$rd6prefixbin = str_pad($rd6prefixbin, 128, "0", STR_PAD_RIGHT);;
3295 51c57aae smos
3296 be45aa79 Renato Botelho
	/* convert the 128 bits for the broker address back into a valid IPv6 address */
3297 4aa569bd smos
	$rd6prefix = convert_128bit_to_ipv6($rd6prefixbin);
3298 f87ccbed smos
3299 7d1f2eac Ermal
	/* XXX: need to extend to support variable prefix size for v4 */
3300 b686e5d0 Ermal
	if (!is_module_loaded("if_stf"))
3301
		mwexec("/sbin/kldload if_stf.ko");
3302 7d1f2eac Ermal
	$stfiface = "{$interface}_stf";
3303 c4fc2eae Ermal
	if (does_interface_exist($stfiface))
3304
		pfSense_interface_destroy($stfiface);
3305
	$tmpstfiface = pfSense_interface_create("stf");
3306
	pfSense_interface_rename($tmpstfiface, $stfiface);
3307 7d1f2eac Ermal
	pfSense_interface_flags($stfiface, IFF_LINK2);
3308
	mwexec("/sbin/ifconfig {$stfiface} inet6 {$rd6prefix}/{$rd6prefixlen}");
3309 b0059636 Ermal
	if ($g['debug'])
3310 7d1f2eac Ermal
		log_error("Created 6rd interface {$stfiface} {$rd6prefix}/{$rd6prefixlen}");
3311 668e8961 smos
3312 f55b6cbb smos
	/* write out a default router file */
3313 20a7cb15 smos
	file_put_contents("{$g['tmp_path']}/{$wanif}_routerv6", "{$rd6brgw}\n");
3314
	file_put_contents("{$g['tmp_path']}/{$wanif}_defaultgwv6", "{$rd6brgw}\n");
3315 2d5ca06e smos
3316 5ee79d32 Ermal
	$ip4gateway = get_interface_gateway($interface);
3317 66c73aab Ermal
	if (is_ipaddrv4($ip4gateway))
3318 b0059636 Ermal
		mwexec("/sbin/route change -host " . $wancfg['gateway-6rd'] . " {$ip4gateway}");
3319 c8ed8142 smos
3320 2d5ca06e smos
	/* configure dependent interfaces */
3321 7a04cd20 Ermal
	if (!$g['booting'])
3322
		link_interface_to_track6($interface, "update");
3323 66c73aab Ermal
3324 f55b6cbb smos
	return 0;
3325 668e8961 smos
}
3326
3327 7a04cd20 Ermal
function interface_6to4_configure($interface = "wan", $wancfg){
3328 31c43fd3 smos
	global $config, $g;
3329
3330 be45aa79 Renato Botelho
	/* because this is a tunnel interface we can only function
3331 31c43fd3 smos
	 *	with a public IPv4 address on the interface */
3332
3333 7a04cd20 Ermal
	if (!is_array($wancfg))
3334
		return;
3335 31c43fd3 smos
3336
	$wanif = get_real_interface($interface);
3337
	$ip4address = find_interface_ip($wanif);
3338
	if((!is_ipaddrv4($ip4address)) || (is_private_ip($ip4address))) {
3339
		log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel");
3340
		return false;
3341
	}
3342 be45aa79 Renato Botelho
3343 31c43fd3 smos
	/* create the long prefix notation for math, save the prefix length */
3344
	$stfprefixlen = 16;
3345
	$stfprefix = Net_IPv6::uncompress("2002::");
3346
	$stfarr = explode(":", $stfprefix);
3347
	$v4prefixlen = "0";
3348 be45aa79 Renato Botelho
3349 31c43fd3 smos
	/* we need the hex form of the interface IPv4 address */
3350
	$ip4arr = explode(".", $ip4address);
3351
	$hexwanv4 = "";
3352
	foreach($ip4arr as $octet)
3353
		$hexwanv4 .= sprintf("%02x", $octet);
3354
3355
	/* we need the hex form of the broker IPv4 address */
3356
	$ip4arr = explode(".", "192.88.99.1");
3357
	$hexbrv4 = "";
3358
	foreach($ip4arr as $octet)
3359
		$hexbrv4 .= sprintf("%02x", $octet);
3360 be45aa79 Renato Botelho
3361 31c43fd3 smos
	/* binary presentation of the prefix for all 128 bits. */
3362
	$stfprefixbin = "";
3363
	foreach($stfarr as $element) {
3364
		$stfprefixbin .= sprintf("%016b", hexdec($element));
3365
	}
3366
	/* just save the left prefix length bits */
3367
	$stfprefixstartbin = substr($stfprefixbin, 0, $stfprefixlen);
3368
3369
	/* if the prefix length is not 32 bits we need to shave bits off from the left of the v4 address. */
3370
	$stfbrokerbin = substr(sprintf("%032b", hexdec($hexbrv4)), $v4prefixlen, 32);
3371
	$stfbrokerbin = str_pad($stfprefixstartbin . $stfbrokerbin, 128, "0", STR_PAD_RIGHT);;
3372
3373
	/* for the local subnet too. */
3374
	$stflanbin = substr(sprintf("%032b", hexdec($hexwanv4)), $v4prefixlen, 32);
3375
	$stflanbin = str_pad($stfprefixstartbin . $stflanbin, 128, "0", STR_PAD_RIGHT);;
3376
3377 be45aa79 Renato Botelho
	/* convert the 128 bits for the broker address back into a valid IPv6 address */
3378 31c43fd3 smos
	$stfbrarr = array();
3379
	$stfbrbinarr = array();
3380
	$stfbrbinarr = str_split($stfbrokerbin, 16);
3381
	foreach($stfbrbinarr as $bin)
3382
		$stfbrarr[] = dechex(bindec($bin));
3383
	$stfbrgw = Net_IPv6::compress(implode(":", $stfbrarr));
3384
3385 be45aa79 Renato Botelho
	/* convert the 128 bits for the broker address back into a valid IPv6 address */
3386 31c43fd3 smos
	$stflanarr = array();
3387
	$stflanbinarr = array();
3388
	$stflanbinarr = str_split($stflanbin, 16);
3389
	foreach($stflanbinarr as $bin)
3390
		$stflanarr[] = dechex(bindec($bin));
3391
	$stflanpr = Net_IPv6::compress(implode(":", $stflanarr));
3392
	$stflanarr[7] = 1;
3393
	$stflan = Net_IPv6::compress(implode(":", $stflanarr));
3394
3395
	/* setup the stf interface */
3396 b686e5d0 Ermal
	if (!is_module_loaded("if_stf"))
3397
		mwexec("/sbin/kldload if_stf.ko");
3398 7d1f2eac Ermal
	$stfiface = "{$interface}_stf";
3399 c4fc2eae Ermal
	if (does_interface_exist($stfiface))
3400
		pfSense_interface_destroy($stfiface);
3401
	$tmpstfiface = pfSense_interface_create("stf");
3402
	pfSense_interface_rename($tmpstfiface, $stfiface);
3403 7d1f2eac Ermal
	pfSense_interface_flags($stfiface, IFF_LINK2);
3404
	mwexec("/sbin/ifconfig {$stfiface} inet6 {$stflanpr} prefixlen 16");
3405 31c43fd3 smos
3406 7d1f2eac Ermal
	if ($g['debug'])
3407
		log_error("Set IPv6 address inet6 {$stflanpr} prefixlen 16 for {$stfiface}, route {$stfbrgw}");
3408 be45aa79 Renato Botelho
3409 31c43fd3 smos
	/* write out a default router file */
3410
	file_put_contents("{$g['tmp_path']}/{$wanif}_routerv6", "{$stfbrgw}");
3411
	file_put_contents("{$g['tmp_path']}/{$wanif}_defaultgwv6", "{$stfbrgw}");
3412 2d5ca06e smos
3413 5ee79d32 Ermal
	$ip4gateway = get_interface_gateway($interface);
3414
	if (is_ipaddrv4($ip4gateway))
3415 c8ed8142 smos
		mwexec("route change -host 192.88.99.1 {$ip4gateway}");
3416
3417 7a04cd20 Ermal
	if (!$g['booting'])
3418
		link_interface_to_track6($interface, "update");
3419 be45aa79 Renato Botelho
3420 31c43fd3 smos
	return 0;
3421
}
3422
3423 7a04cd20 Ermal
function interface_dhcpv6_configure($interface = "wan", $wancfg) {
3424 ed395640 Seth Mos
	global $config, $g;
3425
3426 7a04cd20 Ermal
	if (!is_array($wancfg))
3427 b0059636 Ermal
		return;
3428 ed395640 Seth Mos
3429
	$wanif = get_real_interface($interface);
3430 d53a9a51 smos
	$dhcp6cconf = "";
3431
	$dhcp6cconf .= "interface {$wanif} {\n";
3432 feb88a14 smos
3433 d53a9a51 smos
	/* for SLAAC interfaces we do fire off a dhcp6 client for just our name servers */
3434
	if($wancfg['ipaddrv6'] == "slaac") {
3435
		$dhcp6cconf .= "	information-only;\n";
3436
		$dhcp6cconf .= "	request domain-name-servers;\n";
3437
		$dhcp6cconf .= "	request domain-name;\n";
3438
		$dhcp6cconf .= "	script \"{$g['varetc_path']}/dhcp6c_{$interface}_script.sh\"; # we'd like some nameservers please\n";
3439
		$dhcp6cconf .= "};\n";
3440
	} else {
3441 be45aa79 Renato Botelho
3442 d53a9a51 smos
		$dhcp6cconf .= " 	send ia-na 0;	# request stateful address\n";
3443 b0059636 Ermal
		if(is_numeric($wancfg['dhcp6-ia-pd-len']))
3444 d53a9a51 smos
			$dhcp6cconf .= "	send ia-pd 0;	# request prefix delegation\n";
3445
		$dhcp6cconf .= "request domain-name-servers;\n";
3446
		$dhcp6cconf .= "request domain-name;\n";
3447
		$dhcp6cconf .= "script \"{$g['varetc_path']}/dhcp6c_{$interface}_script.sh\"; # we'd like some nameservers please\n";
3448
3449
		$dhcp6cconf .= "};\n";
3450
		$dhcp6cconf .= "id-assoc na 0 { };\n";
3451
		if(is_numeric($wancfg['dhcp6-ia-pd-len'])) {
3452
			/* Setup the prefix delegation */
3453
			$dhcp6cconf .= "id-assoc pd 0 {\n";
3454 7a04cd20 Ermal
			$iflist = link_interface_to_track6($interface);
3455
			foreach ($iflist as $friendly => $ifcfg) {
3456
				if (is_numeric($ifcfg['track6-prefix-id'])) {
3457
					if ($g['debug'])
3458
						log_error("setting up $ifdescr - {$ifcfg['track6-prefix-id']}");
3459 d53a9a51 smos
					$realif = get_real_interface($friendly);
3460
					$dhcp6cconf .= "	prefix-interface {$realif} {\n";
3461 7a04cd20 Ermal
					$dhcp6cconf .= "		sla-id {$ifcfg['track6-prefix-id']};\n";
3462 d53a9a51 smos
					$dhcp6cconf .= "		sla-len {$wancfg['dhcp6-ia-pd-len']};\n";
3463
					$dhcp6cconf .= "	};\n";
3464
				}
3465
			}
3466 7a04cd20 Ermal
			unset($iflist, $ifcfg);
3467 d53a9a51 smos
			$dhcp6cconf .= "};\n";
3468
		}
3469
	}
3470 b0059636 Ermal
	/* wide-dhcp6c works for now. */
3471
	if (!@file_put_contents("{$g['varetc_path']}/dhcp6c_{$interface}.conf", $dhcp6cconf)) {
3472
		printf("Error: cannot open dhcp6c_{$interface}.conf in interface_dhcpv6_configure() for writing.\n");
3473 d12ae241 Renato Botelho
		unset($dhcp6cconf);
3474 b0059636 Ermal
		return 1;
3475
	}
3476 d12ae241 Renato Botelho
	unset($dhcp6cconf);
3477 ed395640 Seth Mos
3478 b0059636 Ermal
	$dhcp6cscript = "#!/bin/sh\n";
3479
	$dhcp6cscript .= "# This shell script launches /etc/rc.newwanipv6 with a interface argument.\n";
3480
	$dhcp6cscript .= "/etc/rc.newwanipv6 {$wanif} \n";
3481 d53a9a51 smos
	/* Add wide-dhcp6c shell script here. Because we can not pass a argument to it. */
3482 b0059636 Ermal
	if (!@file_put_contents("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh", $dhcp6cscript)) {
3483 d53a9a51 smos
		printf("Error: cannot open dhcp6c_{$interface}_script.sh in interface_dhcpv6_configure() for writing.\n");
3484 d12ae241 Renato Botelho
		unset($dhcp6cscript);
3485 d53a9a51 smos
		return 1;
3486
	}
3487 d12ae241 Renato Botelho
	unset($dhcp6cscript);
3488 b0059636 Ermal
	@chmod("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh", 0755);
3489 d53a9a51 smos
3490
3491 c65d3051 Seth Mos
	/* accept router advertisements for this interface */
3492 ef851fed smos
	mwexec("/sbin/sysctl -w net.inet6.ip6.accept_rtadv=1");
3493 49047fb4 smos
	log_error("Accept router advertisements on interface {$wanif} ");
3494 100c7be0 Seth Mos
	mwexec("/sbin/ifconfig {$wanif} inet6 accept_rtadv");
3495 61c4383d smos
3496 8f833c7c smos
	/* run a filter configure sync so that the filter rules allow traffic before we launch the client */
3497
	/* there reallyt is no good way around this i'm 'fraid */
3498 db6e6b1a Ermal
	if (!$g['booting'])
3499
		filter_configure_sync();
3500 82769dfe smos
3501 d53a9a51 smos
	/* fire up dhcp6c for IPv6 first, this backgrounds immediately */
3502 b0059636 Ermal
	mwexec("/usr/local/sbin/dhcp6c -d -c {$g['varetc_path']}/dhcp6c_{$interface}.conf -p {$g['varrun_path']}/dhcp6c_{$interface}.pid {$wanif}");
3503 d53a9a51 smos
	sleep(1);
3504 b0059636 Ermal
	unset($out);
3505 d53a9a51 smos
	exec("/sbin/rtsol -d {$wanif} 2>&1", $out, $ret);
3506 b0059636 Ermal
	if (!empty($out)) {
3507 d53a9a51 smos
		foreach($out as $line) {
3508
			if((stristr($line, "received")) && (!stristr($line, "unexpected"))) {
3509
				$parts = explode(" ", $line);
3510
				if(is_ipaddrv6($parts[3])) {
3511
					log_error("Found IPv6 default gateway '{$parts[3]}' by RA.");
3512
					file_put_contents("{$g['tmp_path']}/{$wanif}_routerv6", "{$parts[3]}\n");
3513
					file_put_contents("{$g['tmp_path']}/{$wanif}_defaultgwv6", "{$parts[3]}\n");
3514
					break;
3515
				}
3516
			}
3517
		}
3518 7a04cd20 Ermal
		unset($out);
3519 65101877 smos
	}
3520 d53a9a51 smos
	/* worst case is that the rc.newwanipv6 handles setting up the track6 interface */
3521 ceba035a Ermal
	if (!$g['booting'] && $wancfg['ipaddrv6'] != "slaac")
3522 7a04cd20 Ermal
		link_interface_to_track6($interface, "update");
3523 b0059636 Ermal
3524 ed395640 Seth Mos
	return 0;
3525
}
3526
3527 8103bd1e Seth Mos
function interface_dhcp_configure($interface = "wan") {
3528 ed395640 Seth Mos
	global $config, $g;
3529
3530
	$wancfg = $config['interfaces'][$interface];
3531
	$wanif = $wancfg['if'];
3532 df9e93f0 Ermal
	if (empty($wancfg))
3533
		$wancfg = array();
3534 5b237745 Scott Ullrich
3535 0311dbd5 Scott Ullrich
	/* generate dhclient_wan.conf */
3536 67ee1ec5 Ermal Luçi
	$fd = fopen("{$g['varetc_path']}/dhclient_{$interface}.conf", "w");
3537 5b237745 Scott Ullrich
	if (!$fd) {
3538 905ea336 Phil Davis
		printf(printf(gettext("Error: cannot open dhclient_%s.conf in interface_dhcp_configure() for writing.%s"), $interface, "\n"));
3539 5b237745 Scott Ullrich
		return 1;
3540
	}
3541 eb772abd Scott Ullrich
3542 2305d4c5 Scott Ullrich
	if ($wancfg['dhcphostname']) {
3543
		$dhclientconf_hostname = "send dhcp-client-identifier \"{$wancfg['dhcphostname']}\";\n";
3544
		$dhclientconf_hostname .= "\tsend host-name \"{$wancfg['dhcphostname']}\";\n";
3545
	} else {
3546
		$dhclientconf_hostname = "";
3547
	}
3548
3549 85a5da13 Ermal Luçi
	$wanif = get_real_interface($interface);
3550 df9e93f0 Ermal
	if (empty($wanif)) {
3551 07e40c1f Carlos Eduardo Ramos
		log_error(sprintf(gettext("Invalid interface \"%s\" in interface_dhcp_configure()"), $interface));
3552 c1cc447c gnhb
		return 0;
3553 3a906378 gnhb
	}
3554 1c3ddd9e Renato Botelho
	$dhclientconf = "";
3555 be45aa79 Renato Botelho
3556 6d76590c Scott Ullrich
	$dhclientconf .= <<<EOD
3557 67ee1ec5 Ermal Luçi
interface "{$wanif}" {
3558 76d3b9a3 Chris Buechler
timeout 60;
3559 88810240 smos
retry 15;
3560 ce69a638 Scott Ullrich
select-timeout 0;
3561
initial-interval 1;
3562 2305d4c5 Scott Ullrich
	{$dhclientconf_hostname}
3563
	script "/sbin/dhclient-script";
3564 5b237745 Scott Ullrich
}
3565
3566
EOD;
3567
3568 bc40d758 Seth Mos
if(is_ipaddr($wancfg['alias-address'])) {
3569
	$subnetmask = gen_subnet_mask($wancfg['alias-subnet']);
3570
	$dhclientconf .= <<<EOD
3571
alias {
3572 67ee1ec5 Ermal Luçi
	interface  "{$wanif}";
3573 bc40d758 Seth Mos
	fixed-address {$wancfg['alias-address']};
3574
	option subnet-mask {$subnetmask};
3575
}
3576
3577
EOD;
3578
}
3579 5b237745 Scott Ullrich
	fwrite($fd, $dhclientconf);
3580
	fclose($fd);
3581 eb772abd Scott Ullrich
3582 d7147b1c Scott Ullrich
	/* bring wan interface up before starting dhclient */
3583 3a906378 gnhb
	if($wanif)
3584
		interfaces_bring_up($wanif);
3585 be45aa79 Renato Botelho
	else
3586 07e40c1f Carlos Eduardo Ramos
		log_error(printf(gettext("Could not bring up %s interface in interface_dhcp_configure()"), $wanif));
3587 eacc8c14 Scott Ullrich
3588 7149c4e7 Seth Mos
	/* fire up dhclient */
3589 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");
3590 0119d2f7 Scott Ullrich
3591 5b237745 Scott Ullrich
	return 0;
3592
}
3593
3594 42753d25 Ermal Lu?i
function interfaces_group_setup() {
3595
	global $config;
3596
3597
	if (!is_array($config['ifgroups']['ifgroupentry']))
3598
		return;
3599
3600 482961e3 Ermal Lu?i
	foreach ($config['ifgroups']['ifgroupentry'] as $groupar)
3601 42753d25 Ermal Lu?i
		interface_group_setup($groupar);
3602
3603
	return;
3604
}
3605
3606 abcb2bed Ermal Lu?i
function interface_group_setup(&$groupname /* The parameter is an array */) {
3607 42753d25 Ermal Lu?i
	global $config;
3608
3609
	if (!is_array($groupname))
3610
		return;
3611
	$members = explode(" ", $groupname['members']);
3612
	foreach($members as $ifs) {
3613
		$realif = get_real_interface($ifs);
3614
		if ($realif)
3615
			mwexec("/sbin/ifconfig {$realif} group {$groupname['ifname']}");
3616
	}
3617
3618
	return;
3619
}
3620 48f23632 Ermal
3621 06182467 Renato Botelho
function is_interface_group($if) {
3622
	global $config;
3623
3624
	if (is_array($config['ifgroups']['ifgroupentry']))
3625
		foreach ($config['ifgroups']['ifgroupentry'] as $groupentry) {
3626
			if ($groupentry['ifname'] === $if)
3627
				return true;
3628
		}
3629
3630
	return false;
3631
}
3632
3633 48f23632 Ermal
function interface_group_add_member($interface, $groupname) {
3634 ed62880b Ermal
	$interface = get_real_interface($interface);
3635 48f23632 Ermal
	mwexec("/sbin/ifconfig {$interface} group {$groupname}", true);
3636
}
3637 be45aa79 Renato Botelho
3638 e8910ad4 Ermal Lu?i
/* COMPAT Function */
3639 afb2de1b Ermal Lu?i
function convert_friendly_interface_to_real_interface_name($interface) {
3640
	return get_real_interface($interface);
3641
}
3642
3643 e8910ad4 Ermal Lu?i
/* COMPAT Function */
3644 eba938e3 Scott Ullrich
function get_real_wan_interface($interface = "wan") {
3645 abb31ea4 Ermal Luçi
	return get_real_interface($interface);
3646
}
3647 afb2de1b Ermal Lu?i
3648 e8910ad4 Ermal Lu?i
/* COMPAT Function */
3649 eba938e3 Scott Ullrich
function get_current_wan_address($interface = "wan") {
3650 abb31ea4 Ermal Luçi
	return get_interface_ip($interface);
3651
}
3652
3653 afb2de1b Ermal Lu?i
/*
3654
 * convert_real_interface_to_friendly_interface_name($interface): convert fxp0 -> wan, etc.
3655
 */
3656
function convert_real_interface_to_friendly_interface_name($interface = "wan") {
3657 7061ba0f Renato Botelho
	global $config;
3658 afb2de1b Ermal Lu?i
3659 7b47bd4c Ermal
	if (stristr($interface, "_vip")) {
3660 7061ba0f Renato Botelho
		foreach ($config['virtualip']['vip'] as $counter => $vip) {
3661
			if ($vip['mode'] == "carp")  {
3662
				if ($interface == "{$vip['interface']}_vip{$vip['vhid']}")
3663
					return $vip['interface'];
3664
			}
3665
		}
3666
	}
3667 afb2de1b Ermal Lu?i
3668 7061ba0f Renato Botelho
	/* XXX: For speed reasons reference directly the interface array */
3669 74e1e658 jim-p
	$ifdescrs = &$config['interfaces'];
3670 7061ba0f Renato Botelho
	//$ifdescrs = get_configured_interface_list(false, true);
3671 afb2de1b Ermal Lu?i
3672 7061ba0f Renato Botelho
	foreach ($ifdescrs as $if => $ifname) {
3673
		if ($if == $interface || $config['interfaces'][$if]['if'] == $interface)
3674
			return $if;
3675 afb2de1b Ermal Lu?i
3676 7061ba0f Renato Botelho
		if (stristr($interface, "_wlan0") && $config['interfaces'][$if]['if'] == interface_get_wireless_base($interface))
3677
			return $if;
3678 af637766 Erik Fonnesbeck
3679 d11e01f4 Erik Fonnesbeck
		// XXX: This case doesn't work anymore (segfaults - recursion?) - should be replaced with something else or just removed.
3680
		//      Not to be replaced with get_real_interface - causes slow interface listings here because of recursion!
3681
		/*
3682 7061ba0f Renato Botelho
		$int = get_parent_interface($if);
3683
		if ($int[0] == $interface)
3684
			return $ifname;
3685
		 */
3686
	}
3687
	return NULL;
3688 afb2de1b Ermal Lu?i
}
3689
3690
/* attempt to resolve interface to friendly descr */
3691
function convert_friendly_interface_to_friendly_descr($interface) {
3692 1c3ddd9e Renato Botelho
	global $config;
3693 afb2de1b Ermal Lu?i
3694 1c3ddd9e Renato Botelho
	switch ($interface) {
3695
	case "l2tp":
3696
		$ifdesc = "L2TP";
3697
		break;
3698 68ef6e03 Ermal
	case "pptp":
3699
		$ifdesc = "PPTP";
3700
		break;
3701
	case "pppoe":
3702
		$ifdesc = "PPPoE";
3703
		break;
3704
	case "openvpn":
3705
		$ifdesc = "OpenVPN";
3706
		break;
3707
	case "enc0":
3708
	case "ipsec":
3709
		$ifdesc = "IPsec";
3710
		break;
3711 1c3ddd9e Renato Botelho
	default:
3712
		if (isset($config['interfaces'][$interface])) {
3713
			if (empty($config['interfaces'][$interface]['descr']))
3714
				$ifdesc = strtoupper($interface);
3715
			else
3716
				$ifdesc = strtoupper($config['interfaces'][$interface]['descr']);
3717 57c52d45 Erik Fonnesbeck
			break;
3718 7b47bd4c Ermal
		} else if (stristr($interface, "_vip")) {
3719 68ef6e03 Ermal
			if (is_array($config['virtualip']['vip'])) {
3720
				foreach ($config['virtualip']['vip'] as $counter => $vip) {
3721 3e662cb0 Ermal
					if ($vip['mode'] == "carp")  {
3722 7b47bd4c Ermal
						if ($interface == "{$vip['interface']}_vip{$vip['vhid']}")
3723 68ef6e03 Ermal
							return "{$vip['subnet']} - {$vip['descr']}";
3724
					}
3725
				}
3726 1c3ddd9e Renato Botelho
			}
3727
		} else {
3728 68ef6e03 Ermal
			/* if list */
3729
			$ifdescrs = get_configured_interface_with_descr(false, true);
3730
			foreach ($ifdescrs as $if => $ifname) {
3731 7b47bd4c Ermal
				if ($if == $interface || $ifname == $interface)
3732
					return $ifname;
3733 68ef6e03 Ermal
			}
3734 57c52d45 Erik Fonnesbeck
		}
3735 1c3ddd9e Renato Botelho
		break;
3736
	}
3737 afb2de1b Ermal Lu?i
3738 1c3ddd9e Renato Botelho
	return $ifdesc;
3739 afb2de1b Ermal Lu?i
}
3740
3741
function convert_real_interface_to_friendly_descr($interface) {
3742 1c3ddd9e Renato Botelho
	global $config;
3743 afb2de1b Ermal Lu?i
3744 1c3ddd9e Renato Botelho
	$ifdesc = convert_real_interface_to_friendly_interface_name("{$interface}");
3745 afb2de1b Ermal Lu?i
3746 1c3ddd9e Renato Botelho
	if ($ifdesc) {
3747
		$iflist = get_configured_interface_with_descr(false, true);
3748
		return $iflist[$ifdesc];
3749
	}
3750 afb2de1b Ermal Lu?i
3751 1c3ddd9e Renato Botelho
	return $interface;
3752 afb2de1b Ermal Lu?i
}
3753
3754 532b0fb8 Ermal Lu?i
/*
3755 d5dfcb52 gnhb
 *  get_parent_interface($interface):
3756 20cb9803 gnhb
 *			--returns the (real or virtual) parent interface(s) array for a given interface friendly name (i.e. wan)
3757
 *				or virtual interface (i.e. vlan)
3758
 *				(We need array because MLPPP and bridge interfaces have more than one parent.)
3759
 *			-- returns $interface passed in if $interface parent is not found
3760
 *			-- returns empty array if an invalid interface is passed
3761
 *	(Only handles ppps and vlans now.)
3762 532b0fb8 Ermal Lu?i
 */
3763 d5dfcb52 gnhb
function get_parent_interface($interface) {
3764
	global $config;
3765 532b0fb8 Ermal Lu?i
3766 20cb9803 gnhb
	$parents = array();
3767
	//Check that we got a valid interface passed
3768
	$realif = get_real_interface($interface);
3769
	if ($realif == NULL)
3770
		return $parents;
3771
3772
	// If we got a real interface, find it's friendly assigned name
3773
	$interface = convert_real_interface_to_friendly_interface_name($interface);
3774 be45aa79 Renato Botelho
3775 20cb9803 gnhb
	if (!empty($interface) && isset($config['interfaces'][$interface])) {
3776
		$ifcfg = $config['interfaces'][$interface];
3777
		switch ($ifcfg['ipaddr']) {
3778
			case "ppp":
3779
			case "pppoe":
3780
			case "pptp":
3781
			case "l2tp":
3782
				if (empty($parents))
3783
					if (is_array($config['ppps']['ppp']))
3784
						foreach ($config['ppps']['ppp'] as $pppidx => $ppp) {
3785 02b8bfae Renato Botelho
							if ($ifcfg['if'] == $ppp['if']) {
3786 20cb9803 gnhb
								$ports = explode(',', $ppp['ports']);
3787 be45aa79 Renato Botelho
								foreach ($ports as $pid => $parent_if)
3788 20cb9803 gnhb
									$parents[$pid] = get_real_interface($parent_if);
3789
								break;
3790
							}
3791
						}
3792
				break;
3793
			case "dhcp":
3794
			case "static":
3795
			default:
3796
				// Handle _vlans
3797
				if (strstr($realif,"_vlan"))
3798 be45aa79 Renato Botelho
					if (is_array($config['vlans']['vlan']))
3799 20cb9803 gnhb
						foreach ($config['vlans']['vlan'] as $vlanidx => $vlan)
3800
							if ($ifcfg['if'] == $vlan['vlanif']){
3801
								$parents[0] = $vlan['if'];
3802
								break;
3803
							}
3804
				break;
3805 3e5d0d1d Ermal
		}
3806
	}
3807 be45aa79 Renato Botelho
3808 20cb9803 gnhb
	if (empty($parents))
3809
		$parents[0] = $realif;
3810 be45aa79 Renato Botelho
3811 20cb9803 gnhb
	return $parents;
3812 532b0fb8 Ermal Lu?i
}
3813
3814 263e2b7e Erik Fonnesbeck
function interface_is_wireless_clone($wlif) {
3815
	if(!stristr($wlif, "_wlan")) {
3816
		return false;
3817
	} else {
3818
		return true;
3819
	}
3820
}
3821
3822 1d072761 Erik Fonnesbeck
function interface_get_wireless_base($wlif) {
3823 34808d4e Erik Fonnesbeck
	if(!stristr($wlif, "_wlan")) {
3824
		return $wlif;
3825
	} else {
3826
		return substr($wlif, 0, stripos($wlif, "_wlan"));
3827
	}
3828
}
3829
3830 1d072761 Erik Fonnesbeck
function interface_get_wireless_clone($wlif) {
3831 34808d4e Erik Fonnesbeck
	if(!stristr($wlif, "_wlan")) {
3832
		return $wlif . "_wlan0";
3833
	} else {
3834
		return $wlif;
3835
	}
3836
}
3837
3838 df9e93f0 Ermal
function get_real_interface($interface = "wan") {
3839 ee3576dd Ermal
	global $config, $g;
3840 cfc707f7 Scott Ullrich
3841 521cfa2f Ermal Lu?i
	$wanif = NULL;
3842 c515ea57 Scott Ullrich
3843 67ee1ec5 Ermal Luçi
	switch ($interface) {
3844 acc1e9d0 Scott Ullrich
	case "l2tp":
3845
		$wanif = "l2tp";
3846
		break;
3847 67ee1ec5 Ermal Luçi
	case "pptp":
3848
		$wanif = "pptp";
3849
		break;
3850
	case "pppoe":
3851
		$wanif = "pppoe";
3852
		break;
3853
	case "openvpn":
3854
		$wanif = "openvpn";
3855
		break;
3856 4563d12f Seth Mos
	case "ipsec":
3857 67ee1ec5 Ermal Luçi
	case "enc0":
3858
		$wanif = "enc0";
3859
		break;
3860
	case "ppp":
3861
		$wanif = "ppp";
3862
		break;
3863
	default:
3864 6d5446a2 Ermal
		// If a real interface was alread passed simply
3865
		// pass the real interface back.  This encourages
3866
		// the usage of this function in more cases so that
3867
		// we can combine logic for more flexibility.
3868
		if(does_interface_exist($interface)) {
3869
			$wanif = $interface;
3870
			break;
3871
		}
3872 bf001dec smos
3873 6d5446a2 Ermal
		if (empty($config['interfaces'][$interface]))
3874
			break;
3875 568b1358 Scott Ullrich
3876 6447bde5 jim-p
		$cfg = &$config['interfaces'][$interface];
3877 2ebf3945 Scott Ullrich
3878 6d5446a2 Ermal
		// Wireless cloned NIC support (FreeBSD 8+)
3879
		// interface name format: $parentnic_wlanparentnic#
3880
		// example: ath0_wlan0
3881 8ac9dd5e Ermal
		if( is_array($cfg['wireless']) || preg_match($g['wireless_regex'], $cfg['if']))
3882 6d5446a2 Ermal
			$wanif = interface_get_wireless_clone($cfg['if']);
3883 8ac9dd5e Ermal
		else
3884
			$wanif = $cfg['if'];
3885 67ee1ec5 Ermal Luçi
		break;
3886 c515ea57 Scott Ullrich
	}
3887
3888 1c3ddd9e Renato Botelho
	return $wanif;
3889 5b237745 Scott Ullrich
}
3890
3891 9ff8c299 Seth Mos
/* Guess the physical interface by providing a IP address */
3892 afb2de1b Ermal Lu?i
function guess_interface_from_ip($ipaddress) {
3893 80a2c1e6 Seth Mos
	if(! is_ipaddr($ipaddress)) {
3894 9ff8c299 Seth Mos
		return false;
3895
	}
3896 a05b2f42 Seth Mos
	if(is_ipaddrv4($ipaddress)) {
3897
		/* create a route table we can search */
3898
		exec("netstat -rnWf inet", $output, $ret);
3899
		foreach($output as $line) {
3900
			if(preg_match("/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+[ ]+link[#]/", $line)) {
3901
				$fields = preg_split("/[ ]+/", $line);
3902
				if(ip_in_subnet($ipaddress, $fields[0])) {
3903
					return $fields[6];
3904
				}
3905
			}
3906
		}
3907
	}
3908
	/* FIXME: This works from cursory testing, regexp might need fine tuning */
3909
	if(is_ipaddrv6($ipaddress)) {
3910
		/* create a route table we can search */
3911
		exec("netstat -rnWf inet6", $output, $ret);
3912
		foreach($output as $line) {
3913
			if(preg_match("/[0-9a-f]+[:]+[0-9a-f]+[:]+[\/][0-9]+/", $line)) {
3914
				$fields = preg_split("/[ ]+/", $line);
3915
				if(ip_in_subnet($ipaddress, $fields[0])) {
3916
					return $fields[6];
3917
				}
3918 9ff8c299 Seth Mos
			}
3919
		}
3920
	}
3921
	$ret = exec_command("/sbin/route -n get {$ipaddress} | /usr/bin/awk '/interface/ { print \$2; };'");
3922
	if(empty($ret)) {
3923 1c3ddd9e Renato Botelho
		return false;
3924 9ff8c299 Seth Mos
	}
3925
	return $ret;
3926 afb2de1b Ermal Lu?i
}
3927
3928
/*
3929
 * find_ip_interface($ip): return the interface where an ip is defined
3930 59231855 Darren Embry
 *   (or if $bits is specified, where an IP within the subnet is defined)
3931 afb2de1b Ermal Lu?i
 */
3932 2027b4c7 bcyrill
function find_ip_interface($ip, $bits = null) {
3933
	if (!is_ipaddr($ip))
3934
		return false;
3935
	
3936
	$isv6ip = is_ipaddrv6($ip);
3937
	
3938 59231855 Darren Embry
	/* if list */
3939
	$ifdescrs = get_configured_interface_list();
3940 be45aa79 Renato Botelho
3941 59231855 Darren Embry
	foreach ($ifdescrs as $ifdescr => $ifname) {
3942 2027b4c7 bcyrill
		$ifip = ($isv6ip) ? get_interface_ipv6($ifname) : get_interface_ip($ifname);
3943 ec8b4d8d Ermal
		if (is_null($ifip))
3944 2027b4c7 bcyrill
			continue;
3945 ec8b4d8d Ermal
		if (is_null($bits)) {
3946 2027b4c7 bcyrill
			if ($ip == $ifip) {
3947 59231855 Darren Embry
				$int = get_real_interface($ifname);
3948
				return $int;
3949
			}
3950
		}
3951
		else {
3952 2027b4c7 bcyrill
			if (ip_in_subnet($ifip, $ip . "/" . $bits)) {
3953 59231855 Darren Embry
				$int = get_real_interface($ifname);
3954
				return $int;
3955
			}
3956
		}
3957
	}
3958 ec8b4d8d Ermal
3959 59231855 Darren Embry
	return false;
3960
}
3961 afb2de1b Ermal Lu?i
3962 59231855 Darren Embry
/*
3963
 * find_virtual_ip_alias($ip): return the virtual IP alias where an IP is found
3964
 *   (or if $bits is specified, where an IP within the subnet is found)
3965
 */
3966
function find_virtual_ip_alias($ip, $bits = null) {
3967
	global $config;
3968 6b207f73 bcyrill
	
3969 59231855 Darren Embry
	if (!is_array($config['virtualip']['vip'])) {
3970
		return false;
3971
	}
3972 6b207f73 bcyrill
	if (!is_ipaddr($ip))
3973
		return false;
3974
	
3975
	$isv6ip = is_ipaddrv6($ip);
3976
	
3977 59231855 Darren Embry
	foreach ($config['virtualip']['vip'] as $vip) {
3978
		if ($vip['mode'] === "ipalias") {
3979 6b207f73 bcyrill
			if (is_ipaddrv6($vip['subnet']) != $isv6ip)
3980
				continue;
3981 ec8b4d8d Ermal
			if (is_null($bits)) {
3982 59231855 Darren Embry
				if (ip_in_subnet($ip, $vip['subnet'] . "/" . $vip['subnet_bits'])) {
3983
					return $vip;
3984
				}
3985
			}
3986
			else {
3987 dbea91b3 bcyrill
				if (($isv6ip && check_subnetsv6_overlap($ip, $bits, $vip['subnet'], $vip['subnet_bits']))
3988
					|| (!$isv6ip && check_subnets_overlap($ip, $bits, $vip['subnet'], $vip['subnet_bits']))) {
3989 59231855 Darren Embry
					return $vip;
3990
				}
3991
			}
3992 abcb2bed Ermal Lu?i
		}
3993 59231855 Darren Embry
	}
3994
	return false;
3995 afb2de1b Ermal Lu?i
}
3996
3997 a71b32d2 Scott Ullrich
/*
3998
 *   find_number_of_created_carp_interfaces: return the number of carp interfaces
3999
 */
4000
function find_number_of_created_carp_interfaces() {
4001
	return `/sbin/ifconfig | grep "carp:" | wc -l`;
4002
}
4003
4004
function get_all_carp_interfaces() {
4005
	$ints = str_replace("\n", " ", `ifconfig | grep "carp:" -B2 | grep ": flag" | cut -d: -f1`);
4006 81c64284 Chris Buechler
	$ints = explode(" ", $ints);
4007 a71b32d2 Scott Ullrich
	return $ints;
4008
}
4009
4010 abcb2bed Ermal Lu?i
/*
4011
 * find_carp_interface($ip): return the carp interface where an ip is defined
4012
 */
4013
function find_carp_interface($ip) {
4014 27625b39 Scott Ullrich
	global $config;
4015 abcb2bed Ermal Lu?i
	if (is_array($config['virtualip']['vip'])) {
4016
		foreach ($config['virtualip']['vip'] as $vip) {
4017 3e662cb0 Ermal
			if ($vip['mode'] == "carp") {
4018 645ad665 Seth Mos
				if(is_ipaddrv4($ip)) {
4019
					$carp_ip = get_interface_ip($vip['interface']);
4020
				}
4021
				if(is_ipaddrv6($ip)) {
4022
					$carp_ip = get_interface_ipv6($vip['interface']);
4023
				}
4024
				exec("/sbin/ifconfig", $output, $return);
4025
				foreach($output as $line) {
4026
					$elements = preg_split("/[ ]+/i", $line);
4027
					if(strstr($elements[0], "vip"))
4028
						$curif = str_replace(":", "", $elements[0]);
4029
					if(stristr($line, $ip)) {
4030
						$if = $curif;
4031
						continue;
4032
					}
4033
				}
4034 a687f866 Namezero
4035 27625b39 Scott Ullrich
				if ($if)
4036
					return $if;
4037 abcb2bed Ermal Lu?i
			}
4038
		}
4039
	}
4040
}
4041
4042
function link_carp_interface_to_parent($interface) {
4043 6fb26a17 smos
	global $config;
4044 abcb2bed Ermal Lu?i
4045 6fb26a17 smos
	if ($interface == "")
4046
		return;
4047 abcb2bed Ermal Lu?i
4048 6fb26a17 smos
	$carp_ip = get_interface_ip($interface);
4049
	$carp_ipv6 = get_interface_ipv6($interface);
4050 abcb2bed Ermal Lu?i
4051 6fb26a17 smos
	if((!is_ipaddrv4($carp_ip)) && (!is_ipaddrv6($carp_ipv6)))
4052
		return;
4053 abcb2bed Ermal Lu?i
4054 6fb26a17 smos
	/* if list */
4055
	$ifdescrs = get_configured_interface_list();
4056
	foreach ($ifdescrs as $ifdescr => $ifname) {
4057
		/* check IPv4 */
4058
		if(is_ipaddrv4($carp_ip)) {
4059
			$interfaceip = get_interface_ip($ifname);
4060
			$subnet_bits = get_interface_subnet($ifname);
4061
			$subnet_ip = gen_subnet("{$interfaceip}", "{$subnet_bits}");
4062
			if(ip_in_subnet($carp_ip, "{$subnet_ip}/{$subnet_bits}"))
4063
				return $ifname;
4064
		}
4065
		/* Check IPv6 */
4066
		if(is_ipaddrv6($carp_ipv6)) {
4067
			$interfaceipv6 = get_interface_ipv6($ifname);
4068
			$prefixlen = get_interface_subnetv6($ifname);
4069
			if(ip_in_subnet($carp_ipv6, "{$interfaceipv6}/{$prefixlen}"))
4070
				return $ifname;
4071
		}
4072
	}
4073
	return "";
4074 abcb2bed Ermal Lu?i
}
4075
4076 6fb26a17 smos
4077 abcb2bed Ermal Lu?i
/****f* interfaces/link_ip_to_carp_interface
4078
 * NAME
4079
 *   link_ip_to_carp_interface - Find where a CARP interface links to.
4080
 * INPUTS
4081
 *   $ip
4082
 * RESULT
4083
 *   $carp_ints
4084
 ******/
4085
function link_ip_to_carp_interface($ip) {
4086 1c3ddd9e Renato Botelho
	global $config;
4087 abcb2bed Ermal Lu?i
4088 1c3ddd9e Renato Botelho
	if (!is_ipaddr($ip))
4089
		return;
4090 abcb2bed Ermal Lu?i
4091 1c3ddd9e Renato Botelho
	$carp_ints = "";
4092
	if (is_array($config['virtualip']['vip'])) {
4093 1d002dc9 Ermal
		$first = 0;
4094 3fbc3487 Ermal
		$carp_int = array();
4095 1c3ddd9e Renato Botelho
		foreach ($config['virtualip']['vip'] as $vip) {
4096
			if ($vip['mode'] == "carp") {
4097
				$carp_ip = $vip['subnet'];
4098
				$carp_sn = $vip['subnet_bits'];
4099
				$carp_nw = gen_subnet($carp_ip, $carp_sn);
4100
				if (ip_in_subnet($ip, "{$carp_nw}/{$carp_sn}")) {
4101 7b47bd4c Ermal
					$carp_int[] = "{$vip['interface']}_vip{$vip['vhid']}";
4102
				}
4103 1c3ddd9e Renato Botelho
			}
4104
		}
4105 3fbc3487 Ermal
		if (!empty($carp_int))
4106
			$carp_ints = implode(" ", array_unique($carp_int));
4107 1c3ddd9e Renato Botelho
	}
4108 abcb2bed Ermal Lu?i
4109 1c3ddd9e Renato Botelho
	return $carp_ints;
4110 abcb2bed Ermal Lu?i
}
4111
4112 7a04cd20 Ermal
function link_interface_to_track6($int, $action = "") {
4113
	global $config;
4114
4115
	if (empty($int))
4116
		return;
4117
4118
	if (is_array($config['interfaces'])) {
4119
		$list = array();
4120
		foreach ($config['interfaces'] as $ifname => $ifcfg) {
4121
			if (!isset($ifcfg['enable']))
4122
				continue;
4123
			if (!empty($ifcfg['ipaddrv6']) && $ifcfg['track6-interface'] == $int) {
4124
				if ($action == "update")
4125
					interface_track6_configure($ifname, $ifcfg);
4126
				else if ($action == "")
4127
					$list[$ifname] = $ifcfg;
4128
			}
4129
		}
4130
		return $list;
4131
	}
4132
}
4133
4134 7850de1c Ermal Lu?i
function link_interface_to_vlans($int, $action = "") {
4135
	global $config;
4136
4137
	if (empty($int))
4138
		return;
4139
4140
	if (is_array($config['vlans']['vlan'])) {
4141 1c3ddd9e Renato Botelho
		foreach ($config['vlans']['vlan'] as $vlan) {
4142 fa4a331f Ermal
			if ($int == $vlan['if']) {
4143 7850de1c Ermal Lu?i
				if ($action == "update") {
4144 fa4a331f Ermal
					interfaces_bring_up($int);
4145 7850de1c Ermal Lu?i
				} else if ($action == "")
4146
					return $vlan;
4147
			}
4148
		}
4149
	}
4150
}
4151
4152
function link_interface_to_vips($int, $action = "") {
4153 1c3ddd9e Renato Botelho
	global $config;
4154 e5ac67ed Ermal Lu?i
4155 1c3ddd9e Renato Botelho
	if (is_array($config['virtualip']['vip'])) {
4156 75201355 Ermal
		$result = array();
4157 dcadda55 Ermal
		foreach ($config['virtualip']['vip'] as $vip) {
4158
			if ($int == $vip['interface']) {
4159 7b47bd4c Ermal
				if ($action == "update")
4160
					interfaces_vips_configure($int);
4161
				else
4162 75201355 Ermal
					$result[] = $vip;
4163 7850de1c Ermal Lu?i
			}
4164 dcadda55 Ermal
		}
4165 75201355 Ermal
		return $result;
4166 dcadda55 Ermal
	}
4167 e5ac67ed Ermal Lu?i
}
4168
4169 afb2de1b Ermal Lu?i
/****f* interfaces/link_interface_to_bridge
4170
 * NAME
4171
 *   link_interface_to_bridge - Finds out a bridge group for an interface
4172
 * INPUTS
4173
 *   $ip
4174
 * RESULT
4175
 *   bridge[0-99]
4176
 ******/
4177
function link_interface_to_bridge($int) {
4178 1c3ddd9e Renato Botelho
	global $config;
4179 afb2de1b Ermal Lu?i
4180 1c3ddd9e Renato Botelho
	if (is_array($config['bridges']['bridged'])) {
4181
		foreach ($config['bridges']['bridged'] as $bridge) {
4182 a639bb91 Ermal
			if (in_array($int, explode(',', $bridge['members'])))
4183 1c3ddd9e Renato Botelho
				return "{$bridge['bridgeif']}";
4184 a639bb91 Ermal
		}
4185
	}
4186 afb2de1b Ermal Lu?i
}
4187
4188 48f23632 Ermal
function link_interface_to_group($int) {
4189 1c3ddd9e Renato Botelho
	global $config;
4190 48f23632 Ermal
4191 ed62880b Ermal
	$result = array();
4192
4193 1c3ddd9e Renato Botelho
	if (is_array($config['ifgroups']['ifgroupentry'])) {
4194
		foreach ($config['ifgroups']['ifgroupentry'] as $group) {
4195 1dbc0c43 Ermal
			if (in_array($int, explode(" ", $group['members'])))
4196 ed62880b Ermal
				$result[$group['ifname']] = $int;
4197 48f23632 Ermal
		}
4198
	}
4199 ed62880b Ermal
4200
	return $result;
4201 48f23632 Ermal
}
4202
4203 afb2de1b Ermal Lu?i
function link_interface_to_gre($interface) {
4204 1c3ddd9e Renato Botelho
	global $config;
4205 afb2de1b Ermal Lu?i
4206 ed62880b Ermal
	$result = array();
4207
4208 1c3ddd9e Renato Botelho
	if (is_array($config['gres']['gre'])) {
4209
		foreach ($config['gres']['gre'] as $gre)
4210
			if($gre['if'] == $interface)
4211 ed62880b Ermal
				$result[] = $gre;
4212
	}
4213
4214
	return $result;
4215 afb2de1b Ermal Lu?i
}
4216
4217
function link_interface_to_gif($interface) {
4218 1c3ddd9e Renato Botelho
	global $config;
4219 afb2de1b Ermal Lu?i
4220 ed62880b Ermal
	$result = array();
4221
4222 1c3ddd9e Renato Botelho
	if (is_array($config['gifs']['gif'])) {
4223
		foreach ($config['gifs']['gif'] as $gif)
4224
			if($gif['if'] == $interface)
4225
				$result[] = $gif;
4226 ed62880b Ermal
	}
4227
4228
	return $result;
4229 afb2de1b Ermal Lu?i
}
4230
4231
/*
4232
 * find_interface_ip($interface): return the interface ip (first found)
4233
 */
4234
function find_interface_ip($interface, $flush = false)
4235
{
4236
	global $interface_ip_arr_cache;
4237 01f1b601 Ermal
	global $interface_sn_arr_cache;
4238 afb2de1b Ermal Lu?i
4239
	$interface = str_replace("\n", "", $interface);
4240 be45aa79 Renato Botelho
4241 8256f324 gnhb
	if (!does_interface_exist($interface))
4242 afb2de1b Ermal Lu?i
		return;
4243
4244
	/* Setup IP cache */
4245
	if (!isset($interface_ip_arr_cache[$interface]) or $flush) {
4246 3f70e618 Ermal Lu?i
		$ifinfo = pfSense_get_interface_addresses($interface);
4247
		$interface_ip_arr_cache[$interface] = $ifinfo['ipaddr'];
4248 01f1b601 Ermal
		$interface_sn_arr_cache[$interface] = $ifinfo['subnetbits'];
4249 afb2de1b Ermal Lu?i
	}
4250
4251
	return $interface_ip_arr_cache[$interface];
4252
}
4253
4254 47593ac6 Seth Mos
/*
4255
 * find_interface_ipv6($interface): return the interface ip (first found)
4256
 */
4257
function find_interface_ipv6($interface, $flush = false)
4258
{
4259
	global $interface_ipv6_arr_cache;
4260
	global $interface_snv6_arr_cache;
4261 31ace4ea Seth Mos
	global $config;
4262 be45aa79 Renato Botelho
4263 31bdb9e5 smos
	$interface = trim($interface);
4264
	$interface = get_real_interface($interface);
4265 be45aa79 Renato Botelho
4266 47593ac6 Seth Mos
	if (!does_interface_exist($interface))
4267
		return;
4268
4269
	/* Setup IP cache */
4270
	if (!isset($interface_ipv6_arr_cache[$interface]) or $flush) {
4271
		$ifinfo = pfSense_get_interface_addresses($interface);
4272 3c5e10fc Seth Mos
		// FIXME: Add IPv6 support to the pfSense module
4273 31ace4ea Seth Mos
		exec("/sbin/ifconfig {$interface} inet6", $output);
4274
		foreach($output as $line) {
4275
			if(preg_match("/inet6/", $line)) {
4276
				$parts = explode(" ", $line);
4277 c9d174df Seth Mos
				if(! preg_match("/fe80::/", $parts[1])) {
4278 31ace4ea Seth Mos
					$ifinfo['ipaddrv6'] = $parts[1];
4279 a23a99cb Seth Mos
					if($parts[2] == "-->") {
4280 cf6bc278 Seth Mos
						$parts[5] = "126";
4281 9991ff2c Seth Mos
						$ifinfo['subnetbitsv6'] = $parts[5];
4282 a23a99cb Seth Mos
					} else {
4283 9991ff2c Seth Mos
						$ifinfo['subnetbitsv6'] = $parts[3];
4284 a23a99cb Seth Mos
					}
4285 acc68ffa Renato Botelho
					break;
4286 31ace4ea Seth Mos
				}
4287
			}
4288
		}
4289 47593ac6 Seth Mos
		$interface_ipv6_arr_cache[$interface] = $ifinfo['ipaddrv6'];
4290
		$interface_snv6_arr_cache[$interface] = $ifinfo['subnetbitsv6'];
4291
	}
4292
4293
	return $interface_ipv6_arr_cache[$interface];
4294
}
4295
4296 81a3b6f5 smos
/*
4297
 * find_interface_ipv6_ll($interface): return the interface ipv6 link local (first found)
4298
 */
4299
function find_interface_ipv6_ll($interface, $flush = false)
4300
{
4301 58418355 smos
	global $interface_llv6_arr_cache;
4302 81a3b6f5 smos
	global $config;
4303 be45aa79 Renato Botelho
4304 81a3b6f5 smos
	$interface = str_replace("\n", "", $interface);
4305 be45aa79 Renato Botelho
4306 81a3b6f5 smos
	if (!does_interface_exist($interface))
4307
		return;
4308
4309
	/* Setup IP cache */
4310 58418355 smos
	if (!isset($interface_llv6_arr_cache[$interface]) or $flush) {
4311 81a3b6f5 smos
		$ifinfo = pfSense_get_interface_addresses($interface);
4312
		// FIXME: Add IPv6 support to the pfSense module
4313
		exec("/sbin/ifconfig {$interface} inet6", $output);
4314
		foreach($output as $line) {
4315
			if(preg_match("/inet6/", $line)) {
4316
				$parts = explode(" ", $line);
4317
				if(preg_match("/fe80::/", $parts[1])) {
4318 58418355 smos
					$partsaddress = explode("%", $parts[1]);
4319
					$ifinfo['linklocal'] = $partsaddress[0];
4320 81a3b6f5 smos
				}
4321
			}
4322
		}
4323 58418355 smos
		$interface_llv6_arr_cache[$interface] = $ifinfo['linklocal'];
4324 81a3b6f5 smos
	}
4325 58418355 smos
	return $interface_llv6_arr_cache[$interface];
4326 81a3b6f5 smos
}
4327
4328 afb2de1b Ermal Lu?i
function find_interface_subnet($interface, $flush = false)
4329
{
4330
	global $interface_sn_arr_cache;
4331 01f1b601 Ermal
	global $interface_ip_arr_cache;
4332 afb2de1b Ermal Lu?i
4333
	$interface = str_replace("\n", "", $interface);
4334
	if (does_interface_exist($interface) == false)
4335
		return;
4336
4337
	if (!isset($interface_sn_arr_cache[$interface]) or $flush) {
4338 bd96e1fe Ermal Lu?i
		$ifinfo = pfSense_get_interface_addresses($interface);
4339 01f1b601 Ermal
		$interface_ip_arr_cache[$interface] = $ifinfo['ipaddr'];
4340 bd96e1fe Ermal Lu?i
		$interface_sn_arr_cache[$interface] = $ifinfo['subnetbits'];
4341 1c3ddd9e Renato Botelho
	}
4342 afb2de1b Ermal Lu?i
4343
	return $interface_sn_arr_cache[$interface];
4344
}
4345
4346 47593ac6 Seth Mos
function find_interface_subnetv6($interface, $flush = false)
4347
{
4348
	global $interface_snv6_arr_cache;
4349
	global $interface_ipv6_arr_cache;
4350
4351
	$interface = str_replace("\n", "", $interface);
4352
	if (does_interface_exist($interface) == false)
4353
		return;
4354
4355 c4fc2eae Ermal
	$foundv6 = false;
4356 47593ac6 Seth Mos
	if (!isset($interface_snv6_arr_cache[$interface]) or $flush) {
4357
		$ifinfo = pfSense_get_interface_addresses($interface);
4358 3c5e10fc Seth Mos
		// FIXME: Add IPv6 support to the pfSense module
4359 c4fc2eae Ermal
		unset($output);
4360 9991ff2c Seth Mos
		exec("/sbin/ifconfig {$interface} inet6", $output);
4361
		foreach($output as $line) {
4362 c4fc2eae Ermal
			$line = trim($line);
4363 9991ff2c Seth Mos
			if(preg_match("/inet6/", $line)) {
4364
				$parts = explode(" ", $line);
4365
				if(! preg_match("/fe80::/", $parts[1])) {
4366
					$ifinfo['ipaddrv6'] = $parts[1];
4367 a23a99cb Seth Mos
					if($parts[2] == "-->") {
4368 cf6bc278 Seth Mos
						$parts[5] = "126";
4369 9991ff2c Seth Mos
						$ifinfo['subnetbitsv6'] = $parts[5];
4370 a23a99cb Seth Mos
					} else {
4371 9991ff2c Seth Mos
						$ifinfo['subnetbitsv6'] = $parts[3];
4372 a23a99cb Seth Mos
					}
4373 c4fc2eae Ermal
					$foundv6 = true;
4374
					break;
4375 9991ff2c Seth Mos
				}
4376
			}
4377
		}
4378 c4fc2eae Ermal
		if ($foundv6 === true) {
4379
			$interface_ipv6_arr_cache[$interface] = $ifinfo['ipaddrv6'];
4380
			$interface_snv6_arr_cache[$interface] = $ifinfo['subnetbitsv6'];
4381
		} else
4382
			unset($interface_ipv6_arr_cache[$interface], $interface_snv6_arr_cache[$interface]);
4383 1c3ddd9e Renato Botelho
	}
4384 47593ac6 Seth Mos
4385
	return $interface_snv6_arr_cache[$interface];
4386
}
4387
4388 e19b7d1e Ermal
function ip_in_interface_alias_subnet($interface, $ipalias) {
4389
	global $config;
4390
4391
	if (empty($interface) || !is_ipaddr($ipalias))
4392 e8471084 Ermal
		return false;
4393 e19b7d1e Ermal
	if (is_array($config['virtualip']['vip'])) {
4394 1c3ddd9e Renato Botelho
		foreach ($config['virtualip']['vip'] as $vip) {
4395
			switch ($vip['mode']) {
4396
			case "ipalias":
4397
				if ($vip['interface'] <> $interface)
4398
					break;
4399 e19b7d1e Ermal
				if (ip_in_subnet($ipalias, gen_subnet($vip['subnet'], $vip['subnet_bits']) . "/" . $vip['subnet_bits']))
4400 e8471084 Ermal
					return true;
4401 1c3ddd9e Renato Botelho
				break;
4402
			}
4403
		}
4404 e19b7d1e Ermal
	}
4405 e8471084 Ermal
4406
	return false;
4407 e19b7d1e Ermal
}
4408
4409 e88fbe50 Ermal Lu?i
function get_interface_ip($interface = "wan")
4410
{
4411 bf001dec smos
	$realif = get_failover_interface($interface);
4412 afb2de1b Ermal Lu?i
	if (!$realif) {
4413
		if (preg_match("/^carp/i", $interface))
4414
			$realif = $interface;
4415 5a61fd69 smos
		else if (preg_match("/^[a-z0-9]+_vip/i", $interface))
4416 564df7c2 Ermal Lu?i
			$realif = $interface;
4417 afb2de1b Ermal Lu?i
		else
4418
			return null;
4419
	}
4420
4421 5e041d5f Scott Ullrich
	$curip = find_interface_ip($realif);
4422
	if ($curip && is_ipaddr($curip) && ($curip != "0.0.0.0"))
4423
		return $curip;
4424 8256f324 gnhb
	else
4425
		return null;
4426 5b237745 Scott Ullrich
}
4427
4428 47593ac6 Seth Mos
function get_interface_ipv6($interface = "wan")
4429
{
4430 479f0fda smos
	global $config;
4431 c4fc2eae Ermal
4432 bf001dec smos
	$realif = get_failover_interface($interface);
4433 c4fc2eae Ermal
	if (is_array($config['interfaces'][$interface])) {
4434
		switch($config['interfaces'][$interface]['ipaddrv6']) {
4435
			case "6rd":
4436
			case "6to4":
4437
				$realif = "{$interface}_stf";
4438
				break;
4439
		}
4440 479f0fda smos
	}
4441 47593ac6 Seth Mos
	if (!$realif) {
4442 c4fc2eae Ermal
		if (preg_match("/^[a-z0-9]+_vip/i", $interface))
4443 47593ac6 Seth Mos
			$realif = $interface;
4444
		else
4445
			return null;
4446
	}
4447
4448
	$curip = find_interface_ipv6($realif);
4449
	if ($curip && is_ipaddrv6($curip) && ($curip != "::"))
4450
		return $curip;
4451
	else
4452
		return null;
4453
}
4454
4455 58418355 smos
function get_interface_linklocal($interface = "wan")
4456
{
4457 bf001dec smos
	$realif = get_failover_interface($interface);
4458 58418355 smos
	if (!$realif) {
4459
		if (preg_match("/^carp/i", $interface))
4460
			$realif = $interface;
4461 5a61fd69 smos
		else if (preg_match("/^[a-z0-9]+_vip/i", $interface))
4462 58418355 smos
			$realif = $interface;
4463
		else
4464
			return null;
4465
	}
4466
4467
	$curip = find_interface_ipv6_ll($realif);
4468
	if ($curip && is_ipaddrv6($curip) && ($curip != "::"))
4469
		return $curip;
4470
	else
4471
		return null;
4472
}
4473
4474 e88fbe50 Ermal Lu?i
function get_interface_subnet($interface = "wan")
4475
{
4476 31b24870 Ermal Luçi
	$realif = get_real_interface($interface);
4477 e88fbe50 Ermal Lu?i
	if (!$realif) {
4478 1c3ddd9e Renato Botelho
		if (preg_match("/^carp/i", $interface))
4479
			$realif = $interface;
4480
		else if (preg_match("/^[a-z0-9]+_vip/i", $interface))
4481
			$realif = $interface;
4482
		else
4483
			return null;
4484
	}
4485 e88fbe50 Ermal Lu?i
4486 5e041d5f Scott Ullrich
	$cursn = find_interface_subnet($realif);
4487
	if (!empty($cursn))
4488 31b24870 Ermal Luçi
		return $cursn;
4489
4490
	return null;
4491
}
4492
4493 47593ac6 Seth Mos
function get_interface_subnetv6($interface = "wan")
4494
{
4495 c4fc2eae Ermal
	global $config;
4496
4497 a75a49f6 Renato Botelho
	if (is_array($config['interfaces'][$interface])) {
4498
		switch($config['interfaces'][$interface]['ipaddrv6']) {
4499
			case "6rd":
4500
			case "6to4":
4501
				$realif = "{$interface}_stf";
4502
				break;
4503
			default:
4504
				$realif = get_real_interface($interface);
4505
				break;
4506
		}
4507 c4fc2eae Ermal
	}
4508 47593ac6 Seth Mos
	if (!$realif) {
4509 c4fc2eae Ermal
		if (preg_match("/^[a-z0-9]+_vip/i", $interface))
4510 1c3ddd9e Renato Botelho
			$realif = $interface;
4511
		else
4512
			return null;
4513
	}
4514 47593ac6 Seth Mos
4515
	$cursn = find_interface_subnetv6($realif);
4516
	if (!empty($cursn))
4517
		return $cursn;
4518
4519
	return null;
4520
}
4521
4522 52947718 Ermal Lu?i
/* return outside interfaces with a gateway */
4523
function get_interfaces_with_gateway() {
4524 77ccab82 Scott Ullrich
	global $config;
4525 52947718 Ermal Lu?i
4526
	$ints = array();
4527
4528
	/* loop interfaces, check config for outbound */
4529 77ccab82 Scott Ullrich
	foreach($config['interfaces'] as $ifdescr => $ifname) {
4530
		switch ($ifname['ipaddr']) {
4531
			case "dhcp":
4532 39f750b5 gnhb
			case "ppp";
4533 77ccab82 Scott Ullrich
			case "pppoe":
4534
			case "pptp":
4535 6d5446a2 Ermal
			case "l2tp":
4536 9ebe7028 gnhb
			case "ppp";
4537 6d5446a2 Ermal
				$ints[$ifdescr] = $ifdescr;
4538 77ccab82 Scott Ullrich
			break;
4539
			default:
4540 c822154c jim-p
				if (substr($ifname['if'], 0, 4) ==  "ovpn" ||
4541 f6b30142 Ermal
				    !empty($ifname['gateway']))
4542 6d5446a2 Ermal
					$ints[$ifdescr] = $ifdescr;
4543 77ccab82 Scott Ullrich
			break;
4544
		}
4545
	}
4546
	return $ints;
4547 52947718 Ermal Lu?i
}
4548
4549
/* return true if interface has a gateway */
4550
function interface_has_gateway($friendly) {
4551 6d5446a2 Ermal
	global $config;
4552 52947718 Ermal Lu?i
4553 6d5446a2 Ermal
	if (!empty($config['interfaces'][$friendly])) {
4554 43a22ee2 jim-p
		$ifname = &$config['interfaces'][$friendly];
4555 6d5446a2 Ermal
		switch ($ifname['ipaddr']) {
4556
			case "dhcp":
4557
			case "pppoe":
4558
			case "pptp":
4559
			case "l2tp":
4560
			case "ppp";
4561
				return true;
4562
			break;
4563
			default:
4564 c822154c jim-p
				if (substr($ifname['if'], 0, 4) ==  "ovpn")
4565 e9d7afeb Ermal
					return true;
4566 6d5446a2 Ermal
				if (!empty($ifname['gateway']))
4567
					return true;
4568
			break;
4569
		}
4570
	}
4571 52947718 Ermal Lu?i
4572
	return false;
4573
}
4574
4575 2feb85af Seth Mos
/* return true if interface has a gateway */
4576
function interface_has_gatewayv6($friendly) {
4577
	global $config;
4578
4579
	if (!empty($config['interfaces'][$friendly])) {
4580
		$ifname = &$config['interfaces'][$friendly];
4581
		switch ($ifname['ipaddrv6']) {
4582 67102344 smos
			case "slaac":
4583 2feb85af Seth Mos
			case "dhcp6":
4584
				return true;
4585 a11a839d smos
				break;
4586
			case "6to4":
4587
				return true;
4588
				break;
4589 d500e296 smos
			case "6rd":
4590
				return true;
4591 a11a839d smos
				break;
4592 2feb85af Seth Mos
			default:
4593 c822154c jim-p
				if (substr($ifname['if'], 0, 4) ==  "ovpn")
4594 2feb85af Seth Mos
					return true;
4595
				if (!empty($ifname['gatewayv6']))
4596
					return true;
4597 a11a839d smos
				break;
4598 2feb85af Seth Mos
		}
4599
	}
4600
4601
	return false;
4602
}
4603
4604 a57b119e Bill Marquette
/****f* interfaces/is_altq_capable
4605
 * NAME
4606
 *   is_altq_capable - Test if interface is capable of using ALTQ
4607
 * INPUTS
4608
 *   $int            - string containing interface name
4609
 * RESULT
4610
 *   boolean         - true or false
4611
 ******/
4612
4613 eba938e3 Scott Ullrich
function is_altq_capable($int) {
4614 1c3ddd9e Renato Botelho
	/* Per:
4615
	 * http://www.freebsd.org/cgi/man.cgi?query=altq&manpath=FreeBSD+7.2-current&format=html
4616
	 * Only the following drivers have ALTQ support
4617
	 */
4618 c2d7074e Ermal
	$capable = array("age", "alc", "ale", "an", "ath", "aue", "awi", "bce",
4619 a5ccf623 jim-p
			"bfe", "bge", "bridge", "cas", "dc", "de", "ed", "em", "ep", "fxp", "gem",
4620 be888d7f Ermal
			"hme", "igb", "ipw", "iwi", "jme", "le", "lem", "msk", "mxge", "my", "nfe",
4621 8c62fa48 jim-p
			"npe", "nve", "ral", "re", "rl", "rum", "run", "bwn", "sf", "sis", "sk",
4622 64fe3233 Seth Mos
			"ste", "stge", "txp", "udav", "ural", "vge", "vr", "wi", "xl",
4623 febca7e8 Ermal
			"ndis", "tun", "ovpns", "ovpnc", "vlan", "pppoe", "pptp", "ng",
4624 cf205dca Ermal
			"l2tp", "ppp", "vtnet");
4625 a57b119e Bill Marquette
4626 2ccac125 Renato Botelho
	$int_family = remove_ifindex($int);
4627 a57b119e Bill Marquette
4628 2163ace9 phildd
	if (in_array($int_family, $capable))
4629 1c3ddd9e Renato Botelho
		return true;
4630 dbe67167 Ermal
	else if (stristr($int, "l2tp")) /* VLANs are name $parent_$vlan now */
4631
		return true;
4632 21699e76 Ermal
	else if (stristr($int, "vlan")) /* VLANs are name $parent_$vlan now */
4633 7e627719 Ermal
		return true;
4634 21699e76 Ermal
	else if (stristr($int, "_wlan")) /* WLANs are name $parent_$wlan now */
4635 2f3446db Ermal Lu?i
		return true;
4636 1c3ddd9e Renato Botelho
	else
4637
		return false;
4638 a57b119e Bill Marquette
}
4639
4640 52947718 Ermal Lu?i
/****f* interfaces/is_interface_wireless
4641
 * NAME
4642
 *   is_interface_wireless - Returns if an interface is wireless
4643
 * RESULT
4644
 *   $tmp       - Returns if an interface is wireless
4645
 ******/
4646
function is_interface_wireless($interface) {
4647 1c3ddd9e Renato Botelho
	global $config, $g;
4648
4649
	$friendly = convert_real_interface_to_friendly_interface_name($interface);
4650
	if(!isset($config['interfaces'][$friendly]['wireless'])) {
4651
		if (preg_match($g['wireless_regex'], $interface)) {
4652
			if (isset($config['interfaces'][$friendly]))
4653
				$config['interfaces'][$friendly]['wireless'] = array();
4654
			return true;
4655
		}
4656
		return false;
4657
	} else
4658
		return true;
4659 52947718 Ermal Lu?i
}
4660
4661 eba938e3 Scott Ullrich
function get_wireless_modes($interface) {
4662 d8c67d69 Scott Ullrich
	/* return wireless modes and channels */
4663 92f7d37d Ermal Luçi
	$wireless_modes = array();
4664
4665 5357f386 Erik Fonnesbeck
	$cloned_interface = get_real_interface($interface);
4666 1b773d20 Ermal Lu?i
4667 5357f386 Erik Fonnesbeck
	if($cloned_interface && is_interface_wireless($cloned_interface)) {
4668 1b773d20 Ermal Lu?i
		$chan_list = "/sbin/ifconfig {$cloned_interface} list chan";
4669
		$stack_list = "/usr/bin/awk -F\"Channel \" '{ gsub(/\\*/, \" \"); print \$2 \"\\\n\" \$3 }'";
4670 1de74081 Ermal Lu?i
		$format_list = "/usr/bin/awk '{print \$5 \" \" \$6 \",\" \$1}'";
4671 d8c67d69 Scott Ullrich
4672 4b0e71db Scott Ullrich
		$interface_channels = "";
4673 d8c67d69 Scott Ullrich
		exec("$chan_list | $stack_list | sort -u | $format_list 2>&1", $interface_channels);
4674
		$interface_channel_count = count($interface_channels);
4675
4676
		$c = 0;
4677
		while ($c < $interface_channel_count)
4678
		{
4679
			$channel_line = explode(",", $interface_channels["$c"]);
4680
			$wireless_mode = trim($channel_line[0]);
4681
			$wireless_channel = trim($channel_line[1]);
4682 4066776d Scott Ullrich
			if(trim($wireless_mode) != "") {
4683
				/* if we only have 11g also set 11b channels */
4684
				if($wireless_mode == "11g") {
4685 1ae54336 Erik Fonnesbeck
					if(!isset($wireless_modes["11b"]))
4686
						$wireless_modes["11b"] = array();
4687 39c1349c Erik Fonnesbeck
				} else if($wireless_mode == "11g ht") {
4688 1ae54336 Erik Fonnesbeck
					if(!isset($wireless_modes["11b"]))
4689
						$wireless_modes["11b"] = array();
4690
					if(!isset($wireless_modes["11g"]))
4691
						$wireless_modes["11g"] = array();
4692 39c1349c Erik Fonnesbeck
					$wireless_mode = "11ng";
4693
				} else if($wireless_mode == "11a ht") {
4694 1ae54336 Erik Fonnesbeck
					if(!isset($wireless_modes["11a"]))
4695
						$wireless_modes["11a"] = array();
4696 39c1349c Erik Fonnesbeck
					$wireless_mode = "11na";
4697 4066776d Scott Ullrich
				}
4698
				$wireless_modes["$wireless_mode"]["$c"] = $wireless_channel;
4699
			}
4700 d8c67d69 Scott Ullrich
			$c++;
4701
		}
4702
	}
4703 4066776d Scott Ullrich
	return($wireless_modes);
4704 d8c67d69 Scott Ullrich
}
4705
4706 f4094f0d Erik Fonnesbeck
/* return channel numbers, frequency, max txpower, and max regulation txpower */
4707
function get_wireless_channel_info($interface) {
4708
	$wireless_channels = array();
4709
4710 5357f386 Erik Fonnesbeck
	$cloned_interface = get_real_interface($interface);
4711 f4094f0d Erik Fonnesbeck
4712 5357f386 Erik Fonnesbeck
	if($cloned_interface && is_interface_wireless($cloned_interface)) {
4713 f4094f0d Erik Fonnesbeck
		$chan_list = "/sbin/ifconfig {$cloned_interface} list txpower";
4714
		$stack_list = "/usr/bin/awk -F\"Channel \" '{ gsub(/\\*/, \" \"); print \$2 \"\\\n\" \$3 }'";
4715
		$format_list = "/usr/bin/awk '{print \$1 \",\" \$3 \" \" \$4 \",\" \$5 \",\" \$7}'";
4716
4717
		$interface_channels = "";
4718
		exec("$chan_list | $stack_list | sort -u | $format_list 2>&1", $interface_channels);
4719
4720
		foreach ($interface_channels as $channel_line) {
4721
			$channel_line = explode(",", $channel_line);
4722
			if(!isset($wireless_channels[$channel_line[0]]))
4723
				$wireless_channels[$channel_line[0]] = $channel_line;
4724
		}
4725
	}
4726
	return($wireless_channels);
4727
}
4728
4729 52947718 Ermal Lu?i
/****f* interfaces/get_interface_mtu
4730
 * NAME
4731
 *   get_interface_mtu - Return the mtu of an interface
4732
 * RESULT
4733
 *   $tmp       - Returns the mtu of an interface
4734
 ******/
4735
function get_interface_mtu($interface) {
4736 1c3ddd9e Renato Botelho
	$mtu = pfSense_get_interface_addresses($interface);
4737
	return $mtu['mtu'];
4738 52947718 Ermal Lu?i
}
4739
4740 eba938e3 Scott Ullrich
function get_interface_mac($interface) {
4741 7d6076f3 Ermal Lu?i
4742 3f70e618 Ermal Lu?i
	$macinfo = pfSense_get_interface_addresses($interface);
4743
	return $macinfo["macaddr"];
4744 f2ba47f8 Ermal Lu?i
}
4745
4746
/****f* pfsense-utils/generate_random_mac_address
4747
 * NAME
4748
 *   generate_random_mac - generates a random mac address
4749
 * INPUTS
4750
 *   none
4751
 * RESULT
4752
 *   $mac - a random mac address
4753
 ******/
4754
function generate_random_mac_address() {
4755 1c3ddd9e Renato Botelho
	$mac = "02";
4756
	for($x=0; $x<5; $x++)
4757
		$mac .= ":" . dechex(rand(16, 255));
4758
	return $mac;
4759 53c82ef9 Scott Ullrich
}
4760 b7ec2b9e Scott Ullrich
4761 52947718 Ermal Lu?i
/****f* interfaces/is_jumbo_capable
4762
 * NAME
4763
 *   is_jumbo_capable - Test if interface is jumbo frame capable.  Useful for determining VLAN capability.
4764
 * INPUTS
4765
 *   $int             - string containing interface name
4766
 * RESULT
4767
 *   boolean          - true or false
4768
 ******/
4769 47ee6926 Ermal
function is_jumbo_capable($iface) {
4770
	$iface = trim($iface);
4771
	$capable = pfSense_get_interface_addresses($iface);
4772 a687f866 Namezero
4773 1c3ddd9e Renato Botelho
	if (isset($capable['caps']['vlanmtu']))
4774
		return true;
4775 a687f866 Namezero
4776 47ee6926 Ermal
	return false;
4777 52947718 Ermal Lu?i
}
4778
4779 70e46e62 Ermal
function interface_setup_pppoe_reset_file($pppif, $iface="") {
4780 55f3ca1d gnhb
	global $g;
4781 70e46e62 Ermal
4782 5c8e8a17 gnhb
	$cron_file = "{$g['varetc_path']}/pppoe_restart_{$pppif}";
4783 766bd6d0 gnhb
4784 5c8e8a17 gnhb
	if(!empty($iface) && !empty($pppif)){
4785 7673cdb5 Ermal
		$cron_cmd = <<<EOD
4786
#!/bin/sh
4787
/usr/local/sbin/pfSctl -c 'interface reload {$iface}'
4788 70e46e62 Ermal
/usr/bin/logger -t {$pppif} "PPPoE periodic reset executed on {$iface}"
4789 7673cdb5 Ermal
4790
EOD;
4791
4792 70e46e62 Ermal
		@file_put_contents($cron_file, $cron_cmd);
4793
		chmod($cron_file, 0755);
4794 55f3ca1d gnhb
		sigkillbypid("{$g['varrun_path']}/cron.pid", "HUP");
4795 a5d6f60b Ermal Lu?i
	} else
4796 766bd6d0 gnhb
		unlink_if_exists($cron_file);
4797 b7ec2b9e Scott Ullrich
}
4798
4799 56da23dc Ermal
function get_interface_default_mtu($type = "ethernet") {
4800
	switch ($type) {
4801
	case "gre":
4802
		return 1476;
4803
		break;
4804
	case "gif":
4805
		return 1280;
4806
		break;
4807
	case "tun":
4808
	case "vlan":
4809
	case "tap":
4810
	case "ethernet":
4811
	default:
4812
		return 1500;
4813
		break;
4814
	}
4815
4816
	/* Never reached */
4817
	return 1500;
4818
}
4819
4820 dd62256f Pierre POMES
function get_vip_descr($ipaddress) {
4821
	global $config;
4822
4823
	foreach ($config['virtualip']['vip'] as $vip) {
4824
		if ($vip['subnet'] == $ipaddress) {
4825
			return ($vip['descr']);
4826
		}
4827
	}
4828
	return "";
4829
}
4830
4831 d368b334 jim-p
function interfaces_staticarp_configure($if) {
4832
	global $config, $g;
4833
	if(isset($config['system']['developerspew'])) {
4834
		$mt = microtime();
4835
		echo "interfaces_staticarp_configure($if) being called $mt\n";
4836
	}
4837
4838
	$ifcfg = $config['interfaces'][$if];
4839
4840 873e49ec Renato Botelho
	if (empty($if) || empty($ifcfg['if']) || !isset($ifcfg['enable']))
4841 d368b334 jim-p
		return 0;
4842
4843
	/* Enable staticarp, if enabled */
4844
	if(isset($config['dhcpd'][$if]['staticarp'])) {
4845
		mwexec("/sbin/ifconfig " . escapeshellarg($ifcfg['if']) . " staticarp " );
4846
		mwexec("/usr/sbin/arp -d -i " . escapeshellarg($ifcfg['if']) . " -a > /dev/null 2>&1 ");
4847
		if (is_array($config['dhcpd'][$if]['staticmap'])) {
4848
4849
			foreach ($config['dhcpd'][$if]['staticmap'] as $arpent) {
4850
				mwexec("/usr/sbin/arp -s " . escapeshellarg($arpent['ipaddr']) . " " . escapeshellarg($arpent['mac']));
4851
4852
			}
4853
4854
		}
4855
	} else {
4856
		mwexec("/sbin/ifconfig " . escapeshellarg($ifcfg['if']) . " -staticarp " );
4857
		mwexec("/usr/sbin/arp -d -i " . escapeshellarg($ifcfg['if']) . " -a > /dev/null 2>&1 ");
4858 25c1ebd5 N0YB
		if (is_array($config['dhcpd'][$if]['staticmap'])) {
4859
			foreach ($config['dhcpd'][$if]['staticmap'] as $arpent) {
4860
				if (isset($arpent['arp_table_static_entry'])) {
4861
					mwexec("/usr/sbin/arp -s " . escapeshellarg($arpent['ipaddr']) . " " . escapeshellarg($arpent['mac']));
4862
				}
4863
			}
4864
		}
4865 d368b334 jim-p
	}
4866
4867
	return 0;
4868
}
4869
4870 bf001dec smos
function get_failover_interface($interface) {
4871
	global $config;
4872 e90c833a smos
	/* shortcut to get_real_interface if we find it in the config */
4873
	if(is_array($config['interfaces'][$interface])) {
4874
		$wanif = get_real_interface($interface);
4875
		return $wanif;
4876
	}
4877
4878 bf001dec smos
	/* compare against gateway groups */
4879
	$a_groups = return_gateway_groups_array();
4880
	if(is_array($a_groups[$interface])) {
4881
		/* we found a gateway group, fetch the interface or vip */
4882
		if($a_groups[$interface][0]['vip'] <> "")
4883
			$wanif = $a_groups[$interface][0]['vip'];
4884
		else
4885
			$wanif = $a_groups[$interface][0]['int'];
4886 be45aa79 Renato Botelho
4887 bf001dec smos
		return $wanif;
4888
	}
4889
	/* fall through to get_real_interface */
4890
	$wanif = get_real_interface($interface);
4891
	return $wanif;
4892
}
4893
4894 2ccac125 Renato Botelho
function remove_ifindex($ifname) {
4895
	return preg_replace("/[0-9]+$/", "", $ifname);
4896
}
4897
4898 6a7dd9bb Ermal
?>