The Linux Kernel

6.3.0

Quick search

Contents

  • A guide to the Kernel Development Process
  • Submitting patches: the essential guide to getting your code into the kernel
  • Code of conduct
  • Kernel Maintainer Handbook
  • All development-process docs
  • Core API Documentation
  • Driver implementer’s API guide
  • Kernel subsystem documentation
    • Driver implementer’s API guide
    • Core API Documentation
    • locking
    • Accounting
    • Block
    • cdrom
    • CPUFreq - CPU frequency and voltage scaling code in the Linux(TM) kernel
    • Frame Buffer
    • fpga
    • Human Interface Devices (HID)
    • I2C/SMBus Subsystem
    • Industrial I/O
    • ISDN
    • InfiniBand
    • LEDs
    • NetLabel
    • Networking
      • AF_XDP
      • Bare UDP Tunnelling Module Documentation
      • batman-adv
      • SocketCAN - Controller Area Network
      • The UCAN Protocol
      • Hardware Device Drivers
      • Distributed Switch Architecture
      • Linux Devlink Documentation
      • CAIF
      • Netlink interface for ethtool
      • IEEE 802.15.4 Developer’s Guide
      • J1939 Documentation
      • Linux Networking and Network Devices APIs
      • MSG_ZEROCOPY
      • FAILOVER
      • Net DIM - Generic Network Dynamic Interrupt Moderation
      • NET_FAILOVER
      • Page Pool API
      • PHY Abstraction Layer
      • phylink
      • IP-Aliasing
      • Ethernet Bridging
      • SNMP counter
      • Checksum Offloads
      • Segmentation Offloads
      • Scaling in the Linux Networking Stack
      • Kernel TLS
      • Kernel TLS offload
      • Linux NFC subsystem
      • Netdev private dataroom for 6lowpan interfaces
      • 6pack Protocol
      • ARCnet Hardware
      • ARCnet
      • ATM
      • AX.25
      • Linux Ethernet Bonding Driver HOWTO
      • cdc_mbim - Driver for CDC MBIM Mobile Broadband modems
      • DCCP protocol
      • DCTCP (DataCenter TCP)
      • DNS Resolver Module
      • Softnet Driver Issues
      • EQL Driver: Serial IP Load Balancing HOWTO
      • LC-trie implementation notes
      • Linux Socket Filtering aka Berkeley Packet Filter (BPF)
      • Generic HDLC layer
      • Generic Netlink
      • Generic networking statistics for netlink users
      • The Linux kernel GTP tunneling module
      • Identifier Locator Addressing (ILA)
      • IOAM6 Sysfs variables
      • AppleTalk-IP Decapsulation and AppleTalk-IP Encapsulation
      • IP dynamic address hack-port v0.03
      • IPsec
      • IP Sysctl
      • IPv6
      • IPVLAN Driver HOWTO
      • IPvs-sysctl
      • Kernel Connection Multiplexor
      • L2TP
      • The Linux LAPB Module Interface
      • How to use packet injection with mac80211
      • Management Component Transport Protocol (MCTP)
      • MPLS Sysfs variables
      • MPTCP Sysfs variables
      • HOWTO for multiqueue network device support
      • Netconsole
      • Netdev features mess and how to get out from it alive
      • Network Devices, the Kernel, and You!
      • Netfilter Sysfs variables
      • NETIF Msg Level
      • Resilient Next-hop Groups
      • Netfilter Conntrack Sysfs variables
      • Netfilter’s flowtable infrastructure
      • Open vSwitch datapath developer documentation
      • Operational States
      • Packet MMAP
      • Linux Phonet protocol family
      • HOWTO for the linux packet generator
      • PLIP: The Parallel Line Internet Protocol Device
      • PPP Generic Driver and Channel Interface
      • The proc/net/tcp and proc/net/tcp6 variables
      • How to use radiotap headers
      • RDS
      • Linux wireless regulatory documentation
      • Network Function Representors
      • RxRPC Network Protocol
      • SOCKET OPTIONS
      • SECURITY
      • EXAMPLE CLIENT USAGE
      • Linux Kernel SCTP
      • LSM/SeLinux secid
      • Seg6 Sysfs variables
      • struct sk_buff
      • SMC Sysctl
      • Interface statistics
      • Stream Parser (strparser)
      • Ethernet switch device driver model (switchdev)
      • Sysfs tagging
      • TC Actions - Environmental Rules
      • TC queue based filtering
      • Thin-streams and TCP
      • Team
      • Timestamping
      • Linux Kernel TIPC
      • Transparent proxy support
      • Universal TUN/TAP device driver
      • The UDP-Lite protocol (RFC 3828)
      • Virtual Routing and Forwarding (VRF)
      • Virtual eXtensible Local Area Networking documentation
      • Packet Layer to Device Driver
      • Device Driver to Packet Layer
      • Requirements for the device driver
      • Linux X.25 Project
      • XFRM device - offloading the IPsec computations
      • XFRM proc - /proc/net/xfrm_* files
      • XFRM
      • XFRM Syscall
      • XDP RX Metadata
    • pcmcia
    • Power Management
    • TCM Virtual Device
    • timers
    • Serial Peripheral Interface (SPI)
    • 1-Wire Subsystem
    • Watchdog Support
    • Virtualization Support
    • Input Documentation
    • Hardware Monitoring
    • GPU Driver Developer’s Guide
    • Compute Accelerators
    • Security Documentation
    • Sound Subsystem Documentation
    • Crypto API
    • Filesystems in the Linux kernel
    • Memory Management Documentation
    • BPF Documentation
    • USB support
    • PCI Bus Subsystem
    • SCSI Subsystem
    • Assorted Miscellaneous Devices Documentation
    • Scheduler
    • MHI
    • PECI Subsystem
  • Locking in the kernel
  • Linux kernel licensing rules
  • How to write kernel documentation
  • Development tools for the kernel
  • Kernel Testing Guide
  • Kernel Hacking Guides
  • Linux Tracing Technologies
  • fault-injection
  • Kernel Livepatching
  • Rust
  • The Linux kernel user’s and administrator’s guide
  • The kernel build system
  • Reporting issues
  • User-space tools
  • The Linux kernel user-space API guide
  • The Linux kernel firmware guide
  • Open Firmware and Devicetree
  • CPU Architectures
  • Unsorted Documentation
  • Translations

This Page

  • Show Source

Generic networking statistics for netlink users¶

Statistic counters are grouped into structs:

Struct

TLV type

Description

gnet_stats_basic

TCA_STATS_BASIC

Basic statistics

gnet_stats_rate_est

TCA_STATS_RATE_EST

Rate estimator

gnet_stats_queue

TCA_STATS_QUEUE

Queue statistics

none

TCA_STATS_APP

Application specific

Collecting:¶

Declare the statistic structs you need:

struct mystruct {
        struct gnet_stats_basic bstats;
        struct gnet_stats_queue qstats;
        ...
};

Update statistics, in dequeue() methods only, (while owning qdisc->running):

mystruct->tstats.packet++;
mystruct->qstats.backlog += skb->pkt_len;

Export to userspace (Dump):¶

my_dumping_routine(struct sk_buff *skb, ...)
{
        struct gnet_dump dump;

        if (gnet_stats_start_copy(skb, TCA_STATS2, &mystruct->lock, &dump,
                                TCA_PAD) < 0)
                goto rtattr_failure;

        if (gnet_stats_copy_basic(&dump, &mystruct->bstats) < 0 ||
            gnet_stats_copy_queue(&dump, &mystruct->qstats) < 0 ||
                gnet_stats_copy_app(&dump, &xstats, sizeof(xstats)) < 0)
                goto rtattr_failure;

        if (gnet_stats_finish_copy(&dump) < 0)
                goto rtattr_failure;
        ...
}

TCA_STATS/TCA_XSTATS backward compatibility:¶

Prior users of struct tc_stats and xstats can maintain backward compatibility by calling the compat wrappers to keep providing the existing TLV types:

my_dumping_routine(struct sk_buff *skb, ...)
{
    if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS,
                                    TCA_XSTATS, &mystruct->lock, &dump,
                                    TCA_PAD) < 0)
                goto rtattr_failure;
        ...
}

A struct tc_stats will be filled out during gnet_stats_copy_* calls and appended to the skb. TCA_XSTATS is provided if gnet_stats_copy_app was called.

Locking:¶

Locks are taken before writing and released once all statistics have been written. Locks are always released in case of an error. You are responsible for making sure that the lock is initialized.

Rate Estimator:¶

  1. Prepare an estimator attribute. Most likely this would be in user space. The value of this TLV should contain a tc_estimator structure. As usual, such a TLV needs to be 32 bit aligned and therefore the length needs to be appropriately set, etc. The estimator interval and ewma log need to be converted to the appropriate values. tc_estimator.c::tc_setup_estimator() is advisable to be used as the conversion routine. It does a few clever things. It takes a time interval in microsecs, a time constant also in microsecs and a struct tc_estimator to be populated. The returned tc_estimator can be transported to the kernel. Transfer such a structure in a TLV of type TCA_RATE to your code in the kernel.

In the kernel when setting up:

  1. make sure you have basic stats and rate stats setup first.

  2. make sure you have initialized stats lock that is used to setup such stats.

  3. Now initialize a new estimator:

    int ret = gen_new_estimator(my_basicstats,my_rate_est_stats,
        mystats_lock, attr_with_tcestimator_struct);
    
    if ret == 0
        success
    else
        failed
    

From now on, every time you dump my_rate_est_stats it will contain up-to-date info.

Once you are done, call gen_kill_estimator(my_basicstats, my_rate_est_stats) Make sure that my_basicstats and my_rate_est_stats are still valid (i.e still exist) at the time of making this call.

Authors:¶

  • Thomas Graf <tgraf@suug.ch>

  • Jamal Hadi Salim <hadi@cyberus.ca>

©The kernel development community. | Powered by Sphinx 5.0.1 & Alabaster 0.7.12 | Page source