tools/testing/selftests/drivers/net/macsec.py

Source file repositories/reference/linux-study-clean/tools/testing/selftests/drivers/net/macsec.py

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/drivers/net/macsec.py
Extension
.py
Size
11493 bytes
Lines
344
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: tools
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0

"""MACsec tests."""

import os

from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_raises
from lib.py import ksft_variants, KsftNamedVariant
from lib.py import CmdExitFailure, KsftSkipEx
from lib.py import NetDrvEpEnv
from lib.py import cmd, ip, defer, ethtool

MACSEC_KEY = "12345678901234567890123456789012"
MACSEC_VLAN_VID = 10

# Unique prefix per run to avoid collisions in the shared netns.
# Keep it short: IFNAMSIZ is 16 (incl. NUL), and VLAN names append ".<vid>".
MACSEC_PFX = f"ms{os.getpid()}_"


def _macsec_name(idx=0):
    return f"{MACSEC_PFX}{idx}"


def _get_macsec_offload(dev):
    """Returns macsec offload mode string from ip -d link show."""
    info = ip(f"-d link show dev {dev}", json=True)[0]
    return info.get("linkinfo", {}).get("info_data", {}).get("offload")


def _get_features(dev):
    """Returns ethtool features dict for a device."""
    return ethtool(f"-k {dev}", json=True)[0]


def _require_ip_macsec(cfg):
    """SKIP if iproute2 on local or remote lacks 'ip macsec' support."""
    for host in [None, cfg.remote]:
        out = cmd("ip macsec help", fail=False, host=host)
        if "Usage" not in out.stdout + out.stderr:
            where = "remote" if host else "local"
            raise KsftSkipEx(f"iproute2 too old on {where},"
                             " missing macsec support")


def _require_ip_macsec_offload():
    """SKIP if local iproute2 doesn't understand 'ip macsec offload'."""
    out = cmd("ip macsec help", fail=False)
    if "offload" not in out.stdout + out.stderr:
        raise KsftSkipEx("iproute2 too old, missing macsec offload")


def _require_macsec_offload(cfg):
    """SKIP if local device doesn't support macsec-hw-offload."""
    _require_ip_macsec_offload()
    try:
        feat = ethtool(f"-k {cfg.ifname}", json=True)[0]
    except (CmdExitFailure, IndexError) as e:
        raise KsftSkipEx(
            f"can't query features: {e}") from e
    if not feat.get("macsec-hw-offload", {}).get("active"):
        raise KsftSkipEx("macsec-hw-offload not supported")


def _get_mac(ifname, host=None):
    """Gets MAC address of an interface."""
    dev = ip(f"link show dev {ifname}", json=True, host=host)
    return dev[0]["address"]

Annotation

Implementation Notes