mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-24 21:34:08 +03:00
sd-netlink: turn 'max' into 'count' to support empty type-systems
Right now we store the maximum type-ID of a type-system. This prevents us from creating empty type-systems. Store the "count" instead, which should be treated as max+1. Note that type_system_union_protocol_get_type_system() currently has a nasty hack to treat empty type-systems as invalid. This might need some modification later on as well.
This commit is contained in:
parent
6c14ad61db
commit
c1df8dee28
@ -753,7 +753,7 @@ int sd_netlink_message_enter_container(sd_netlink_message *m, unsigned short typ
|
|||||||
r = rtnl_message_parse(m,
|
r = rtnl_message_parse(m,
|
||||||
&m->rta_offset_tb[m->n_containers],
|
&m->rta_offset_tb[m->n_containers],
|
||||||
&m->rta_tb_size[m->n_containers],
|
&m->rta_tb_size[m->n_containers],
|
||||||
type_system_get_max(type_system),
|
type_system_get_count(type_system),
|
||||||
container,
|
container,
|
||||||
size);
|
size);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
@ -811,17 +811,17 @@ int sd_netlink_message_get_errno(sd_netlink_message *m) {
|
|||||||
int rtnl_message_parse(sd_netlink_message *m,
|
int rtnl_message_parse(sd_netlink_message *m,
|
||||||
size_t **rta_offset_tb,
|
size_t **rta_offset_tb,
|
||||||
unsigned short *rta_tb_size,
|
unsigned short *rta_tb_size,
|
||||||
int max,
|
int count,
|
||||||
struct rtattr *rta,
|
struct rtattr *rta,
|
||||||
unsigned int rt_len) {
|
unsigned int rt_len) {
|
||||||
unsigned short type;
|
unsigned short type;
|
||||||
size_t *tb;
|
size_t *tb;
|
||||||
|
|
||||||
tb = new0(size_t, max + 1);
|
tb = new0(size_t, count);
|
||||||
if(!tb)
|
if(!tb)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
*rta_tb_size = max + 1;
|
*rta_tb_size = count;
|
||||||
|
|
||||||
for (; RTA_OK(rta, rt_len); rta = RTA_NEXT(rta, rt_len)) {
|
for (; RTA_OK(rta, rt_len); rta = RTA_NEXT(rta, rt_len)) {
|
||||||
type = RTA_TYPE(rta);
|
type = RTA_TYPE(rta);
|
||||||
@ -829,7 +829,7 @@ int rtnl_message_parse(sd_netlink_message *m,
|
|||||||
/* if the kernel is newer than the headers we used
|
/* if the kernel is newer than the headers we used
|
||||||
when building, we ignore out-of-range attributes
|
when building, we ignore out-of-range attributes
|
||||||
*/
|
*/
|
||||||
if (type > max)
|
if (type >= count)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (tb[type])
|
if (tb[type])
|
||||||
@ -889,7 +889,7 @@ int sd_netlink_message_rewind(sd_netlink_message *m) {
|
|||||||
r = rtnl_message_parse(m,
|
r = rtnl_message_parse(m,
|
||||||
&m->rta_offset_tb[m->n_containers],
|
&m->rta_offset_tb[m->n_containers],
|
||||||
&m->rta_tb_size[m->n_containers],
|
&m->rta_tb_size[m->n_containers],
|
||||||
type_system_get_max(type_system),
|
type_system_get_count(type_system),
|
||||||
(struct rtattr*)((uint8_t*)NLMSG_DATA(m->hdr) + NLMSG_ALIGN(size)),
|
(struct rtattr*)((uint8_t*)NLMSG_DATA(m->hdr) + NLMSG_ALIGN(size)),
|
||||||
NLMSG_PAYLOAD(m->hdr, size));
|
NLMSG_PAYLOAD(m->hdr, size));
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
@ -47,7 +47,7 @@ struct NLType {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct NLTypeSystem {
|
struct NLTypeSystem {
|
||||||
uint16_t max;
|
uint16_t count;
|
||||||
const NLType *types;
|
const NLType *types;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ static const NLType rtnl_bond_arp_target_types[BOND_ARP_TARGETS_MAX + 1] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const NLTypeSystem rtnl_bond_arp_type_system = {
|
static const NLTypeSystem rtnl_bond_arp_type_system = {
|
||||||
.max = ELEMENTSOF(rtnl_bond_arp_target_types) - 1,
|
.count = ELEMENTSOF(rtnl_bond_arp_target_types),
|
||||||
.types = rtnl_bond_arp_target_types,
|
.types = rtnl_bond_arp_target_types,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -223,37 +223,37 @@ static const char* const nl_union_link_info_data_table[_NL_UNION_LINK_INFO_DATA_
|
|||||||
DEFINE_STRING_TABLE_LOOKUP(nl_union_link_info_data, NLUnionLinkInfoData);
|
DEFINE_STRING_TABLE_LOOKUP(nl_union_link_info_data, NLUnionLinkInfoData);
|
||||||
|
|
||||||
static const NLTypeSystem rtnl_link_info_data_type_systems[_NL_UNION_LINK_INFO_DATA_MAX] = {
|
static const NLTypeSystem rtnl_link_info_data_type_systems[_NL_UNION_LINK_INFO_DATA_MAX] = {
|
||||||
[NL_UNION_LINK_INFO_DATA_BOND] = { .max = ELEMENTSOF(rtnl_link_info_data_bond_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_BOND] = { .count = ELEMENTSOF(rtnl_link_info_data_bond_types),
|
||||||
.types = rtnl_link_info_data_bond_types },
|
.types = rtnl_link_info_data_bond_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_BRIDGE] = { .max = ELEMENTSOF(rtnl_link_info_data_bridge_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_BRIDGE] = { .count = ELEMENTSOF(rtnl_link_info_data_bridge_types),
|
||||||
.types = rtnl_link_info_data_bridge_types },
|
.types = rtnl_link_info_data_bridge_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_VLAN] = { .max = ELEMENTSOF(rtnl_link_info_data_vlan_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_VLAN] = { .count = ELEMENTSOF(rtnl_link_info_data_vlan_types),
|
||||||
.types = rtnl_link_info_data_vlan_types },
|
.types = rtnl_link_info_data_vlan_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_VETH] = { .max = ELEMENTSOF(rtnl_link_info_data_veth_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_VETH] = { .count = ELEMENTSOF(rtnl_link_info_data_veth_types),
|
||||||
.types = rtnl_link_info_data_veth_types },
|
.types = rtnl_link_info_data_veth_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_MACVLAN] = { .max = ELEMENTSOF(rtnl_link_info_data_macvlan_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_MACVLAN] = { .count = ELEMENTSOF(rtnl_link_info_data_macvlan_types),
|
||||||
.types = rtnl_link_info_data_macvlan_types },
|
.types = rtnl_link_info_data_macvlan_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_IPVLAN] = { .max = ELEMENTSOF(rtnl_link_info_data_ipvlan_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_IPVLAN] = { .count = ELEMENTSOF(rtnl_link_info_data_ipvlan_types),
|
||||||
.types = rtnl_link_info_data_ipvlan_types },
|
.types = rtnl_link_info_data_ipvlan_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_VXLAN] = { .max = ELEMENTSOF(rtnl_link_info_data_vxlan_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_VXLAN] = { .count = ELEMENTSOF(rtnl_link_info_data_vxlan_types),
|
||||||
.types = rtnl_link_info_data_vxlan_types },
|
.types = rtnl_link_info_data_vxlan_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_IPIP_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_iptun_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_IPIP_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_iptun_types),
|
||||||
.types = rtnl_link_info_data_iptun_types },
|
.types = rtnl_link_info_data_iptun_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_IPGRE_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ipgre_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_IPGRE_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
|
||||||
.types = rtnl_link_info_data_ipgre_types },
|
.types = rtnl_link_info_data_ipgre_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_IPGRETAP_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ipgre_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_IPGRETAP_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
|
||||||
.types = rtnl_link_info_data_ipgre_types },
|
.types = rtnl_link_info_data_ipgre_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_IP6GRE_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ipgre_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_IP6GRE_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
|
||||||
.types = rtnl_link_info_data_ipgre_types },
|
.types = rtnl_link_info_data_ipgre_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_IP6GRETAP_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ipgre_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_IP6GRETAP_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_ipgre_types),
|
||||||
.types = rtnl_link_info_data_ipgre_types },
|
.types = rtnl_link_info_data_ipgre_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_SIT_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_iptun_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_SIT_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_iptun_types),
|
||||||
.types = rtnl_link_info_data_iptun_types },
|
.types = rtnl_link_info_data_iptun_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_VTI_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ipvti_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_VTI_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_ipvti_types),
|
||||||
.types = rtnl_link_info_data_ipvti_types },
|
.types = rtnl_link_info_data_ipvti_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_VTI6_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ipvti_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_VTI6_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_ipvti_types),
|
||||||
.types = rtnl_link_info_data_ipvti_types },
|
.types = rtnl_link_info_data_ipvti_types },
|
||||||
[NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL] = { .max = ELEMENTSOF(rtnl_link_info_data_ip6tnl_types) - 1,
|
[NL_UNION_LINK_INFO_DATA_IP6TNL_TUNNEL] = { .count = ELEMENTSOF(rtnl_link_info_data_ip6tnl_types),
|
||||||
.types = rtnl_link_info_data_ip6tnl_types },
|
.types = rtnl_link_info_data_ip6tnl_types },
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -277,7 +277,7 @@ static const NLType rtnl_link_info_types[IFLA_INFO_MAX + 1] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const NLTypeSystem rtnl_link_info_type_system = {
|
static const NLTypeSystem rtnl_link_info_type_system = {
|
||||||
.max = ELEMENTSOF(rtnl_link_info_types) - 1,
|
.count = ELEMENTSOF(rtnl_link_info_types),
|
||||||
.types = rtnl_link_info_types,
|
.types = rtnl_link_info_types,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -293,7 +293,7 @@ static const struct NLType rtnl_prot_info_bridge_port_types[IFLA_BRPORT_MAX + 1]
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const NLTypeSystem rtnl_prot_info_type_systems[AF_MAX] = {
|
static const NLTypeSystem rtnl_prot_info_type_systems[AF_MAX] = {
|
||||||
[AF_BRIDGE] = { .max = ELEMENTSOF(rtnl_prot_info_bridge_port_types) - 1,
|
[AF_BRIDGE] = { .count = ELEMENTSOF(rtnl_prot_info_bridge_port_types),
|
||||||
.types = rtnl_prot_info_bridge_port_types },
|
.types = rtnl_prot_info_bridge_port_types },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -317,7 +317,7 @@ static const struct NLType rtnl_af_spec_inet6_types[IFLA_INET6_MAX + 1] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const NLTypeSystem rtnl_af_spec_inet6_type_system = {
|
static const NLTypeSystem rtnl_af_spec_inet6_type_system = {
|
||||||
.max = ELEMENTSOF(rtnl_af_spec_inet6_types) - 1,
|
.count = ELEMENTSOF(rtnl_af_spec_inet6_types),
|
||||||
.types = rtnl_af_spec_inet6_types,
|
.types = rtnl_af_spec_inet6_types,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -326,7 +326,7 @@ static const NLType rtnl_af_spec_types[AF_MAX + 1] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const NLTypeSystem rtnl_af_spec_type_system = {
|
static const NLTypeSystem rtnl_af_spec_type_system = {
|
||||||
.max = ELEMENTSOF(rtnl_af_spec_types) - 1,
|
.count = ELEMENTSOF(rtnl_af_spec_types),
|
||||||
.types = rtnl_af_spec_types,
|
.types = rtnl_af_spec_types,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -383,7 +383,7 @@ static const NLType rtnl_link_types[IFLA_MAX + 1 ] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const NLTypeSystem rtnl_link_type_system = {
|
static const NLTypeSystem rtnl_link_type_system = {
|
||||||
.max = ELEMENTSOF(rtnl_link_types) - 1,
|
.count = ELEMENTSOF(rtnl_link_types),
|
||||||
.types = rtnl_link_types,
|
.types = rtnl_link_types,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -403,7 +403,7 @@ static const NLType rtnl_address_types[CONST_MAX(IFA_MAX, IFA_FLAGS) + 1] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const NLTypeSystem rtnl_address_type_system = {
|
static const NLTypeSystem rtnl_address_type_system = {
|
||||||
.max = ELEMENTSOF(rtnl_address_types) - 1,
|
.count = ELEMENTSOF(rtnl_address_types),
|
||||||
.types = rtnl_address_types,
|
.types = rtnl_address_types,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -429,7 +429,7 @@ static const NLType rtnl_route_types[RTA_MAX + 1] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const NLTypeSystem rtnl_route_type_system = {
|
static const NLTypeSystem rtnl_route_type_system = {
|
||||||
.max = ELEMENTSOF(rtnl_route_types) - 1,
|
.count = ELEMENTSOF(rtnl_route_types),
|
||||||
.types = rtnl_route_types,
|
.types = rtnl_route_types,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -445,7 +445,7 @@ static const NLType rtnl_neigh_types[NDA_MAX + 1] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const NLTypeSystem rtnl_neigh_type_system = {
|
static const NLTypeSystem rtnl_neigh_type_system = {
|
||||||
.max = ELEMENTSOF(rtnl_neigh_types) - 1,
|
.count = ELEMENTSOF(rtnl_neigh_types),
|
||||||
.types = rtnl_neigh_types,
|
.types = rtnl_neigh_types,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -468,7 +468,7 @@ static const NLType rtnl_types[RTM_MAX + 1] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const NLTypeSystem rtnl_type_system = {
|
const NLTypeSystem rtnl_type_system = {
|
||||||
.max = ELEMENTSOF(rtnl_types) - 1,
|
.count = ELEMENTSOF(rtnl_types),
|
||||||
.types = rtnl_types,
|
.types = rtnl_types,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -500,9 +500,9 @@ void type_get_type_system_union(const NLType *nl_type, const NLTypeSystemUnion *
|
|||||||
*ret = nl_type->type_system_union;
|
*ret = nl_type->type_system_union;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t type_system_get_max(const NLTypeSystem *type_system) {
|
uint16_t type_system_get_count(const NLTypeSystem *type_system) {
|
||||||
assert(type_system);
|
assert(type_system);
|
||||||
return type_system->max;
|
return type_system->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
int type_system_get_type(const NLTypeSystem *type_system, const NLType **ret, uint16_t type) {
|
int type_system_get_type(const NLTypeSystem *type_system, const NLType **ret, uint16_t type) {
|
||||||
@ -515,7 +515,7 @@ int type_system_get_type(const NLTypeSystem *type_system, const NLType **ret, ui
|
|||||||
|
|
||||||
assert(type_system->types);
|
assert(type_system->types);
|
||||||
|
|
||||||
if (type > type_system->max)
|
if (type >= type_system->count)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
nl_type = &type_system->types[type];
|
nl_type = &type_system->types[type];
|
||||||
@ -589,7 +589,7 @@ int type_system_union_protocol_get_type_system(const NLTypeSystemUnion *type_sys
|
|||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
type_system = &type_system_union->type_systems[protocol];
|
type_system = &type_system_union->type_systems[protocol];
|
||||||
if (type_system->max == 0)
|
if (type_system->count == 0)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
*ret = type_system;
|
*ret = type_system;
|
||||||
|
@ -58,7 +58,7 @@ size_t type_get_size(const NLType *type);
|
|||||||
void type_get_type_system(const NLType *type, const NLTypeSystem **ret);
|
void type_get_type_system(const NLType *type, const NLTypeSystem **ret);
|
||||||
void type_get_type_system_union(const NLType *type, const NLTypeSystemUnion **ret);
|
void type_get_type_system_union(const NLType *type, const NLTypeSystemUnion **ret);
|
||||||
|
|
||||||
uint16_t type_system_get_max(const NLTypeSystem *type_system);
|
uint16_t type_system_get_count(const NLTypeSystem *type_system);
|
||||||
int type_system_get_type(const NLTypeSystem *type_system, const NLType **ret, uint16_t type);
|
int type_system_get_type(const NLTypeSystem *type_system, const NLType **ret, uint16_t type);
|
||||||
int type_system_get_type_system(const NLTypeSystem *type_system, const NLTypeSystem **ret, uint16_t type);
|
int type_system_get_type_system(const NLTypeSystem *type_system, const NLTypeSystem **ret, uint16_t type);
|
||||||
int type_system_get_type_system_union(const NLTypeSystem *type_system, const NLTypeSystemUnion **ret, uint16_t type);
|
int type_system_get_type_system_union(const NLTypeSystem *type_system, const NLTypeSystemUnion **ret, uint16_t type);
|
||||||
|
Loading…
Reference in New Issue
Block a user