xref: /dpdk/dts/framework/params/testpmd.py (revision fc0f7dc47ee35f7f6ea196331e27c3e088807092)
1# SPDX-License-Identifier: BSD-3-Clause
2# Copyright(c) 2024 Arm Limited
3
4"""Module containing all the TestPmd-related parameter classes."""
5
6from dataclasses import dataclass, field
7from enum import EnumMeta, Flag, auto, unique
8from pathlib import PurePath
9from typing import Literal, NamedTuple
10
11from framework.params import (
12    Params,
13    Switch,
14    YesNoSwitch,
15    bracketed,
16    comma_separated,
17    hex_from_flag_value,
18    modify_str,
19    str_from_flag_value,
20)
21from framework.params.eal import EalParams
22from framework.utils import StrEnum
23
24
25class PortTopology(StrEnum):
26    """Enum representing the port topology."""
27
28    #: In paired mode, the forwarding is between pairs of ports, e.g.: (0,1), (2,3), (4,5).
29    paired = auto()
30
31    #: In chained mode, the forwarding is to the next available port in the port mask, e.g.:
32    #: (0,1), (1,2), (2,0).
33    #:
34    #: The ordering of the ports can be changed using the portlist testpmd runtime function.
35    chained = auto()
36
37    #: In loop mode, ingress traffic is simply transmitted back on the same interface.
38    loop = auto()
39
40
41@modify_str(comma_separated, bracketed)
42class PortNUMAConfig(NamedTuple):
43    """DPDK port to NUMA socket association tuple."""
44
45    #:
46    port: int
47    #:
48    socket: int
49
50
51@modify_str(str_from_flag_value)
52@unique
53class FlowDirection(Flag):
54    """Flag indicating the direction of the flow.
55
56    A bi-directional flow can be specified with the pipe:
57
58    >>> TestPmdFlowDirection.RX | TestPmdFlowDirection.TX
59    <TestPmdFlowDirection.TX|RX: 3>
60    """
61
62    #:
63    RX = 1 << 0
64    #:
65    TX = 1 << 1
66
67
68@modify_str(comma_separated, bracketed)
69class RingNUMAConfig(NamedTuple):
70    """Tuple associating DPDK port, direction of the flow and NUMA socket."""
71
72    #:
73    port: int
74    #:
75    direction: FlowDirection
76    #:
77    socket: int
78
79
80@modify_str(comma_separated)
81class EthPeer(NamedTuple):
82    """Tuple associating a MAC address to the specified DPDK port."""
83
84    #:
85    port_no: int
86    #:
87    mac_address: str
88
89
90@modify_str(comma_separated)
91class TxIPAddrPair(NamedTuple):
92    """Tuple specifying the source and destination IPs for the packets."""
93
94    #:
95    source_ip: str
96    #:
97    dest_ip: str
98
99
100@modify_str(comma_separated)
101class TxUDPPortPair(NamedTuple):
102    """Tuple specifying the UDP source and destination ports for the packets.
103
104    If leaving ``dest_port`` unspecified, ``source_port`` will be used for
105    the destination port as well.
106    """
107
108    #:
109    source_port: int
110    #:
111    dest_port: int | None = None
112
113
114@dataclass
115class DisableRSS(Params):
116    """Disables RSS (Receive Side Scaling)."""
117
118    _disable_rss: Literal[True] = field(
119        default=True, init=False, metadata=Params.long("disable-rss")
120    )
121
122
123@dataclass
124class SetRSSIPOnly(Params):
125    """Sets RSS (Receive Side Scaling) functions for IPv4/IPv6 only."""
126
127    _rss_ip: Literal[True] = field(default=True, init=False, metadata=Params.long("rss-ip"))
128
129
130@dataclass
131class SetRSSUDP(Params):
132    """Sets RSS (Receive Side Scaling) functions for IPv4/IPv6 and UDP."""
133
134    _rss_udp: Literal[True] = field(default=True, init=False, metadata=Params.long("rss-udp"))
135
136
137class RSSSetting(EnumMeta):
138    """Enum representing a RSS setting. Each property is a class that needs to be initialised."""
139
140    #:
141    Disabled = DisableRSS
142    #:
143    SetIPOnly = SetRSSIPOnly
144    #:
145    SetUDP = SetRSSUDP
146
147
148class SimpleForwardingModes(StrEnum):
149    r"""The supported packet forwarding modes for :class:`~TestPmdShell`\s."""
150
151    #:
152    io = auto()
153    #:
154    mac = auto()
155    #:
156    macswap = auto()
157    #:
158    rxonly = auto()
159    #:
160    csum = auto()
161    #:
162    icmpecho = auto()
163    #:
164    ieee1588 = auto()
165    #:
166    fivetswap = "5tswap"
167    #:
168    shared_rxq = "shared-rxq"
169    #:
170    recycle_mbufs = auto()
171
172
173@dataclass(kw_only=True)
174class TXOnlyForwardingMode(Params):
175    """Sets a TX-Only forwarding mode.
176
177    Attributes:
178        multi_flow: Generates multiple flows if set to True.
179        segments_length: Sets TX segment sizes or total packet length.
180    """
181
182    _forward_mode: Literal["txonly"] = field(
183        default="txonly", init=False, metadata=Params.long("forward-mode")
184    )
185    multi_flow: Switch = field(default=None, metadata=Params.long("txonly-multi-flow"))
186    segments_length: list[int] | None = field(
187        default=None, metadata=Params.long("txpkts") | Params.convert_value(comma_separated)
188    )
189
190
191@dataclass(kw_only=True)
192class FlowGenForwardingMode(Params):
193    """Sets a flowgen forwarding mode.
194
195    Attributes:
196        clones: Set the number of each packet clones to be sent. Sending clones reduces host CPU
197                load on creating packets and may help in testing extreme speeds or maxing out
198                Tx packet performance. N should be not zero, but less than ‘burst’ parameter.
199        flows: Set the number of flows to be generated, where 1 <= N <= INT32_MAX.
200        segments_length: Set TX segment sizes or total packet length.
201    """
202
203    _forward_mode: Literal["flowgen"] = field(
204        default="flowgen", init=False, metadata=Params.long("forward-mode")
205    )
206    clones: int | None = field(default=None, metadata=Params.long("flowgen-clones"))
207    flows: int | None = field(default=None, metadata=Params.long("flowgen-flows"))
208    segments_length: list[int] | None = field(
209        default=None, metadata=Params.long("txpkts") | Params.convert_value(comma_separated)
210    )
211
212
213@dataclass(kw_only=True)
214class NoisyForwardingMode(Params):
215    """Sets a noisy forwarding mode.
216
217    Attributes:
218        forward_mode: Set the noisy VNF forwarding mode.
219        tx_sw_buffer_size: Set the maximum number of elements of the FIFO queue to be created for
220                           buffering packets.
221        tx_sw_buffer_flushtime: Set the time before packets in the FIFO queue are flushed.
222        lkup_memory: Set the size of the noisy neighbor simulation memory buffer in MB to N.
223        lkup_num_reads: Set the size of the noisy neighbor simulation memory buffer in MB to N.
224        lkup_num_writes: Set the number of writes to be done in noisy neighbor simulation
225                         memory buffer to N.
226        lkup_num_reads_writes: Set the number of r/w accesses to be done in noisy neighbor
227                               simulation memory buffer to N.
228    """
229
230    _forward_mode: Literal["noisy"] = field(
231        default="noisy", init=False, metadata=Params.long("forward-mode")
232    )
233    forward_mode: (
234        Literal[
235            SimpleForwardingModes.io,
236            SimpleForwardingModes.mac,
237            SimpleForwardingModes.macswap,
238            SimpleForwardingModes.fivetswap,
239        ]
240        | None
241    ) = field(default=SimpleForwardingModes.io, metadata=Params.long("noisy-forward-mode"))
242    tx_sw_buffer_size: int | None = field(
243        default=None, metadata=Params.long("noisy-tx-sw-buffer-size")
244    )
245    tx_sw_buffer_flushtime: int | None = field(
246        default=None, metadata=Params.long("noisy-tx-sw-buffer-flushtime")
247    )
248    lkup_memory: int | None = field(default=None, metadata=Params.long("noisy-lkup-memory"))
249    lkup_num_reads: int | None = field(default=None, metadata=Params.long("noisy-lkup-num-reads"))
250    lkup_num_writes: int | None = field(default=None, metadata=Params.long("noisy-lkup-num-writes"))
251    lkup_num_reads_writes: int | None = field(
252        default=None, metadata=Params.long("noisy-lkup-num-reads-writes")
253    )
254
255
256@modify_str(hex_from_flag_value)
257@unique
258class HairpinMode(Flag):
259    """Flag representing the hairpin mode."""
260
261    #: Two hairpin ports loop.
262    TWO_PORTS_LOOP = 1 << 0
263    #: Two hairpin ports paired.
264    TWO_PORTS_PAIRED = 1 << 1
265    #: Explicit Tx flow rule.
266    EXPLICIT_TX_FLOW = 1 << 4
267    #: Force memory settings of hairpin RX queue.
268    FORCE_RX_QUEUE_MEM_SETTINGS = 1 << 8
269    #: Force memory settings of hairpin TX queue.
270    FORCE_TX_QUEUE_MEM_SETTINGS = 1 << 9
271    #: Hairpin RX queues will use locked device memory.
272    RX_QUEUE_USE_LOCKED_DEVICE_MEMORY = 1 << 12
273    #: Hairpin RX queues will use RTE memory.
274    RX_QUEUE_USE_RTE_MEMORY = 1 << 13
275    #: Hairpin TX queues will use locked device memory.
276    TX_QUEUE_USE_LOCKED_DEVICE_MEMORY = 1 << 16
277    #: Hairpin TX queues will use RTE memory.
278    TX_QUEUE_USE_RTE_MEMORY = 1 << 18
279
280
281@dataclass(kw_only=True)
282class RXRingParams(Params):
283    """Sets the RX ring parameters.
284
285    Attributes:
286        descriptors: Set the number of descriptors in the RX rings to N, where N > 0.
287        prefetch_threshold: Set the prefetch threshold register of RX rings to N, where N >= 0.
288        host_threshold: Set the host threshold register of RX rings to N, where N >= 0.
289        write_back_threshold: Set the write-back threshold register of RX rings to N, where N >= 0.
290        free_threshold: Set the free threshold of RX descriptors to N,
291                        where 0 <= N < value of ``-–rxd``.
292    """
293
294    descriptors: int | None = field(default=None, metadata=Params.long("rxd"))
295    prefetch_threshold: int | None = field(default=None, metadata=Params.long("rxpt"))
296    host_threshold: int | None = field(default=None, metadata=Params.long("rxht"))
297    write_back_threshold: int | None = field(default=None, metadata=Params.long("rxwt"))
298    free_threshold: int | None = field(default=None, metadata=Params.long("rxfreet"))
299
300
301@modify_str(hex_from_flag_value)
302@unique
303class RXMultiQueueMode(Flag):
304    """Flag representing the RX multi-queue mode."""
305
306    #:
307    RSS = 1 << 0
308    #:
309    DCB = 1 << 1
310    #:
311    VMDQ = 1 << 2
312
313
314@dataclass(kw_only=True)
315class TXRingParams(Params):
316    """Sets the TX ring parameters.
317
318    Attributes:
319        descriptors: Set the number of descriptors in the TX rings to N, where N > 0.
320        rs_bit_threshold: Set the transmit RS bit threshold of TX rings to N,
321                          where 0 <= N <= value of ``--txd``.
322        prefetch_threshold: Set the prefetch threshold register of TX rings to N, where N >= 0.
323        host_threshold: Set the host threshold register of TX rings to N, where N >= 0.
324        write_back_threshold: Set the write-back threshold register of TX rings to N, where N >= 0.
325        free_threshold: Set the transmit free threshold of TX rings to N,
326                        where 0 <= N <= value of ``--txd``.
327    """
328
329    descriptors: int | None = field(default=None, metadata=Params.long("txd"))
330    rs_bit_threshold: int | None = field(default=None, metadata=Params.long("txrst"))
331    prefetch_threshold: int | None = field(default=None, metadata=Params.long("txpt"))
332    host_threshold: int | None = field(default=None, metadata=Params.long("txht"))
333    write_back_threshold: int | None = field(default=None, metadata=Params.long("txwt"))
334    free_threshold: int | None = field(default=None, metadata=Params.long("txfreet"))
335
336
337class Event(StrEnum):
338    """Enum representing a testpmd event."""
339
340    #:
341    unknown = auto()
342    #:
343    queue_state = auto()
344    #:
345    vf_mbox = auto()
346    #:
347    macsec = auto()
348    #:
349    intr_lsc = auto()
350    #:
351    intr_rmv = auto()
352    #:
353    intr_reset = auto()
354    #:
355    dev_probed = auto()
356    #:
357    dev_released = auto()
358    #:
359    flow_aged = auto()
360    #:
361    err_recovering = auto()
362    #:
363    recovery_success = auto()
364    #:
365    recovery_failed = auto()
366    #:
367    all = auto()
368
369
370class SimpleMempoolAllocationMode(StrEnum):
371    """Enum representing simple mempool allocation modes."""
372
373    #: Create and populate mempool using native DPDK memory.
374    native = auto()
375    #: Create and populate mempool using externally and anonymously allocated area.
376    xmem = auto()
377    #: Create and populate mempool using externally and anonymously allocated hugepage area.
378    xmemhuge = auto()
379
380
381@dataclass(kw_only=True)
382class AnonMempoolAllocationMode(Params):
383    """Create mempool using native DPDK memory, but populate using anonymous memory.
384
385    Attributes:
386        no_iova_contig: Enables to create mempool which is not IOVA contiguous.
387    """
388
389    _mp_alloc: Literal["anon"] = field(default="anon", init=False, metadata=Params.long("mp-alloc"))
390    no_iova_contig: Switch = None
391
392
393@dataclass(slots=True, kw_only=True)
394class TestPmdParams(EalParams):
395    """The testpmd shell parameters.
396
397    Attributes:
398        interactive_mode: Run testpmd in interactive mode.
399        auto_start: Start forwarding on initialization.
400        tx_first: Start forwarding, after sending a burst of packets first.
401        stats_period: Display statistics every ``PERIOD`` seconds, if interactive mode is disabled.
402                      The default value is 0, which means that the statistics will not be displayed.
403
404                      .. note:: This flag should be used only in non-interactive mode.
405        display_xstats: Display comma-separated list of extended statistics every ``PERIOD`` seconds
406                        as specified in ``--stats-period`` or when used with interactive commands
407                        that show Rx/Tx statistics (i.e. ‘show port stats’).
408        nb_cores: Set the number of forwarding cores, where 1 <= N <= “number of cores” or
409                  ``RTE_MAX_LCORE`` from the configuration file.
410        coremask: Set the bitmask of the cores running the packet forwarding test. The main
411                  lcore is reserved for command line parsing only and cannot be masked on for packet
412                  forwarding.
413        nb_ports: Set the number of forwarding ports, where 1 <= N <= “number of ports” on the board
414                  or ``RTE_MAX_ETHPORTS`` from the configuration file. The default value is the
415                  number of ports on the board.
416        port_topology: Set port topology, where mode is paired (the default), chained or loop.
417        portmask: Set the bitmask of the ports used by the packet forwarding test.
418        portlist: Set the forwarding ports based on the user input used by the packet forwarding
419                  test. ‘-‘ denotes a range of ports to set including the two specified port IDs ‘,’
420                  separates multiple port values. Possible examples like –portlist=0,1 or
421                  –portlist=0-2 or –portlist=0,1-2 etc.
422        numa: Enable/disable NUMA-aware allocation of RX/TX rings and of RX memory buffers (mbufs).
423        socket_num: Set the socket from which all memory is allocated in NUMA mode, where
424                    0 <= N < number of sockets on the board.
425        port_numa_config: Specify the socket on which the memory pool to be used by the port will be
426                          allocated.
427        ring_numa_config: Specify the socket on which the TX/RX rings for the port will be
428                          allocated. Where flag is 1 for RX, 2 for TX, and 3 for RX and TX.
429        total_num_mbufs: Set the number of mbufs to be allocated in the mbuf pools, where N > 1024.
430        mbuf_size: Set the data size of the mbufs used to N bytes, where N < 65536.
431                   If multiple mbuf-size values are specified the extra memory pools will be created
432                   for allocating mbufs to receive packets with buffer splitting features.
433        mbcache: Set the cache of mbuf memory pools to N, where 0 <= N <= 512.
434        max_pkt_len: Set the maximum packet size to N bytes, where N >= 64.
435        eth_peers_configfile: Use a configuration file containing the Ethernet addresses of
436                              the peer ports.
437        eth_peer: Set the MAC address XX:XX:XX:XX:XX:XX of the peer port N,
438                  where 0 <= N < RTE_MAX_ETHPORTS.
439        tx_ip: Set the source and destination IP address used when doing transmit only test.
440               The defaults address values are source 198.18.0.1 and destination 198.18.0.2.
441               These are special purpose addresses reserved for benchmarking (RFC 5735).
442        tx_udp: Set the source and destination UDP port number for transmit test only test.
443                The default port is the port 9 which is defined for the discard protocol (RFC 863).
444        enable_lro: Enable large receive offload.
445        max_lro_pkt_size: Set the maximum LRO aggregated packet size to N bytes, where N >= 64.
446        disable_crc_strip: Disable hardware CRC stripping.
447        enable_scatter: Enable scatter (multi-segment) RX.
448        enable_hw_vlan: Enable hardware VLAN.
449        enable_hw_vlan_filter: Enable hardware VLAN filter.
450        enable_hw_vlan_strip: Enable hardware VLAN strip.
451        enable_hw_vlan_extend: Enable hardware VLAN extend.
452        enable_hw_qinq_strip: Enable hardware QINQ strip.
453        pkt_drop_enabled: Enable per-queue packet drop for packets with no descriptors.
454        rss: Receive Side Scaling setting.
455        forward_mode: Set the forwarding mode.
456        hairpin_mode: Set the hairpin port configuration.
457        hairpin_queues: Set the number of hairpin queues per port to N, where 1 <= N <= 65535.
458        burst: Set the number of packets per burst to N, where 1 <= N <= 512.
459        enable_rx_cksum: Enable hardware RX checksum offload.
460        rx_queues: Set the number of RX queues per port to N, where 1 <= N <= 65535.
461        rx_ring: Set the RX rings parameters.
462        no_flush_rx: Don’t flush the RX streams before starting forwarding. Used mainly with
463                     the PCAP PMD.
464        rx_segments_offsets: Set the offsets of packet segments on receiving
465                             if split feature is engaged.
466        rx_segments_length: Set the length of segments to scatter packets on receiving
467                            if split feature is engaged.
468        multi_rx_mempool: Enable multiple mbuf pools per Rx queue.
469        rx_shared_queue: Create queues in shared Rx queue mode if device supports. Shared Rx queues
470                         are grouped per X ports. X defaults to UINT32_MAX, implies all ports join
471                         share group 1. Forwarding engine “shared-rxq” should be used for shared Rx
472                         queues. This engine does Rx only and update stream statistics accordingly.
473        rx_offloads: Set the bitmask of RX queue offloads.
474        rx_mq_mode: Set the RX multi queue mode which can be enabled.
475        tx_queues: Set the number of TX queues per port to N, where 1 <= N <= 65535.
476        tx_ring: Set the TX rings params.
477        tx_offloads: Set the hexadecimal bitmask of TX queue offloads.
478        eth_link_speed: Set a forced link speed to the ethernet port. E.g. 1000 for 1Gbps.
479        disable_link_check: Disable check on link status when starting/stopping ports.
480        disable_device_start: Do not automatically start all ports. This allows testing
481                              configuration of rx and tx queues before device is started
482                              for the first time.
483        no_lsc_interrupt: Disable LSC interrupts for all ports, even those supporting it.
484        no_rmv_interrupt: Disable RMV interrupts for all ports, even those supporting it.
485        bitrate_stats: Set the logical core N to perform bitrate calculation.
486        latencystats: Set the logical core N to perform latency and jitter calculations.
487        print_events: Enable printing the occurrence of the designated events.
488                      Using :attr:`TestPmdEvent.ALL` will enable all of them.
489        mask_events: Disable printing the occurrence of the designated events.
490                     Using :attr:`TestPmdEvent.ALL` will disable all of them.
491        flow_isolate_all: Providing this parameter requests flow API isolated mode on all ports at
492                          initialization time. It ensures all traffic is received through the
493                          configured flow rules only (see flow command). Ports that do not support
494                          this mode are automatically discarded.
495        disable_flow_flush: Disable port flow flush when stopping port.
496                            This allows testing keep flow rules or shared flow objects across
497                            restart.
498        hot_plug: Enable device event monitor mechanism for hotplug.
499        vxlan_gpe_port: Set the UDP port number of tunnel VXLAN-GPE to N.
500        geneve_parsed_port: Set the UDP port number that is used for parsing the GENEVE protocol
501                            to N. HW may be configured with another tunnel Geneve port.
502        lock_all_memory: Enable/disable locking all memory. Disabled by default.
503        mempool_allocation_mode: Set mempool allocation mode.
504        record_core_cycles: Enable measurement of CPU cycles per packet.
505        record_burst_status: Enable display of RX and TX burst stats.
506    """
507
508    interactive_mode: Switch = field(default=True, metadata=Params.short("i"))
509    auto_start: Switch = field(default=None, metadata=Params.short("a"))
510    tx_first: Switch = None
511    stats_period: int | None = None
512    display_xstats: list[str] | None = field(
513        default=None, metadata=Params.convert_value(comma_separated)
514    )
515    nb_cores: int | None = None
516    coremask: int | None = field(default=None, metadata=Params.convert_value(hex))
517    nb_ports: int | None = None
518    port_topology: PortTopology | None = PortTopology.paired
519    portmask: int | None = field(default=None, metadata=Params.convert_value(hex))
520    portlist: str | None = None  # TODO: can be ranges 0,1-3
521
522    numa: YesNoSwitch = None
523    socket_num: int | None = None
524    port_numa_config: list[PortNUMAConfig] | None = field(
525        default=None, metadata=Params.convert_value(comma_separated)
526    )
527    ring_numa_config: list[RingNUMAConfig] | None = field(
528        default=None, metadata=Params.convert_value(comma_separated)
529    )
530    total_num_mbufs: int | None = None
531    mbuf_size: list[int] | None = field(
532        default=None, metadata=Params.convert_value(comma_separated)
533    )
534    mbcache: int | None = None
535    max_pkt_len: int | None = None
536    eth_peers_configfile: PurePath | None = None
537    eth_peer: list[EthPeer] | None = field(default=None, metadata=Params.multiple())
538    tx_ip: TxIPAddrPair | None = None
539    tx_udp: TxUDPPortPair | None = None
540    enable_lro: Switch = None
541    max_lro_pkt_size: int | None = None
542    disable_crc_strip: Switch = None
543    enable_scatter: Switch = None
544    enable_hw_vlan: Switch = None
545    enable_hw_vlan_filter: Switch = None
546    enable_hw_vlan_strip: Switch = None
547    enable_hw_vlan_extend: Switch = None
548    enable_hw_qinq_strip: Switch = None
549    pkt_drop_enabled: Switch = field(default=None, metadata=Params.long("enable-drop-en"))
550    rss: RSSSetting | None = None
551    forward_mode: (
552        SimpleForwardingModes
553        | FlowGenForwardingMode
554        | TXOnlyForwardingMode
555        | NoisyForwardingMode
556        | None
557    ) = None
558    hairpin_mode: HairpinMode | None = None
559    hairpin_queues: int | None = field(default=None, metadata=Params.long("hairpinq"))
560    burst: int | None = None
561    enable_rx_cksum: Switch = None
562
563    rx_queues: int | None = field(default=None, metadata=Params.long("rxq"))
564    rx_ring: RXRingParams | None = None
565    no_flush_rx: Switch = None
566    rx_segments_offsets: list[int] | None = field(
567        default=None, metadata=Params.long("rxoffs") | Params.convert_value(comma_separated)
568    )
569    rx_segments_length: list[int] | None = field(
570        default=None, metadata=Params.long("rxpkts") | Params.convert_value(comma_separated)
571    )
572    multi_rx_mempool: Switch = None
573    rx_shared_queue: Switch | int = field(default=None, metadata=Params.long("rxq-share"))
574    rx_offloads: int | None = field(default=None, metadata=Params.convert_value(hex))
575    rx_mq_mode: RXMultiQueueMode | None = None
576
577    tx_queues: int | None = field(default=None, metadata=Params.long("txq"))
578    tx_ring: TXRingParams | None = None
579    tx_offloads: int | None = field(default=None, metadata=Params.convert_value(hex))
580
581    eth_link_speed: int | None = None
582    disable_link_check: Switch = None
583    disable_device_start: Switch = None
584    no_lsc_interrupt: Switch = None
585    no_rmv_interrupt: Switch = None
586    bitrate_stats: int | None = None
587    latencystats: int | None = None
588    print_events: list[Event] | None = field(
589        default=None, metadata=Params.multiple() | Params.long("print-event")
590    )
591    mask_events: list[Event] | None = field(
592        default_factory=lambda: [Event.intr_lsc],
593        metadata=Params.multiple() | Params.long("mask-event"),
594    )
595
596    flow_isolate_all: Switch = None
597    disable_flow_flush: Switch = None
598
599    hot_plug: Switch = None
600    vxlan_gpe_port: int | None = None
601    geneve_parsed_port: int | None = None
602    lock_all_memory: YesNoSwitch = field(default=None, metadata=Params.long("mlockall"))
603    mempool_allocation_mode: SimpleMempoolAllocationMode | AnonMempoolAllocationMode | None = field(
604        default=None, metadata=Params.long("mp-alloc")
605    )
606    record_core_cycles: Switch = None
607    record_burst_status: Switch = None
608