Commit 50042e80 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

tools: ynl: switch away from MNL_CB_*



Create a local version of the MNL_CB_* parser control values.

Acked-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Link: https://lore.kernel.org/r/20240227223032.1835527-13-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent dd0973d7
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -29,6 +29,12 @@ enum ynl_policy_type {
	YNL_PT_BITFIELD32,
};

enum ynl_parse_result {
	YNL_PARSE_CB_ERROR = -1,
	YNL_PARSE_CB_STOP = 0,
	YNL_PARSE_CB_OK = 1,
};

#define YNL_ARRAY_SIZE(array)	(sizeof(array) ?			\
				 sizeof(array) / sizeof(array[0]) : 0)

+27 −27
Original line number Diff line number Diff line
@@ -147,7 +147,7 @@ ynl_ext_ack_check(struct ynl_sock *ys, const struct nlmsghdr *nlh,

	if (!(nlh->nlmsg_flags & NLM_F_ACK_TLVS)) {
		yerr_msg(ys, "%s", strerror(ys->err.code));
		return MNL_CB_OK;
		return YNL_PARSE_CB_OK;
	}

	ynl_attr_for_each(attr, nlh, hlen) {
@@ -166,12 +166,12 @@ ynl_ext_ack_check(struct ynl_sock *ys, const struct nlmsghdr *nlh,
		case NLMSGERR_ATTR_MISS_TYPE:
		case NLMSGERR_ATTR_MISS_NEST:
			if (len != sizeof(__u32))
				return MNL_CB_ERROR;
				return YNL_PARSE_CB_ERROR;
			break;
		case NLMSGERR_ATTR_MSG:
			str = ynl_attr_get_str(attr);
			if (str[len - 1])
				return MNL_CB_ERROR;
				return YNL_PARSE_CB_ERROR;
			break;
		default:
			break;
@@ -252,7 +252,7 @@ ynl_ext_ack_check(struct ynl_sock *ys, const struct nlmsghdr *nlh,
	else
		yerr_msg(ys, "%s", strerror(ys->err.code));

	return MNL_CB_OK;
	return YNL_PARSE_CB_OK;
}

static int
@@ -272,7 +272,7 @@ ynl_cb_error(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg)

	ynl_ext_ack_check(yarg->ys, nlh, hlen);

	return code ? MNL_CB_ERROR : MNL_CB_STOP;
	return code ? YNL_PARSE_CB_ERROR : YNL_PARSE_CB_STOP;
}

static int ynl_cb_done(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg)
@@ -286,9 +286,9 @@ static int ynl_cb_done(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg)

		ynl_ext_ack_check(yarg->ys, nlh, sizeof(int));

		return MNL_CB_ERROR;
		return YNL_PARSE_CB_ERROR;
	}
	return MNL_CB_STOP;
	return YNL_PARSE_CB_STOP;
}

/* Attribute validation */
@@ -454,7 +454,7 @@ static int ynl_cb_null(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg)
	yerr(yarg->ys, YNL_ERROR_UNEXPECT_MSG,
	     "Received a message when none were expected");

	return MNL_CB_ERROR;
	return YNL_PARSE_CB_ERROR;
}

static int ynl_sock_read_msgs(struct ynl_parse_arg *yarg, ynl_parse_cb_t cb)
@@ -468,30 +468,30 @@ static int ynl_sock_read_msgs(struct ynl_parse_arg *yarg, ynl_parse_cb_t cb)
	if (len < 0)
		return len;

	ret = MNL_CB_STOP;
	ret = YNL_PARSE_CB_STOP;
	for (rem = len; rem > 0; NLMSG_NEXT(nlh, rem)) {
		nlh = (struct nlmsghdr *)&ys->rx_buf[len - rem];
		if (!NLMSG_OK(nlh, rem)) {
			yerr(yarg->ys, YNL_ERROR_INV_RESP,
			     "Invalid message or trailing data in the response.");
			return MNL_CB_ERROR;
			return YNL_PARSE_CB_ERROR;
		}

		if (nlh->nlmsg_flags & NLM_F_DUMP_INTR) {
			/* TODO: handle this better */
			yerr(yarg->ys, YNL_ERROR_DUMP_INTER,
			     "Dump interrupted / inconsistent, please retry.");
			return MNL_CB_ERROR;
			return YNL_PARSE_CB_ERROR;
		}

		switch (nlh->nlmsg_type) {
		case 0:
			yerr(yarg->ys, YNL_ERROR_INV_RESP,
			     "Invalid message type in the response.");
			return MNL_CB_ERROR;
			return YNL_PARSE_CB_ERROR;
		case NLMSG_NOOP:
		case NLMSG_OVERRUN ... NLMSG_MIN_TYPE - 1:
			ret = MNL_CB_OK;
			ret = YNL_PARSE_CB_OK;
			break;
		case NLMSG_ERROR:
			ret = ynl_cb_error(nlh, yarg);
@@ -537,7 +537,7 @@ ynl_get_family_info_mcast(struct ynl_sock *ys, const struct nlattr *mcasts)
	ys->mcast_groups = calloc(ys->n_mcast_groups,
				  sizeof(*ys->mcast_groups));
	if (!ys->mcast_groups)
		return MNL_CB_ERROR;
		return YNL_PARSE_CB_ERROR;

	i = 0;
	ynl_attr_for_each_nested(entry, mcasts) {
@@ -566,14 +566,14 @@ ynl_get_family_info_cb(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg)
	ynl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) {
		if (ynl_attr_type(attr) == CTRL_ATTR_MCAST_GROUPS)
			if (ynl_get_family_info_mcast(ys, attr))
				return MNL_CB_ERROR;
				return YNL_PARSE_CB_ERROR;

		if (ynl_attr_type(attr) != CTRL_ATTR_FAMILY_ID)
			continue;

		if (ynl_attr_data_len(attr) != sizeof(__u16)) {
			yerr(ys, YNL_ERROR_ATTR_INVALID, "Invalid family ID");
			return MNL_CB_ERROR;
			return YNL_PARSE_CB_ERROR;
		}

		ys->family_id = ynl_attr_get_u16(attr);
@@ -582,9 +582,9 @@ ynl_get_family_info_cb(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg)

	if (!found_id) {
		yerr(ys, YNL_ERROR_ATTR_MISSING, "Family ID missing");
		return MNL_CB_ERROR;
		return YNL_PARSE_CB_ERROR;
	}
	return MNL_CB_OK;
	return YNL_PARSE_CB_OK;
}

static int ynl_sock_read_family(struct ynl_sock *ys, const char *family_name)
@@ -741,10 +741,10 @@ static int ynl_ntf_parse(struct ynl_sock *ys, const struct nlmsghdr *nlh)

	gehdr = ynl_nlmsg_data(nlh);
	if (gehdr->cmd >= ys->family->ntf_info_size)
		return MNL_CB_ERROR;
		return YNL_PARSE_CB_ERROR;
	info = &ys->family->ntf_info[gehdr->cmd];
	if (!info->cb)
		return MNL_CB_ERROR;
		return YNL_PARSE_CB_ERROR;

	rsp = calloc(1, info->alloc_sz);
	rsp->free = info->free;
@@ -752,7 +752,7 @@ static int ynl_ntf_parse(struct ynl_sock *ys, const struct nlmsghdr *nlh)
	yarg.rsp_policy = info->policy;

	ret = info->cb(nlh, &yarg);
	if (ret <= MNL_CB_STOP)
	if (ret <= YNL_PARSE_CB_STOP)
		goto err_free;

	rsp->family = nlh->nlmsg_type;
@@ -761,11 +761,11 @@ static int ynl_ntf_parse(struct ynl_sock *ys, const struct nlmsghdr *nlh)
	*ys->ntf_last_next = rsp;
	ys->ntf_last_next = &rsp->next;

	return MNL_CB_OK;
	return YNL_PARSE_CB_OK;

err_free:
	info->free(rsp);
	return MNL_CB_ERROR;
	return YNL_PARSE_CB_ERROR;
}

static int
@@ -812,7 +812,7 @@ void ynl_error_unknown_notification(struct ynl_sock *ys, __u8 cmd)
int ynl_error_parse(struct ynl_parse_arg *yarg, const char *msg)
{
	yerr(yarg->ys, YNL_ERROR_INV_RESP, "Error parsing response: %s", msg);
	return MNL_CB_ERROR;
	return YNL_PARSE_CB_ERROR;
}

static int
@@ -841,7 +841,7 @@ int ynl_req_trampoline(const struct nlmsghdr *nlh, struct ynl_parse_arg *yarg)

	ret = ynl_check_alien(yrs->yarg.ys, nlh, yrs->rsp_cmd);
	if (ret)
		return ret < 0 ? MNL_CB_ERROR : MNL_CB_OK;
		return ret < 0 ? YNL_PARSE_CB_ERROR : YNL_PARSE_CB_OK;

	return yrs->cb(nlh, &yrs->yarg);
}
@@ -872,11 +872,11 @@ ynl_dump_trampoline(const struct nlmsghdr *nlh, struct ynl_parse_arg *data)

	ret = ynl_check_alien(ds->yarg.ys, nlh, ds->rsp_cmd);
	if (ret)
		return ret < 0 ? MNL_CB_ERROR : MNL_CB_OK;
		return ret < 0 ? YNL_PARSE_CB_ERROR : YNL_PARSE_CB_OK;

	obj = calloc(1, ds->alloc_sz);
	if (!obj)
		return MNL_CB_ERROR;
		return YNL_PARSE_CB_ERROR;

	if (!ds->first)
		ds->first = obj;
+7 −7
Original line number Diff line number Diff line
@@ -200,7 +200,7 @@ class Type(SpecAttr):

        if not self.is_multi_val():
            ri.cw.p("if (ynl_attr_validate(yarg, attr))")
            ri.cw.p("return MNL_CB_ERROR;")
            ri.cw.p("return YNL_PARSE_CB_ERROR;")
            if self.presence_type() == 'bit':
                ri.cw.p(f"{var}->_present.{self.c_name} = 1;")

@@ -247,7 +247,7 @@ class TypeUnused(Type):
        return []

    def _attr_get(self, ri, var):
        return ['return MNL_CB_ERROR;'], None, None
        return ['return YNL_PARSE_CB_ERROR;'], None, None

    def _attr_typol(self):
        return '.type = YNL_PT_REJECT, '
@@ -543,7 +543,7 @@ class TypeNest(Type):

    def _attr_get(self, ri, var):
        get_lines = [f"if ({self.nested_render_name}_parse(&parg, attr))",
                     "return MNL_CB_ERROR;"]
                     "return YNL_PARSE_CB_ERROR;"]
        init_lines = [f"parg.rsp_policy = &{self.nested_render_name}_nest;",
                      f"parg.data = &{var}->{self.c_name};"]
        return get_lines, init_lines, None
@@ -1674,7 +1674,7 @@ def _multi_parse(ri, struct, init_lines, local_vars):
        ri.cw.block_start(line=f"ynl_attr_for_each_nested(attr, attr_{aspec.c_name})")
        ri.cw.p(f"parg.data = &dst->{aspec.c_name}[i];")
        ri.cw.p(f"if ({aspec.nested_render_name}_parse(&parg, attr, ynl_attr_type(attr)))")
        ri.cw.p('return MNL_CB_ERROR;')
        ri.cw.p('return YNL_PARSE_CB_ERROR;')
        ri.cw.p('i++;')
        ri.cw.block_end()
        ri.cw.block_end()
@@ -1693,7 +1693,7 @@ def _multi_parse(ri, struct, init_lines, local_vars):
        if 'nested-attributes' in aspec:
            ri.cw.p(f"parg.data = &dst->{aspec.c_name}[i];")
            ri.cw.p(f"if ({aspec.nested_render_name}_parse(&parg, attr))")
            ri.cw.p('return MNL_CB_ERROR;')
            ri.cw.p('return YNL_PARSE_CB_ERROR;')
        elif aspec.type in scalars:
            ri.cw.p(f"dst->{aspec.c_name}[i] = ynl_attr_get_{aspec.type}(attr);")
        else:
@@ -1707,7 +1707,7 @@ def _multi_parse(ri, struct, init_lines, local_vars):
    if struct.nested:
        ri.cw.p('return 0;')
    else:
        ri.cw.p('return MNL_CB_OK;')
        ri.cw.p('return YNL_PARSE_CB_OK;')
    ri.cw.block_end()
    ri.cw.nl()

@@ -1750,7 +1750,7 @@ def parse_rsp_msg(ri, deref=False):
    else:
        # Empty reply
        ri.cw.block_start()
        ri.cw.p('return MNL_CB_OK;')
        ri.cw.p('return YNL_PARSE_CB_OK;')
        ri.cw.block_end()
        ri.cw.nl()