2 * net/core/devlink.c - Network physical/parent device Netlink interface
4 * Heavily inspired by net/wireless/
5 * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
6 * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/types.h>
17 #include <linux/slab.h>
18 #include <linux/gfp.h>
19 #include <linux/device.h>
20 #include <linux/list.h>
21 #include <linux/netdevice.h>
22 #include <rdma/ib_verbs.h>
23 #include <net/netlink.h>
24 #include <net/genetlink.h>
25 #include <net/rtnetlink.h>
26 #include <net/net_namespace.h>
28 #include <net/devlink.h>
30 static LIST_HEAD(devlink_list
);
34 * An overall lock guarding every operation coming from userspace.
35 * It also guards devlink devices list and it is taken when
36 * driver registers/unregisters it.
38 static DEFINE_MUTEX(devlink_mutex
);
42 * Shared lock to guard lists of ports in all devlink devices.
44 static DEFINE_MUTEX(devlink_port_mutex
);
46 static struct net
*devlink_net(const struct devlink
*devlink
)
48 return read_pnet(&devlink
->_net
);
51 static void devlink_net_set(struct devlink
*devlink
, struct net
*net
)
53 write_pnet(&devlink
->_net
, net
);
56 static struct devlink
*devlink_get_from_attrs(struct net
*net
,
57 struct nlattr
**attrs
)
59 struct devlink
*devlink
;
63 if (!attrs
[DEVLINK_ATTR_BUS_NAME
] || !attrs
[DEVLINK_ATTR_DEV_NAME
])
64 return ERR_PTR(-EINVAL
);
66 busname
= nla_data(attrs
[DEVLINK_ATTR_BUS_NAME
]);
67 devname
= nla_data(attrs
[DEVLINK_ATTR_DEV_NAME
]);
69 list_for_each_entry(devlink
, &devlink_list
, list
) {
70 if (strcmp(devlink
->dev
->bus
->name
, busname
) == 0 &&
71 strcmp(dev_name(devlink
->dev
), devname
) == 0 &&
72 net_eq(devlink_net(devlink
), net
))
76 return ERR_PTR(-ENODEV
);
79 static struct devlink
*devlink_get_from_info(struct genl_info
*info
)
81 return devlink_get_from_attrs(genl_info_net(info
), info
->attrs
);
84 static struct devlink_port
*devlink_port_get_by_index(struct devlink
*devlink
,
87 struct devlink_port
*devlink_port
;
89 list_for_each_entry(devlink_port
, &devlink
->port_list
, list
) {
90 if (devlink_port
->index
== port_index
)
96 static bool devlink_port_index_exists(struct devlink
*devlink
, int port_index
)
98 return devlink_port_get_by_index(devlink
, port_index
);
101 static struct devlink_port
*devlink_port_get_from_attrs(struct devlink
*devlink
,
102 struct nlattr
**attrs
)
104 if (attrs
[DEVLINK_ATTR_PORT_INDEX
]) {
105 u32 port_index
= nla_get_u32(attrs
[DEVLINK_ATTR_PORT_INDEX
]);
106 struct devlink_port
*devlink_port
;
108 devlink_port
= devlink_port_get_by_index(devlink
, port_index
);
110 return ERR_PTR(-ENODEV
);
113 return ERR_PTR(-EINVAL
);
116 static struct devlink_port
*devlink_port_get_from_info(struct devlink
*devlink
,
117 struct genl_info
*info
)
119 return devlink_port_get_from_attrs(devlink
, info
->attrs
);
122 #define DEVLINK_NL_FLAG_NEED_DEVLINK BIT(0)
123 #define DEVLINK_NL_FLAG_NEED_PORT BIT(1)
125 static int devlink_nl_pre_doit(const struct genl_ops
*ops
,
126 struct sk_buff
*skb
, struct genl_info
*info
)
128 struct devlink
*devlink
;
130 mutex_lock(&devlink_mutex
);
131 devlink
= devlink_get_from_info(info
);
132 if (IS_ERR(devlink
)) {
133 mutex_unlock(&devlink_mutex
);
134 return PTR_ERR(devlink
);
136 if (ops
->internal_flags
& DEVLINK_NL_FLAG_NEED_DEVLINK
) {
137 info
->user_ptr
[0] = devlink
;
138 } else if (ops
->internal_flags
& DEVLINK_NL_FLAG_NEED_PORT
) {
139 struct devlink_port
*devlink_port
;
141 mutex_lock(&devlink_port_mutex
);
142 devlink_port
= devlink_port_get_from_info(devlink
, info
);
143 if (IS_ERR(devlink_port
)) {
144 mutex_unlock(&devlink_port_mutex
);
145 mutex_unlock(&devlink_mutex
);
146 return PTR_ERR(devlink_port
);
148 info
->user_ptr
[0] = devlink_port
;
153 static void devlink_nl_post_doit(const struct genl_ops
*ops
,
154 struct sk_buff
*skb
, struct genl_info
*info
)
156 if (ops
->internal_flags
& DEVLINK_NL_FLAG_NEED_PORT
)
157 mutex_unlock(&devlink_port_mutex
);
158 mutex_unlock(&devlink_mutex
);
161 static struct genl_family devlink_nl_family
= {
162 .id
= GENL_ID_GENERATE
,
163 .name
= DEVLINK_GENL_NAME
,
164 .version
= DEVLINK_GENL_VERSION
,
165 .maxattr
= DEVLINK_ATTR_MAX
,
167 .pre_doit
= devlink_nl_pre_doit
,
168 .post_doit
= devlink_nl_post_doit
,
171 enum devlink_multicast_groups
{
172 DEVLINK_MCGRP_CONFIG
,
175 static const struct genl_multicast_group devlink_nl_mcgrps
[] = {
176 [DEVLINK_MCGRP_CONFIG
] = { .name
= DEVLINK_GENL_MCGRP_CONFIG_NAME
},
179 static int devlink_nl_put_handle(struct sk_buff
*msg
, struct devlink
*devlink
)
181 if (nla_put_string(msg
, DEVLINK_ATTR_BUS_NAME
, devlink
->dev
->bus
->name
))
183 if (nla_put_string(msg
, DEVLINK_ATTR_DEV_NAME
, dev_name(devlink
->dev
)))
188 static int devlink_nl_fill(struct sk_buff
*msg
, struct devlink
*devlink
,
189 enum devlink_command cmd
, u32 portid
,
194 hdr
= genlmsg_put(msg
, portid
, seq
, &devlink_nl_family
, flags
, cmd
);
198 if (devlink_nl_put_handle(msg
, devlink
))
199 goto nla_put_failure
;
201 genlmsg_end(msg
, hdr
);
205 genlmsg_cancel(msg
, hdr
);
209 static void devlink_notify(struct devlink
*devlink
, enum devlink_command cmd
)
214 WARN_ON(cmd
!= DEVLINK_CMD_NEW
&& cmd
!= DEVLINK_CMD_DEL
);
216 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
220 err
= devlink_nl_fill(msg
, devlink
, cmd
, 0, 0, 0);
226 genlmsg_multicast_netns(&devlink_nl_family
, devlink_net(devlink
),
227 msg
, 0, DEVLINK_MCGRP_CONFIG
, GFP_KERNEL
);
230 static int devlink_nl_port_fill(struct sk_buff
*msg
, struct devlink
*devlink
,
231 struct devlink_port
*devlink_port
,
232 enum devlink_command cmd
, u32 portid
,
237 hdr
= genlmsg_put(msg
, portid
, seq
, &devlink_nl_family
, flags
, cmd
);
241 if (devlink_nl_put_handle(msg
, devlink
))
242 goto nla_put_failure
;
243 if (nla_put_u32(msg
, DEVLINK_ATTR_PORT_INDEX
, devlink_port
->index
))
244 goto nla_put_failure
;
245 if (nla_put_u16(msg
, DEVLINK_ATTR_PORT_TYPE
, devlink_port
->type
))
246 goto nla_put_failure
;
247 if (devlink_port
->desired_type
!= DEVLINK_PORT_TYPE_NOTSET
&&
248 nla_put_u16(msg
, DEVLINK_ATTR_PORT_DESIRED_TYPE
,
249 devlink_port
->desired_type
))
250 goto nla_put_failure
;
251 if (devlink_port
->type
== DEVLINK_PORT_TYPE_ETH
) {
252 struct net_device
*netdev
= devlink_port
->type_dev
;
255 (nla_put_u32(msg
, DEVLINK_ATTR_PORT_NETDEV_IFINDEX
,
257 nla_put_string(msg
, DEVLINK_ATTR_PORT_NETDEV_NAME
,
259 goto nla_put_failure
;
261 if (devlink_port
->type
== DEVLINK_PORT_TYPE_IB
) {
262 struct ib_device
*ibdev
= devlink_port
->type_dev
;
265 nla_put_string(msg
, DEVLINK_ATTR_PORT_IBDEV_NAME
,
267 goto nla_put_failure
;
269 if (devlink_port
->split
&&
270 nla_put_u32(msg
, DEVLINK_ATTR_PORT_SPLIT_GROUP
,
271 devlink_port
->split_group
))
272 goto nla_put_failure
;
274 genlmsg_end(msg
, hdr
);
278 genlmsg_cancel(msg
, hdr
);
282 static void devlink_port_notify(struct devlink_port
*devlink_port
,
283 enum devlink_command cmd
)
285 struct devlink
*devlink
= devlink_port
->devlink
;
289 if (!devlink_port
->registered
)
292 WARN_ON(cmd
!= DEVLINK_CMD_PORT_NEW
&& cmd
!= DEVLINK_CMD_PORT_DEL
);
294 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
298 err
= devlink_nl_port_fill(msg
, devlink
, devlink_port
, cmd
, 0, 0, 0);
304 genlmsg_multicast_netns(&devlink_nl_family
, devlink_net(devlink
),
305 msg
, 0, DEVLINK_MCGRP_CONFIG
, GFP_KERNEL
);
308 static int devlink_nl_cmd_get_doit(struct sk_buff
*skb
, struct genl_info
*info
)
310 struct devlink
*devlink
= info
->user_ptr
[0];
314 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
318 err
= devlink_nl_fill(msg
, devlink
, DEVLINK_CMD_NEW
,
319 info
->snd_portid
, info
->snd_seq
, 0);
325 return genlmsg_reply(msg
, info
);
328 static int devlink_nl_cmd_get_dumpit(struct sk_buff
*msg
,
329 struct netlink_callback
*cb
)
331 struct devlink
*devlink
;
332 int start
= cb
->args
[0];
336 mutex_lock(&devlink_mutex
);
337 list_for_each_entry(devlink
, &devlink_list
, list
) {
338 if (!net_eq(devlink_net(devlink
), sock_net(msg
->sk
)))
344 err
= devlink_nl_fill(msg
, devlink
, DEVLINK_CMD_NEW
,
345 NETLINK_CB(cb
->skb
).portid
,
346 cb
->nlh
->nlmsg_seq
, NLM_F_MULTI
);
352 mutex_unlock(&devlink_mutex
);
358 static int devlink_nl_cmd_port_get_doit(struct sk_buff
*skb
,
359 struct genl_info
*info
)
361 struct devlink_port
*devlink_port
= info
->user_ptr
[0];
362 struct devlink
*devlink
= devlink_port
->devlink
;
366 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
370 err
= devlink_nl_port_fill(msg
, devlink
, devlink_port
,
371 DEVLINK_CMD_PORT_NEW
,
372 info
->snd_portid
, info
->snd_seq
, 0);
378 return genlmsg_reply(msg
, info
);
381 static int devlink_nl_cmd_port_get_dumpit(struct sk_buff
*msg
,
382 struct netlink_callback
*cb
)
384 struct devlink
*devlink
;
385 struct devlink_port
*devlink_port
;
386 int start
= cb
->args
[0];
390 mutex_lock(&devlink_mutex
);
391 mutex_lock(&devlink_port_mutex
);
392 list_for_each_entry(devlink
, &devlink_list
, list
) {
393 if (!net_eq(devlink_net(devlink
), sock_net(msg
->sk
)))
395 list_for_each_entry(devlink_port
, &devlink
->port_list
, list
) {
400 err
= devlink_nl_port_fill(msg
, devlink
, devlink_port
,
402 NETLINK_CB(cb
->skb
).portid
,
411 mutex_unlock(&devlink_port_mutex
);
412 mutex_unlock(&devlink_mutex
);
418 static int devlink_port_type_set(struct devlink
*devlink
,
419 struct devlink_port
*devlink_port
,
420 enum devlink_port_type port_type
)
425 if (devlink
->ops
&& devlink
->ops
->port_type_set
) {
426 if (port_type
== DEVLINK_PORT_TYPE_NOTSET
)
428 err
= devlink
->ops
->port_type_set(devlink_port
, port_type
);
431 devlink_port
->desired_type
= port_type
;
432 devlink_port_notify(devlink_port
, DEVLINK_CMD_PORT_NEW
);
438 static int devlink_nl_cmd_port_set_doit(struct sk_buff
*skb
,
439 struct genl_info
*info
)
441 struct devlink_port
*devlink_port
= info
->user_ptr
[0];
442 struct devlink
*devlink
= devlink_port
->devlink
;
445 if (info
->attrs
[DEVLINK_ATTR_PORT_TYPE
]) {
446 enum devlink_port_type port_type
;
448 port_type
= nla_get_u16(info
->attrs
[DEVLINK_ATTR_PORT_TYPE
]);
449 err
= devlink_port_type_set(devlink
, devlink_port
, port_type
);
456 static int devlink_port_split(struct devlink
*devlink
,
457 u32 port_index
, u32 count
)
460 if (devlink
->ops
&& devlink
->ops
->port_split
)
461 return devlink
->ops
->port_split(devlink
, port_index
, count
);
465 static int devlink_nl_cmd_port_split_doit(struct sk_buff
*skb
,
466 struct genl_info
*info
)
468 struct devlink
*devlink
= info
->user_ptr
[0];
472 if (!info
->attrs
[DEVLINK_ATTR_PORT_INDEX
] ||
473 !info
->attrs
[DEVLINK_ATTR_PORT_SPLIT_COUNT
])
476 port_index
= nla_get_u32(info
->attrs
[DEVLINK_ATTR_PORT_INDEX
]);
477 count
= nla_get_u32(info
->attrs
[DEVLINK_ATTR_PORT_SPLIT_COUNT
]);
478 return devlink_port_split(devlink
, port_index
, count
);
481 static int devlink_port_unsplit(struct devlink
*devlink
, u32 port_index
)
484 if (devlink
->ops
&& devlink
->ops
->port_unsplit
)
485 return devlink
->ops
->port_unsplit(devlink
, port_index
);
489 static int devlink_nl_cmd_port_unsplit_doit(struct sk_buff
*skb
,
490 struct genl_info
*info
)
492 struct devlink
*devlink
= info
->user_ptr
[0];
495 if (!info
->attrs
[DEVLINK_ATTR_PORT_INDEX
])
498 port_index
= nla_get_u32(info
->attrs
[DEVLINK_ATTR_PORT_INDEX
]);
499 return devlink_port_unsplit(devlink
, port_index
);
502 static const struct nla_policy devlink_nl_policy
[DEVLINK_ATTR_MAX
+ 1] = {
503 [DEVLINK_ATTR_BUS_NAME
] = { .type
= NLA_NUL_STRING
},
504 [DEVLINK_ATTR_DEV_NAME
] = { .type
= NLA_NUL_STRING
},
505 [DEVLINK_ATTR_PORT_INDEX
] = { .type
= NLA_U32
},
506 [DEVLINK_ATTR_PORT_TYPE
] = { .type
= NLA_U16
},
507 [DEVLINK_ATTR_PORT_SPLIT_COUNT
] = { .type
= NLA_U32
},
510 static const struct genl_ops devlink_nl_ops
[] = {
512 .cmd
= DEVLINK_CMD_GET
,
513 .doit
= devlink_nl_cmd_get_doit
,
514 .dumpit
= devlink_nl_cmd_get_dumpit
,
515 .policy
= devlink_nl_policy
,
516 .internal_flags
= DEVLINK_NL_FLAG_NEED_DEVLINK
,
517 /* can be retrieved by unprivileged users */
520 .cmd
= DEVLINK_CMD_PORT_GET
,
521 .doit
= devlink_nl_cmd_port_get_doit
,
522 .dumpit
= devlink_nl_cmd_port_get_dumpit
,
523 .policy
= devlink_nl_policy
,
524 .internal_flags
= DEVLINK_NL_FLAG_NEED_PORT
,
525 /* can be retrieved by unprivileged users */
528 .cmd
= DEVLINK_CMD_PORT_SET
,
529 .doit
= devlink_nl_cmd_port_set_doit
,
530 .policy
= devlink_nl_policy
,
531 .flags
= GENL_ADMIN_PERM
,
532 .internal_flags
= DEVLINK_NL_FLAG_NEED_PORT
,
535 .cmd
= DEVLINK_CMD_PORT_SPLIT
,
536 .doit
= devlink_nl_cmd_port_split_doit
,
537 .policy
= devlink_nl_policy
,
538 .flags
= GENL_ADMIN_PERM
,
539 .internal_flags
= DEVLINK_NL_FLAG_NEED_DEVLINK
,
542 .cmd
= DEVLINK_CMD_PORT_UNSPLIT
,
543 .doit
= devlink_nl_cmd_port_unsplit_doit
,
544 .policy
= devlink_nl_policy
,
545 .flags
= GENL_ADMIN_PERM
,
546 .internal_flags
= DEVLINK_NL_FLAG_NEED_DEVLINK
,
551 * devlink_alloc - Allocate new devlink instance resources
554 * @priv_size: size of user private data
556 * Allocate new devlink instance resources, including devlink index
559 struct devlink
*devlink_alloc(const struct devlink_ops
*ops
, size_t priv_size
)
561 struct devlink
*devlink
;
563 devlink
= kzalloc(sizeof(*devlink
) + priv_size
, GFP_KERNEL
);
567 devlink_net_set(devlink
, &init_net
);
568 INIT_LIST_HEAD(&devlink
->port_list
);
571 EXPORT_SYMBOL_GPL(devlink_alloc
);
574 * devlink_register - Register devlink instance
578 int devlink_register(struct devlink
*devlink
, struct device
*dev
)
580 mutex_lock(&devlink_mutex
);
582 list_add_tail(&devlink
->list
, &devlink_list
);
583 devlink_notify(devlink
, DEVLINK_CMD_NEW
);
584 mutex_unlock(&devlink_mutex
);
587 EXPORT_SYMBOL_GPL(devlink_register
);
590 * devlink_unregister - Unregister devlink instance
594 void devlink_unregister(struct devlink
*devlink
)
596 mutex_lock(&devlink_mutex
);
597 devlink_notify(devlink
, DEVLINK_CMD_DEL
);
598 list_del(&devlink
->list
);
599 mutex_unlock(&devlink_mutex
);
601 EXPORT_SYMBOL_GPL(devlink_unregister
);
604 * devlink_free - Free devlink instance resources
608 void devlink_free(struct devlink
*devlink
)
612 EXPORT_SYMBOL_GPL(devlink_free
);
615 * devlink_port_register - Register devlink port
618 * @devlink_port: devlink port
621 * Register devlink port with provided port index. User can use
622 * any indexing, even hw-related one. devlink_port structure
623 * is convenient to be embedded inside user driver private structure.
624 * Note that the caller should take care of zeroing the devlink_port
627 int devlink_port_register(struct devlink
*devlink
,
628 struct devlink_port
*devlink_port
,
629 unsigned int port_index
)
631 mutex_lock(&devlink_port_mutex
);
632 if (devlink_port_index_exists(devlink
, port_index
)) {
633 mutex_unlock(&devlink_port_mutex
);
636 devlink_port
->devlink
= devlink
;
637 devlink_port
->index
= port_index
;
638 devlink_port
->registered
= true;
639 list_add_tail(&devlink_port
->list
, &devlink
->port_list
);
640 mutex_unlock(&devlink_port_mutex
);
641 devlink_port_notify(devlink_port
, DEVLINK_CMD_PORT_NEW
);
644 EXPORT_SYMBOL_GPL(devlink_port_register
);
647 * devlink_port_unregister - Unregister devlink port
649 * @devlink_port: devlink port
651 void devlink_port_unregister(struct devlink_port
*devlink_port
)
653 devlink_port_notify(devlink_port
, DEVLINK_CMD_PORT_DEL
);
654 mutex_lock(&devlink_port_mutex
);
655 list_del(&devlink_port
->list
);
656 mutex_unlock(&devlink_port_mutex
);
658 EXPORT_SYMBOL_GPL(devlink_port_unregister
);
660 static void __devlink_port_type_set(struct devlink_port
*devlink_port
,
661 enum devlink_port_type type
,
664 devlink_port
->type
= type
;
665 devlink_port
->type_dev
= type_dev
;
666 devlink_port_notify(devlink_port
, DEVLINK_CMD_PORT_NEW
);
670 * devlink_port_type_eth_set - Set port type to Ethernet
672 * @devlink_port: devlink port
673 * @netdev: related netdevice
675 void devlink_port_type_eth_set(struct devlink_port
*devlink_port
,
676 struct net_device
*netdev
)
678 return __devlink_port_type_set(devlink_port
,
679 DEVLINK_PORT_TYPE_ETH
, netdev
);
681 EXPORT_SYMBOL_GPL(devlink_port_type_eth_set
);
684 * devlink_port_type_ib_set - Set port type to InfiniBand
686 * @devlink_port: devlink port
687 * @ibdev: related IB device
689 void devlink_port_type_ib_set(struct devlink_port
*devlink_port
,
690 struct ib_device
*ibdev
)
692 return __devlink_port_type_set(devlink_port
,
693 DEVLINK_PORT_TYPE_IB
, ibdev
);
695 EXPORT_SYMBOL_GPL(devlink_port_type_ib_set
);
698 * devlink_port_type_clear - Clear port type
700 * @devlink_port: devlink port
702 void devlink_port_type_clear(struct devlink_port
*devlink_port
)
704 return __devlink_port_type_set(devlink_port
,
705 DEVLINK_PORT_TYPE_NOTSET
, NULL
);
707 EXPORT_SYMBOL_GPL(devlink_port_type_clear
);
710 * devlink_port_split_set - Set port is split
712 * @devlink_port: devlink port
713 * @split_group: split group - identifies group split port is part of
715 void devlink_port_split_set(struct devlink_port
*devlink_port
,
718 devlink_port
->split
= true;
719 devlink_port
->split_group
= split_group
;
720 devlink_port_notify(devlink_port
, DEVLINK_CMD_PORT_NEW
);
722 EXPORT_SYMBOL_GPL(devlink_port_split_set
);
724 static int __init
devlink_module_init(void)
726 return genl_register_family_with_ops_groups(&devlink_nl_family
,
731 static void __exit
devlink_module_exit(void)
733 genl_unregister_family(&devlink_nl_family
);
736 module_init(devlink_module_init
);
737 module_exit(devlink_module_exit
);
739 MODULE_LICENSE("GPL v2");
740 MODULE_AUTHOR("Jiri Pirko <jiri@mellanox.com>");
741 MODULE_DESCRIPTION("Network physical device Netlink interface");
742 MODULE_ALIAS_GENL_FAMILY(DEVLINK_GENL_NAME
);