From c0fe5ceff4dabced60c84cbec0d1d28110c9636e Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Fri, 21 Jun 2019 12:13:17 +0200 Subject: [PATCH] IPv6 Router Advertisements, add advanced options, closes https://github.com/opnsense/core/issues/3366 --- src/etc/inc/plugins.inc.d/dhcpd.inc | 8 +++ src/www/services_router_advertisements.php | 73 ++++++++++++++++++++-- 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/src/etc/inc/plugins.inc.d/dhcpd.inc b/src/etc/inc/plugins.inc.d/dhcpd.inc index 4c739be09..1a41fb12e 100644 --- a/src/etc/inc/plugins.inc.d/dhcpd.inc +++ b/src/etc/inc/plugins.inc.d/dhcpd.inc @@ -264,6 +264,11 @@ function dhcpd_radvd_configure($verbose = false, $blacklist = array()) $radvdconf .= "\tAdvSendAdvert on;\n"; $radvdconf .= sprintf("\tMinRtrAdvInterval %s;\n", !empty($dhcpv6ifconf['ramininterval']) ? $dhcpv6ifconf['ramininterval'] : '200'); $radvdconf .= sprintf("\tMaxRtrAdvInterval %s;\n", !empty($dhcpv6ifconf['ramaxinterval']) ? $dhcpv6ifconf['ramaxinterval'] : '600'); + foreach (array('AdvDefaultLifetime', 'AdvValidLifetime', 'AdvPreferredLifetime', 'AdvRDNSSLifetime', 'AdvDNSSLLifetime') as $opt) { + if (!empty($dhcpv6ifconf[$opt])) { + $radvdconf .= sprintf("\t%s %s;\n", $opt, $dhcpv6ifconf[$opt]); + } + } $radvdconf .= sprintf("\tAdvLinkMTU %s;\n", !empty($mtu) ? $mtu : 1280); switch ($dhcpv6ifconf['rapriority']) { @@ -352,6 +357,9 @@ function dhcpd_radvd_configure($verbose = false, $blacklist = array()) if (!empty($dhcpv6ifconf['rainterface'])) { $radvdconf .= "\t\tRemoveRoute off;\n"; } + if (!empty($dhcpv6ifconf['AdvRouteLifetime'])) { + $radvdconf .= "\t\tAdvRouteLifetime {$dhcpv6ifconf['AdvRouteLifetime']};\n"; + } $radvdconf .= "\t};\n"; } } diff --git a/src/www/services_router_advertisements.php b/src/www/services_router_advertisements.php index bb633f89c..1c436f23e 100644 --- a/src/www/services_router_advertisements.php +++ b/src/www/services_router_advertisements.php @@ -34,6 +34,11 @@ require_once("services.inc"); require_once("interfaces.inc"); require_once("plugins.inc.d/dhcpd.inc"); +function val_int_in_range($value, $min, $max) { + return (((string)(int)$value) == $value) && $value >= $min && $value < $max; +} + +$advanced_options = array('AdvDefaultLifetime', 'AdvValidLifetime', 'AdvPreferredLifetime', 'AdvRDNSSLifetime', 'AdvDNSSLLifetime', 'AdvRouteLifetime'); if ($_SERVER['REQUEST_METHOD'] === 'GET') { if (!empty($_GET['if']) && !empty($config['interfaces'][$_GET['if']])) { $if = $_GET['if']; @@ -45,6 +50,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { $pconfig = array(); $config_copy_fieldsnames = array('ramode', 'rapriority', 'rainterface', 'ramininterval', 'ramaxinterval', 'radomainsearchlist'); + $config_copy_fieldsnames = array_merge($advanced_options, $config_copy_fieldsnames); foreach ($config_copy_fieldsnames as $fieldname) { if (isset($config['dhcpdv6'][$if][$fieldname])) { $pconfig[$fieldname] = $config['dhcpdv6'][$if][$fieldname]; @@ -107,13 +113,34 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { } } - if (!is_numericint($pconfig['ramaxinterval']) || $pconfig['ramaxinterval'] < 4 || $pconfig['ramaxinterval'] > 1800) { + if (!val_int_in_range($pconfig['ramaxinterval'], 4, 1800)) { $input_errors[] = sprintf(gettext('Maximum interval must be between %s and %s seconds.'), 4, 1800); - // chain this validation, we use the former value for calculation */ - } elseif (!is_numericint($pconfig['ramininterval']) || $pconfig['ramininterval'] < 3 || $pconfig['ramininterval'] > intval($pconfig['ramaxinterval'] * 0.75)) { - $input_errors[] = sprintf(gettext('Minimum interval must be between %s and %s seconds.'), 3, intval($pconfig['ramaxinterval'] * 0.75)); + } else { + if (!val_int_in_range($pconfig['ramininterval'], 3, intval($pconfig['ramaxinterval'] * 0.75))) { + $input_errors[] = sprintf(gettext('Minimum interval must be between %s and %s seconds.'), 3, intval($pconfig['ramaxinterval'] * 0.75)); + } + if (!empty($pconfig['AdvDefaultLifetime']) && !val_int_in_range($pconfig['AdvDefaultLifetime'], $pconfig['ramaxinterval'], 9000)) { + $input_errors[] = sprintf(gettext('AdvDefaultLifetime must be between %s and %s seconds.'), $pconfig['ramaxinterval'], 9000); + } + if (!empty($pconfig['AdvValidLifetime']) && !val_int_in_range($pconfig['AdvValidLifetime'], 1, 4294967295)) { + $input_errors[] = sprintf(gettext('AdvValidLifetime must be between %s and %s seconds.'), 1, 4294967295); + } + if (!empty($pconfig['AdvPreferredLifetime']) && !val_int_in_range($pconfig['AdvPreferredLifetime'], 1, 4294967295)) { + $input_errors[] = sprintf(gettext('AdvPreferredLifetime must be between %s and %s seconds.'), 1, 4294967295); + } + if (!empty($pconfig['AdvRDNSSLifetime']) && !val_int_in_range($pconfig['AdvRDNSSLifetime'], $pconfig['ramaxinterval'], $pconfig['ramaxinterval'] * 2)) { + $input_errors[] = sprintf(gettext('AdvRDNSSLifetime must be between %s and %s seconds.'), $pconfig['ramaxinterval'], $pconfig['ramaxinterval'] * 2); + } + if (!empty($pconfig['AdvDNSSLLifetime']) && !val_int_in_range($pconfig['AdvDNSSLLifetime'], $pconfig['ramaxinterval'], $pconfig['ramaxinterval'] * 2)) { + $input_errors[] = sprintf(gettext('AdvDNSSLLifetime must be between %s and %s seconds.'), $pconfig['ramaxinterval'], $pconfig['ramaxinterval'] * 2); + } + if (!empty($pconfig['AdvRouteLifetime']) && !val_int_in_range($pconfig['AdvRouteLifetime'], 1, 4294967295)) { + $input_errors[] = sprintf(gettext('AdvRouteLifetime must be between %s and %s seconds.'), 1, 4294967295); + } } + + if (count($input_errors) == 0) { config_read_array('dhcpdv6', $if); @@ -151,6 +178,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { unset($config['dhcpdv6'][$if]['raroutes']); } + foreach ($advanced_options as $advopt) { + if (isset($pconfig[$advopt]) && $pconfig[$advopt] != "") { + $config['dhcpdv6'][$if][$advopt] = $pconfig[$advopt]; + } elseif (isset($config['dhcpdv6'][$if][$advopt])) { + unset($config['dhcpdv6'][$if][$advopt]); + } + } + write_config(); dhcpd_radvd_configure(); $savemsg = get_std_save_message(); @@ -194,6 +229,14 @@ include("head.inc"); } $(".act-removerow").click(removeRow); $(".act-addrow").click(addRow); + if ($("#has_advanced").val() != "" ) { + $(".advanced_opt").show(); + } + $("#show_advanced_opt").click(function(e){ + e.preventDefault(); + $(".advanced_opt").show(); + $(this).closest('tr').hide(); + }); }); @@ -386,9 +429,31 @@ include("head.inc"); + + + + + " /> + + + + + + + + + +   + ">