Linux Kernel Network Feature Timeline

Last update: 2026-08-28 14:02:12 +0800 +0800
Available translations: 日本語 / 中文(简体) / 中文(繁體)

Linux networking evolves through incremental mainline releases rather than separate subsystem releases. The milestones below identify the first stable kernel containing each feature; later kernels may add protocol coverage, drivers, offloads, or userspace interfaces.

Network Feature Quick Facts #

FeatureKernelRelease DateMaintainer PageQuick Fact
Netfilter and iptables2.4.0January 4, 2001netfilter.orgNetfilter introduced extensible packet-processing hooks, while iptables exposed filtering, NAT, and packet-mangling rules to userspace.
NAPI2.6.0December 17, 2003NAPI combined interrupt notification with polling, thus reducing interrupt overhead when interfaces receive packets at high rates.
CUBIC TCP congestion control2.6.13August 28, 2005CUBIC selects the congestion window from a cubic function of time since the previous congestion event. Linux 2.6.19 later made it the default TCP congestion-control algorithm.
Network namespaces2.6.24January 24, 2008Initial support isolated network devices, protocol stacks, routing tables, firewall rules, and sockets. Subsequent releases expanded device and protocol coverage.
Generic Receive Offload (GRO)2.6.29March 23, 2009GRO aggregates related packets before upper-layer processing, thus amortizing per-packet costs without requiring NIC-specific receive offload.
Receive Packet Steering and Receive Flow Steering2.6.35August 1, 2010RPS distributes receive processing across CPUs in software, while RFS adds flow locality so packet processing can follow the consuming application.
TCP Fast Open client support3.6September 30, 2012TFO can carry application data in the opening SYN when the client has a valid cookie. Server support followed in Linux 3.7.
nftables3.13January 20, 2014nftables projectnftables added a programmable packet-classification engine and a Netlink API intended to replace the separate iptables, ip6tables, arptables, and ebtables interfaces.
Extended BPF3.18December 7, 2014eBPF projectThe bpf() system call and eBPF virtual machine provided the foundation for verified, JIT-compiled programs used by socket filters, traffic control, tracing, and later XDP.
Virtual Routing and Forwarding (VRF)4.3November 2, 2015The VRF device lets interfaces share a network namespace while using separate routing tables, which supports route isolation without creating another namespace.
eXpress Data Path (XDP)4.8October 2, 2016XDP projectXDP runs eBPF programs before the kernel allocates a socket buffer, enabling early packet drop, redirection, and load balancing.
BBR congestion control4.9December 11, 2016Google BBRBBR models bottleneck bandwidth and round-trip propagation time instead of treating packet loss as the primary congestion signal.
Kernel TLS transmit offload4.13September 3, 2017kTLS moved TLS record encryption and framing for transmitted data into the kernel. Receive support followed in Linux 4.17.
AF_XDP sockets4.18August 12, 2018XDP projectAF_XDP connects XDP programs to userspace through shared-memory rings, supporting copy and zero-copy operation depending on the driver.
Multipath TCP5.6March 29, 2020MPTCP upstream projectInitial upstream MPTCP support allowed one logical transport connection to use multiple TCP subflows across different paths.
WireGuard5.6March 29, 2020WireGuardWireGuard added an in-kernel encrypted layer-3 tunnel with a small protocol and cryptographic surface.
IPv6 BIG TCP5.19July 31, 2022BIG TCP allows larger non-GSO packet sizes inside the host stack, thus reducing per-packet overhead on high-speed links. IPv4 support followed in Linux 6.3.

Release dates follow the mainline tags in the Linux kernel Git history. Feature versions are cross-referenced with the KernelNewbies release summaries and the kernel networking documentation.

Kernel-Userspace Boundary #

Linux does not provide a syscall such as add_route() or create_veth(). Instead, userspace selects a kernel control interface and reaches it through general-purpose syscalls. Netlink, in particular, is a family of socket protocols rather than a syscall.

SyscallsControl InterfaceNetwork Configuration RoleCurrent Guidance
socket(), bind(), sendmsg(), and recvmsg()NetlinkA process opens an AF_NETLINK socket and exchanges structured messages with a Netlink family. NETLINK_ROUTE configures links, addresses, routes, neighbours, traffic control, and related objects. Generic Netlink and subsystem protocols cover nftables, nl80211, ethtool, devlink, WireGuard, and other facilities.Prefer the relevant Netlink family for system-wide network configuration. Use a maintained library or tool because message attributes, acknowledgements, multipart replies, and API evolution require careful handling.
ioctl()Socket and device ioctlsRequests such as SIOCSIFFLAGS, SIOCSIFADDR, and SIOCSIFMTU configure interfaces. Private device ioctls and the older ethtool and wireless-extension ABIs use the same syscall.Retain ioctl support for compatibility, but use a Netlink API when the subsystem provides one. An ioctl command has a fixed request structure and is harder to extend safely.
setsockopt() and getsockopt()Socket optionsSocket options configure per-socket behavior such as marks, buffer sizes, device binding, multicast membership, TCP parameters, and attached filters. Legacy iptables also uploads and reads rules through protocol-specific socket options.Continue using socket options for settings that belong to one socket. Use nftables over Netlink instead of the legacy iptables socket-option ABI for new firewall integrations.
bpf()eBPF object APIbpf() loads programs, creates and updates maps, queries objects, and creates supported BPF links. Networking programs may run at socket, traffic-control, cgroup, XDP, and other hooks. Some attachment paths still use Netlink or socket options.Use libbpf rather than issuing raw bpf() commands. Prefer BPF links where a hook supports them because a link gives the attachment an explicit lifetime; use the hook’s established Netlink API where required.
openat(), read(), and write()procfs and sysfsFiles under /proc/sys/net expose network sysctls, while selected files under /proc/net and /sys/class/net expose state or narrowly scoped controls. The calls operate on virtual files, but the data is supplied or consumed by the kernel.Use documented sysctls for host or namespace tunables. Do not parse procfs when a structured Netlink dump exists, because procfs formats are primarily text interfaces and may omit attributes.
clone(), clone3(), unshare(), and setns()Network namespacesCLONE_NEWNET creates a network namespace or moves execution into a namespace setup path; setns() joins an existing one. Configuration commands then operate on the network stack selected by the calling thread’s namespace.Establish the namespace first, then configure it through Netlink. Treat namespace switching as thread-scoped state and avoid changing it concurrently from an uncontrolled multithreaded process.

Most administrative operations require CAP_NET_ADMIN in the user namespace that governs the target network namespace. eBPF operations may additionally require CAP_BPF, CAP_PERFMON, or other capabilities depending on the program type, attachment point, and kernel version.

  1. Early Linux used ioctls, socket options, and virtual files. Programs such as ifconfig, route, and arp issued network-device and routing ioctls. /proc/sys/net supplied global tunables, while firewall generations through legacy iptables used protocol-specific socket options.
  2. Rtnetlink became the extensible network control plane. Linux 2.2 exposed links, multiple addresses, routes, neighbours, and traffic-control objects through NETLINK_ROUTE. The iproute2 tools (ip, bridge, and tc) therefore replaced the ioctl-oriented net-tools commands for new configuration.
  3. Subsystem-specific Netlink families replaced fixed private ABIs. Generic Netlink and related protocols allowed commands and type-length-value attributes to evolve without changing a syscall. nl80211 replaced Wireless Extensions, nftables replaced the legacy iptables rule ABI, and newer ethtool operations use Netlink instead of device ioctls.
  4. eBPF added a programmable data-plane boundary. The bpf() syscall manages programs and maps, but configuration remains split by attachment point: rtnetlink configures traffic-control and established XDP attachments, socket options attach classic socket filters, and BPF links provide file-descriptor lifetime management for supported hooks.
  5. New control planes favor described Netlink APIs. Kernel networking development now documents Netlink families with machine-readable specifications. Applications should use those APIs, request acknowledgements and extended acknowledgements, and reserve ioctls or text-file parsing for interfaces without a supported structured replacement.

See the kernel’s Netlink introduction, rtnetlink(7), netdevice(7), and bpf(2) documentation for the corresponding UAPI details.

The rt in rtnetlink means routing, but the interface has grown into the kernel’s general network-control protocol. A process opens socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) and sends RTM_* messages. Each message contains struct nlmsghdr, an object-specific fixed header, and aligned type-length-value attributes.

Rtnetlink supports three interaction patterns:

  • Do request: create, replace, change, or delete one object and receive an acknowledgement.
  • Dump request: enumerate an object class, such as all links or all routes. The kernel returns a multipart response terminated by NLMSG_DONE.
  • Multicast notification: subscribe to groups for link, address, route, neighbour, rule, traffic-control, and other changes. Notifications use the same object messages as replies, which lets a program maintain a local cache.

Managed Objects #

ObjectPrincipal MessagesOperations and State
Network linksRTM_NEWLINK, RTM_SETLINK, RTM_DELLINK, RTM_GETLINKCreate and remove virtual devices supported by registered link kinds, including veth pairs, bridges, bonds, VLAN devices, VRFs, macvlan/macvtap, VXLAN, Geneve, and dummy devices. Change administrative state, MTU, name, MAC address, queue counts, group, alias, master relationship, namespace placement, and protocol-specific link options. Query carrier state, operational state, queue configuration, physical identifiers, VF settings, statistics, and XDP attachment information.
Link propertiesRTM_NEWLINKPROP, RTM_DELLINKPROP, RTM_GETLINKPROPAdd, remove, and list auxiliary link properties, principally alternative interface names.
Protocol addressesRTM_NEWADDR, RTM_DELADDR, RTM_GETADDRAdd, replace, delete, and enumerate IPv4, IPv6, and supported non-IP addresses. Attributes describe local and peer addresses, prefix length, scope, broadcast or anycast address, flags, labels, preferred lifetime, and valid lifetime.
Address-selection labelsRTM_NEWADDRLABEL, RTM_DELADDRLABEL, RTM_GETADDRLABELManage IPv6 source- and destination-address selection labels independently of interface addresses.
RoutesRTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTEManage unicast, local, broadcast, multicast, blackhole, unreachable, prohibit, and throw routes in multiple tables. A route can select input and output interfaces, gateway, preferred source, metric, MTU, congestion-control parameters, expiry, realms, marks, multipath nexthops, or lightweight tunnel encapsulation. RTM_GETROUTE supports both table dumps and route lookups for a supplied flow key.
Policy-routing rulesRTM_NEWRULE, RTM_DELRULE, RTM_GETRULESelect a routing table or action by priority and selectors such as source, destination, input or output interface, firewall mark, UID range, IP protocol, ports, DSCP, flow label, or layer-3 master device. Actions include table lookup, goto, blackhole, unreachable, and prohibit.
Nexthop objectsRTM_NEWNEXTHOP, RTM_DELNEXTHOP, RTM_GETNEXTHOPCreate reusable nexthops and nexthop groups, including resilient groups, rather than embedding every path in each route. Objects carry gateway, device, group membership, weights, protection flags, and encapsulation state.
Resilient nexthop bucketsRTM_NEWNEXTHOPBUCKET, RTM_DELNEXTHOPBUCKET, RTM_GETNEXTHOPBUCKETInspect and, where supported, control the bucket-to-nexthop mapping used by resilient nexthop groups so membership changes disturb fewer flows.
NeighboursRTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGHManage and inspect ARP, IPv6 NDP, and related neighbour-cache entries. State includes the protocol address, link-layer address, interface, reachability state, router and proxy flags, probe data, offload state, and cache timestamps. Bridge forwarding-database entries also use neighbour messages with bridge-specific attributes.
Neighbour tablesRTM_NEWNEIGHTBL, RTM_SETNEIGHTBL, RTM_GETNEIGHTBLRead table statistics and tune garbage-collection thresholds, reachable time, retransmission time, probe counts, queue limits, stale time, and proxy behaviour for neighbour discovery.
Traffic-control queueing disciplinesRTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISCAttach, configure, replace, inspect, and remove root, ingress, egress, and child qdiscs. Examples include fq, fq_codel, htb, tbf, netem, cake, clsact, and hardware-offloaded qdiscs when a driver supports them.
Traffic classesRTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASSManage class hierarchies below classful qdiscs, including rates, ceilings, priorities, parent handles, and implementation-specific parameters.
Traffic-control filters and chainsRTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER, RTM_NEWCHAIN, RTM_DELCHAIN, RTM_GETCHAINClassify packets and select classes or actions. Filters include flower, u32, route, matchall, and BPF; chains divide a block into ordered stages. Attributes can request hardware offload and report whether offload succeeded.
Traffic-control actionsRTM_NEWACTION, RTM_DELACTION, RTM_GETACTIONCreate and inspect reusable actions such as drop, redirect, mirror, police, tunnel-key manipulation, VLAN operations, packet editing, connection tracking, sampling, and BPF execution.
Bridge multicast databaseRTM_NEWMDB, RTM_DELMDB, RTM_GETMDBManage bridge and switchdev multicast forwarding entries, including group, port, VLAN, source-specific multicast state, router-port state, timers, and hardware-offload information.
Bridge VLAN stateRTM_NEWVLAN, RTM_DELVLAN, RTM_GETVLANManage VLAN membership and per-VLAN bridge options on bridge ports. The interface differs from creating a VLAN network device, which uses RTM_NEWLINK with link kind vlan.
Network-namespace identifiersRTM_NEWNSID, RTM_DELNSID, RTM_GETNSIDAssign and resolve namespace-local numeric IDs for peer network namespaces. Rtnetlink attributes use these IDs when an object refers to another namespace.
Per-interface protocol configurationRTM_NEWNETCONF, RTM_DELNETCONF, RTM_GETNETCONFRead and receive changes to selected IPv4, IPv6, and MPLS interface settings, including forwarding, reverse-path filtering, multicast forwarding, proxy-neighbour behaviour, and handling of routes whose links are down. Coverage is narrower than /proc/sys/net.
Data Center BridgingRTM_GETDCB, RTM_SETDCBExchange Data Center Bridging configuration such as priorities, priority groups, Priority Flow Control, application priorities, and DCB capabilities with capable drivers.
Prefix and IPv6 ND informationRTM_NEWPREFIX, RTM_NEWNDUSEROPTDeliver information learned from IPv6 Router Advertisements, including prefixes and user options. These message classes primarily report kernel-observed state rather than acting as general setters.
Multicast and anycast address reportsRTM_GETMULTICAST, RTM_GETANYCAST and corresponding notification typesEnumerate or report multicast and anycast address state for address families that implement the operations. Support is family-dependent.
Link and offload statisticsRTM_NEWSTATS, RTM_GETSTATS, RTM_SETSTATSRetrieve standard link counters, extended per-link statistics, and selected offload statistics. Setter support is limited to attributes implemented by the target subsystem.
Cache and tunnel reportsRTM_NEWCACHEREPORT, RTM_NEWTUNNEL, RTM_DELTUNNEL, RTM_GETTUNNELReport address-family cache events and manage or report tunnel state implemented by an address family. Availability and accepted attributes depend on the protocol module.

RTM_NEW* does not always mean “create only.” Flags determine the mutation semantics:

FlagMeaning
NLM_F_CREATECreate the object if it does not exist.
NLM_F_EXCLFail if the object already exists.
NLM_F_REPLACEReplace an existing object.
NLM_F_APPENDAdd the object at the end of an ordered collection when supported.
NLM_F_ACKReturn success or an NLMSG_ERROR acknowledgement.
NLM_F_DUMPRequest a multipart enumeration; equivalent to `NLM_F_ROOT

Applications should also enable NETLINK_EXT_ACK. Extended acknowledgements can identify the rejected attribute, include a human-readable kernel message, and report policy constraints. A successful acknowledgement means that the kernel processed that message; it does not make a sequence of separate rtnetlink requests transactional.

Namespace and Consistency Model #

An rtnetlink socket operates in the network namespace with which it is associated. Most requests therefore see and modify only that namespace’s links, routes, rules, neighbours, and traffic-control objects. Link attributes can move a device to another namespace, while namespace-ID messages create references to peer namespaces.

Mutating requests generally require CAP_NET_ADMIN in the user namespace that owns the target network namespace. Read requests may still be restricted when they expose sensitive device or protocol information.

A dump is not an atomic snapshot. Objects can change while a multipart dump is in progress, and multicast notifications can be lost when the receive buffer overflows. A state synchronizer should:

  1. Open and bind the socket to the required multicast groups.
  2. Request a dump with a unique sequence number.
  3. Match unicast replies by sequence number and sender port ID.
  4. Process notifications arriving during the dump.
  5. Detect ENOBUFS, interrupted dumps, and malformed attributes.
  6. Discard the cache and repeat the dump when synchronization cannot be proven.

Scope Boundaries #

Rtnetlink controls network topology, addressing, forwarding, neighbours, and traffic control, but it is not the interface for every network subsystem:

FacilityControl Interface
nftables and connection trackingNETLINK_NETFILTER families
Wi-Fi configurationnl80211 over Generic Netlink
Modern NIC settingsethtool over Generic Netlink
devlink devices, ports, resources, and health reportersdevlink over Generic Netlink
WireGuard peer and key configurationwireguard over Generic Netlink
MPTCP path-manager configurationmptcp_pm over Generic Netlink
Per-socket TCP, UDP, multicast, and device-binding optionssetsockopt()
Network sysctls not represented by netconf messages/proc/sys/net
eBPF program and map lifecyclebpf(); attachment may additionally use rtnetlink

The authoritative operation list is defined in include/uapi/linux/rtnetlink.h. The kernel also publishes machine-readable specifications for links, addresses, routes, rules, neighbours, and traffic control. Higher-level programs should use maintained libraries or iproute2 rather than reproducing UAPI structure layout and attribute validation manually.

Userspace Network Utilities #

Linux has no single userspace networking stack. Command-line tools, policy daemons, configuration renderers, routing daemons, and container plugins reach different kernel control interfaces. A higher-level command may therefore control a daemon instead of contacting the kernel.

SoftwarePrimary RolePath to the Kernel
iproute2ip manages links, addresses, routes, rules, neighbours, and network namespaces; bridge manages bridge state; tc manages traffic control; ss inspects sockets.The programs use iproute2’s internal Netlink support directly. Most configuration goes through rtnetlink; socket inspection uses diagnostic Netlink families. iproute2 is a suite of executables, not a daemon required by other network managers.
NetworkManagerMaintains connection profiles and policy for Ethernet, Wi-Fi, mobile broadband, VPNs, IP configuration, and DNS integration. nmcli, nmtui, desktop applets, and applications are clients.nmcli uses libnm to call the NetworkManager daemon over D-Bus. The daemon’s Linux platform layer opens Netlink sockets directly for normal link, address, route, rule, and traffic-control operations; it does not send those operations through the ip executable. Optional helpers handle facilities such as Wi-Fi authentication, PPP, DHCP, DNS, and firewall integration.
systemd-networkdApplies declarative .network, .netdev, and .link configuration, runs DHCP and router-discovery clients, and maintains network state. networkctl is its inspection and control CLI.systemd-networkd uses systemd’s internal Netlink implementation to configure the kernel. networkctl uses networkd APIs and state rather than invoking iproute2 for managed configuration.
NetplanConverts distribution-level YAML into a backend configuration and coordinates application of that configuration.Netplan selects NetworkManager or systemd-networkd as its renderer. The selected daemon, not Netplan’s YAML parser, performs the continuing kernel configuration.
nftablesnft creates firewall, NAT, packet-classification, and set or map rules. libnftables exposes the same engine to applications.nft uses libnftables and libnftnl to exchange batched messages with the nftables subsystem through NETLINK_NETFILTER; it does not use rtnetlink or iproute2.
firewalldMaintains dynamic firewall zones, services, policies, and separate runtime and persistent configuration. firewall-cmd is its principal CLI.firewall-cmd calls the firewalld daemon over D-Bus. The daemon normally applies rules through its nftables backend rather than asking NetworkManager or iproute2 to install them.
ethtoolReads and changes driver and NIC properties such as link modes, channels, rings, coalescing, offloads, RSS, statistics, and firmware data.Newer operations use the ethtool Generic Netlink family. Older or not-yet-converted operations use SIOCETHTOOL ioctls, so the selected path depends on the command and kernel support.
iwInspects and configures 802.11 physical devices, virtual interfaces, channels, stations, scans, powersave, and regulatory state.iw sends commands to the nl80211 Generic Netlink family. It does not invoke ip, although ip remains responsible for ordinary link and IP-layer configuration of the resulting interface.
wpa_supplicant and iwdPerform Wi-Fi scanning, authentication, association, roaming, and key management.Each daemon controls cfg80211/mac80211 through nl80211. NetworkManager can control either daemon over D-Bus; the Wi-Fi daemon then talks to the kernel.
conntrack-toolsLists, modifies, monitors, and replicates Netfilter connection-tracking state.conntrack and conntrackd use ctnetlink over NETLINK_NETFILTER, independently of rtnetlink.
bpftoolLoads and inspects eBPF programs, maps, links, BTF, cgroups, and selected networking attachments.Most object lifecycle operations use libbpf and the bpf() syscall. Some networking operations also inspect or modify rtnetlink-managed XDP and traffic-control state.
FRRouting and BIRDImplement routing protocols such as BGP, OSPF, IS-IS, and RIP and reconcile learned routes with the kernel FIB.FRRouting protocol daemons submit routes to its zebra daemon, which programs the kernel through rtnetlink. BIRD performs its own kernel-protocol synchronization through routing sockets or Netlink on Linux. Neither requires the ip executable for steady-state route installation.
Open vSwitchImplements programmable virtual switching for virtualization, containers, overlays, and software-defined networking.ovs-vsctl changes the OVS database; ovs-vswitchd consumes that configuration and controls the Linux OVS datapath through OVS Generic Netlink families. Auxiliary link and tunnel setup may also involve rtnetlink.
CNI pluginsConfigure a container network namespace when a compatible runtime invokes a plugin. Common plugins create veth pairs, bridges, routes, policy, and overlays.Plugins execute as short-lived programs and commonly use Go Netlink libraries directly. A plugin may additionally call or link firewall, eBPF, IPAM, or datastore components; CNI specifies invocation and result formats rather than one kernel backend.
net-toolsSupplies the legacy ifconfig, route, arp, and netstat commands.The tools primarily use network-device and routing ioctls and parse procfs. iproute2 and structured Netlink interfaces supersede them for new automation.

Control and Dependency Paths #

The arrows describe runtime control flow, not package ownership. NETLINK_ROUTE, NETLINK_NETFILTER, and nl80211 are kernel protocols reached through AF_NETLINK sockets.

flowchart LR
    subgraph clients[Clients and Configuration]
        nmcli["nmcli / GUI"]
        networkctl
        netplan[Netplan]
        firewallcmd[firewall-cmd]
    end

    subgraph controllers[Daemons and Direct Utilities]
        nm[NetworkManager]
        networkd[systemd-networkd]
        wifi["wpa_supplicant / iwd"]
        firewalld
        iproute["ip / bridge / tc"]
        nft
        iw
        ethtool
        bpftool
    end

    subgraph apis[Kernel Control Interfaces]
        rtnl["NETLINK_ROUTE<br/>(rtnetlink)"]
        nfnl[NETLINK_NETFILTER]
        nl80211["nl80211<br/>(Generic Netlink)"]
        ethtoolapi["ethtool Generic Netlink<br/>or device ioctl"]
        bpfapi["bpf() syscall"]
    end

    kernel[Linux Network Kernel]

    nmcli -->|"libnm + D-Bus"| nm
    networkctl -->|"daemon IPC"| networkd
    netplan -.->|"generates configuration"| nm
    netplan -.->|"generates configuration"| networkd
    firewallcmd -->|D-Bus| firewalld

    nm -->|"internal Netlink"| rtnl
    nm -->|D-Bus| wifi
    networkd -->|sd-netlink| rtnl
    iproute -->|"internal libnetlink"| rtnl
    firewalld -->|"nftables backend"| nfnl
    nft -->|"libnftables + libnftnl"| nfnl
    wifi --> nl80211
    iw --> nl80211
    ethtool --> ethtoolapi
    bpftool -->|libbpf| bpfapi

    rtnl --> kernel
    nfnl --> kernel
    nl80211 --> kernel
    ethtoolapi --> kernel
    bpfapi --> kernel

The diagram answers the common nmcli dependency question directly:

  1. nmcli constructs a request through libnm.
  2. libnm sends the request over D-Bus to the NetworkManager daemon.
  3. NetworkManager applies ordinary kernel network state through its own Netlink implementation.
  4. iproute2 is an independent administrative client of the same kernel APIs, not an intermediate layer between NetworkManager and the kernel.

Calling ip, nft, or another CLI from a program remains useful for shell automation, but a long-running manager generally uses a library or implements the kernel protocol directly. Direct access avoids parsing command output and lets the manager subscribe to asynchronous state notifications.

Comments

Read or comment on GitHub (sign-in required to comment)