Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix various developer doc issues #14499

Merged
merged 2 commits into from
Sep 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/developer/building-frr-for-ubuntu2204.rst
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ If config rollbacks are enabled using ``--enable-config-rollbacks``
the sqlite3 developer package also should be installed.

.. code-block:: console

sudo apt install libsqlite3-dev


Expand Down
2 changes: 2 additions & 0 deletions doc/developer/checkpatch.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
.. SPDX-License-Identifier: GPL-2.0-only

.. _checkpatch:

==========
Checkpatch
==========
Expand Down
34 changes: 18 additions & 16 deletions doc/developer/cli.rst
Original file line number Diff line number Diff line change
Expand Up @@ -639,13 +639,14 @@ in order into ``*argv[]``. Before this happens the ``->arg`` field is set to
point at the snippet of user input that matched it.

For most nontrivial commands the handler function will need to determine which
of the possible matching inputs was entered. Previously this was done by looking
at the first few characters of input. This is now considered an anti-pattern and
should be avoided. Instead, the ``->type`` or ``->text`` fields for this logic.
The ``->type`` field can be used when the possible inputs differ in type. When
the possible types are the same, use the ``->text`` field. This field has the
full text of the corresponding token in the definition string and using it makes
for much more readable code. An example is helpful.
of the possible matching inputs was entered. Previously this was done by
looking at the first few characters of input. This is now considered an
anti-pattern and should be avoided. Instead, use the ``->type`` or ``->text``
fields for this logic. The ``->type`` field can be used when the possible
inputs differ in type. When the possible types are the same, use the ``->text``
field. This field has the full text of the corresponding token in the
definition string and using it makes for much more readable code. An example is
helpful.

Command definition:

Expand All @@ -654,9 +655,10 @@ Command definition:
command <(1-10)|foo|BAR>

In this example, the user may enter any one of:
- an integer between 1 and 10
- "foo"
- anything at all

* an integer between 1 and 10
* "foo"
* anything at all

If the user enters "command f", then:

Expand Down Expand Up @@ -793,12 +795,12 @@ Adding a CLI Node

To add a new CLI node, you should:

- define a new numerical node constant
- define a node structure in the relevant daemon
- call ``install_node()`` in the relevant daemon
- define and install the new node in vtysh
- define corresponding node entry commands in daemon and vtysh
- add a new entry to the ``ctx_keywords`` dictionary in ``tools/frr-reload.py``
#. define a new numerical node constant
#. define a node structure in the relevant daemon
#. call ``install_node()`` in the relevant daemon
#. define and install the new node in vtysh
#. define corresponding node entry commands in daemon and vtysh
#. add a new entry to the ``ctx_keywords`` dictionary in ``tools/frr-reload.py``

Defining the numerical node constant
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down
162 changes: 81 additions & 81 deletions doc/developer/cspf.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,59 +24,59 @@ to the cost of the cuurent path from the source up to the current node.

The algorithm is as followed:

```
cost = MAX_COST;
Priority_Queue.empty();
Visited_Node.empty();
Processed_Path.empty();
src = new_path(source_address);
src.cost = 0;
dst = new_destinatio(destination_address);
dst.cost = MAX_COST;
Processed_Path.add(src);
Processed_Path.add(dst);
while (Priority_Queue.count != 0) {
current_path = Priority_Queue.pop();
current_node = next_path.destination;
Visited_Node.add(current_node);
for (current_node.edges: edge) {
if (prune_edge(current_path, edge)
continue;
if (relax(current_path) && cost > current_path.cost) {
optim_path = current_path;
cost = current_path.cost;
}
}
}

prune_edge(path, edge) {
// check that path + edge meet constraints e.g.
if (current_path.cost + edge.cost > constrained_cost)
return false;
else
return true;
}

relax_edge(current_path, edge) {
next_node = edge.destination;
if (Visited_Node.get(next_node))
return false;
next_path = Processed_Path.get(edge.destination);
if (!next_path) {
next_path = new path(edge.destination);
Processed_Path.add(next_path);
}
total_cost = current_path.cost + edge.cost;
if (total_cost < next_path.cost) {
next_path = current_path;
next_path.add_edge(edge);
next_path.cost = total_cost;
Priority_Queue.add(next_path);
}
return (next_path.destination == destination);
}

```
.. code-block:: c

cost = MAX_COST;
Priority_Queue.empty();
Visited_Node.empty();
Processed_Path.empty();
src = new_path(source_address);
src.cost = 0;
dst = new_destinatio(destination_address);
dst.cost = MAX_COST;
Processed_Path.add(src);
Processed_Path.add(dst);
while (Priority_Queue.count != 0) {
current_path = Priority_Queue.pop();
current_node = next_path.destination;
Visited_Node.add(current_node);
for (current_node.edges: edge) {
if (prune_edge(current_path, edge)
continue;
if (relax(current_path) && cost > current_path.cost) {
optim_path = current_path;
cost = current_path.cost;
}
}
}

prune_edge(path, edge) {
// check that path + edge meet constraints e.g.
if (current_path.cost + edge.cost > constrained_cost)
return false;
else
return true;
}

relax_edge(current_path, edge) {
next_node = edge.destination;
if (Visited_Node.get(next_node))
return false;
next_path = Processed_Path.get(edge.destination);
if (!next_path) {
next_path = new path(edge.destination);
Processed_Path.add(next_path);
}
total_cost = current_path.cost + edge.cost;
if (total_cost < next_path.cost) {
next_path = current_path;
next_path.add_edge(edge);
next_path.cost = total_cost;
Priority_Queue.add(next_path);
}
return (next_path.destination == destination);
}


Definition
----------
Expand Down Expand Up @@ -163,34 +163,34 @@ To perform a Path Computation with given constraints, proceed as follow:

.. code-block:: c

struct cspf *algo;
struct ls_ted *ted;
struct in_addr src;
struct in_addr dst;
struct constraints csts;
struct c_path *path;

// Create a new CSPF structure
algo = cspf_new();

// Initialize constraints
csts.cost = 100;
csts.ctype = CSPF_TE_METRIC;
csts.family = AF_INET;
csts.type = SR_TE;
csts.bw = 1000000;
csts.cos = 3;

// Then, initialise th CSPF with source, destination and constraints
cspf_init_v4(algo, ted, src, dst, &csts);

// Finally, got the Computed Path;
path = compute_p2p_path(ted, algo);

if (path.status == SUCCESS)
zlog_info("Got a valid constraints path");
else
zlog_info("Unable to compute constraints path. Got %d status", path->status);
struct cspf *algo;
struct ls_ted *ted;
struct in_addr src;
struct in_addr dst;
struct constraints csts;
struct c_path *path;

// Create a new CSPF structure
algo = cspf_new();

// Initialize constraints
csts.cost = 100;
csts.ctype = CSPF_TE_METRIC;
csts.family = AF_INET;
csts.type = SR_TE;
csts.bw = 1000000;
csts.cos = 3;

// Then, initialise th CSPF with source, destination and constraints
cspf_init_v4(algo, ted, src, dst, &csts);

// Finally, got the Computed Path;
path = compute_p2p_path(ted, algo);

if (path.status == SUCCESS)
zlog_info("Got a valid constraints path");
else
zlog_info("Unable to compute constraints path. Got %d status", path->status);


If you would compute another path, you must call `cspf_init()` prior to
Expand Down
1 change: 1 addition & 0 deletions doc/developer/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ FRRouting Developer's Guide
:maxdepth: 2

workflow
checkpatch
building
packaging
process-architecture
Expand Down
1 change: 1 addition & 0 deletions doc/developer/ospf.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ OSPFD

ospf-api
ospf-sr
cspf

6 changes: 4 additions & 2 deletions doc/developer/topotests.rst
Original file line number Diff line number Diff line change
Expand Up @@ -472,8 +472,8 @@ For each capture a window is opened displaying a live summary of the captured
packets. Additionally, the entire packet stream is captured in a pcap file in
the tests log directory e.g.,::

When using a unified log file `frr.log` one substitutes `frr` for the daemon
name in the ``--logd`` CLI option, e.g.,
When using a unified log file ``frr.log`` one substitutes ``frr`` for the
daemon name in the ``--logd`` CLI option, e.g.,

.. code:: shell

Expand Down Expand Up @@ -617,6 +617,8 @@ allocations upon exit. To enable also reporting of memory leaks to a specific
location, define an environment variable ``TOPOTESTS_CHECK_MEMLEAK`` with the
file prefix, i.e.:

::

export TOPOTESTS_CHECK_MEMLEAK="/home/mydir/memleak_"

For tests that support the TOPOTESTS_CHECK_MEMLEAK environment variable, this
Expand Down
3 changes: 3 additions & 0 deletions doc/developer/workflow.rst
Original file line number Diff line number Diff line change
Expand Up @@ -817,6 +817,7 @@ The project provides multiple tools to allow you to correctly style your code
as painlessly as possible, primarily built around ``clang-format``.

clang-format

In the project root there is a :file:`.clang-format` configuration file
which can be used with the ``clang-format`` source formatter tool from the
LLVM project. Most of the time, this is the easiest and smartest tool to
Expand Down Expand Up @@ -875,6 +876,8 @@ clang-format
checkpatch.sh
checkpatch.pl

.. seealso:: :ref:`checkpatch`

In the Linux kernel source tree there is a Perl script used to check
incoming patches for style errors. FRR uses a shell script front end and an
adapted version of the perl script for the same purpose. These scripts can
Expand Down
Loading