linux/include/net/devlink.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * include/net/devlink.h - Network physical device Netlink interface
   4 * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
   5 * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
   6 */
   7#ifndef _NET_DEVLINK_H_
   8#define _NET_DEVLINK_H_
   9
  10#include <linux/device.h>
  11#include <linux/slab.h>
  12#include <linux/gfp.h>
  13#include <linux/list.h>
  14#include <linux/netdevice.h>
  15#include <linux/spinlock.h>
  16#include <linux/workqueue.h>
  17#include <linux/refcount.h>
  18#include <net/net_namespace.h>
  19#include <net/flow_offload.h>
  20#include <uapi/linux/devlink.h>
  21#include <linux/xarray.h>
  22
  23struct devlink_ops;
  24
  25struct devlink {
  26        struct list_head list;
  27        struct list_head port_list;
  28        struct list_head sb_list;
  29        struct list_head dpipe_table_list;
  30        struct list_head resource_list;
  31        struct list_head param_list;
  32        struct list_head region_list;
  33        struct list_head reporter_list;
  34        struct mutex reporters_lock; /* protects reporter_list */
  35        struct devlink_dpipe_headers *dpipe_headers;
  36        struct list_head trap_list;
  37        struct list_head trap_group_list;
  38        struct list_head trap_policer_list;
  39        const struct devlink_ops *ops;
  40        struct xarray snapshot_ids;
  41        struct device *dev;
  42        possible_net_t _net;
  43        struct mutex lock;
  44        u8 reload_failed:1,
  45           reload_enabled:1,
  46           registered:1;
  47        char priv[0] __aligned(NETDEV_ALIGN);
  48};
  49
  50struct devlink_port_phys_attrs {
  51        u32 port_number; /* Same value as "split group".
  52                          * A physical port which is visible to the user
  53                          * for a given port flavour.
  54                          */
  55        u32 split_subport_number;
  56};
  57
  58struct devlink_port_pci_pf_attrs {
  59        u16 pf; /* Associated PCI PF for this port. */
  60};
  61
  62struct devlink_port_pci_vf_attrs {
  63        u16 pf; /* Associated PCI PF for this port. */
  64        u16 vf; /* Associated PCI VF for of the PCI PF for this port. */
  65};
  66
  67struct devlink_port_attrs {
  68        u8 set:1,
  69           split:1,
  70           switch_port:1;
  71        enum devlink_port_flavour flavour;
  72        struct netdev_phys_item_id switch_id;
  73        union {
  74                struct devlink_port_phys_attrs phys;
  75                struct devlink_port_pci_pf_attrs pci_pf;
  76                struct devlink_port_pci_vf_attrs pci_vf;
  77        };
  78};
  79
  80struct devlink_port {
  81        struct list_head list;
  82        struct list_head param_list;
  83        struct devlink *devlink;
  84        unsigned int index;
  85        bool registered;
  86        spinlock_t type_lock; /* Protects type and type_dev
  87                               * pointer consistency.
  88                               */
  89        enum devlink_port_type type;
  90        enum devlink_port_type desired_type;
  91        void *type_dev;
  92        struct devlink_port_attrs attrs;
  93        struct delayed_work type_warn_dw;
  94};
  95
  96struct devlink_sb_pool_info {
  97        enum devlink_sb_pool_type pool_type;
  98        u32 size;
  99        enum devlink_sb_threshold_type threshold_type;
 100        u32 cell_size;
 101};
 102
 103/**
 104 * struct devlink_dpipe_field - dpipe field object
 105 * @name: field name
 106 * @id: index inside the headers field array
 107 * @bitwidth: bitwidth
 108 * @mapping_type: mapping type
 109 */
 110struct devlink_dpipe_field {
 111        const char *name;
 112        unsigned int id;
 113        unsigned int bitwidth;
 114        enum devlink_dpipe_field_mapping_type mapping_type;
 115};
 116
 117/**
 118 * struct devlink_dpipe_header - dpipe header object
 119 * @name: header name
 120 * @id: index, global/local detrmined by global bit
 121 * @fields: fields
 122 * @fields_count: number of fields
 123 * @global: indicates if header is shared like most protocol header
 124 *          or driver specific
 125 */
 126struct devlink_dpipe_header {
 127        const char *name;
 128        unsigned int id;
 129        struct devlink_dpipe_field *fields;
 130        unsigned int fields_count;
 131        bool global;
 132};
 133
 134/**
 135 * struct devlink_dpipe_match - represents match operation
 136 * @type: type of match
 137 * @header_index: header index (packets can have several headers of same
 138 *                type like in case of tunnels)
 139 * @header: header
 140 * @fieled_id: field index
 141 */
 142struct devlink_dpipe_match {
 143        enum devlink_dpipe_match_type type;
 144        unsigned int header_index;
 145        struct devlink_dpipe_header *header;
 146        unsigned int field_id;
 147};
 148
 149/**
 150 * struct devlink_dpipe_action - represents action operation
 151 * @type: type of action
 152 * @header_index: header index (packets can have several headers of same
 153 *                type like in case of tunnels)
 154 * @header: header
 155 * @fieled_id: field index
 156 */
 157struct devlink_dpipe_action {
 158        enum devlink_dpipe_action_type type;
 159        unsigned int header_index;
 160        struct devlink_dpipe_header *header;
 161        unsigned int field_id;
 162};
 163
 164/**
 165 * struct devlink_dpipe_value - represents value of match/action
 166 * @action: action
 167 * @match: match
 168 * @mapping_value: in case the field has some mapping this value
 169 *                 specified the mapping value
 170 * @mapping_valid: specify if mapping value is valid
 171 * @value_size: value size
 172 * @value: value
 173 * @mask: bit mask
 174 */
 175struct devlink_dpipe_value {
 176        union {
 177                struct devlink_dpipe_action *action;
 178                struct devlink_dpipe_match *match;
 179        };
 180        unsigned int mapping_value;
 181        bool mapping_valid;
 182        unsigned int value_size;
 183        void *value;
 184        void *mask;
 185};
 186
 187/**
 188 * struct devlink_dpipe_entry - table entry object
 189 * @index: index of the entry in the table
 190 * @match_values: match values
 191 * @matche_values_count: count of matches tuples
 192 * @action_values: actions values
 193 * @action_values_count: count of actions values
 194 * @counter: value of counter
 195 * @counter_valid: Specify if value is valid from hardware
 196 */
 197struct devlink_dpipe_entry {
 198        u64 index;
 199        struct devlink_dpipe_value *match_values;
 200        unsigned int match_values_count;
 201        struct devlink_dpipe_value *action_values;
 202        unsigned int action_values_count;
 203        u64 counter;
 204        bool counter_valid;
 205};
 206
 207/**
 208 * struct devlink_dpipe_dump_ctx - context provided to driver in order
 209 *                                 to dump
 210 * @info: info
 211 * @cmd: devlink command
 212 * @skb: skb
 213 * @nest: top attribute
 214 * @hdr: hdr
 215 */
 216struct devlink_dpipe_dump_ctx {
 217        struct genl_info *info;
 218        enum devlink_command cmd;
 219        struct sk_buff *skb;
 220        struct nlattr *nest;
 221        void *hdr;
 222};
 223
 224struct devlink_dpipe_table_ops;
 225
 226/**
 227 * struct devlink_dpipe_table - table object
 228 * @priv: private
 229 * @name: table name
 230 * @counters_enabled: indicates if counters are active
 231 * @counter_control_extern: indicates if counter control is in dpipe or
 232 *                          external tool
 233 * @resource_valid: Indicate that the resource id is valid
 234 * @resource_id: relative resource this table is related to
 235 * @resource_units: number of resource's unit consumed per table's entry
 236 * @table_ops: table operations
 237 * @rcu: rcu
 238 */
 239struct devlink_dpipe_table {
 240        void *priv;
 241        struct list_head list;
 242        const char *name;
 243        bool counters_enabled;
 244        bool counter_control_extern;
 245        bool resource_valid;
 246        u64 resource_id;
 247        u64 resource_units;
 248        struct devlink_dpipe_table_ops *table_ops;
 249        struct rcu_head rcu;
 250};
 251
 252/**
 253 * struct devlink_dpipe_table_ops - dpipe_table ops
 254 * @actions_dump - dumps all tables actions
 255 * @matches_dump - dumps all tables matches
 256 * @entries_dump - dumps all active entries in the table
 257 * @counters_set_update - when changing the counter status hardware sync
 258 *                        maybe needed to allocate/free counter related
 259 *                        resources
 260 * @size_get - get size
 261 */
 262struct devlink_dpipe_table_ops {
 263        int (*actions_dump)(void *priv, struct sk_buff *skb);
 264        int (*matches_dump)(void *priv, struct sk_buff *skb);
 265        int (*entries_dump)(void *priv, bool counters_enabled,
 266                            struct devlink_dpipe_dump_ctx *dump_ctx);
 267        int (*counters_set_update)(void *priv, bool enable);
 268        u64 (*size_get)(void *priv);
 269};
 270
 271/**
 272 * struct devlink_dpipe_headers - dpipe headers
 273 * @headers - header array can be shared (global bit) or driver specific
 274 * @headers_count - count of headers
 275 */
 276struct devlink_dpipe_headers {
 277        struct devlink_dpipe_header **headers;
 278        unsigned int headers_count;
 279};
 280
 281/**
 282 * struct devlink_resource_size_params - resource's size parameters
 283 * @size_min: minimum size which can be set
 284 * @size_max: maximum size which can be set
 285 * @size_granularity: size granularity
 286 * @size_unit: resource's basic unit
 287 */
 288struct devlink_resource_size_params {
 289        u64 size_min;
 290        u64 size_max;
 291        u64 size_granularity;
 292        enum devlink_resource_unit unit;
 293};
 294
 295static inline void
 296devlink_resource_size_params_init(struct devlink_resource_size_params *size_params,
 297                                  u64 size_min, u64 size_max,
 298                                  u64 size_granularity,
 299                                  enum devlink_resource_unit unit)
 300{
 301        size_params->size_min = size_min;
 302        size_params->size_max = size_max;
 303        size_params->size_granularity = size_granularity;
 304        size_params->unit = unit;
 305}
 306
 307typedef u64 devlink_resource_occ_get_t(void *priv);
 308
 309/**
 310 * struct devlink_resource - devlink resource
 311 * @name: name of the resource
 312 * @id: id, per devlink instance
 313 * @size: size of the resource
 314 * @size_new: updated size of the resource, reload is needed
 315 * @size_valid: valid in case the total size of the resource is valid
 316 *              including its children
 317 * @parent: parent resource
 318 * @size_params: size parameters
 319 * @list: parent list
 320 * @resource_list: list of child resources
 321 */
 322struct devlink_resource {
 323        const char *name;
 324        u64 id;
 325        u64 size;
 326        u64 size_new;
 327        bool size_valid;
 328        struct devlink_resource *parent;
 329        struct devlink_resource_size_params size_params;
 330        struct list_head list;
 331        struct list_head resource_list;
 332        devlink_resource_occ_get_t *occ_get;
 333        void *occ_get_priv;
 334};
 335
 336#define DEVLINK_RESOURCE_ID_PARENT_TOP 0
 337
 338#define __DEVLINK_PARAM_MAX_STRING_VALUE 32
 339enum devlink_param_type {
 340        DEVLINK_PARAM_TYPE_U8,
 341        DEVLINK_PARAM_TYPE_U16,
 342        DEVLINK_PARAM_TYPE_U32,
 343        DEVLINK_PARAM_TYPE_STRING,
 344        DEVLINK_PARAM_TYPE_BOOL,
 345};
 346
 347union devlink_param_value {
 348        u8 vu8;
 349        u16 vu16;
 350        u32 vu32;
 351        char vstr[__DEVLINK_PARAM_MAX_STRING_VALUE];
 352        bool vbool;
 353};
 354
 355struct devlink_param_gset_ctx {
 356        union devlink_param_value val;
 357        enum devlink_param_cmode cmode;
 358};
 359
 360/**
 361 * struct devlink_param - devlink configuration parameter data
 362 * @name: name of the parameter
 363 * @generic: indicates if the parameter is generic or driver specific
 364 * @type: parameter type
 365 * @supported_cmodes: bitmap of supported configuration modes
 366 * @get: get parameter value, used for runtime and permanent
 367 *       configuration modes
 368 * @set: set parameter value, used for runtime and permanent
 369 *       configuration modes
 370 * @validate: validate input value is applicable (within value range, etc.)
 371 *
 372 * This struct should be used by the driver to fill the data for
 373 * a parameter it registers.
 374 */
 375struct devlink_param {
 376        u32 id;
 377        const char *name;
 378        bool generic;
 379        enum devlink_param_type type;
 380        unsigned long supported_cmodes;
 381        int (*get)(struct devlink *devlink, u32 id,
 382                   struct devlink_param_gset_ctx *ctx);
 383        int (*set)(struct devlink *devlink, u32 id,
 384                   struct devlink_param_gset_ctx *ctx);
 385        int (*validate)(struct devlink *devlink, u32 id,
 386                        union devlink_param_value val,
 387                        struct netlink_ext_ack *extack);
 388};
 389
 390struct devlink_param_item {
 391        struct list_head list;
 392        const struct devlink_param *param;
 393        union devlink_param_value driverinit_value;
 394        bool driverinit_value_valid;
 395        bool published;
 396};
 397
 398enum devlink_param_generic_id {
 399        DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET,
 400        DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
 401        DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV,
 402        DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT,
 403        DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI,
 404        DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX,
 405        DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN,
 406        DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY,
 407        DEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE,
 408        DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE,
 409
 410        /* add new param generic ids above here*/
 411        __DEVLINK_PARAM_GENERIC_ID_MAX,
 412        DEVLINK_PARAM_GENERIC_ID_MAX = __DEVLINK_PARAM_GENERIC_ID_MAX - 1,
 413};
 414
 415#define DEVLINK_PARAM_GENERIC_INT_ERR_RESET_NAME "internal_error_reset"
 416#define DEVLINK_PARAM_GENERIC_INT_ERR_RESET_TYPE DEVLINK_PARAM_TYPE_BOOL
 417
 418#define DEVLINK_PARAM_GENERIC_MAX_MACS_NAME "max_macs"
 419#define DEVLINK_PARAM_GENERIC_MAX_MACS_TYPE DEVLINK_PARAM_TYPE_U32
 420
 421#define DEVLINK_PARAM_GENERIC_ENABLE_SRIOV_NAME "enable_sriov"
 422#define DEVLINK_PARAM_GENERIC_ENABLE_SRIOV_TYPE DEVLINK_PARAM_TYPE_BOOL
 423
 424#define DEVLINK_PARAM_GENERIC_REGION_SNAPSHOT_NAME "region_snapshot_enable"
 425#define DEVLINK_PARAM_GENERIC_REGION_SNAPSHOT_TYPE DEVLINK_PARAM_TYPE_BOOL
 426
 427#define DEVLINK_PARAM_GENERIC_IGNORE_ARI_NAME "ignore_ari"
 428#define DEVLINK_PARAM_GENERIC_IGNORE_ARI_TYPE DEVLINK_PARAM_TYPE_BOOL
 429
 430#define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MAX_NAME "msix_vec_per_pf_max"
 431#define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MAX_TYPE DEVLINK_PARAM_TYPE_U32
 432
 433#define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MIN_NAME "msix_vec_per_pf_min"
 434#define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MIN_TYPE DEVLINK_PARAM_TYPE_U32
 435
 436#define DEVLINK_PARAM_GENERIC_FW_LOAD_POLICY_NAME "fw_load_policy"
 437#define DEVLINK_PARAM_GENERIC_FW_LOAD_POLICY_TYPE DEVLINK_PARAM_TYPE_U8
 438
 439#define DEVLINK_PARAM_GENERIC_RESET_DEV_ON_DRV_PROBE_NAME \
 440        "reset_dev_on_drv_probe"
 441#define DEVLINK_PARAM_GENERIC_RESET_DEV_ON_DRV_PROBE_TYPE DEVLINK_PARAM_TYPE_U8
 442
 443#define DEVLINK_PARAM_GENERIC_ENABLE_ROCE_NAME "enable_roce"
 444#define DEVLINK_PARAM_GENERIC_ENABLE_ROCE_TYPE DEVLINK_PARAM_TYPE_BOOL
 445
 446#define DEVLINK_PARAM_GENERIC(_id, _cmodes, _get, _set, _validate)      \
 447{                                                                       \
 448        .id = DEVLINK_PARAM_GENERIC_ID_##_id,                           \
 449        .name = DEVLINK_PARAM_GENERIC_##_id##_NAME,                     \
 450        .type = DEVLINK_PARAM_GENERIC_##_id##_TYPE,                     \
 451        .generic = true,                                                \
 452        .supported_cmodes = _cmodes,                                    \
 453        .get = _get,                                                    \
 454        .set = _set,                                                    \
 455        .validate = _validate,                                          \
 456}
 457
 458#define DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes, _get, _set, _validate) \
 459{                                                                       \
 460        .id = _id,                                                      \
 461        .name = _name,                                                  \
 462        .type = _type,                                                  \
 463        .supported_cmodes = _cmodes,                                    \
 464        .get = _get,                                                    \
 465        .set = _set,                                                    \
 466        .validate = _validate,                                          \
 467}
 468
 469/* Part number, identifier of board design */
 470#define DEVLINK_INFO_VERSION_GENERIC_BOARD_ID   "board.id"
 471/* Revision of board design */
 472#define DEVLINK_INFO_VERSION_GENERIC_BOARD_REV  "board.rev"
 473/* Maker of the board */
 474#define DEVLINK_INFO_VERSION_GENERIC_BOARD_MANUFACTURE  "board.manufacture"
 475
 476/* Part number, identifier of asic design */
 477#define DEVLINK_INFO_VERSION_GENERIC_ASIC_ID    "asic.id"
 478/* Revision of asic design */
 479#define DEVLINK_INFO_VERSION_GENERIC_ASIC_REV   "asic.rev"
 480
 481/* Overall FW version */
 482#define DEVLINK_INFO_VERSION_GENERIC_FW         "fw"
 483/* Control processor FW version */
 484#define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT    "fw.mgmt"
 485/* FW interface specification version */
 486#define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API        "fw.mgmt.api"
 487/* Data path microcode controlling high-speed packet processing */
 488#define DEVLINK_INFO_VERSION_GENERIC_FW_APP     "fw.app"
 489/* UNDI software version */
 490#define DEVLINK_INFO_VERSION_GENERIC_FW_UNDI    "fw.undi"
 491/* NCSI support/handler version */
 492#define DEVLINK_INFO_VERSION_GENERIC_FW_NCSI    "fw.ncsi"
 493/* FW parameter set id */
 494#define DEVLINK_INFO_VERSION_GENERIC_FW_PSID    "fw.psid"
 495/* RoCE FW version */
 496#define DEVLINK_INFO_VERSION_GENERIC_FW_ROCE    "fw.roce"
 497/* Firmware bundle identifier */
 498#define DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID       "fw.bundle_id"
 499
 500struct devlink_region;
 501struct devlink_info_req;
 502
 503/**
 504 * struct devlink_region_ops - Region operations
 505 * @name: region name
 506 * @destructor: callback used to free snapshot memory when deleting
 507 * @snapshot: callback to request an immediate snapshot. On success,
 508 *            the data variable must be updated to point to the snapshot data.
 509 *            The function will be called while the devlink instance lock is
 510 *            held.
 511 */
 512struct devlink_region_ops {
 513        const char *name;
 514        void (*destructor)(const void *data);
 515        int (*snapshot)(struct devlink *devlink, struct netlink_ext_ack *extack,
 516                        u8 **data);
 517};
 518
 519struct devlink_fmsg;
 520struct devlink_health_reporter;
 521
 522enum devlink_health_reporter_state {
 523        DEVLINK_HEALTH_REPORTER_STATE_HEALTHY,
 524        DEVLINK_HEALTH_REPORTER_STATE_ERROR,
 525};
 526
 527/**
 528 * struct devlink_health_reporter_ops - Reporter operations
 529 * @name: reporter name
 530 * @recover: callback to recover from reported error
 531 *           if priv_ctx is NULL, run a full recover
 532 * @dump: callback to dump an object
 533 *        if priv_ctx is NULL, run a full dump
 534 * @diagnose: callback to diagnose the current status
 535 */
 536
 537struct devlink_health_reporter_ops {
 538        char *name;
 539        int (*recover)(struct devlink_health_reporter *reporter,
 540                       void *priv_ctx, struct netlink_ext_ack *extack);
 541        int (*dump)(struct devlink_health_reporter *reporter,
 542                    struct devlink_fmsg *fmsg, void *priv_ctx,
 543                    struct netlink_ext_ack *extack);
 544        int (*diagnose)(struct devlink_health_reporter *reporter,
 545                        struct devlink_fmsg *fmsg,
 546                        struct netlink_ext_ack *extack);
 547};
 548
 549/**
 550 * struct devlink_trap_policer - Immutable packet trap policer attributes.
 551 * @id: Policer identifier.
 552 * @init_rate: Initial rate in packets / sec.
 553 * @init_burst: Initial burst size in packets.
 554 * @max_rate: Maximum rate.
 555 * @min_rate: Minimum rate.
 556 * @max_burst: Maximum burst size.
 557 * @min_burst: Minimum burst size.
 558 *
 559 * Describes immutable attributes of packet trap policers that drivers register
 560 * with devlink.
 561 */
 562struct devlink_trap_policer {
 563        u32 id;
 564        u64 init_rate;
 565        u64 init_burst;
 566        u64 max_rate;
 567        u64 min_rate;
 568        u64 max_burst;
 569        u64 min_burst;
 570};
 571
 572/**
 573 * struct devlink_trap_group - Immutable packet trap group attributes.
 574 * @name: Trap group name.
 575 * @id: Trap group identifier.
 576 * @generic: Whether the trap group is generic or not.
 577 * @init_policer_id: Initial policer identifier.
 578 *
 579 * Describes immutable attributes of packet trap groups that drivers register
 580 * with devlink.
 581 */
 582struct devlink_trap_group {
 583        const char *name;
 584        u16 id;
 585        bool generic;
 586        u32 init_policer_id;
 587};
 588
 589#define DEVLINK_TRAP_METADATA_TYPE_F_IN_PORT    BIT(0)
 590#define DEVLINK_TRAP_METADATA_TYPE_F_FA_COOKIE  BIT(1)
 591
 592/**
 593 * struct devlink_trap - Immutable packet trap attributes.
 594 * @type: Trap type.
 595 * @init_action: Initial trap action.
 596 * @generic: Whether the trap is generic or not.
 597 * @id: Trap identifier.
 598 * @name: Trap name.
 599 * @init_group_id: Initial group identifier.
 600 * @metadata_cap: Metadata types that can be provided by the trap.
 601 *
 602 * Describes immutable attributes of packet traps that drivers register with
 603 * devlink.
 604 */
 605struct devlink_trap {
 606        enum devlink_trap_type type;
 607        enum devlink_trap_action init_action;
 608        bool generic;
 609        u16 id;
 610        const char *name;
 611        u16 init_group_id;
 612        u32 metadata_cap;
 613};
 614
 615/* All traps must be documented in
 616 * Documentation/networking/devlink/devlink-trap.rst
 617 */
 618enum devlink_trap_generic_id {
 619        DEVLINK_TRAP_GENERIC_ID_SMAC_MC,
 620        DEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH,
 621        DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER,
 622        DEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER,
 623        DEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST,
 624        DEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER,
 625        DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE,
 626        DEVLINK_TRAP_GENERIC_ID_TTL_ERROR,
 627        DEVLINK_TRAP_GENERIC_ID_TAIL_DROP,
 628        DEVLINK_TRAP_GENERIC_ID_NON_IP_PACKET,
 629        DEVLINK_TRAP_GENERIC_ID_UC_DIP_MC_DMAC,
 630        DEVLINK_TRAP_GENERIC_ID_DIP_LB,
 631        DEVLINK_TRAP_GENERIC_ID_SIP_MC,
 632        DEVLINK_TRAP_GENERIC_ID_SIP_LB,
 633        DEVLINK_TRAP_GENERIC_ID_CORRUPTED_IP_HDR,
 634        DEVLINK_TRAP_GENERIC_ID_IPV4_SIP_BC,
 635        DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_RESERVED_SCOPE,
 636        DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE,
 637        DEVLINK_TRAP_GENERIC_ID_MTU_ERROR,
 638        DEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH,
 639        DEVLINK_TRAP_GENERIC_ID_RPF,
 640        DEVLINK_TRAP_GENERIC_ID_REJECT_ROUTE,
 641        DEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS,
 642        DEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS,
 643        DEVLINK_TRAP_GENERIC_ID_NON_ROUTABLE,
 644        DEVLINK_TRAP_GENERIC_ID_DECAP_ERROR,
 645        DEVLINK_TRAP_GENERIC_ID_OVERLAY_SMAC_MC,
 646        DEVLINK_TRAP_GENERIC_ID_INGRESS_FLOW_ACTION_DROP,
 647        DEVLINK_TRAP_GENERIC_ID_EGRESS_FLOW_ACTION_DROP,
 648        DEVLINK_TRAP_GENERIC_ID_STP,
 649        DEVLINK_TRAP_GENERIC_ID_LACP,
 650        DEVLINK_TRAP_GENERIC_ID_LLDP,
 651        DEVLINK_TRAP_GENERIC_ID_IGMP_QUERY,
 652        DEVLINK_TRAP_GENERIC_ID_IGMP_V1_REPORT,
 653        DEVLINK_TRAP_GENERIC_ID_IGMP_V2_REPORT,
 654        DEVLINK_TRAP_GENERIC_ID_IGMP_V3_REPORT,
 655        DEVLINK_TRAP_GENERIC_ID_IGMP_V2_LEAVE,
 656        DEVLINK_TRAP_GENERIC_ID_MLD_QUERY,
 657        DEVLINK_TRAP_GENERIC_ID_MLD_V1_REPORT,
 658        DEVLINK_TRAP_GENERIC_ID_MLD_V2_REPORT,
 659        DEVLINK_TRAP_GENERIC_ID_MLD_V1_DONE,
 660        DEVLINK_TRAP_GENERIC_ID_IPV4_DHCP,
 661        DEVLINK_TRAP_GENERIC_ID_IPV6_DHCP,
 662        DEVLINK_TRAP_GENERIC_ID_ARP_REQUEST,
 663        DEVLINK_TRAP_GENERIC_ID_ARP_RESPONSE,
 664        DEVLINK_TRAP_GENERIC_ID_ARP_OVERLAY,
 665        DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_SOLICIT,
 666        DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_ADVERT,
 667        DEVLINK_TRAP_GENERIC_ID_IPV4_BFD,
 668        DEVLINK_TRAP_GENERIC_ID_IPV6_BFD,
 669        DEVLINK_TRAP_GENERIC_ID_IPV4_OSPF,
 670        DEVLINK_TRAP_GENERIC_ID_IPV6_OSPF,
 671        DEVLINK_TRAP_GENERIC_ID_IPV4_BGP,
 672        DEVLINK_TRAP_GENERIC_ID_IPV6_BGP,
 673        DEVLINK_TRAP_GENERIC_ID_IPV4_VRRP,
 674        DEVLINK_TRAP_GENERIC_ID_IPV6_VRRP,
 675        DEVLINK_TRAP_GENERIC_ID_IPV4_PIM,
 676        DEVLINK_TRAP_GENERIC_ID_IPV6_PIM,
 677        DEVLINK_TRAP_GENERIC_ID_UC_LB,
 678        DEVLINK_TRAP_GENERIC_ID_LOCAL_ROUTE,
 679        DEVLINK_TRAP_GENERIC_ID_EXTERNAL_ROUTE,
 680        DEVLINK_TRAP_GENERIC_ID_IPV6_UC_DIP_LINK_LOCAL_SCOPE,
 681        DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_NODES,
 682        DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_ROUTERS,
 683        DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_SOLICIT,
 684        DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ADVERT,
 685        DEVLINK_TRAP_GENERIC_ID_IPV6_REDIRECT,
 686        DEVLINK_TRAP_GENERIC_ID_IPV4_ROUTER_ALERT,
 687        DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ALERT,
 688        DEVLINK_TRAP_GENERIC_ID_PTP_EVENT,
 689        DEVLINK_TRAP_GENERIC_ID_PTP_GENERAL,
 690        DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_SAMPLE,
 691        DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_TRAP,
 692
 693        /* Add new generic trap IDs above */
 694        __DEVLINK_TRAP_GENERIC_ID_MAX,
 695        DEVLINK_TRAP_GENERIC_ID_MAX = __DEVLINK_TRAP_GENERIC_ID_MAX - 1,
 696};
 697
 698/* All trap groups must be documented in
 699 * Documentation/networking/devlink/devlink-trap.rst
 700 */
 701enum devlink_trap_group_generic_id {
 702        DEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS,
 703        DEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS,
 704        DEVLINK_TRAP_GROUP_GENERIC_ID_L3_EXCEPTIONS,
 705        DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS,
 706        DEVLINK_TRAP_GROUP_GENERIC_ID_TUNNEL_DROPS,
 707        DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_DROPS,
 708        DEVLINK_TRAP_GROUP_GENERIC_ID_STP,
 709        DEVLINK_TRAP_GROUP_GENERIC_ID_LACP,
 710        DEVLINK_TRAP_GROUP_GENERIC_ID_LLDP,
 711        DEVLINK_TRAP_GROUP_GENERIC_ID_MC_SNOOPING,
 712        DEVLINK_TRAP_GROUP_GENERIC_ID_DHCP,
 713        DEVLINK_TRAP_GROUP_GENERIC_ID_NEIGH_DISCOVERY,
 714        DEVLINK_TRAP_GROUP_GENERIC_ID_BFD,
 715        DEVLINK_TRAP_GROUP_GENERIC_ID_OSPF,
 716        DEVLINK_TRAP_GROUP_GENERIC_ID_BGP,
 717        DEVLINK_TRAP_GROUP_GENERIC_ID_VRRP,
 718        DEVLINK_TRAP_GROUP_GENERIC_ID_PIM,
 719        DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB,
 720        DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY,
 721        DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY,
 722        DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6,
 723        DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT,
 724        DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL,
 725        DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_SAMPLE,
 726        DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_TRAP,
 727
 728        /* Add new generic trap group IDs above */
 729        __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX,
 730        DEVLINK_TRAP_GROUP_GENERIC_ID_MAX =
 731                __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX - 1,
 732};
 733
 734#define DEVLINK_TRAP_GENERIC_NAME_SMAC_MC \
 735        "source_mac_is_multicast"
 736#define DEVLINK_TRAP_GENERIC_NAME_VLAN_TAG_MISMATCH \
 737        "vlan_tag_mismatch"
 738#define DEVLINK_TRAP_GENERIC_NAME_INGRESS_VLAN_FILTER \
 739        "ingress_vlan_filter"
 740#define DEVLINK_TRAP_GENERIC_NAME_INGRESS_STP_FILTER \
 741        "ingress_spanning_tree_filter"
 742#define DEVLINK_TRAP_GENERIC_NAME_EMPTY_TX_LIST \
 743        "port_list_is_empty"
 744#define DEVLINK_TRAP_GENERIC_NAME_PORT_LOOPBACK_FILTER \
 745        "port_loopback_filter"
 746#define DEVLINK_TRAP_GENERIC_NAME_BLACKHOLE_ROUTE \
 747        "blackhole_route"
 748#define DEVLINK_TRAP_GENERIC_NAME_TTL_ERROR \
 749        "ttl_value_is_too_small"
 750#define DEVLINK_TRAP_GENERIC_NAME_TAIL_DROP \
 751        "tail_drop"
 752#define DEVLINK_TRAP_GENERIC_NAME_NON_IP_PACKET \
 753        "non_ip"
 754#define DEVLINK_TRAP_GENERIC_NAME_UC_DIP_MC_DMAC \
 755        "uc_dip_over_mc_dmac"
 756#define DEVLINK_TRAP_GENERIC_NAME_DIP_LB \
 757        "dip_is_loopback_address"
 758#define DEVLINK_TRAP_GENERIC_NAME_SIP_MC \
 759        "sip_is_mc"
 760#define DEVLINK_TRAP_GENERIC_NAME_SIP_LB \
 761        "sip_is_loopback_address"
 762#define DEVLINK_TRAP_GENERIC_NAME_CORRUPTED_IP_HDR \
 763        "ip_header_corrupted"
 764#define DEVLINK_TRAP_GENERIC_NAME_IPV4_SIP_BC \
 765        "ipv4_sip_is_limited_bc"
 766#define DEVLINK_TRAP_GENERIC_NAME_IPV6_MC_DIP_RESERVED_SCOPE \
 767        "ipv6_mc_dip_reserved_scope"
 768#define DEVLINK_TRAP_GENERIC_NAME_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE \
 769        "ipv6_mc_dip_interface_local_scope"
 770#define DEVLINK_TRAP_GENERIC_NAME_MTU_ERROR \
 771        "mtu_value_is_too_small"
 772#define DEVLINK_TRAP_GENERIC_NAME_UNRESOLVED_NEIGH \
 773        "unresolved_neigh"
 774#define DEVLINK_TRAP_GENERIC_NAME_RPF \
 775        "mc_reverse_path_forwarding"
 776#define DEVLINK_TRAP_GENERIC_NAME_REJECT_ROUTE \
 777        "reject_route"
 778#define DEVLINK_TRAP_GENERIC_NAME_IPV4_LPM_UNICAST_MISS \
 779        "ipv4_lpm_miss"
 780#define DEVLINK_TRAP_GENERIC_NAME_IPV6_LPM_UNICAST_MISS \
 781        "ipv6_lpm_miss"
 782#define DEVLINK_TRAP_GENERIC_NAME_NON_ROUTABLE \
 783        "non_routable_packet"
 784#define DEVLINK_TRAP_GENERIC_NAME_DECAP_ERROR \
 785        "decap_error"
 786#define DEVLINK_TRAP_GENERIC_NAME_OVERLAY_SMAC_MC \
 787        "overlay_smac_is_mc"
 788#define DEVLINK_TRAP_GENERIC_NAME_INGRESS_FLOW_ACTION_DROP \
 789        "ingress_flow_action_drop"
 790#define DEVLINK_TRAP_GENERIC_NAME_EGRESS_FLOW_ACTION_DROP \
 791        "egress_flow_action_drop"
 792#define DEVLINK_TRAP_GENERIC_NAME_STP \
 793        "stp"
 794#define DEVLINK_TRAP_GENERIC_NAME_LACP \
 795        "lacp"
 796#define DEVLINK_TRAP_GENERIC_NAME_LLDP \
 797        "lldp"
 798#define DEVLINK_TRAP_GENERIC_NAME_IGMP_QUERY \
 799        "igmp_query"
 800#define DEVLINK_TRAP_GENERIC_NAME_IGMP_V1_REPORT \
 801        "igmp_v1_report"
 802#define DEVLINK_TRAP_GENERIC_NAME_IGMP_V2_REPORT \
 803        "igmp_v2_report"
 804#define DEVLINK_TRAP_GENERIC_NAME_IGMP_V3_REPORT \
 805        "igmp_v3_report"
 806#define DEVLINK_TRAP_GENERIC_NAME_IGMP_V2_LEAVE \
 807        "igmp_v2_leave"
 808#define DEVLINK_TRAP_GENERIC_NAME_MLD_QUERY \
 809        "mld_query"
 810#define DEVLINK_TRAP_GENERIC_NAME_MLD_V1_REPORT \
 811        "mld_v1_report"
 812#define DEVLINK_TRAP_GENERIC_NAME_MLD_V2_REPORT \
 813        "mld_v2_report"
 814#define DEVLINK_TRAP_GENERIC_NAME_MLD_V1_DONE \
 815        "mld_v1_done"
 816#define DEVLINK_TRAP_GENERIC_NAME_IPV4_DHCP \
 817        "ipv4_dhcp"
 818#define DEVLINK_TRAP_GENERIC_NAME_IPV6_DHCP \
 819        "ipv6_dhcp"
 820#define DEVLINK_TRAP_GENERIC_NAME_ARP_REQUEST \
 821        "arp_request"
 822#define DEVLINK_TRAP_GENERIC_NAME_ARP_RESPONSE \
 823        "arp_response"
 824#define DEVLINK_TRAP_GENERIC_NAME_ARP_OVERLAY \
 825        "arp_overlay"
 826#define DEVLINK_TRAP_GENERIC_NAME_IPV6_NEIGH_SOLICIT \
 827        "ipv6_neigh_solicit"
 828#define DEVLINK_TRAP_GENERIC_NAME_IPV6_NEIGH_ADVERT \
 829        "ipv6_neigh_advert"
 830#define DEVLINK_TRAP_GENERIC_NAME_IPV4_BFD \
 831        "ipv4_bfd"
 832#define DEVLINK_TRAP_GENERIC_NAME_IPV6_BFD \
 833        "ipv6_bfd"
 834#define DEVLINK_TRAP_GENERIC_NAME_IPV4_OSPF \
 835        "ipv4_ospf"
 836#define DEVLINK_TRAP_GENERIC_NAME_IPV6_OSPF \
 837        "ipv6_ospf"
 838#define DEVLINK_TRAP_GENERIC_NAME_IPV4_BGP \
 839        "ipv4_bgp"
 840#define DEVLINK_TRAP_GENERIC_NAME_IPV6_BGP \
 841        "ipv6_bgp"
 842#define DEVLINK_TRAP_GENERIC_NAME_IPV4_VRRP \
 843        "ipv4_vrrp"
 844#define DEVLINK_TRAP_GENERIC_NAME_IPV6_VRRP \
 845        "ipv6_vrrp"
 846#define DEVLINK_TRAP_GENERIC_NAME_IPV4_PIM \
 847        "ipv4_pim"
 848#define DEVLINK_TRAP_GENERIC_NAME_IPV6_PIM \
 849        "ipv6_pim"
 850#define DEVLINK_TRAP_GENERIC_NAME_UC_LB \
 851        "uc_loopback"
 852#define DEVLINK_TRAP_GENERIC_NAME_LOCAL_ROUTE \
 853        "local_route"
 854#define DEVLINK_TRAP_GENERIC_NAME_EXTERNAL_ROUTE \
 855        "external_route"
 856#define DEVLINK_TRAP_GENERIC_NAME_IPV6_UC_DIP_LINK_LOCAL_SCOPE \
 857        "ipv6_uc_dip_link_local_scope"
 858#define DEVLINK_TRAP_GENERIC_NAME_IPV6_DIP_ALL_NODES \
 859        "ipv6_dip_all_nodes"
 860#define DEVLINK_TRAP_GENERIC_NAME_IPV6_DIP_ALL_ROUTERS \
 861        "ipv6_dip_all_routers"
 862#define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_SOLICIT \
 863        "ipv6_router_solicit"
 864#define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_ADVERT \
 865        "ipv6_router_advert"
 866#define DEVLINK_TRAP_GENERIC_NAME_IPV6_REDIRECT \
 867        "ipv6_redirect"
 868#define DEVLINK_TRAP_GENERIC_NAME_IPV4_ROUTER_ALERT \
 869        "ipv4_router_alert"
 870#define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_ALERT \
 871        "ipv6_router_alert"
 872#define DEVLINK_TRAP_GENERIC_NAME_PTP_EVENT \
 873        "ptp_event"
 874#define DEVLINK_TRAP_GENERIC_NAME_PTP_GENERAL \
 875        "ptp_general"
 876#define DEVLINK_TRAP_GENERIC_NAME_FLOW_ACTION_SAMPLE \
 877        "flow_action_sample"
 878#define DEVLINK_TRAP_GENERIC_NAME_FLOW_ACTION_TRAP \
 879        "flow_action_trap"
 880
 881#define DEVLINK_TRAP_GROUP_GENERIC_NAME_L2_DROPS \
 882        "l2_drops"
 883#define DEVLINK_TRAP_GROUP_GENERIC_NAME_L3_DROPS \
 884        "l3_drops"
 885#define DEVLINK_TRAP_GROUP_GENERIC_NAME_L3_EXCEPTIONS \
 886        "l3_exceptions"
 887#define DEVLINK_TRAP_GROUP_GENERIC_NAME_BUFFER_DROPS \
 888        "buffer_drops"
 889#define DEVLINK_TRAP_GROUP_GENERIC_NAME_TUNNEL_DROPS \
 890        "tunnel_drops"
 891#define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_DROPS \
 892        "acl_drops"
 893#define DEVLINK_TRAP_GROUP_GENERIC_NAME_STP \
 894        "stp"
 895#define DEVLINK_TRAP_GROUP_GENERIC_NAME_LACP \
 896        "lacp"
 897#define DEVLINK_TRAP_GROUP_GENERIC_NAME_LLDP \
 898        "lldp"
 899#define DEVLINK_TRAP_GROUP_GENERIC_NAME_MC_SNOOPING  \
 900        "mc_snooping"
 901#define DEVLINK_TRAP_GROUP_GENERIC_NAME_DHCP \
 902        "dhcp"
 903#define DEVLINK_TRAP_GROUP_GENERIC_NAME_NEIGH_DISCOVERY \
 904        "neigh_discovery"
 905#define DEVLINK_TRAP_GROUP_GENERIC_NAME_BFD \
 906        "bfd"
 907#define DEVLINK_TRAP_GROUP_GENERIC_NAME_OSPF \
 908        "ospf"
 909#define DEVLINK_TRAP_GROUP_GENERIC_NAME_BGP \
 910        "bgp"
 911#define DEVLINK_TRAP_GROUP_GENERIC_NAME_VRRP \
 912        "vrrp"
 913#define DEVLINK_TRAP_GROUP_GENERIC_NAME_PIM \
 914        "pim"
 915#define DEVLINK_TRAP_GROUP_GENERIC_NAME_UC_LB \
 916        "uc_loopback"
 917#define DEVLINK_TRAP_GROUP_GENERIC_NAME_LOCAL_DELIVERY \
 918        "local_delivery"
 919#define DEVLINK_TRAP_GROUP_GENERIC_NAME_EXTERNAL_DELIVERY \
 920        "external_delivery"
 921#define DEVLINK_TRAP_GROUP_GENERIC_NAME_IPV6 \
 922        "ipv6"
 923#define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_EVENT \
 924        "ptp_event"
 925#define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_GENERAL \
 926        "ptp_general"
 927#define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_SAMPLE \
 928        "acl_sample"
 929#define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_TRAP \
 930        "acl_trap"
 931
 932#define DEVLINK_TRAP_GENERIC(_type, _init_action, _id, _group_id,             \
 933                             _metadata_cap)                                   \
 934        {                                                                     \
 935                .type = DEVLINK_TRAP_TYPE_##_type,                            \
 936                .init_action = DEVLINK_TRAP_ACTION_##_init_action,            \
 937                .generic = true,                                              \
 938                .id = DEVLINK_TRAP_GENERIC_ID_##_id,                          \
 939                .name = DEVLINK_TRAP_GENERIC_NAME_##_id,                      \
 940                .init_group_id = _group_id,                                   \
 941                .metadata_cap = _metadata_cap,                                \
 942        }
 943
 944#define DEVLINK_TRAP_DRIVER(_type, _init_action, _id, _name, _group_id,       \
 945                            _metadata_cap)                                    \
 946        {                                                                     \
 947                .type = DEVLINK_TRAP_TYPE_##_type,                            \
 948                .init_action = DEVLINK_TRAP_ACTION_##_init_action,            \
 949                .generic = false,                                             \
 950                .id = _id,                                                    \
 951                .name = _name,                                                \
 952                .init_group_id = _group_id,                                   \
 953                .metadata_cap = _metadata_cap,                                \
 954        }
 955
 956#define DEVLINK_TRAP_GROUP_GENERIC(_id, _policer_id)                          \
 957        {                                                                     \
 958                .name = DEVLINK_TRAP_GROUP_GENERIC_NAME_##_id,                \
 959                .id = DEVLINK_TRAP_GROUP_GENERIC_ID_##_id,                    \
 960                .generic = true,                                              \
 961                .init_policer_id = _policer_id,                               \
 962        }
 963
 964#define DEVLINK_TRAP_POLICER(_id, _rate, _burst, _max_rate, _min_rate,        \
 965                             _max_burst, _min_burst)                          \
 966        {                                                                     \
 967                .id = _id,                                                    \
 968                .init_rate = _rate,                                           \
 969                .init_burst = _burst,                                         \
 970                .max_rate = _max_rate,                                        \
 971                .min_rate = _min_rate,                                        \
 972                .max_burst = _max_burst,                                      \
 973                .min_burst = _min_burst,                                      \
 974        }
 975
 976struct devlink_ops {
 977        int (*reload_down)(struct devlink *devlink, bool netns_change,
 978                           struct netlink_ext_ack *extack);
 979        int (*reload_up)(struct devlink *devlink,
 980                         struct netlink_ext_ack *extack);
 981        int (*port_type_set)(struct devlink_port *devlink_port,
 982                             enum devlink_port_type port_type);
 983        int (*port_split)(struct devlink *devlink, unsigned int port_index,
 984                          unsigned int count, struct netlink_ext_ack *extack);
 985        int (*port_unsplit)(struct devlink *devlink, unsigned int port_index,
 986                            struct netlink_ext_ack *extack);
 987        int (*sb_pool_get)(struct devlink *devlink, unsigned int sb_index,
 988                           u16 pool_index,
 989                           struct devlink_sb_pool_info *pool_info);
 990        int (*sb_pool_set)(struct devlink *devlink, unsigned int sb_index,
 991                           u16 pool_index, u32 size,
 992                           enum devlink_sb_threshold_type threshold_type,
 993                           struct netlink_ext_ack *extack);
 994        int (*sb_port_pool_get)(struct devlink_port *devlink_port,
 995                                unsigned int sb_index, u16 pool_index,
 996                                u32 *p_threshold);
 997        int (*sb_port_pool_set)(struct devlink_port *devlink_port,
 998                                unsigned int sb_index, u16 pool_index,
 999                                u32 threshold, struct netlink_ext_ack *extack);
1000        int (*sb_tc_pool_bind_get)(struct devlink_port *devlink_port,
1001                                   unsigned int sb_index,
1002                                   u16 tc_index,
1003                                   enum devlink_sb_pool_type pool_type,
1004                                   u16 *p_pool_index, u32 *p_threshold);
1005        int (*sb_tc_pool_bind_set)(struct devlink_port *devlink_port,
1006                                   unsigned int sb_index,
1007                                   u16 tc_index,
1008                                   enum devlink_sb_pool_type pool_type,
1009                                   u16 pool_index, u32 threshold,
1010                                   struct netlink_ext_ack *extack);
1011        int (*sb_occ_snapshot)(struct devlink *devlink,
1012                               unsigned int sb_index);
1013        int (*sb_occ_max_clear)(struct devlink *devlink,
1014                                unsigned int sb_index);
1015        int (*sb_occ_port_pool_get)(struct devlink_port *devlink_port,
1016                                    unsigned int sb_index, u16 pool_index,
1017                                    u32 *p_cur, u32 *p_max);
1018        int (*sb_occ_tc_port_bind_get)(struct devlink_port *devlink_port,
1019                                       unsigned int sb_index,
1020                                       u16 tc_index,
1021                                       enum devlink_sb_pool_type pool_type,
1022                                       u32 *p_cur, u32 *p_max);
1023
1024        int (*eswitch_mode_get)(struct devlink *devlink, u16 *p_mode);
1025        int (*eswitch_mode_set)(struct devlink *devlink, u16 mode,
1026                                struct netlink_ext_ack *extack);
1027        int (*eswitch_inline_mode_get)(struct devlink *devlink, u8 *p_inline_mode);
1028        int (*eswitch_inline_mode_set)(struct devlink *devlink, u8 inline_mode,
1029                                       struct netlink_ext_ack *extack);
1030        int (*eswitch_encap_mode_get)(struct devlink *devlink,
1031                                      enum devlink_eswitch_encap_mode *p_encap_mode);
1032        int (*eswitch_encap_mode_set)(struct devlink *devlink,
1033                                      enum devlink_eswitch_encap_mode encap_mode,
1034                                      struct netlink_ext_ack *extack);
1035        int (*info_get)(struct devlink *devlink, struct devlink_info_req *req,
1036                        struct netlink_ext_ack *extack);
1037        int (*flash_update)(struct devlink *devlink, const char *file_name,
1038                            const char *component,
1039                            struct netlink_ext_ack *extack);
1040        /**
1041         * @trap_init: Trap initialization function.
1042         *
1043         * Should be used by device drivers to initialize the trap in the
1044         * underlying device. Drivers should also store the provided trap
1045         * context, so that they could efficiently pass it to
1046         * devlink_trap_report() when the trap is triggered.
1047         */
1048        int (*trap_init)(struct devlink *devlink,
1049                         const struct devlink_trap *trap, void *trap_ctx);
1050        /**
1051         * @trap_fini: Trap de-initialization function.
1052         *
1053         * Should be used by device drivers to de-initialize the trap in the
1054         * underlying device.
1055         */
1056        void (*trap_fini)(struct devlink *devlink,
1057                          const struct devlink_trap *trap, void *trap_ctx);
1058        /**
1059         * @trap_action_set: Trap action set function.
1060         */
1061        int (*trap_action_set)(struct devlink *devlink,
1062                               const struct devlink_trap *trap,
1063                               enum devlink_trap_action action);
1064        /**
1065         * @trap_group_init: Trap group initialization function.
1066         *
1067         * Should be used by device drivers to initialize the trap group in the
1068         * underlying device.
1069         */
1070        int (*trap_group_init)(struct devlink *devlink,
1071                               const struct devlink_trap_group *group);
1072        /**
1073         * @trap_group_set: Trap group parameters set function.
1074         *
1075         * Note: @policer can be NULL when a policer is being unbound from
1076         * @group.
1077         */
1078        int (*trap_group_set)(struct devlink *devlink,
1079                              const struct devlink_trap_group *group,
1080                              const struct devlink_trap_policer *policer);
1081        /**
1082         * @trap_policer_init: Trap policer initialization function.
1083         *
1084         * Should be used by device drivers to initialize the trap policer in
1085         * the underlying device.
1086         */
1087        int (*trap_policer_init)(struct devlink *devlink,
1088                                 const struct devlink_trap_policer *policer);
1089        /**
1090         * @trap_policer_fini: Trap policer de-initialization function.
1091         *
1092         * Should be used by device drivers to de-initialize the trap policer
1093         * in the underlying device.
1094         */
1095        void (*trap_policer_fini)(struct devlink *devlink,
1096                                  const struct devlink_trap_policer *policer);
1097        /**
1098         * @trap_policer_set: Trap policer parameters set function.
1099         */
1100        int (*trap_policer_set)(struct devlink *devlink,
1101                                const struct devlink_trap_policer *policer,
1102                                u64 rate, u64 burst,
1103                                struct netlink_ext_ack *extack);
1104        /**
1105         * @trap_policer_counter_get: Trap policer counter get function.
1106         *
1107         * Should be used by device drivers to report number of packets dropped
1108         * by the policer.
1109         */
1110        int (*trap_policer_counter_get)(struct devlink *devlink,
1111                                        const struct devlink_trap_policer *policer,
1112                                        u64 *p_drops);
1113};
1114
1115static inline void *devlink_priv(struct devlink *devlink)
1116{
1117        BUG_ON(!devlink);
1118        return &devlink->priv;
1119}
1120
1121static inline struct devlink *priv_to_devlink(void *priv)
1122{
1123        BUG_ON(!priv);
1124        return container_of(priv, struct devlink, priv);
1125}
1126
1127static inline struct devlink_port *
1128netdev_to_devlink_port(struct net_device *dev)
1129{
1130        if (dev->netdev_ops->ndo_get_devlink_port)
1131                return dev->netdev_ops->ndo_get_devlink_port(dev);
1132        return NULL;
1133}
1134
1135static inline struct devlink *netdev_to_devlink(struct net_device *dev)
1136{
1137        struct devlink_port *devlink_port = netdev_to_devlink_port(dev);
1138
1139        if (devlink_port)
1140                return devlink_port->devlink;
1141        return NULL;
1142}
1143
1144struct ib_device;
1145
1146struct net *devlink_net(const struct devlink *devlink);
1147void devlink_net_set(struct devlink *devlink, struct net *net);
1148struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size);
1149int devlink_register(struct devlink *devlink, struct device *dev);
1150void devlink_unregister(struct devlink *devlink);
1151void devlink_reload_enable(struct devlink *devlink);
1152void devlink_reload_disable(struct devlink *devlink);
1153void devlink_free(struct devlink *devlink);
1154int devlink_port_register(struct devlink *devlink,
1155                          struct devlink_port *devlink_port,
1156                          unsigned int port_index);
1157void devlink_port_unregister(struct devlink_port *devlink_port);
1158void devlink_port_type_eth_set(struct devlink_port *devlink_port,
1159                               struct net_device *netdev);
1160void devlink_port_type_ib_set(struct devlink_port *devlink_port,
1161                              struct ib_device *ibdev);
1162void devlink_port_type_clear(struct devlink_port *devlink_port);
1163void devlink_port_attrs_set(struct devlink_port *devlink_port,
1164                            enum devlink_port_flavour flavour,
1165                            u32 port_number, bool split,
1166                            u32 split_subport_number,
1167                            const unsigned char *switch_id,
1168                            unsigned char switch_id_len);
1169void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port,
1170                                   const unsigned char *switch_id,
1171                                   unsigned char switch_id_len, u16 pf);
1172void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port,
1173                                   const unsigned char *switch_id,
1174                                   unsigned char switch_id_len,
1175                                   u16 pf, u16 vf);
1176int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
1177                        u32 size, u16 ingress_pools_count,
1178                        u16 egress_pools_count, u16 ingress_tc_count,
1179                        u16 egress_tc_count);
1180void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index);
1181int devlink_dpipe_table_register(struct devlink *devlink,
1182                                 const char *table_name,
1183                                 struct devlink_dpipe_table_ops *table_ops,
1184                                 void *priv, bool counter_control_extern);
1185void devlink_dpipe_table_unregister(struct devlink *devlink,
1186                                    const char *table_name);
1187int devlink_dpipe_headers_register(struct devlink *devlink,
1188                                   struct devlink_dpipe_headers *dpipe_headers);
1189void devlink_dpipe_headers_unregister(struct devlink *devlink);
1190bool devlink_dpipe_table_counter_enabled(struct devlink *devlink,
1191                                         const char *table_name);
1192int devlink_dpipe_entry_ctx_prepare(struct devlink_dpipe_dump_ctx *dump_ctx);
1193int devlink_dpipe_entry_ctx_append(struct devlink_dpipe_dump_ctx *dump_ctx,
1194                                   struct devlink_dpipe_entry *entry);
1195int devlink_dpipe_entry_ctx_close(struct devlink_dpipe_dump_ctx *dump_ctx);
1196void devlink_dpipe_entry_clear(struct devlink_dpipe_entry *entry);
1197int devlink_dpipe_action_put(struct sk_buff *skb,
1198                             struct devlink_dpipe_action *action);
1199int devlink_dpipe_match_put(struct sk_buff *skb,
1200                            struct devlink_dpipe_match *match);
1201extern struct devlink_dpipe_header devlink_dpipe_header_ethernet;
1202extern struct devlink_dpipe_header devlink_dpipe_header_ipv4;
1203extern struct devlink_dpipe_header devlink_dpipe_header_ipv6;
1204
1205int devlink_resource_register(struct devlink *devlink,
1206                              const char *resource_name,
1207                              u64 resource_size,
1208                              u64 resource_id,
1209                              u64 parent_resource_id,
1210                              const struct devlink_resource_size_params *size_params);
1211void devlink_resources_unregister(struct devlink *devlink,
1212                                  struct devlink_resource *resource);
1213int devlink_resource_size_get(struct devlink *devlink,
1214                              u64 resource_id,
1215                              u64 *p_resource_size);
1216int devlink_dpipe_table_resource_set(struct devlink *devlink,
1217                                     const char *table_name, u64 resource_id,
1218                                     u64 resource_units);
1219void devlink_resource_occ_get_register(struct devlink *devlink,
1220                                       u64 resource_id,
1221                                       devlink_resource_occ_get_t *occ_get,
1222                                       void *occ_get_priv);
1223void devlink_resource_occ_get_unregister(struct devlink *devlink,
1224                                         u64 resource_id);
1225int devlink_params_register(struct devlink *devlink,
1226                            const struct devlink_param *params,
1227                            size_t params_count);
1228void devlink_params_unregister(struct devlink *devlink,
1229                               const struct devlink_param *params,
1230                               size_t params_count);
1231void devlink_params_publish(struct devlink *devlink);
1232void devlink_params_unpublish(struct devlink *devlink);
1233int devlink_port_params_register(struct devlink_port *devlink_port,
1234                                 const struct devlink_param *params,
1235                                 size_t params_count);
1236void devlink_port_params_unregister(struct devlink_port *devlink_port,
1237                                    const struct devlink_param *params,
1238                                    size_t params_count);
1239int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
1240                                       union devlink_param_value *init_val);
1241int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
1242                                       union devlink_param_value init_val);
1243int
1244devlink_port_param_driverinit_value_get(struct devlink_port *devlink_port,
1245                                        u32 param_id,
1246                                        union devlink_param_value *init_val);
1247int devlink_port_param_driverinit_value_set(struct devlink_port *devlink_port,
1248                                            u32 param_id,
1249                                            union devlink_param_value init_val);
1250void devlink_param_value_changed(struct devlink *devlink, u32 param_id);
1251void devlink_port_param_value_changed(struct devlink_port *devlink_port,
1252                                      u32 param_id);
1253void devlink_param_value_str_fill(union devlink_param_value *dst_val,
1254                                  const char *src);
1255struct devlink_region *
1256devlink_region_create(struct devlink *devlink,
1257                      const struct devlink_region_ops *ops,
1258                      u32 region_max_snapshots, u64 region_size);
1259void devlink_region_destroy(struct devlink_region *region);
1260int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id);
1261void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id);
1262int devlink_region_snapshot_create(struct devlink_region *region,
1263                                   u8 *data, u32 snapshot_id);
1264int devlink_info_serial_number_put(struct devlink_info_req *req,
1265                                   const char *sn);
1266int devlink_info_driver_name_put(struct devlink_info_req *req,
1267                                 const char *name);
1268int devlink_info_version_fixed_put(struct devlink_info_req *req,
1269                                   const char *version_name,
1270                                   const char *version_value);
1271int devlink_info_version_stored_put(struct devlink_info_req *req,
1272                                    const char *version_name,
1273                                    const char *version_value);
1274int devlink_info_version_running_put(struct devlink_info_req *req,
1275                                     const char *version_name,
1276                                     const char *version_value);
1277
1278int devlink_fmsg_obj_nest_start(struct devlink_fmsg *fmsg);
1279int devlink_fmsg_obj_nest_end(struct devlink_fmsg *fmsg);
1280
1281int devlink_fmsg_pair_nest_start(struct devlink_fmsg *fmsg, const char *name);
1282int devlink_fmsg_pair_nest_end(struct devlink_fmsg *fmsg);
1283
1284int devlink_fmsg_arr_pair_nest_start(struct devlink_fmsg *fmsg,
1285                                     const char *name);
1286int devlink_fmsg_arr_pair_nest_end(struct devlink_fmsg *fmsg);
1287int devlink_fmsg_binary_pair_nest_start(struct devlink_fmsg *fmsg,
1288                                        const char *name);
1289int devlink_fmsg_binary_pair_nest_end(struct devlink_fmsg *fmsg);
1290
1291int devlink_fmsg_bool_put(struct devlink_fmsg *fmsg, bool value);
1292int devlink_fmsg_u8_put(struct devlink_fmsg *fmsg, u8 value);
1293int devlink_fmsg_u32_put(struct devlink_fmsg *fmsg, u32 value);
1294int devlink_fmsg_u64_put(struct devlink_fmsg *fmsg, u64 value);
1295int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value);
1296int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value,
1297                            u16 value_len);
1298
1299int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name,
1300                               bool value);
1301int devlink_fmsg_u8_pair_put(struct devlink_fmsg *fmsg, const char *name,
1302                             u8 value);
1303int devlink_fmsg_u32_pair_put(struct devlink_fmsg *fmsg, const char *name,
1304                              u32 value);
1305int devlink_fmsg_u64_pair_put(struct devlink_fmsg *fmsg, const char *name,
1306                              u64 value);
1307int devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name,
1308                                 const char *value);
1309int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name,
1310                                 const void *value, u32 value_len);
1311
1312struct devlink_health_reporter *
1313devlink_health_reporter_create(struct devlink *devlink,
1314                               const struct devlink_health_reporter_ops *ops,
1315                               u64 graceful_period, void *priv);
1316void
1317devlink_health_reporter_destroy(struct devlink_health_reporter *reporter);
1318
1319void *
1320devlink_health_reporter_priv(struct devlink_health_reporter *reporter);
1321int devlink_health_report(struct devlink_health_reporter *reporter,
1322                          const char *msg, void *priv_ctx);
1323void
1324devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
1325                                     enum devlink_health_reporter_state state);
1326void
1327devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter);
1328
1329bool devlink_is_reload_failed(const struct devlink *devlink);
1330
1331void devlink_flash_update_begin_notify(struct devlink *devlink);
1332void devlink_flash_update_end_notify(struct devlink *devlink);
1333void devlink_flash_update_status_notify(struct devlink *devlink,
1334                                        const char *status_msg,
1335                                        const char *component,
1336                                        unsigned long done,
1337                                        unsigned long total);
1338
1339int devlink_traps_register(struct devlink *devlink,
1340                           const struct devlink_trap *traps,
1341                           size_t traps_count, void *priv);
1342void devlink_traps_unregister(struct devlink *devlink,
1343                              const struct devlink_trap *traps,
1344                              size_t traps_count);
1345void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb,
1346                         void *trap_ctx, struct devlink_port *in_devlink_port,
1347                         const struct flow_action_cookie *fa_cookie);
1348void *devlink_trap_ctx_priv(void *trap_ctx);
1349int devlink_trap_groups_register(struct devlink *devlink,
1350                                 const struct devlink_trap_group *groups,
1351                                 size_t groups_count);
1352void devlink_trap_groups_unregister(struct devlink *devlink,
1353                                    const struct devlink_trap_group *groups,
1354                                    size_t groups_count);
1355int
1356devlink_trap_policers_register(struct devlink *devlink,
1357                               const struct devlink_trap_policer *policers,
1358                               size_t policers_count);
1359void
1360devlink_trap_policers_unregister(struct devlink *devlink,
1361                                 const struct devlink_trap_policer *policers,
1362                                 size_t policers_count);
1363
1364#if IS_ENABLED(CONFIG_NET_DEVLINK)
1365
1366void devlink_compat_running_version(struct net_device *dev,
1367                                    char *buf, size_t len);
1368int devlink_compat_flash_update(struct net_device *dev, const char *file_name);
1369int devlink_compat_phys_port_name_get(struct net_device *dev,
1370                                      char *name, size_t len);
1371int devlink_compat_switch_id_get(struct net_device *dev,
1372                                 struct netdev_phys_item_id *ppid);
1373
1374#else
1375
1376static inline void
1377devlink_compat_running_version(struct net_device *dev, char *buf, size_t len)
1378{
1379}
1380
1381static inline int
1382devlink_compat_flash_update(struct net_device *dev, const char *file_name)
1383{
1384        return -EOPNOTSUPP;
1385}
1386
1387static inline int
1388devlink_compat_phys_port_name_get(struct net_device *dev,
1389                                  char *name, size_t len)
1390{
1391        return -EOPNOTSUPP;
1392}
1393
1394static inline int
1395devlink_compat_switch_id_get(struct net_device *dev,
1396                             struct netdev_phys_item_id *ppid)
1397{
1398        return -EOPNOTSUPP;
1399}
1400
1401#endif
1402
1403#endif /* _NET_DEVLINK_H_ */
1404