RDMA/netlink: Implement nldev port doit callback
Provide ability to get specific to device and port information. Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Reviewed-by: Steve Wise <swise@opengridcomputing.com>
This commit is contained in:
		
							parent
							
								
									7d02f605f0
								
							
						
					
					
						commit
						c3f66f7b00
					
				| @ -141,6 +141,49 @@ static int nldev_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb) | |||||||
| 	return ib_enum_all_devs(_nldev_get_dumpit, skb, cb); | 	return ib_enum_all_devs(_nldev_get_dumpit, skb, cb); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int nldev_port_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh, | ||||||
|  | 			       struct netlink_ext_ack *extack) | ||||||
|  | { | ||||||
|  | 	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX]; | ||||||
|  | 	struct ib_device *device; | ||||||
|  | 	struct sk_buff *msg; | ||||||
|  | 	u32 index; | ||||||
|  | 	u32 port; | ||||||
|  | 	int err; | ||||||
|  | 
 | ||||||
|  | 	err = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1, | ||||||
|  | 			  nldev_policy, extack); | ||||||
|  | 	if (err || !tb[RDMA_NLDEV_ATTR_PORT_INDEX]) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	index = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); | ||||||
|  | 	device = __ib_device_get_by_index(index); | ||||||
|  | 	if (!device) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	port = nla_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]); | ||||||
|  | 	if (!rdma_is_port_valid(device, port)) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | ||||||
|  | 	if (!msg) | ||||||
|  | 		return -ENOMEM; | ||||||
|  | 
 | ||||||
|  | 	nlh = nlmsg_put(msg, NETLINK_CB(skb).portid, nlh->nlmsg_seq, | ||||||
|  | 			RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET), | ||||||
|  | 			0, 0); | ||||||
|  | 
 | ||||||
|  | 	err = fill_port_info(msg, device, port); | ||||||
|  | 	if (err) { | ||||||
|  | 		nlmsg_free(msg); | ||||||
|  | 		return err; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	nlmsg_end(msg, nlh); | ||||||
|  | 
 | ||||||
|  | 	return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int nldev_port_get_dumpit(struct sk_buff *skb, | static int nldev_port_get_dumpit(struct sk_buff *skb, | ||||||
| 				 struct netlink_callback *cb) | 				 struct netlink_callback *cb) | ||||||
| { | { | ||||||
| @ -203,6 +246,7 @@ static const struct rdma_nl_cbs nldev_cb_table[] = { | |||||||
| 		.dump = nldev_get_dumpit, | 		.dump = nldev_get_dumpit, | ||||||
| 	}, | 	}, | ||||||
| 	[RDMA_NLDEV_CMD_PORT_GET] = { | 	[RDMA_NLDEV_CMD_PORT_GET] = { | ||||||
|  | 		.doit = nldev_port_get_doit, | ||||||
| 		.dump = nldev_port_get_dumpit, | 		.dump = nldev_port_get_dumpit, | ||||||
| 	}, | 	}, | ||||||
| }; | }; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user