linux/include/net/mctpdevice.h
Khang Nguyen 580db513b4 net: mctp: Expose transport binding identifier via IFLA attribute
MCTP control protocol implementations are transport binding dependent.
Endpoint discovery is mandatory based on transport binding.
Message timing requirements are specified in each respective transport
binding specification.

However, we currently have no means to get this information from MCTP
links.

Add a IFLA_MCTP_PHYS_BINDING netlink link attribute, which represents
the transport type using the DMTF DSP0239-defined type numbers, returned
as part of RTM_GETLINK data.

We get an IFLA_MCTP_PHYS_BINDING attribute for each MCTP link, for
example:

- 0x00 (unspec) for loopback interface;
- 0x01 (SMBus/I2C) for mctpi2c%d interfaces; and
- 0x05 (serial) for mctpserial%d interfaces.

Signed-off-by: Khang Nguyen <khangng@os.amperecomputing.com>
Reviewed-by: Matt Johnston <matt@codeconstruct.com.au>
Link: https://patch.msgid.link/20241105071915.821871-1-khangng@os.amperecomputing.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2024-11-09 09:04:54 -08:00

59 lines
1.3 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Management Component Transport Protocol (MCTP) - device
* definitions.
*
* Copyright (c) 2021 Code Construct
* Copyright (c) 2021 Google
*/
#ifndef __NET_MCTPDEVICE_H
#define __NET_MCTPDEVICE_H
#include <linux/list.h>
#include <linux/types.h>
#include <linux/refcount.h>
struct mctp_sk_key;
struct mctp_dev {
struct net_device *dev;
refcount_t refs;
unsigned int net;
enum mctp_phys_binding binding;
const struct mctp_netdev_ops *ops;
/* Only modified under RTNL. Reads have addrs_lock held */
u8 *addrs;
size_t num_addrs;
spinlock_t addrs_lock;
struct rcu_head rcu;
};
struct mctp_netdev_ops {
void (*release_flow)(struct mctp_dev *dev,
struct mctp_sk_key *key);
};
#define MCTP_INITIAL_DEFAULT_NET 1
struct mctp_dev *mctp_dev_get_rtnl(const struct net_device *dev);
struct mctp_dev *__mctp_dev_get(const struct net_device *dev);
int mctp_register_netdev(struct net_device *dev,
const struct mctp_netdev_ops *ops,
enum mctp_phys_binding binding);
void mctp_unregister_netdev(struct net_device *dev);
void mctp_dev_hold(struct mctp_dev *mdev);
void mctp_dev_put(struct mctp_dev *mdev);
void mctp_dev_set_key(struct mctp_dev *dev, struct mctp_sk_key *key);
void mctp_dev_release_key(struct mctp_dev *dev, struct mctp_sk_key *key);
#endif /* __NET_MCTPDEVICE_H */