mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 14:14:24 +08:00
d93f952857
Commit 8cea95b0bd
("tools: ynl-gen: handle do ops with no input attrs")
added support for some of the previously-skipped ops in nfsd.
Regenerate the user space parsers to fill them in.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Acked-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
204 lines
6.1 KiB
C
204 lines
6.1 KiB
C
// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
|
/* Do not edit directly, auto-generated from: */
|
|
/* Documentation/netlink/specs/nfsd.yaml */
|
|
/* YNL-GEN user source */
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "nfsd-user.h"
|
|
#include "ynl.h"
|
|
#include <linux/nfsd_netlink.h>
|
|
|
|
#include <libmnl/libmnl.h>
|
|
#include <linux/genetlink.h>
|
|
|
|
/* Enums */
|
|
static const char * const nfsd_op_strmap[] = {
|
|
[NFSD_CMD_RPC_STATUS_GET] = "rpc-status-get",
|
|
};
|
|
|
|
const char *nfsd_op_str(int op)
|
|
{
|
|
if (op < 0 || op >= (int)MNL_ARRAY_SIZE(nfsd_op_strmap))
|
|
return NULL;
|
|
return nfsd_op_strmap[op];
|
|
}
|
|
|
|
/* Policies */
|
|
struct ynl_policy_attr nfsd_rpc_status_policy[NFSD_A_RPC_STATUS_MAX + 1] = {
|
|
[NFSD_A_RPC_STATUS_XID] = { .name = "xid", .type = YNL_PT_U32, },
|
|
[NFSD_A_RPC_STATUS_FLAGS] = { .name = "flags", .type = YNL_PT_U32, },
|
|
[NFSD_A_RPC_STATUS_PROG] = { .name = "prog", .type = YNL_PT_U32, },
|
|
[NFSD_A_RPC_STATUS_VERSION] = { .name = "version", .type = YNL_PT_U8, },
|
|
[NFSD_A_RPC_STATUS_PROC] = { .name = "proc", .type = YNL_PT_U32, },
|
|
[NFSD_A_RPC_STATUS_SERVICE_TIME] = { .name = "service_time", .type = YNL_PT_U64, },
|
|
[NFSD_A_RPC_STATUS_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, },
|
|
[NFSD_A_RPC_STATUS_SADDR4] = { .name = "saddr4", .type = YNL_PT_U32, },
|
|
[NFSD_A_RPC_STATUS_DADDR4] = { .name = "daddr4", .type = YNL_PT_U32, },
|
|
[NFSD_A_RPC_STATUS_SADDR6] = { .name = "saddr6", .type = YNL_PT_BINARY,},
|
|
[NFSD_A_RPC_STATUS_DADDR6] = { .name = "daddr6", .type = YNL_PT_BINARY,},
|
|
[NFSD_A_RPC_STATUS_SPORT] = { .name = "sport", .type = YNL_PT_U16, },
|
|
[NFSD_A_RPC_STATUS_DPORT] = { .name = "dport", .type = YNL_PT_U16, },
|
|
[NFSD_A_RPC_STATUS_COMPOUND_OPS] = { .name = "compound-ops", .type = YNL_PT_U32, },
|
|
};
|
|
|
|
struct ynl_policy_nest nfsd_rpc_status_nest = {
|
|
.max_attr = NFSD_A_RPC_STATUS_MAX,
|
|
.table = nfsd_rpc_status_policy,
|
|
};
|
|
|
|
/* Common nested types */
|
|
/* ============== NFSD_CMD_RPC_STATUS_GET ============== */
|
|
/* NFSD_CMD_RPC_STATUS_GET - dump */
|
|
int nfsd_rpc_status_get_rsp_dump_parse(const struct nlmsghdr *nlh, void *data)
|
|
{
|
|
struct nfsd_rpc_status_get_rsp_dump *dst;
|
|
struct ynl_parse_arg *yarg = data;
|
|
unsigned int n_compound_ops = 0;
|
|
const struct nlattr *attr;
|
|
int i;
|
|
|
|
dst = yarg->data;
|
|
|
|
if (dst->compound_ops)
|
|
return ynl_error_parse(yarg, "attribute already present (rpc-status.compound-ops)");
|
|
|
|
mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
|
|
unsigned int type = mnl_attr_get_type(attr);
|
|
|
|
if (type == NFSD_A_RPC_STATUS_XID) {
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
dst->_present.xid = 1;
|
|
dst->xid = mnl_attr_get_u32(attr);
|
|
} else if (type == NFSD_A_RPC_STATUS_FLAGS) {
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
dst->_present.flags = 1;
|
|
dst->flags = mnl_attr_get_u32(attr);
|
|
} else if (type == NFSD_A_RPC_STATUS_PROG) {
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
dst->_present.prog = 1;
|
|
dst->prog = mnl_attr_get_u32(attr);
|
|
} else if (type == NFSD_A_RPC_STATUS_VERSION) {
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
dst->_present.version = 1;
|
|
dst->version = mnl_attr_get_u8(attr);
|
|
} else if (type == NFSD_A_RPC_STATUS_PROC) {
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
dst->_present.proc = 1;
|
|
dst->proc = mnl_attr_get_u32(attr);
|
|
} else if (type == NFSD_A_RPC_STATUS_SERVICE_TIME) {
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
dst->_present.service_time = 1;
|
|
dst->service_time = mnl_attr_get_u64(attr);
|
|
} else if (type == NFSD_A_RPC_STATUS_SADDR4) {
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
dst->_present.saddr4 = 1;
|
|
dst->saddr4 = mnl_attr_get_u32(attr);
|
|
} else if (type == NFSD_A_RPC_STATUS_DADDR4) {
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
dst->_present.daddr4 = 1;
|
|
dst->daddr4 = mnl_attr_get_u32(attr);
|
|
} else if (type == NFSD_A_RPC_STATUS_SADDR6) {
|
|
unsigned int len;
|
|
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
|
|
len = mnl_attr_get_payload_len(attr);
|
|
dst->_present.saddr6_len = len;
|
|
dst->saddr6 = malloc(len);
|
|
memcpy(dst->saddr6, mnl_attr_get_payload(attr), len);
|
|
} else if (type == NFSD_A_RPC_STATUS_DADDR6) {
|
|
unsigned int len;
|
|
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
|
|
len = mnl_attr_get_payload_len(attr);
|
|
dst->_present.daddr6_len = len;
|
|
dst->daddr6 = malloc(len);
|
|
memcpy(dst->daddr6, mnl_attr_get_payload(attr), len);
|
|
} else if (type == NFSD_A_RPC_STATUS_SPORT) {
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
dst->_present.sport = 1;
|
|
dst->sport = mnl_attr_get_u16(attr);
|
|
} else if (type == NFSD_A_RPC_STATUS_DPORT) {
|
|
if (ynl_attr_validate(yarg, attr))
|
|
return MNL_CB_ERROR;
|
|
dst->_present.dport = 1;
|
|
dst->dport = mnl_attr_get_u16(attr);
|
|
} else if (type == NFSD_A_RPC_STATUS_COMPOUND_OPS) {
|
|
n_compound_ops++;
|
|
}
|
|
}
|
|
|
|
if (n_compound_ops) {
|
|
dst->compound_ops = calloc(n_compound_ops, sizeof(*dst->compound_ops));
|
|
dst->n_compound_ops = n_compound_ops;
|
|
i = 0;
|
|
mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
|
|
if (mnl_attr_get_type(attr) == NFSD_A_RPC_STATUS_COMPOUND_OPS) {
|
|
dst->compound_ops[i] = mnl_attr_get_u32(attr);
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return MNL_CB_OK;
|
|
}
|
|
|
|
void
|
|
nfsd_rpc_status_get_rsp_list_free(struct nfsd_rpc_status_get_rsp_list *rsp)
|
|
{
|
|
struct nfsd_rpc_status_get_rsp_list *next = rsp;
|
|
|
|
while ((void *)next != YNL_LIST_END) {
|
|
rsp = next;
|
|
next = rsp->next;
|
|
|
|
free(rsp->obj.saddr6);
|
|
free(rsp->obj.daddr6);
|
|
free(rsp->obj.compound_ops);
|
|
free(rsp);
|
|
}
|
|
}
|
|
|
|
struct nfsd_rpc_status_get_rsp_list *
|
|
nfsd_rpc_status_get_dump(struct ynl_sock *ys)
|
|
{
|
|
struct ynl_dump_state yds = {};
|
|
struct nlmsghdr *nlh;
|
|
int err;
|
|
|
|
yds.ys = ys;
|
|
yds.alloc_sz = sizeof(struct nfsd_rpc_status_get_rsp_list);
|
|
yds.cb = nfsd_rpc_status_get_rsp_dump_parse;
|
|
yds.rsp_cmd = NFSD_CMD_RPC_STATUS_GET;
|
|
yds.rsp_policy = &nfsd_rpc_status_nest;
|
|
|
|
nlh = ynl_gemsg_start_dump(ys, ys->family_id, NFSD_CMD_RPC_STATUS_GET, 1);
|
|
|
|
err = ynl_exec_dump(ys, nlh, &yds);
|
|
if (err < 0)
|
|
goto free_list;
|
|
|
|
return yds.first;
|
|
|
|
free_list:
|
|
nfsd_rpc_status_get_rsp_list_free(yds.first);
|
|
return NULL;
|
|
}
|
|
|
|
const struct ynl_family ynl_nfsd_family = {
|
|
.name = "nfsd",
|
|
};
|