summaryrefslogtreecommitdiffstats
path: root/ripd/rip_northbound.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* ripd: use MTYPE_STATICDavid Lamparter2019-06-211-0/+1
| | | | Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
* ripd, ripngd: fix OpenBSD compiler warningDavid Lamparter2019-06-131-2/+2
| | | | | | | The fact that the OpenBSD RB_TREE stuff results in a compiler warning on OpenBSD - and OpenBSD alone - is pretty funny, I have to say... Signed-off-by: David Lamparter <equinox@diac24.net>
* *: fix northbound initializer warning on OpenBSDDavid Lamparter2019-06-131-94/+190
| | | | | | | | For some reason, the compiler on OpenBSD on our CI boxes doesn't like struct initializers with ".a.b = x, .a.c = y", generating a warning about overwritten initializers... Signed-off-by: David Lamparter <equinox@diac24.net>
* lib: rework management of user pointers in the northbound layerRenato Westphal2019-04-181-54/+54
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Introduce a hash table to keep track of user pointers associated to configuration entries. The previous strategy was to embed the user pointers inside libyang data nodes, but this solution incurred a substantial performance overhead. The user pointers embedded in candidate configurations could be lost while the configuration was being edited, so they needed to be regenerated before the candidate could be committed. This was done by the nb_candidate_restore_priv_pointers() function, which was extremely expensive for large configurations. The new hash table solves this performance problem. The yang_dnode_[gs]et_entry() functions were renamed and moved from yang.[ch] to northbound.[ch], which is a more appropriate place for them. This patch also introduces the nb_running_unset_entry() function, the counterpart of nb_running_set_entry() (unsetting user pointers was done automatically before, now it needs to be done manually). As a consequence of these changes, we shouldn't need support for libyang private pointers anymore (-DENABLE_LYD_PRIV=ON). But it's probably a good idea to keep requiring this feature as we might need it in the future for other things (e.g. disable configuration settings without removing them). Fixes #4136. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* Merge pull request #3548 from opensourcerouting/rip-vrfDonald Sharp2019-04-051-164/+348
|\ | | | | rip(ng)d: add VRF support
| * lib, ripd, ripngd: rename remaining delete northbound callbacksRenato Westphal2019-03-291-47/+47
| | | | | | | | | | | | | | | | | | PR #3622 renamed the "delete" northbound callback to "destroy" in order to make the libfrr headers compatible with C++. This commit renames a few functions that still use "delete" instead of "destroy" in their names. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * Merge remote-tracking branch 'frr/master' into rip-vrfRenato Westphal2019-03-291-16/+16
| |\ | | | | | | | | | | | | | | | | | | Merge commit to solve a bunch of conflicts with other PRs that were merged in the previous weeks. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * | ripd, ripngd: change how we keep track of redistribution configurationRenato Westphal2019-01-181-13/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ripd and ripngd were leveraging the zclient code to keep track of the redistribute configuration, which is what most daemons do. The problem, however, is that the zclient code uses VRF IDs to identify VRFs, and VRF IDs are unknown until a VRF is enabled (information received from zebra). This means we can't configure a redistribute command on a RIP instance when the corresponding VRF is disabled (doing so leads to a null-dereference crash right now in both ripd and ripngd). To fix this, change the rip/ripng data structures so that they keep track of the full redistribute configuration and not only the route-map and metric associated to each command. This is similar to what bgpd and ospfd are doing to solve the same problem. In the future the zclient code and all daemons need to be refactored to consolidate the handling of redistribute configuration in a single place to reduce code duplication. One of the most important changes to do is to use VRF names and not VRF IDs to identify VRFs. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * | ripd: add vrf input parameter to the "clear-rip-route" RPCRenato Westphal2019-01-181-9/+32
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Description of the new parameter (adapted from the ietf-rip module): "VRF name identifying a specific RIP instance. This leaf is optional for the rpc. If it is specified, the rpc will clear all routes in the specified RIP instance; if it is not specified, the rpc will clear all routes in all RIP instances."; Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * | ripd: make YANG operational-data VRF aware tooRenato Westphal2019-01-181-84/+106
| | | | | | | | | | | | | | | | | | | | | Move the "state" container into the "instance" list and adapt the code accordingly. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * | ripd: add VRF supportRenato Westphal2019-01-181-4/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Turn the "instance" YANG presence-container into a YANG list keyed by the new "vrf" leaf. This is a backward incompatible change but this should be ok for now. * RIP VRF instances can be configured even when the corresponding VRF doesn't exist. And a RIP VRF instance isn't deleted when the corresponding VRF is deleted. For this to work, implement the rip_instance_enable() and rip_instance_disable() functions that are called to enable/disable RIP routing instances when necessary. A RIP routing instance can be enabled only when the corresponding VRF is enabled (this information comes from zebra and depends on the underlying VRF backend). Routing instances are stored in the new rip_instances rb-tree (global variable). * Add a vrf pointer to the rip structure instead of storing vrf_id only. This is much more convenient than using vrf_lookup_by_id() every time we need to get the vrf pointer from the VRF ID. The rip->vrf pointer is updated whenever the VRF enable/disable hooks are called. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * | ripd: remove the rip global variableRenato Westphal2019-01-181-26/+120
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is the last step to make ripd ready for multi-instance support. Remove the rip global variable and add a "rip" parameter to all functions that need to know the RIP instance they are working on. On some functions, retrieve the RIP instance from the interface variable when it exists (this assumes interfaces can pertain to one RIP instance at most, which is ok for VRF support). In preparation for the next commits (VRF support), add a "vrd_id" member to the rip structure, and use rip->vrf_id instead of VRF_DEFAULT wherever possible. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * | ripd: move "rip_distance_table" to the rip structureRenato Westphal2019-01-181-4/+1
| | | | | | | | | | | | Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * | ripd: move "peer_list" to the rip structureRenato Westphal2019-01-181-2/+8
| | | | | | | | | | | | Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * | ripd, ripngd: fix null pointer dereference in YANG RPCsRenato Westphal2019-01-181-0/+3
| | | | | | | | | | | | | | | | | | These RPCs should do nothing when RIP/RIPng aren't configured. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* | | *: remove null check before XFREEQuentin Young2019-02-261-4/+2
| |/ |/| | | | | Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
* | libs, daemons: changes to permit c++ compilationMark Stapp2019-02-111-16/+16
|/ | | | | | | | | | | Some misc changes to resolve some c++ compilation errors. The goal is only to permit an external module - a plugin, for example - to see frr headers, not to support or encourage contributions in c++. The changes include: avoiding use of keywords like 'new', 'delete'; cleaning up implicit type-casting from 'void *' in several places. Signed-off-by: Mark Stapp <mjs@voltanet.io>
* ripd: fix minor issues from the northbound conversionRenato Westphal2018-12-031-4/+8
| | | | | | | | | | | | | | * Always apply the mask of IPv4 prefixes (user data) in the northbound callbacks, we shouldn't assume the northbound plugins will do that for us. * Fix a bug in the "distance" command introduced by commit a6233bfcb3b. * Remove unnecessary check in the ripd_instance_redistribute_route_map_delete() function and reset the route-map's map pointer for safety as well. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* Merge pull request #3342 from opensourcerouting/nb-operational-dataRuss White2018-11-291-23/+36
|\ | | | | Northbound: improved support for YANG-modeled operational data
| * ripd: fix operational-data northbound callbacksRenato Westphal2018-11-261-12/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The get_next() and lookup_entry() callbacks should return structures of the same type. This is because the returned list entry is passed to the get_elem() callbacks, which must assume the 'list_entry' parameter is of a single type. This wasn't a problem before because we'd always call lookup_entry() after get_next(), but it was realized this isn't necessary when iterating sequentially over a YANG list. Now we need to ensure that the get_elem() callbacks work with list entries returned by either get_next() or lookup_entry(). Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * lib, tests: major rework in the operational-data callbacksRenato Westphal2018-11-261-5/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The northbound infrastructure for operational data was subpar compared to the infrastructure for configuration data. This commit addresses most of the existing problems, making it possible to write operational-data callbacks for more complex YANG models. Summary of the changes: * Add support for nested YANG lists. * Add support for leaf-lists. * Add support for leafs of type "empty". * Introduce the "show yang operational-data XPATH" command, and write an unit test for it. The main purpose of this command is to make it easier to test the operational-data northbound callbacks. * Introduce the nb_oper_data_iterate() function, that can be used to iterate over operational data. Make the CLI and sysrepo use this function. * Since ConfD has a very peculiar API, it can't reuse the nb_oper_data_iterate() like the other northbound clients. In this case, adapt the existing ConfD callbacks to support the new features (and make some performance improvements in the process). Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| * lib: don't fetch schema information when creating yang_data structuresRenato Westphal2018-11-261-6/+5
| | | | | | | | | | | | | | | | | | Prefetching the schema node when creating yang_data structures is expensive, and in most cases we don't need that information. In that case, fetch the schema information only when necessary to improve performance when fetching operational data. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* | lib: make yang_dnode_get_entry() more flexibleRenato Westphal2018-11-261-18/+18
|/ | | | | | | | | | | | Add the "abort_if_not_found" parameter to the yang_dnode_get_entry() function instead of always aborting when an user pointer is not found. This will make it possible, for example, to use this function during the validation phase of a configuration transaction. Callers will only need to check if the function returned NULL or not, since new configuration objects (if any) won't be created until the NB_EV_APPLY phase of the transaction. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: implement two YANG notificationsRenato Westphal2018-10-271-0/+38
| | | | | | | Implement the 'authentication-failure' and 'authentication-type-failure' notifications defined in the frr-ripd YANG module. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: implement the 'clear-rip-route' YANG RPCRenato Westphal2018-10-271-1/+34
| | | | | | | | | | | | | This command deletes all received routes from the RIP routing table. It should be used with caution as it can create black holes in the network until RIP reconverges. Very useful to make automated testing (e.g. ANVL) more predictable, since the internal state of ripd can be cleared after each test. Implement the command using a YANG RPC so that it can be executed by other northbound clients in addition to the CLI. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: implement northbound callbacks to fetch route informationRenato Westphal2018-10-271-13/+59
| | | | | | | | | Support for fetching operational data is experimental at this point. Locks must be introduced to ensure the rip->table routing table won't be modified while we're iterating asynchronously over it (or iterating from a separate pthread). Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: implement northbound callbacks to fetch neighbor informationRenato Westphal2018-10-271-12/+30
| | | | | | | | | Support for fetching operational data is experimental at this point. Locks must be introduced to ensure the peer_list global variable won't be modified while we're iterating asynchronously over it (or iterating from a separate pthread). Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit all RIP interface commands to the new northbound modelRenato Westphal2018-10-271-11/+127
| | | | Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'version' command to the new northbound modelRenato Westphal2018-10-271-2/+14
| | | | | | Trivial conversion. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'timer basic' command to the new northbound modelRenato Westphal2018-10-271-3/+29
| | | | | | | | | | | Trivial conversion. Use the northbound 'apply_finish()' callback so we'll call rip_event() only once even if we change the three RIP timers at the same time. Convert the timers to uint32_t to match their representation in the YANG model. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'route' command to the new northbound modelRenato Westphal2018-10-271-2/+23
| | | | | | | | Trivial conversion. Remove the rip->route routing table and associated code because this variable was used only to show the running configuration. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'redistribute' commands to the new northbound modelRenato Westphal2018-10-271-6/+69
| | | | | | | | | | | | | | | | Trivial conversion. As usual, combine multiple DEFUNs into a single DEFPY for simplicity. As a bonus of the northbound conversion, this commit fixes the redistribution of certain protocols into ripd. The 'redist_type' array used by the "redistribute" commands was terribly outdated, which was preventing the CLI to parse correctly certain protocols like isis and babel. Remove the route_map hooks installed by rip_route_map_init() since they were redundant (rip_init() already takes care of that). Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'passive-interface' command to the new northbound modelRenato Westphal2018-10-271-9/+41
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In ripd, the "passive-interface default" command has the following behavior: * All interfaces are converted to the passive mode; * The "passive-interface IFNAME" command becomes a no-operation and "passive-interface IFNAME" statements are removed from the running configuration. * The "no passive-interface IFNAME" can be used to remove interfaces from the passive mode. This command was modeled using the following YANG data nodes in the frr-ripd module: leaf passive-default { type boolean; default "false"; description "Control whether interfaces are in the passive mode by default or not."; } leaf-list passive-interface { when "../passive-default = 'false'"; type string { length "1..16"; } description "A list of interfaces where the sending of RIP packets is disabled."; } leaf-list non-passive-interface { when "../passive-default = 'true'"; type string { length "1..16"; } description "A list of interfaces where the sending of RIP packets is enabled."; } The 'when' statements guarantee that the list of passive interfaces is cleared when the "passive-interface default" command is entered (likewise, they guarantee that the list of non-passive interfaces is cleared when the "passive-interface default" command is removed). This matches exactly the behavior we want to model. Finally, move the 'passive_default' global variable into the 'rip' structure where it belongs. This fixed the bug where the "passive-interface default" command was being retained after a "no router rip" + "router rip". Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'offset-list' command to the new northbound modelRenato Westphal2018-10-271-4/+57
| | | | | | | | | | | | | | Remove the rip_offset_list_set() and rip_offset_list_unset() functions since they set/unset multiple configuration options at the same time. The northbound callbacks need to set/unset configuration options individually. The frr-ripd YANG module models the "offset-list" command using a list keyed by the 'interface' and 'direction' leafs. One important detail is that the IFNAME parameter is optional, and when it's not present it means we want to match all interfaces. This is modeled using an interface name of '*' since key lists are mandatory by definition in YANG. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'network' command to the new northbound modelRenato Westphal2018-10-271-8/+34
| | | | | | | | | The frr-ripd YANG module models the ripd "network" command using two separate leaf-lists for simplicity: one leaf-list for interfaces and another leaf-list for actual networks. In the 'cli_show' callbacks, display the "network" command for entries of both leaf-lists. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'neighbor' command to the new northbound modelRenato Westphal2018-10-271-4/+21
| | | | | | | | | | | | | | | | Make rip_neighbor_add() and rip_neighbor_delete() return northbound error codes since their return values are used as the return value of some northbound callbacks. These functions shouldn't fail in normal conditions because the northbound layer guarantees it will never call the 'create' or 'delete' callback more than once for the same object. Hence any failure in those functions would indicate an internal inconsistency that needs to be investigated (by returning NB_ERR the northbound will log a detailed error message indicating the xpath of the object, the event and the callback where the error happened). Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'distance source' commands to the new northbound modelRenato Westphal2018-10-271-5/+70
| | | | | | | | | | | | | | | | | | | The "distance (1-255) A.B.C.D/M [WORD]" command was modeled using a YANG list, which makes it a little bit more complicated to convert to the new northbound model. The rip_distance_set() and rip_distance_unset() functions were removed since they set/unset multiple configuration options at the same time. The northbound callbacks need to set/unset configuration options individually. When a distance list is created, use yang_dnode_set_entry() to store a pointer in the configuration node, and retrieve this pointer in the other callbacks using yang_dnode_get_entry(). The 'rip_distance' structure was moved to ripd.h so that it can be used in the rip_northbound.c file. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'distance' command to the new northbound modelRenato Westphal2018-10-271-1/+6
| | | | | | Trivial conversion. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'default-metric' command to the new northbound modelRenato Westphal2018-10-271-1/+7
| | | | | | | | | Trivial conversion. rip->default_metric was converted to an uint8_t to match the way it's defined in the YANG module. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'default-information' command to the new northbound modelRenato Westphal2018-10-271-1/+23
| | | | | | | | | | | | Trivial conversion. 'rip->default_information_route_map' was removed since it wasn't being used anywhere. 'rip->default_information' was removed too because it was being used only to display the running configuration and thus is not necessary anymore. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'allow-ecmp' command to the new northbound modelRenato Westphal2018-10-271-1/+8
| | | | | | | Trivial conversion. The rip->ecmp variable was converted to a boolean to match the way it's defined in the YANG module. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* ripd: retrofit the 'router rip' command to the new northbound modelRenato Westphal2018-10-271-2/+27
| | | | | | | | | | | | | | | | * Implement the northbound callbacks associated to the '/frr-ripd:ripd/instance' YANG path (the code is mostly a copy and paste from the original "router rip" DEFUNs); * Move rip_create_socket() out of rip_create() since creating a socket is an error-prone operation and thus needs to be performed separately during the NB_EV_PREPARE phase; * On rip_create(), fetch the defaults from the frr-ripd YANG model; * Convert the "[no] router rip" CLI commands to be dumb wrappers around the northbound callbacks; * On config_write_rip(), write logic to call all 'cli_show' northbound callbacks defined under the '/frr-ripd:ripd/instance' YANG path. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
* yang, ripd: add 'frr-ripd.yang' and associated stub callbacksRenato Westphal2018-10-271-0/+896
Introduce frr-ripd.yang, which defines a model for managing the FRR ripd daemon. Also add frr-route-types.yang which defines typedefs for FRR route types. Update the 'frr_yang_module_info' array of ripd with the new 'frr-ripd' module. Add two new files (rip_cli.[ch]) which should contain all ripd commands converted to the new northbound model. Centralizing all commands in a single place will facilitate the process of moving the CLI to a separate program in the future. Add automatically generated stub callbacks in rip_northbound.c. These callbacks will be implemented gradually in the following commits. Add example JSON/XML ripd configurations in yang/examples/. Add the confd.frr-ripd.yang YANG module with annotations specific to the ConfD daemon. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>