diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/Ospf6settingsController.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/Ospf6settingsController.php index 0046b5df7..5019e029b 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/Ospf6settingsController.php +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/Ospf6settingsController.php @@ -1,7 +1,7 @@ * Copyright (C) 2017 Fabian Franz * Copyright (C) 2017 Michael Muenz @@ -40,29 +40,101 @@ class Ospf6settingsController extends ApiMutableModelControllerBase { protected static $internalModelName = 'ospf6'; protected static $internalModelClass = '\OPNsense\Quagga\OSPF6'; + + public function searchNetworkAction() + { + return $this->searchBase('networks.network'); + } public function searchInterfaceAction() { - return $this->searchBase('interfaces.interface', array("enabled", "interfacename", "area", "networktype")); + return $this->searchBase('interfaces.interface'); + } + public function searchPrefixlistAction() + { + return $this->searchBase('prefixlists.prefixlist'); + } + public function searchRoutemapAction() + { + return $this->searchBase('routemaps.routemap'); + } + public function getNetworkAction($uuid = null) + { + return $this->getBase('network', 'networks.network', $uuid); } public function getInterfaceAction($uuid = null) { - $this->sessionClose(); return $this->getBase('interface', 'interfaces.interface', $uuid); } + public function getPrefixlistAction($uuid = null) + { + return $this->getBase('prefixlist', 'prefixlists.prefixlist', $uuid); + } + public function getRoutemapAction($uuid = null) + { + return $this->getBase('routemap', 'routemaps.routemap', $uuid); + } + public function addNetworkAction() + { + return $this->addBase('network', 'networks.network'); + } public function addInterfaceAction() { return $this->addBase('interface', 'interfaces.interface'); } + public function addPrefixlistAction() + { + return $this->addBase('prefixlist', 'prefixlists.prefixlist'); + } + public function addRoutemapAction() + { + return $this->addBase('routemap', 'routemaps.routemap'); + } + public function delNetworkAction($uuid) + { + return $this->delBase('networks.network', $uuid); + } public function delInterfaceAction($uuid) { return $this->delBase('interfaces.interface', $uuid); } + public function delPrefixlistAction($uuid) + { + return $this->delBase('prefixlists.prefixlist', $uuid); + } + public function delRoutemapAction($uuid) + { + return $this->delBase('routemaps.routemap', $uuid); + } + public function setNetworkAction($uuid) + { + return $this->setBase('network', 'networks.network', $uuid); + } public function setInterfaceAction($uuid) { return $this->setBase('interface', 'interfaces.interface', $uuid); } + public function setPrefixlistAction($uuid) + { + return $this->setBase('prefixlist', 'prefixlists.prefixlist', $uuid); + } + public function setRoutemapAction($uuid) + { + return $this->setBase('routemap', 'routemaps.routemap', $uuid); + } + public function toggleNetworkAction($uuid) + { + return $this->toggleBase('networks.network', $uuid); + } public function toggleInterfaceAction($uuid) { return $this->toggleBase('interfaces.interface', $uuid); } + public function togglePrefixlistAction($uuid) + { + return $this->toggleBase('prefixlists.prefixlist', $uuid); + } + public function toggleRoutemapAction($uuid) + { + return $this->toggleBase('routemaps.routemap', $uuid); + } } diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Ospf6Controller.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Ospf6Controller.php index 60fa68241..f4863bedb 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Ospf6Controller.php +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Ospf6Controller.php @@ -30,7 +30,10 @@ class Ospf6Controller extends \OPNsense\Base\IndexController public function indexAction() { $this->view->ospf6Form = $this->getForm("ospf6"); + $this->view->formDialogEditNetwork = $this->getForm("dialogEditOSPF6Network"); $this->view->formDialogEditInterface = $this->getForm("dialogEditOSPF6Interface"); + $this->view->formDialogEditPrefixLists = $this->getForm("dialogEditOSPF6PrefixLists"); + $this->view->formDialogEditRouteMaps = $this->getForm("dialogEditOSPF6RouteMaps"); $this->view->pick('OPNsense/Quagga/ospf6'); } } diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6Interface.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6Interface.xml index ec7300f00..610edd3b2 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6Interface.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6Interface.xml @@ -30,6 +30,7 @@ interface.cost_demoted text + 65535 interface.carp_depend_on diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6Network.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6Network.xml new file mode 100644 index 000000000..c047e03f0 --- /dev/null +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6Network.xml @@ -0,0 +1,41 @@ +
+ + network.enabled + + checkbox + + + network.ipaddr + + text + + + network.netmask + + text + + + network.area + + text + Area in wildcard mask style like 0.0.0.0 and no decimal 0. Only use Area in Interface tab or in Network tab once. + + + network.arearange + + text + Here you can summarize a network for this area like fe80:1234::0/64 + + + network.linkedPrefixlistIn + + dropdown + Prefix-List for inbound direction + + + network.linkedPrefixlistOut + + dropdown + Prefix-List for outbound direction + +
diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6PrefixLists.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6PrefixLists.xml new file mode 100644 index 000000000..a1f0fce3a --- /dev/null +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6PrefixLists.xml @@ -0,0 +1,32 @@ +
+ + prefixlist.enabled + + checkbox + Enable / Disable + + + prefixlist.name + + text + The name of your Prefix-List, please choose one near to the result you want to achieve. + + + prefixlist.seqnumber + + text + The ACL sequence number (10-99) + + + prefixlist.action + + select_multiple + Set permit for match or deny to negate the rule. + + + prefixlist.network + + text + The network pattern you want to match. It's not validated so please be careful! + +
diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6RouteMaps.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6RouteMaps.xml new file mode 100644 index 000000000..8d82c8ec4 --- /dev/null +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPF6RouteMaps.xml @@ -0,0 +1,38 @@ +
+ + routemap.enabled + + checkbox + + + routemap.name + + text + Route-map name to match and set your patterns, it will be enabled via redistribution. + + + routemap.action + + select_multiple + Set permit for match or deny to negate the rule. + + + routemap.id + + text + Route-map ID between 10 and 99. Be aware that the sorting will be done under the hood, so when you add an entry between it get's to the right position + + + routemap.match2 + + select_multiple + + true + + + routemap.set + + text + Free text field for your set, please be careful! You can set e.g. "local-preference 300" or "community 1:1" (http://docs.frrouting.org/en/latest/routemap.html#route-map-set-command) + +
diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf6.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf6.xml index 598f8eda8..c7295a702 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf6.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf6.xml @@ -22,6 +22,12 @@ Type or select a route source.
+ + ospf6.redistributemap + + dropdown + Route Map to set for Redistribution. + ospf6.routerid @@ -33,7 +39,6 @@ checkbox This will send the information that we have a default gateway. - ospf6.originatealways diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF6.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF6.xml index 177e57155..5bd6613ac 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF6.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF6.xml @@ -12,17 +12,25 @@ Y - N Y - Connected routes (directly attached subnet or host) Kernel routes (not installed via the zebra RIB) Statically configured routes + + + + + Related Route-Map item not found + - N /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ @@ -34,11 +42,59 @@ Y - N 0 16777214 Must be a number between 0 and 16777214. + + + + 1 + Y + + + + Y + N + N + ipv6 + + + 64 + 0 + Y + 128 + Network mask must be between 0 and 128. + + + Y + /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ + + + + + + + Related Prefix-List item not found + + + + + + Related Prefix-List item not found + + + @@ -46,16 +102,12 @@ Y - N - N - Y /^(?!0).*$/ - Y /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ @@ -64,66 +116,45 @@ Y - 0 - N 4294967295 Cost must be between 0 and 4294967295. - 65535 1 - N 65535 Cost must be between 1 and 65535. carp - N - 0 - N 4294967295 Hello interval must be between 0 and 4294967295. - 0 - N 4294967295 Dead interval must be between 0 and 4294967295. - 0 - N 4294967295 Retransmit interval must be between 0 and 4294967295. - 0 - N 4294967295 Transmit delay must be between 0 and 4294967295. - 0 - N 4294967295 Priority must be between 0 and 4294967295. - - 0 - N - + - N - N - Broadcast multi-access network Point-to-point network @@ -131,5 +162,67 @@ + + + + 1 + Y + + + Y + /^([0-9a-zA-Z\._\-]){1,64}$/u + The name should only contain alphanumeric characters, dashes, underscores or a dot. + + + Y + 10 + 99 + + + Y + + Permit + Deny + + + + Y + + + + + + + 1 + Y + + + Y + + + Y + + Permit + Deny + + + + Y + 10 + 99 + + + + + + Related item not found + + + + diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf6.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf6.volt index 6052ccd59..8b9ff5297 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf6.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf6.volt @@ -1,8 +1,7 @@ {# - -OPNsense® is Copyright © 2014 – 2023 by Deciso B.V. -This file is Copyright © 2017 by Fabian Franz -This file is Copyright © 2017 by Michael Muenz +Copyright (c) 2014 – 2024 by Deciso B.V. +Copyright (c) 2017 by Fabian Franz +Copyright (c) Michael Muenz All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -27,22 +26,130 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #} + + + + + + +
+
+
+ {{ partial("layout_partials/base_form",['fields':ospf6Form,'id':'frm_ospf6_settings'])}}
+
+ + +
+ + + + + + + + + + + + + + + + + + + + +
{{ lang._('Enabled') }}{{ lang._('Network Address') }}{{ lang._('Mask') }}{{ lang._('Area') }}{{ lang._('ID') }}{{ lang._('ID') }}{{ lang._('Commands') }}
+ +
+
@@ -64,66 +171,85 @@ POSSIBILITY OF SUCH DAMAGE. -
+ +
+ + + + + + + + + + + + + + + + + + + + +
{{ lang._('Enabled') }}{{ lang._('Name') }}{{ lang._('Sequence Number') }}{{ lang._('Action') }}{{ lang._('Network') }}{{ lang._('ID') }}{{ lang._('Commands') }}
+ +
- +{{ partial("layout_partials/base_dialog",['fields':formDialogEditNetwork,'id':'DialogEditNetwork','label':lang._('Edit Network')])}} {{ partial("layout_partials/base_dialog",['fields':formDialogEditInterface,'id':'DialogEditInterface','label':lang._('Edit Interface')])}} +{{ partial("layout_partials/base_dialog",['fields':formDialogEditPrefixLists,'id':'DialogEditPrefixLists','label':lang._('Edit Prefix Lists')])}} +{{ partial("layout_partials/base_dialog",['fields':formDialogEditRouteMaps,'id':'DialogEditRouteMaps','label':lang._('Edit Route Maps')])}} diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospf6d.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospf6d.conf index b7e0a52e3..cba31d788 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospf6d.conf +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospf6d.conf @@ -2,13 +2,13 @@ ipv6 ospf6 {{ directive }} {{ modelname }} {% endif %}{%- endmacro %} {% from 'OPNsense/Macros/interface.macro' import physical_interface %} -{% if helpers.exists('OPNsense.quagga.ospf6.enabled') and OPNsense.quagga.ospf6.enabled == '1' %} +{% if not helpers.empty('OPNsense.quagga.ospf6.enabled') %} ! ! Zebra configuration saved from vty ! 2017/03/03 20:21:04 ! {% if helpers.exists('OPNsense.quagga.general') %} -{% if helpers.exists('OPNsense.quagga.general.enablesyslog') and OPNsense.quagga.general.enablesyslog == '1' %} +{% if not helpers.empty('OPNsense.quagga.general.enablesyslog') %} log syslog {{ OPNsense.quagga.general.sysloglevel }} {% endif %} {% if helpers.exists('OPNsense.quagga.general.profile') %} @@ -21,9 +21,8 @@ agentx ! ! ! -{% if helpers.exists('OPNsense.quagga.ospf6.interfaces.interface') %} -{% for interface in helpers.toList('OPNsense.quagga.ospf6.interfaces.interface') %} -{% if interface.enabled == '1' %} +{% for interface in helpers.toList('OPNsense.quagga.ospf6.interfaces.interface') %} +{% if interface.enabled == '1' %} interface {{ physical_interface(interface.interfacename) }} {% if interface.bfd|default('') == '1' %} ipv6 ospf6 bfd @@ -40,22 +39,48 @@ interface {{ physical_interface(interface.interfacename) }} }}{{ cline("priority",interface.priority) }}{{ cline("retransmit-interval",interface.retransmitinterval) }}! -{% endif %} -{% endfor %} -{% endif %} +{% endif %} +{% endfor %} ! router ospf6 -{% if helpers.exists('OPNsense.quagga.ospf6.routerid') and OPNsense.quagga.ospf6.routerid != '' %} +{% if not helpers.empty('OPNsense.quagga.ospf6.routerid') %} ospf6 router-id {{ OPNsense.quagga.ospf6.routerid }} {% endif %} {% if not helpers.empty('OPNsense.quagga.ospf6.originate') %} default-information originate{% if not helpers.empty('OPNsense.quagga.ospf6.originatealways') %} always {% endif %}{% if OPNsense.quagga.ospf6.originatemetric|default('') != '' %} metric {{ OPNsense.quagga.ospf6.originatemetric }}{% endif %} {% endif %} -{% if helpers.exists('OPNsense.quagga.ospf6.redistribute') and OPNsense.quagga.ospf6.redistribute != '' %} +{% if not helpers.empty('OPNsense.quagga.ospf6.redistribute')%} {% for line in OPNsense.quagga.ospf6.redistribute.split(',') %} +{% if not helpers.empty('OPNsense.quagga.ospf6.redistributemap') %}{% set line = line + " route-map " + helpers.getUUID(OPNsense.quagga.ospf6.redistributemap).name %}{% endif %} redistribute {{ line }} {% endfor %}{% endif %} +{% if helpers.exists('OPNsense.quagga.ospf6.networks.network') %} +{% for network in helpers.toList('OPNsense.quagga.ospf6.networks.network') %} +{% if network.enabled == '1' %} + network {{ network.ipaddr }}/{{ network.netmask }} area {{ network.area }} +{% endif %} +{% if network.arearange|default("") != "" %} + area {{ network.area }} range {{ network.arearange }} +{% endif %} +{% if network.linkedPrefixlistIn|default("") != "" %} +{% for prefixlist in network.linkedPrefixlistIn.split(",") %} +{% set prefixlist2_data = helpers.getUUID(prefixlist) %} +{% if prefixlist2_data != {} and prefixlist2_data.enabled == '1' %} + area {{ network.area }} filter-list prefix {{ prefixlist2_data.name }} in +{% endif %} +{% endfor %} +{% endif %} +{% if network.linkedPrefixlistOut|default("") != "" %} +{% for prefixlist in network.linkedPrefixlistOut.split(",") %} +{% set prefixlist_data = helpers.getUUID(prefixlist) %} +{% if prefixlist_data != {} and prefixlist_data.enabled == '1' %} + area {{ network.area }} filter-list prefix {{ prefixlist_data.name }} out +{% endif %} +{% endfor %} +{% endif %} +{% endfor %} +{% endif %} {% if helpers.exists('OPNsense.quagga.ospf6.interfaces.interface') %} {% for interface in helpers.toList('OPNsense.quagga.ospf6.interfaces.interface') %} {% if interface.enabled == '1' %} @@ -64,6 +89,33 @@ router ospf6 {% endfor %} {% endif %} ! +{% if helpers.exists('OPNsense.quagga.ospf6.prefixlists.prefixlist') %} +{% for prefixlist in helpers.sortDictList(OPNsense.quagga.ospf6.prefixlists.prefixlist, 'name', 'seqnumber' ) %} +{% if prefixlist.enabled == '1' %} +ip prefix-list {{ prefixlist.name }} seq {{ prefixlist.seqnumber }} {{ prefixlist.action }} {{ prefixlist.network }} +{% endif %} +{% endfor %} +{% endif %} +! +{% if helpers.exists('OPNsense.quagga.ospf6.routemaps.routemap') %} +{% for routemap in helpers.sortDictList(OPNsense.quagga.ospf6.routemaps.routemap, 'name', 'id' ) %} +{% if routemap.enabled == '1' %} +route-map {{ routemap.name }} {{ routemap.action }} {{ routemap.id }} +{% if routemap.match2|default("") != "" %} +{% for prefixlist in routemap.match2.split(",") %} +{% set prefixlist_data = helpers.getUUID(prefixlist) %} +{% if 'match2' in routemap and routemap.match2 != '' %} + match ip address prefix-list {{ prefixlist_data.name }} +{% endif %} +{% endfor %} +{% endif %} +{% if routemap.set|default("") != "" %} + set {{ routemap.set }} +{% endif %} +{% endif %} +{% endfor %} +{% endif %} +! line vty ! {% endif %}