mirror of
https://github.com/systemd/systemd.git
synced 2026-08-06 08:00:57 +00:00
sd-netlink: introduce basic_type_system
Preparation for later commits.
This commit is contained in:
@@ -1302,14 +1302,14 @@ static int netlink_message_parse_error(sd_netlink_message *m) {
|
||||
NLMSG_PAYLOAD(m->hdr, hlen));
|
||||
}
|
||||
|
||||
int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *genl) {
|
||||
int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *nl) {
|
||||
const NLType *nl_type;
|
||||
uint16_t type;
|
||||
size_t size;
|
||||
int r;
|
||||
|
||||
assert_return(m, -EINVAL);
|
||||
assert_return(genl || m->protocol != NETLINK_GENERIC, -EINVAL);
|
||||
assert_return(nl, -EINVAL);
|
||||
|
||||
/* don't allow appending to message once parsed */
|
||||
message_seal(m);
|
||||
@@ -1325,7 +1325,7 @@ int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *genl) {
|
||||
|
||||
assert(m->hdr);
|
||||
|
||||
r = type_system_root_get_type(genl, &nl_type, m->hdr->nlmsg_type);
|
||||
r = type_system_root_get_type(nl, &nl_type, m->hdr->nlmsg_type);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
||||
@@ -251,8 +251,6 @@ static const NLTypeSystem genl_wireguard_type_system = {
|
||||
|
||||
/***************** genl families *****************/
|
||||
static const NLType genl_types[] = {
|
||||
[SD_GENL_DONE] = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system },
|
||||
[SD_GENL_ERROR] = { .type = NETLINK_TYPE_NESTED, .type_system = &error_type_system, .size = sizeof(struct nlmsgerr) },
|
||||
[SD_GENL_ID_CTRL] = { .type = NETLINK_TYPE_NESTED, .type_system = &genl_ctrl_type_system, .size = sizeof(struct genlmsghdr) },
|
||||
[SD_GENL_WIREGUARD] = { .type = NETLINK_TYPE_NESTED, .type_system = &genl_wireguard_type_system, .size = sizeof(struct genlmsghdr) },
|
||||
[SD_GENL_FOU] = { .type = NETLINK_TYPE_NESTED, .type_system = &genl_fou_type_system, .size = sizeof(struct genlmsghdr) },
|
||||
|
||||
@@ -24,9 +24,6 @@ struct NLTypeSystemUnion {
|
||||
const NLTypeSystem *type_systems;
|
||||
};
|
||||
|
||||
extern const NLTypeSystem empty_type_system;
|
||||
extern const NLTypeSystem error_type_system;
|
||||
|
||||
typedef enum NLUnionLinkInfoData {
|
||||
NL_UNION_LINK_INFO_DATA_BOND,
|
||||
NL_UNION_LINK_INFO_DATA_BRIDGE,
|
||||
|
||||
@@ -234,8 +234,6 @@ static const NLTypeSystem nfnl_msg_batch_type_system = {
|
||||
};
|
||||
|
||||
static const NLType nfnl_types[] = {
|
||||
[NLMSG_DONE] = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system, .size = 0 },
|
||||
[NLMSG_ERROR] = { .type = NETLINK_TYPE_NESTED, .type_system = &error_type_system, .size = sizeof(struct nlmsgerr) },
|
||||
[NFNL_MSG_BATCH_BEGIN] = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_msg_batch_type_system, .size = sizeof(struct nfgenmsg) },
|
||||
[NFNL_MSG_BATCH_END] = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_msg_batch_type_system, .size = sizeof(struct nfgenmsg) },
|
||||
[NFNL_SUBSYS_NFTABLES] = { .type = NETLINK_TYPE_NESTED, .type_system = &nfnl_nft_msg_type_system, .size = sizeof(struct nfgenmsg) },
|
||||
|
||||
@@ -1008,8 +1008,6 @@ static const NLTypeSystem rtnl_mdb_type_system = {
|
||||
};
|
||||
|
||||
static const NLType rtnl_types[] = {
|
||||
[NLMSG_DONE] = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system, .size = 0 },
|
||||
[NLMSG_ERROR] = { .type = NETLINK_TYPE_NESTED, .type_system = &error_type_system, .size = sizeof(struct nlmsgerr) },
|
||||
[RTM_NEWLINK] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
|
||||
[RTM_DELLINK] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
|
||||
[RTM_GETLINK] = { .type = NETLINK_TYPE_NESTED, .type_system = &rtnl_link_type_system, .size = sizeof(struct ifinfomsg) },
|
||||
|
||||
@@ -9,7 +9,7 @@ static const NLType empty_types[1] = {
|
||||
/* fake array to avoid .types==NULL, which denotes invalid type-systems */
|
||||
};
|
||||
|
||||
const NLTypeSystem empty_type_system = {
|
||||
static const NLTypeSystem empty_type_system = {
|
||||
.count = 0,
|
||||
.types = empty_types,
|
||||
};
|
||||
@@ -19,11 +19,21 @@ static const NLType error_types[] = {
|
||||
[NLMSGERR_ATTR_OFFS] = { .type = NETLINK_TYPE_U32 },
|
||||
};
|
||||
|
||||
const NLTypeSystem error_type_system = {
|
||||
static const NLTypeSystem error_type_system = {
|
||||
.count = ELEMENTSOF(error_types),
|
||||
.types = error_types,
|
||||
};
|
||||
|
||||
static const NLType basic_types[] = {
|
||||
[NLMSG_DONE] = { .type = NETLINK_TYPE_NESTED, .type_system = &empty_type_system },
|
||||
[NLMSG_ERROR] = { .type = NETLINK_TYPE_NESTED, .type_system = &error_type_system, .size = sizeof(struct nlmsgerr) },
|
||||
};
|
||||
|
||||
const NLTypeSystem basic_type_system = {
|
||||
.count = ELEMENTSOF(basic_types),
|
||||
.types = basic_types,
|
||||
};
|
||||
|
||||
uint16_t type_get_type(const NLType *type) {
|
||||
assert(type);
|
||||
return type->type;
|
||||
@@ -54,8 +64,8 @@ uint16_t type_system_get_count(const NLTypeSystem *type_system) {
|
||||
}
|
||||
|
||||
int type_system_root_get_type(sd_netlink *nl, const NLType **ret, uint16_t type) {
|
||||
if (!nl)
|
||||
return rtnl_get_type(type, ret);
|
||||
if (!nl || IN_SET(type, NLMSG_DONE, NLMSG_ERROR))
|
||||
return type_system_get_type(&basic_type_system, ret, type);
|
||||
|
||||
switch(nl->protocol) {
|
||||
case NETLINK_ROUTE:
|
||||
|
||||
@@ -29,7 +29,7 @@ static void test_message_link_bridge(sd_netlink *rtnl) {
|
||||
assert_se(sd_netlink_message_append_u32(message, IFLA_BRPORT_COST, 10) >= 0);
|
||||
assert_se(sd_netlink_message_close_container(message) >= 0);
|
||||
|
||||
assert_se(sd_netlink_message_rewind(message, NULL) >= 0);
|
||||
assert_se(sd_netlink_message_rewind(message, rtnl) >= 0);
|
||||
|
||||
assert_se(sd_netlink_message_enter_container(message, IFLA_PROTINFO) >= 0);
|
||||
assert_se(sd_netlink_message_read_u32(message, IFLA_BRPORT_COST, &cost) >= 0);
|
||||
@@ -131,7 +131,7 @@ static void test_route(sd_netlink *rtnl) {
|
||||
return;
|
||||
}
|
||||
|
||||
assert_se(sd_netlink_message_rewind(req, NULL) >= 0);
|
||||
assert_se(sd_netlink_message_rewind(req, rtnl) >= 0);
|
||||
|
||||
assert_se(sd_netlink_message_read_in_addr(req, RTA_GATEWAY, &addr_data) >= 0);
|
||||
assert_se(addr_data.s_addr == addr.s_addr);
|
||||
@@ -431,7 +431,7 @@ static void test_container(sd_netlink *rtnl) {
|
||||
assert_se(sd_netlink_message_close_container(m) >= 0);
|
||||
assert_se(sd_netlink_message_close_container(m) == -EINVAL);
|
||||
|
||||
assert_se(sd_netlink_message_rewind(m, NULL) >= 0);
|
||||
assert_se(sd_netlink_message_rewind(m, rtnl) >= 0);
|
||||
|
||||
assert_se(sd_netlink_message_enter_container(m, IFLA_LINKINFO) >= 0);
|
||||
assert_se(sd_netlink_message_read_string(m, IFLA_INFO_KIND, &string_data) >= 0);
|
||||
@@ -571,7 +571,7 @@ static void test_strv(sd_netlink *rtnl) {
|
||||
assert_se(sd_netlink_message_close_container(m) >= 0);
|
||||
|
||||
message_seal(m);
|
||||
assert_se(sd_netlink_message_rewind(m, NULL) >= 0);
|
||||
assert_se(sd_netlink_message_rewind(m, rtnl) >= 0);
|
||||
|
||||
assert_se(sd_netlink_message_read_strv(m, IFLA_PROP_LIST, IFLA_ALT_IFNAME, &names_out) >= 0);
|
||||
assert_se(strv_equal(names_in, names_out));
|
||||
|
||||
@@ -128,7 +128,7 @@ int sd_netlink_message_exit_container(sd_netlink_message *m);
|
||||
int sd_netlink_message_open_array(sd_netlink_message *m, uint16_t type);
|
||||
int sd_netlink_message_cancel_array(sd_netlink_message *m);
|
||||
|
||||
int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *genl);
|
||||
int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *nl);
|
||||
|
||||
sd_netlink_message *sd_netlink_message_next(sd_netlink_message *m);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user