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.
r = rtnl_message_parse(m,
&m->rta_offset_tb[m->n_containers],
&m->rta_tb_size[m->n_containers],
r = rtnl_message_parse(m,
&m->rta_offset_tb[m->n_containers],
&m->rta_tb_size[m->n_containers],
- type_system_get_max(type_system),
+ type_system_get_count(type_system),
container,
size);
if (r < 0) {
container,
size);
if (r < 0) {
int rtnl_message_parse(sd_netlink_message *m,
size_t **rta_offset_tb,
unsigned short *rta_tb_size,
int rtnl_message_parse(sd_netlink_message *m,
size_t **rta_offset_tb,
unsigned short *rta_tb_size,
struct rtattr *rta,
unsigned int rt_len) {
unsigned short type;
size_t *tb;
struct rtattr *rta,
unsigned int rt_len) {
unsigned short type;
size_t *tb;
- tb = new0(size_t, max + 1);
+ tb = new0(size_t, count);
- *rta_tb_size = max + 1;
for (; RTA_OK(rta, rt_len); rta = RTA_NEXT(rta, rt_len)) {
type = RTA_TYPE(rta);
for (; RTA_OK(rta, rt_len); rta = RTA_NEXT(rta, rt_len)) {
type = RTA_TYPE(rta);
/* if the kernel is newer than the headers we used
when building, we ignore out-of-range attributes
*/
/* if the kernel is newer than the headers we used
when building, we ignore out-of-range attributes
*/
r = rtnl_message_parse(m,
&m->rta_offset_tb[m->n_containers],
&m->rta_tb_size[m->n_containers],
r = rtnl_message_parse(m,
&m->rta_offset_tb[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)),
NLMSG_PAYLOAD(m->hdr, size));
if (r < 0)
(struct rtattr*)((uint8_t*)NLMSG_DATA(m->hdr) + NLMSG_ALIGN(size)),
NLMSG_PAYLOAD(m->hdr, size));
if (r < 0)
};
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,
};
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] = {
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] = {
- [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 },
};
};
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,
};
};
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 },
};
};
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,
};
};
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,
};
};
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,
};
};
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,
};
};
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,
};
};
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,
};
};
const NLTypeSystem rtnl_type_system = {
};
const NLTypeSystem rtnl_type_system = {
- .max = ELEMENTSOF(rtnl_types) - 1,
+ .count = ELEMENTSOF(rtnl_types),
*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) {
- 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) {
assert(type_system->types);
assert(type_system->types);
- if (type > type_system->max)
+ if (type >= type_system->count)
return -EOPNOTSUPP;
nl_type = &type_system->types[type];
return -EOPNOTSUPP;
nl_type = &type_system->types[type];
return -EOPNOTSUPP;
type_system = &type_system_union->type_systems[protocol];
return -EOPNOTSUPP;
type_system = &type_system_union->type_systems[protocol];
- if (type_system->max == 0)
+ if (type_system->count == 0)
return -EOPNOTSUPP;
*ret = type_system;
return -EOPNOTSUPP;
*ret = type_system;
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(const NLType *type, const NLTypeSystem **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_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(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_union(const NLTypeSystem *type_system, const NLTypeSystemUnion **ret, uint16_t type);