32 || $_POST['tunnel-remote-net'] < 1) { $input_errors[] = gettext("The gif tunnel subnet must be an integer between 1 and 32."); } } if (is_ipaddrv6($_POST['tunnel-local-addr'])) { if (!is_ipaddrv6($_POST['tunnel-remote-addr'])) { $input_errors[] = gettext("The gif tunnel remote address must be IPv6 where tunnel local address is IPv6."); } if ($_POST['tunnel-remote-net'] > 128 || $_POST['tunnel-remote-net'] < 1) { $input_errors[] = gettext("The gif tunnel subnet must be an integer between 1 and 128."); } } $alias = strstr($_POST['if'], '|'); if ((is_ipaddrv4($alias) && !is_ipaddrv4($_POST['remote-addr'])) || (is_ipaddrv6($alias) && !is_ipaddrv6($_POST['remote-addr']))) { $input_errors[] = gettext("The alias IP address family has to match the family of the remote peer address."); } foreach ($a_gifs as $gif) { if (isset($id) && ($a_gifs[$id]) && ($a_gifs[$id] === $gif)) { continue; } /* FIXME: needs to perform proper subnet checks in the future */ if (($gif['if'] == $interface) && ($gif['tunnel-remote-addr'] == $_POST['tunnel-remote-addr'])) { $input_errors[] = sprintf(gettext("A gif with the network %s is already defined."), $gif['tunnel-remote-addr']); break; } } if (!$input_errors) { $gif = array(); list($gif['if'], $gif['ipaddr']) = explode("|", $_POST['if']); $gif['tunnel-local-addr'] = $_POST['tunnel-local-addr']; $gif['tunnel-remote-addr'] = $_POST['tunnel-remote-addr']; $gif['tunnel-remote-net'] = $_POST['tunnel-remote-net']; $gif['remote-addr'] = $_POST['remote-addr']; $gif['descr'] = $_POST['descr']; if (isset($_POST['link1'])) { $gif['link1'] = ''; } if (isset($_POST['link2'])) { $gif['link2'] = ''; } $gif['gifif'] = $_POST['gifif']; $gif['gifif'] = interface_gif_configure($gif); if ($gif['gifif'] == "" || !stristr($gif['gifif'], "gif")) { $input_errors[] = gettext("Error occurred creating interface, please retry."); } else { if (isset($id) && $a_gifs[$id]) { $a_gifs[$id] = $gif; } else { $a_gifs[] = $gif; } write_config(); $confif = convert_real_interface_to_friendly_interface_name($gif['gifif']); if ($confif != "") { interface_configure($confif); } header("Location: interfaces_gif.php"); exit; } } } function build_parent_list() { $parentlist = array(); $portlist = get_possible_listen_ips(); foreach ($portlist as $ifn => $ifinfo) { $parentlist[$ifn] = $ifinfo; } return($parentlist); } $pgtitle = array(gettext("Interfaces"), gettext("GIFs"), gettext("Edit")); $shortcut_section = "interfaces"; include("head.inc"); if ($input_errors) { print_input_errors($input_errors); } $form = new Form(); $section = new Form_Section('GIF Configuration'); $section->addInput(new Form_Select( 'if', 'Parent Interface', $pconfig['if'], build_parent_list() ))->setHelp('This interface serves as the local address to be used for the GIF tunnel.'); $section->addInput(new Form_IpAddress( 'remote-addr', 'GIF Remote Address', $pconfig['remote-addr'] ))->setHelp('Peer address where encapsulated gif packets will be sent.'); $section->addInput(new Form_IpAddress( 'tunnel-local-addr', 'GIF tunnel local address', $pconfig['tunnel-local-addr'] ))->setHelp('Local gif tunnel endpoint.'); $section->addInput(new Form_IpAddress( 'tunnel-remote-addr', 'GIF tunnel remote address', $pconfig['tunnel-remote-addr'] ))->setHelp('Remote GIF address endpoint.'); $section->addInput(new Form_Select( 'tunnel-remote-net', 'GIF tunnel subnet', $pconfig['tunnel-remote-net'], array_combine(range(128, 1, -1), range(128, 1, -1)) ))->setHelp('The subnet is used for determining the network that is tunnelled.'); $section->addInput(new Form_Checkbox( 'link1', 'ECN friendly behavior', 'ECN friendly behavior violates RFC2893. This should be used in mutual agreement with the peer. ', $pconfig['link1'] )); $section->addInput(new Form_Checkbox( 'link2', 'Outer Source Filtering', 'Disable automatic filtering of the outer GIF source which ensures a match with the configured remote peer. When disabled, martian and inbound filtering is not performed which allows asymmetric routing of the outer traffic.', $pconfig['link2'] )); $section->addInput(new Form_Input( 'descr', 'Description', 'text', $pconfig['descr'] ))->setHelp('A description may be entered here for administrative reference (not parsed).'); $section->addInput(new Form_Input( 'gifif', null, 'hidden', $pconfig['gifif'] )); if (isset($id) && $a_gifs[$id]) { $section->addInput(new Form_Input( 'id', null, 'hidden', $id )); } $form->add($section); print($form); include("foot.inc");