Tobias Waldekranz 9591093379 confd: bridge: Refactor setup
TL;DR:
> New code, all bugs removed ;)

Incremental reconfiguration of bridge related settings had lots of
ordering issues.

This change tries to remedy that by:

- Introducing the concept of "snippets": Instead of having to run C
  code in the correct order (which is doomed to fail since teardowns
  typically need to run in reverse), collect related settings in a
  snippet.  Later on, we can then concatenate snippets into a larger
  file in the proper order.

- Refactoring the bridge setup to take advantage of snippets.  Now we
  can call out to functions that _both_ generate the VLAN config _and_
  sets some bridge global options, for example.  This gets us out of
  having to pass back settings to the main generation function.

- Ensuring that deleted objects are always removed - in the proper
  order - in the exit action of the previous generation.  This was
  previously not true for VLANs, fix #869.

- Generating `mcd`:s config orthogonally from the bridge setup.  Since
  we need to keep track of _all_ bridges, figure out when VLAN uppers
  exist etc., it becomes _very_ messy to generate the configuration
  from the diff of a single interface. There were lots of cases here
  where disabling the querier service on one bridge would disable the
  whole daemon, thereby disabling the service for other bridges that
  still had it enabled.
2024-12-17 22:59:31 +01:00
2024-12-06 08:22:10 +01:00
2024-12-17 22:59:31 +01:00
2022-12-05 21:09:05 +01:00
2024-11-25 14:04:07 +01:00

License Badge GitHub Status Coverity Status Discord

Infix - Linux <3 NETCONF

Infix is a free, Linux based, immutable Network Operating System (NOS) built on Buildroot, and sysrepo. A powerful mix that ease porting to different platforms, simplify long-term maintenance, and provide made-easy management using NETCONF, RESTCONF1 , or the built-in command line interface (CLI) from a console or SSH login.

Click the ▶ Example CLI Session foldout below for an example, or head on over to the Infix Documentation for more information on how to set up the system.

Although primarily focused on switches and routers, the core values may be appealing for other use-cases as well:

  • Runs from a squashfs image on a read-only partition
  • Single configuration file on a separate partition
  • Built around YANG with standard IETF models
  • Linux switchdev provides open switch APIs
  • Atomic upgrades to secondary partition
  • Highly security focused

An immutable2 operating system enhances security and inherently makes it maintenance-free. Configuration and data, e.g, containers, is stored on separate partitions to ensure complete separation from system files and allow for seamless backup, restore, and provisioning.

In itself, Infix is perfectly suited for dedicated networking tasks, and with native support for Docker containers, the operating system provides a versatile platform that can easily be adapted to any customer need. Be it legacy applications, network protocols, process monitoring, or edge data analysis, it can run close to end equipment. Either directly connected on dedicated Ethernet ports or indirectly using virtual network cables to exist on the same LAN as other connected equipment.

The simple design of Infix provides complete control over both system and data, minimal cognitive burden, and makes it incredibly easy to get started.

Example CLI Session

The CLI configure context is automatically generated from the loaded YANG models and their corresponding sysrepo plugins. The following is brief example of how to set the IP address of an interface:

admin@infix-12-34-56:/> configure
admin@infix-12-34-56:/config/> edit interface eth0
admin@infix-12-34-56:/config/interface/eth0/> set ipv4 <TAB>
      address     autoconf bind-ni-name      enabled
	  forwarding  mtu      neighbor
admin@infix-12-34-56:/config/interface/eth0/> set ipv4 address 192.168.2.200 prefix-length 24
admin@infix-12-34-56:/config/interface/eth0/> show
type ethernet;
ipv4 {
  address 192.168.2.200 {
    prefix-length 24;
  }
}
ipv6
admin@infix-12-34-56:/config/interface/eth0/> diff
interfaces {
  interface eth0 {
+    ipv4 {
+      address 192.168.2.200 {
+        prefix-length 24;
+      }
+    }
  }
}
admin@infix-12-34-56:/config/interface/eth0/> leave
admin@infix-12-34-56:/> show interfaces
INTERFACE       PROTOCOL   STATE       DATA
eth0            ethernet   UP          52:54:00:12:34:56
                ipv4                   192.168.2.200/24 (static)
                ipv6                   fe80::5054:ff:fe12:3456/64 (link-layer)
lo              ethernet   UP          00:00:00:00:00:00
                ipv4                   127.0.0.1/8 (static)
                ipv6                   ::1/128 (static)
admin@infix-12-34-56:/> copy running-config startup-config

Click here for more details.

Infix can run on many different types of architectures and boards, much thanks to Linux and Buildroot. Currently the focus is on 64-bit ARM devices, optionally with switching fabric supported by Linux switchdev. The following boards are fully supported:

  • Marvell CN9130 CRB
  • Marvell EspressoBIN
  • Microchip SparX-5i PCB135 (eMMC)
  • StarFive VisionFive2
  • NanoPi R2S

An x86_64 build is also available, primarily intended for development and testing, but can also be used for evaluation and demo purposes. For more information, see: Infix in Virtual Environments.

See the GitHub Releases page for our pre-built images. The Latest Build has bleeding edge images, if possible we recommend using a versioned release.

For customer specific builds of Infix, see your product repository.


  1. Partial RESTCONF support, features like HTTP PATCH, OPTIONS, HEAD, and copying between datastores are still missing. ↩︎

  2. An immutable operating system is one with read-only file systems, atomic updates, rollbacks, declarative configuration, and workload isolation. All to improve reliability, scalability, and security. For more information, see https://ceur-ws.org/Vol-3386/paper9.pdf and https://www.zdnet.com/article/what-is-immutable-linux-heres-why-youd-run-an-immutable-linux-distro/. ↩︎

Languages
Python 36.9%
C 16.3%
Go 16.1%
HTML 13.5%
Shell 8.2%
Other 8.9%