From 26bfd491d750dd65f55f54f3d5269b26227e99b4 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 23 Jun 2019 20:42:37 +0200 Subject: [PATCH] net/frr: add route-maps to OSPF (#1360) --- net/frr/Makefile | 2 +- net/frr/pkg-descr | 4 ++ .../Quagga/Api/OspfsettingsController.php | 26 +++++++++ .../OPNsense/Quagga/OspfController.php | 1 + .../Quagga/forms/dialogEditOSPFRouteMaps.xml | 38 +++++++++++++ .../OPNsense/Quagga/forms/ospf.xml | 6 +++ .../mvc/app/models/OPNsense/Quagga/OSPF.xml | 53 +++++++++++++++++++ .../mvc/app/views/OPNsense/Quagga/ospf.volt | 46 ++++++++++++++-- .../templates/OPNsense/Quagga/ospfd.conf | 23 +++++++- 9 files changed, 193 insertions(+), 6 deletions(-) create mode 100644 net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPFRouteMaps.xml diff --git a/net/frr/Makefile b/net/frr/Makefile index 3d4884a41..36ce8f209 100644 --- a/net/frr/Makefile +++ b/net/frr/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= frr -PLUGIN_VERSION= 1.10 +PLUGIN_VERSION= 1.11 PLUGIN_COMMENT= The FRRouting Protocol Suite PLUGIN_DEPENDS= frr6 ruby PLUGIN_MAINTAINER= franz.fabian.94@gmail.com diff --git a/net/frr/pkg-descr b/net/frr/pkg-descr index 155bdbe8b..bacd5717d 100644 --- a/net/frr/pkg-descr +++ b/net/frr/pkg-descr @@ -11,6 +11,10 @@ switching and routing, Internet access routers, and Internet peering. Plugin Changelog ================ +1.11 + +* Add route-map support to redistribution in OSPF + 1.10 * XMLRPC sync support diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/OspfsettingsController.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/OspfsettingsController.php index 7cc0c346b..bc7136b39 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/OspfsettingsController.php +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/OspfsettingsController.php @@ -2,6 +2,7 @@ /* * Copyright (C) 2017 Fabian Franz + * Copyright (C) 2019 Michael Muenz * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,6 +48,10 @@ class OspfsettingsController extends ApiMutableModelControllerBase { return $this->searchBase('prefixlists.prefixlist', array("enabled", "name", "seqnumber", "action", "network" )); } + public function searchRoutemapAction() + { + return $this->searchBase('routemaps.routemap', array("enabled", "name", "action", "id", "match2", "set")); + } public function getNetworkAction($uuid = null) { $this->sessionClose(); @@ -62,6 +67,11 @@ class OspfsettingsController extends ApiMutableModelControllerBase $this->sessionClose(); return $this->getBase('prefixlist', 'prefixlists.prefixlist', $uuid); } + public function getRoutemapAction($uuid = null) + { + $this->sessionClose(); + return $this->getBase('routemap', 'routemaps.routemap', $uuid); + } public function addNetworkAction() { return $this->addBase('network', 'networks.network'); @@ -74,6 +84,10 @@ class OspfsettingsController extends ApiMutableModelControllerBase { 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); @@ -86,6 +100,10 @@ class OspfsettingsController extends ApiMutableModelControllerBase { 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); @@ -98,6 +116,10 @@ class OspfsettingsController extends ApiMutableModelControllerBase { 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); @@ -110,4 +132,8 @@ class OspfsettingsController extends ApiMutableModelControllerBase { 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/OspfController.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/OspfController.php index d445c3e6f..4e884c5ec 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/OspfController.php +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/OspfController.php @@ -35,6 +35,7 @@ class OspfController extends \OPNsense\Base\IndexController $this->view->formDialogEditNetwork = $this->getForm("dialogEditOSPFNetwork"); $this->view->formDialogEditInterface = $this->getForm("dialogEditOSPFInterface"); $this->view->formDialogEditPrefixLists = $this->getForm("dialogEditOSPFPrefixLists"); + $this->view->formDialogEditRouteMaps = $this->getForm("dialogEditOSPFRouteMaps"); $this->view->pick('OPNsense/Quagga/ospf'); } } diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPFRouteMaps.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPFRouteMaps.xml new file mode 100644 index 000000000..8d82c8ec4 --- /dev/null +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditOSPFRouteMaps.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/ospf.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml index 665962e24..825d5b638 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml @@ -26,6 +26,12 @@ Type or select a route source. + + ospf.redistributemap + + dropdown + Route Map to set for Redistribution. + ospf.originate diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml index f2e45072c..187742e4b 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml @@ -47,6 +47,19 @@ Statically configured routes + + + + + Related Route-Map item not found + N + N + @@ -223,5 +236,45 @@ + + + + 1 + Y + + + + Y + + + Y + + Permit + Deny + + + + + Y + 10 + 99 + + + + + + Related item not found + N + N + + + N + + + diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf.volt index 424ca1e11..9668a241f 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/ospf.volt @@ -33,6 +33,7 @@ POSSIBILITY OF SUCH DAMAGE.
  • {{ lang._('Networks') }}
  • {{ lang._('Interfaces') }}
  • {{ lang._('Prefix Lists') }}
  • +
  • {{ lang._('Route Maps') }}
  • @@ -118,10 +119,36 @@ POSSIBILITY OF SUCH DAMAGE. - - - - + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + @@ -195,9 +222,20 @@ $( document ).ready(function() { 'options':{selection:false, multiSelect:false} } ); + $("#grid-routemaps").UIBootgrid( + { 'search':'/api/quagga/ospfsettings/searchRoutemap', + 'get':'/api/quagga/ospfsettings/getRoutemap/', + 'set':'/api/quagga/ospfsettings/setRoutemap/', + 'add':'/api/quagga/ospfsettings/addRoutemap/', + 'del':'/api/quagga/ospfsettings/delRoutemap/', + 'toggle':'/api/quagga/ospfsettings/toggleRoutemap/', + 'options':{selection:false, multiSelect:false} + } + ); }); {{ 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/ospfd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospfd.conf index e6e765ddb..da64ff990 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospfd.conf +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospfd.conf @@ -45,7 +45,9 @@ router ospf {% endif %} {% if helpers.exists('OPNsense.quagga.ospf.redistribute') and OPNsense.quagga.ospf.redistribute != '' %} {% for line in OPNsense.quagga.ospf.redistribute.split(',') %} - redistribute {{ line }} +{% set rmap = helpers.getUUID(OPNsense.quagga.ospf.redistributemap) %} + redistribute {{ line }} {% if helpers.exists('OPNsense.quagga.ospf.redistributemap') and OPNsense.quagga.ospf.redistributemap != '' %}route-map {{ rmap.name }} +{% endif %} {% endfor %}{% endif %} {% if helpers.exists('OPNsense.quagga.ospf.passiveinterfaces') and OPNsense.quagga.ospf.passiveinterfaces != '' %} {% for line in OPNsense.quagga.ospf.passiveinterfaces.split(',') %} @@ -90,6 +92,25 @@ ip prefix-list {{ prefixlist.name }} seq {{ prefixlist.seqnumber }} {{ prefixlis {% endfor %} {% endif %} ! +{% if helpers.exists('OPNsense.quagga.ospf.routemaps.routemap') %} +{% for routemap in helpers.sortDictList(OPNsense.quagga.ospf.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 %}
    {{ lang._('Enabled') }}{{ lang._('Name') }}{{ lang._('Secquence Number') }}{{ lang._('Action') }}{{ lang._('Network') }}{{ lang._('ID') }}{{ lang._('Commands') }}
    + +