Skip to content

Commit

Permalink
mctp: Add device handling and netlink interface
Browse files Browse the repository at this point in the history
This change adds the infrastructure for managing MCTP netdevices; we add
a pointer to the AF_MCTP-specific data to struct netdevice, and hook up
the rtnetlink operations for adding and removing addresses.

Includes changes from Matt Johnston <matt@codeconstruct.com.au>.

Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
jk-ozlabs authored and davem330 committed Jul 29, 2021
1 parent 4b2e693 commit 583be98
Show file tree
Hide file tree
Showing 10 changed files with 491 additions and 1 deletion.
1 change: 1 addition & 0 deletions MAINTAINERS
Expand Up @@ -11039,6 +11039,7 @@ L: netdev@vger.kernel.org
S: Maintained
F: drivers/net/mctp/
F: include/net/mctp.h
F: include/net/mctpdevice.h
F: net/mctp/

MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
Expand Down
4 changes: 4 additions & 0 deletions include/linux/netdevice.h
Expand Up @@ -1823,6 +1823,7 @@ enum netdev_ml_priv_type {
* @ieee802154_ptr: IEEE 802.15.4 low-rate Wireless Personal Area Network
* device struct
* @mpls_ptr: mpls_dev struct pointer
* @mctp_ptr: MCTP specific data
*
* @dev_addr: Hw address (before bcast,
* because most packets are unicast)
Expand Down Expand Up @@ -2110,6 +2111,9 @@ struct net_device {
#if IS_ENABLED(CONFIG_MPLS_ROUTING)
struct mpls_dev __rcu *mpls_ptr;
#endif
#if IS_ENABLED(CONFIG_MCTP)
struct mctp_dev __rcu *mctp_ptr;
#endif

/*
* Cache lines mostly used on receive path (including eth_type_trans())
Expand Down
14 changes: 14 additions & 0 deletions include/net/mctp.h
Expand Up @@ -10,6 +10,7 @@
#define __NET_MCTP_H

#include <linux/bits.h>
#include <linux/mctp.h>

/* MCTP packet definitions */
struct mctp_hdr {
Expand All @@ -32,4 +33,17 @@ struct mctp_hdr {
#define MCTP_HDR_TAG_SHIFT 0
#define MCTP_HDR_TAG_MASK GENMASK(2, 0)

static inline bool mctp_address_ok(mctp_eid_t eid)
{
return eid >= 8 && eid < 255;
}

static inline struct mctp_hdr *mctp_hdr(struct sk_buff *skb)
{
return (struct mctp_hdr *)skb_network_header(skb);
}

void mctp_device_init(void);
void mctp_device_exit(void);

#endif /* __NET_MCTP_H */
35 changes: 35 additions & 0 deletions include/net/mctpdevice.h
@@ -0,0 +1,35 @@
/* 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_dev {
struct net_device *dev;

unsigned int net;

/* Only modified under RTNL. Reads have addrs_lock held */
u8 *addrs;
size_t num_addrs;
spinlock_t addrs_lock;

struct rcu_head rcu;
};

#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);

#endif /* __NET_MCTPDEVICE_H */
3 changes: 3 additions & 0 deletions include/uapi/linux/if_ether.h
Expand Up @@ -151,6 +151,9 @@
#define ETH_P_MAP 0x00F9 /* Qualcomm multiplexing and
* aggregation protocol
*/
#define ETH_P_MCTP 0x00FA /* Management component transport
* protocol packets
*/

/*
* This is an Ethernet frame header.
Expand Down
10 changes: 10 additions & 0 deletions include/uapi/linux/if_link.h
Expand Up @@ -1260,4 +1260,14 @@ struct ifla_rmnet_flags {
__u32 mask;
};

/* MCTP section */

enum {
IFLA_MCTP_UNSPEC,
IFLA_MCTP_NET,
__IFLA_MCTP_MAX,
};

#define IFLA_MCTP_MAX (__IFLA_MCTP_MAX - 1)

#endif /* _UAPI_LINUX_IF_LINK_H */
1 change: 1 addition & 0 deletions include/uapi/linux/mctp.h
Expand Up @@ -26,6 +26,7 @@ struct sockaddr_mctp {
};

#define MCTP_NET_ANY 0x0
#define MCTP_NET_DEFAULT 0x0

#define MCTP_ADDR_NULL 0x00
#define MCTP_ADDR_ANY 0xff
Expand Down
2 changes: 1 addition & 1 deletion net/mctp/Makefile
@@ -1,3 +1,3 @@
# SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_MCTP) += mctp.o
mctp-objs := af_mctp.o
mctp-objs := af_mctp.o device.o
8 changes: 8 additions & 0 deletions net/mctp/af_mctp.c
Expand Up @@ -6,13 +6,18 @@
* Copyright (c) 2021 Google
*/

#include <linux/if_arp.h>
#include <linux/net.h>
#include <linux/mctp.h>
#include <linux/module.h>
#include <linux/socket.h>

#include <net/mctp.h>
#include <net/mctpdevice.h>
#include <net/sock.h>

/* socket implementation */

struct mctp_sock {
struct sock sk;
};
Expand Down Expand Up @@ -152,6 +157,8 @@ static __init int mctp_init(void)
if (rc)
goto err_unreg_sock;

mctp_device_init();

return 0;

err_unreg_sock:
Expand All @@ -162,6 +169,7 @@ static __init int mctp_init(void)

static __exit void mctp_exit(void)
{
mctp_device_exit();
proto_unregister(&mctp_proto);
sock_unregister(PF_MCTP);
}
Expand Down

0 comments on commit 583be98

Please sign in to comment.