Merge pull request #34699 from yuwata/netlink-cleanups

sd-netlink: several cleanups
This commit is contained in:
Yu Watanabe
2024-10-11 04:30:16 +09:00
committed by GitHub
11 changed files with 528 additions and 1271 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -754,25 +754,55 @@ static int netlink_message_read_internal(
return RTA_PAYLOAD(rta);
}
int sd_netlink_message_read(sd_netlink_message *m, uint16_t attr_type, size_t size, void *data) {
static int netlink_message_read_impl(
sd_netlink_message *m,
uint16_t attr_type,
bool strict,
NLAType type,
size_t size,
void *ret,
bool *ret_net_byteorder) {
bool net_byteorder;
void *attr_data;
int r;
assert_return(m, -EINVAL);
assert(m);
r = netlink_message_read_internal(m, attr_type, &attr_data, NULL);
if (type >= 0) {
r = message_attribute_has_type(m, NULL, attr_type, type);
if (r < 0)
return r;
}
r = netlink_message_read_internal(m, attr_type, &attr_data, &net_byteorder);
if (r < 0)
return r;
if ((size_t) r > size)
return -ENOBUFS;
if (data)
memcpy(data, attr_data, r);
if (strict && (size_t) r != size)
return -EIO;
if (ret)
memzero(mempcpy(ret, attr_data, r), size - (size_t) r);
if (ret_net_byteorder)
*ret_net_byteorder = net_byteorder;
return r;
}
int sd_netlink_message_read(sd_netlink_message *m, uint16_t attr_type, size_t size, void *ret) {
assert_return(m, -EINVAL);
return netlink_message_read_impl(
m, attr_type, /* strict = */ false,
_NETLINK_TYPE_INVALID, size,
ret, /* ret_net_byteorder = */ NULL);
}
int sd_netlink_message_read_data(sd_netlink_message *m, uint16_t attr_type, size_t *ret_size, void **ret_data) {
void *attr_data;
int r;
@@ -799,34 +829,20 @@ int sd_netlink_message_read_data(sd_netlink_message *m, uint16_t attr_type, size
return r;
}
int sd_netlink_message_read_string_strdup(sd_netlink_message *m, uint16_t attr_type, char **data) {
void *attr_data;
int sd_netlink_message_read_string_strdup(sd_netlink_message *m, uint16_t attr_type, char **ret) {
const char *s;
int r;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, NULL, attr_type, NETLINK_TYPE_STRING);
r = sd_netlink_message_read_string(m, attr_type, &s);
if (r < 0)
return r;
r = netlink_message_read_internal(m, attr_type, &attr_data, NULL);
if (r < 0)
return r;
if (data) {
char *str;
str = strndup(attr_data, r);
if (!str)
return -ENOMEM;
*data = str;
}
return 0;
return strdup_to(ret, s);
}
int sd_netlink_message_read_string(sd_netlink_message *m, uint16_t attr_type, const char **data) {
int sd_netlink_message_read_string(sd_netlink_message *m, uint16_t attr_type, const char **ret) {
void *attr_data;
int r;
@@ -843,234 +859,152 @@ int sd_netlink_message_read_string(sd_netlink_message *m, uint16_t attr_type, co
if (strnlen(attr_data, r) >= (size_t) r)
return -EIO;
if (data)
*data = (const char *) attr_data;
if (ret)
*ret = (const char *) attr_data;
return 0;
}
int sd_netlink_message_read_u8(sd_netlink_message *m, uint16_t attr_type, uint8_t *data) {
void *attr_data;
int r;
int sd_netlink_message_read_u8(sd_netlink_message *m, uint16_t attr_type, uint8_t *ret) {
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, NULL, attr_type, NETLINK_TYPE_U8);
if (r < 0)
return r;
r = netlink_message_read_internal(m, attr_type, &attr_data, NULL);
if (r < 0)
return r;
if ((size_t) r < sizeof(uint8_t))
return -EIO;
if (data)
*data = *(uint8_t *) attr_data;
return 0;
return netlink_message_read_impl(
m, attr_type, /* strict = */ true,
NETLINK_TYPE_U8, sizeof(uint8_t),
ret, /* ret_net_byteorder = */ NULL);
}
int sd_netlink_message_read_u16(sd_netlink_message *m, uint16_t attr_type, uint16_t *data) {
void *attr_data;
int sd_netlink_message_read_u16(sd_netlink_message *m, uint16_t attr_type, uint16_t *ret) {
bool net_byteorder;
uint16_t u;
int r;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, NULL, attr_type, NETLINK_TYPE_U16);
r = netlink_message_read_impl(
m, attr_type, /* strict = */ true,
NETLINK_TYPE_U16, sizeof(uint16_t),
ret ? &u : NULL, &net_byteorder);
if (r < 0)
return r;
r = netlink_message_read_internal(m, attr_type, &attr_data, &net_byteorder);
if (r < 0)
return r;
if ((size_t) r < sizeof(uint16_t))
return -EIO;
if (data) {
if (net_byteorder)
*data = be16toh(*(uint16_t *) attr_data);
else
*data = *(uint16_t *) attr_data;
}
if (ret)
*ret = net_byteorder ? be16toh(u) : u;
return 0;
}
int sd_netlink_message_read_u32(sd_netlink_message *m, uint16_t attr_type, uint32_t *data) {
void *attr_data;
int sd_netlink_message_read_u32(sd_netlink_message *m, uint16_t attr_type, uint32_t *ret) {
bool net_byteorder;
uint32_t u;
int r;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, NULL, attr_type, NETLINK_TYPE_U32);
r = netlink_message_read_impl(
m, attr_type, /* strict = */ true,
NETLINK_TYPE_U32, sizeof(uint32_t),
ret ? &u : NULL, &net_byteorder);
if (r < 0)
return r;
r = netlink_message_read_internal(m, attr_type, &attr_data, &net_byteorder);
if (r < 0)
return r;
if ((size_t) r < sizeof(uint32_t))
return -EIO;
if (data) {
if (net_byteorder)
*data = be32toh(*(uint32_t *) attr_data);
else
*data = *(uint32_t *) attr_data;
}
if (ret)
*ret = net_byteorder ? be32toh(u) : u;
return 0;
}
int sd_netlink_message_read_u64(sd_netlink_message *m, uint16_t attr_type, uint64_t *ret) {
void *attr_data;
bool net_byteorder;
uint64_t u;
int r;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, NULL, attr_type, NETLINK_TYPE_U64);
r = netlink_message_read_impl(
m, attr_type, /* strict = */ true,
NETLINK_TYPE_U64, sizeof(uint64_t),
ret ? &u : NULL, &net_byteorder);
if (r < 0)
return r;
r = netlink_message_read_internal(m, attr_type, &attr_data, &net_byteorder);
if (r < 0)
return r;
if ((size_t) r < sizeof(uint64_t))
return -EIO;
if (ret) {
if (net_byteorder)
*ret = be64toh(*(uint64_t *) attr_data);
else
*ret = *(uint64_t *) attr_data;
}
if (ret)
*ret = net_byteorder ? be64toh(u) : u;
return 0;
}
int sd_netlink_message_read_ether_addr(sd_netlink_message *m, uint16_t attr_type, struct ether_addr *data) {
void *attr_data;
int sd_netlink_message_read_ether_addr(sd_netlink_message *m, uint16_t attr_type, struct ether_addr *ret) {
assert_return(m, -EINVAL);
return netlink_message_read_impl(
m, attr_type, /* strict = */ true,
NETLINK_TYPE_ETHER_ADDR, sizeof(struct ether_addr),
ret, /* ret_net_byteorder = */ NULL);
}
int netlink_message_read_hw_addr(sd_netlink_message *m, uint16_t attr_type, struct hw_addr_data *ret) {
int r;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, NULL, attr_type, NETLINK_TYPE_ETHER_ADDR);
r = netlink_message_read_impl(
m, attr_type, /* strict = */ false,
NETLINK_TYPE_ETHER_ADDR, HW_ADDR_MAX_SIZE,
ret ? ret->bytes : NULL, /* ret_net_byteorder = */ NULL);
if (r < 0)
return r;
r = netlink_message_read_internal(m, attr_type, &attr_data, NULL);
if (r < 0)
return r;
if (ret)
ret->length = r;
if ((size_t) r < sizeof(struct ether_addr))
return -EIO;
if (data)
memcpy(data, attr_data, sizeof(struct ether_addr));
return 0;
return r;
}
int netlink_message_read_hw_addr(sd_netlink_message *m, uint16_t attr_type, struct hw_addr_data *data) {
void *attr_data;
int r;
int sd_netlink_message_read_cache_info(sd_netlink_message *m, uint16_t attr_type, struct ifa_cacheinfo *ret) {
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, NULL, attr_type, NETLINK_TYPE_ETHER_ADDR);
if (r < 0)
return r;
r = netlink_message_read_internal(m, attr_type, &attr_data, NULL);
if (r < 0)
return r;
if (r > HW_ADDR_MAX_SIZE)
return -EIO;
if (data) {
memcpy(data->bytes, attr_data, r);
data->length = r;
}
return 0;
return netlink_message_read_impl(
m, attr_type, /* strict = */ true,
NETLINK_TYPE_CACHE_INFO, sizeof(struct ifa_cacheinfo),
ret, /* ret_net_byteorder = */ NULL);
}
int sd_netlink_message_read_cache_info(sd_netlink_message *m, uint16_t attr_type, struct ifa_cacheinfo *info) {
void *attr_data;
int r;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, NULL, attr_type, NETLINK_TYPE_CACHE_INFO);
if (r < 0)
return r;
r = netlink_message_read_internal(m, attr_type, &attr_data, NULL);
if (r < 0)
return r;
if ((size_t) r < sizeof(struct ifa_cacheinfo))
return -EIO;
if (info)
memcpy(info, attr_data, sizeof(struct ifa_cacheinfo));
return 0;
}
int netlink_message_read_in_addr_union(sd_netlink_message *m, uint16_t attr_type, int family, union in_addr_union *data) {
void *attr_data;
int netlink_message_read_in_addr_union(sd_netlink_message *m, uint16_t attr_type, int family, union in_addr_union *ret) {
int r;
assert_return(m, -EINVAL);
assert_return(IN_SET(family, AF_INET, AF_INET6), -EINVAL);
r = message_attribute_has_type(m, NULL, attr_type, NETLINK_TYPE_IN_ADDR);
r = netlink_message_read_impl(
m, attr_type, /* strict = */ true,
NETLINK_TYPE_IN_ADDR, FAMILY_ADDRESS_SIZE(family),
ret, /* ret_net_byteorder = */ NULL);
if (r < 0)
return r;
r = netlink_message_read_internal(m, attr_type, &attr_data, NULL);
if (r < 0)
return r;
if ((size_t) r < FAMILY_ADDRESS_SIZE(family))
return -EIO;
if (data)
memcpy(data, attr_data, FAMILY_ADDRESS_SIZE(family));
return 0;
}
int sd_netlink_message_read_in_addr(sd_netlink_message *m, uint16_t attr_type, struct in_addr *data) {
union in_addr_union u;
int r;
r = netlink_message_read_in_addr_union(m, attr_type, AF_INET, &u);
if (r >= 0 && data)
*data = u.in;
if (ret)
memzero((uint8_t*) ret + FAMILY_ADDRESS_SIZE(family), sizeof(union in_addr_union) - FAMILY_ADDRESS_SIZE(family));
return r;
}
int sd_netlink_message_read_in6_addr(sd_netlink_message *m, uint16_t attr_type, struct in6_addr *data) {
union in_addr_union u;
int r;
int sd_netlink_message_read_in_addr(sd_netlink_message *m, uint16_t attr_type, struct in_addr *ret) {
assert_return(m, -EINVAL);
r = netlink_message_read_in_addr_union(m, attr_type, AF_INET6, &u);
if (r >= 0 && data)
*data = u.in6;
return netlink_message_read_impl(
m, attr_type, /* strict = */ true,
NETLINK_TYPE_IN_ADDR, sizeof(struct in_addr),
ret, /* ret_net_byteorder = */ NULL);
}
return r;
int sd_netlink_message_read_in6_addr(sd_netlink_message *m, uint16_t attr_type, struct in6_addr *ret) {
assert_return(m, -EINVAL);
return netlink_message_read_impl(
m, attr_type, /* strict = */ true,
NETLINK_TYPE_IN_ADDR, sizeof(struct in6_addr),
ret, /* ret_net_byteorder = */ NULL);
}
int sd_netlink_message_has_flag(sd_netlink_message *m, uint16_t attr_type) {
@@ -1413,7 +1347,7 @@ void message_seal(sd_netlink_message *m) {
m->sealed = true;
}
sd_netlink_message *sd_netlink_message_next(sd_netlink_message *m) {
sd_netlink_message* sd_netlink_message_next(sd_netlink_message *m) {
assert_return(m, NULL);
return m->next;

View File

@@ -105,19 +105,19 @@ static sd_netlink_slot* netlink_slot_free(sd_netlink_slot *slot) {
DEFINE_TRIVIAL_REF_UNREF_FUNC(sd_netlink_slot, sd_netlink_slot, netlink_slot_free);
sd_netlink *sd_netlink_slot_get_netlink(sd_netlink_slot *slot) {
sd_netlink* sd_netlink_slot_get_netlink(sd_netlink_slot *slot) {
assert_return(slot, NULL);
return slot->netlink;
}
void *sd_netlink_slot_get_userdata(sd_netlink_slot *slot) {
void* sd_netlink_slot_get_userdata(sd_netlink_slot *slot) {
assert_return(slot, NULL);
return slot->userdata;
}
void *sd_netlink_slot_set_userdata(sd_netlink_slot *slot, void *userdata) {
void* sd_netlink_slot_set_userdata(sd_netlink_slot *slot, void *userdata) {
void *ret;
assert_return(slot, NULL);
@@ -128,11 +128,11 @@ void *sd_netlink_slot_set_userdata(sd_netlink_slot *slot, void *userdata) {
return ret;
}
int sd_netlink_slot_get_destroy_callback(sd_netlink_slot *slot, sd_netlink_destroy_t *callback) {
int sd_netlink_slot_get_destroy_callback(sd_netlink_slot *slot, sd_netlink_destroy_t *ret) {
assert_return(slot, -EINVAL);
if (callback)
*callback = slot->destroy_callback;
if (ret)
*ret = slot->destroy_callback;
return !!slot->destroy_callback;
}
@@ -172,11 +172,11 @@ int sd_netlink_slot_set_floating(sd_netlink_slot *slot, int b) {
return 1;
}
int sd_netlink_slot_get_description(sd_netlink_slot *slot, const char **description) {
int sd_netlink_slot_get_description(sd_netlink_slot *slot, const char **ret) {
assert_return(slot, -EINVAL);
if (description)
*description = slot->description;
if (ret)
*ret = slot->description;
return !!slot->description;
}

View File

@@ -148,7 +148,7 @@ DEFINE_TRIVIAL_REF_UNREF_FUNC(sd_netlink, sd_netlink, netlink_free);
int sd_netlink_send(
sd_netlink *nl,
sd_netlink_message *message,
uint32_t *serial) {
uint32_t *ret_serial) {
int r;
@@ -163,8 +163,8 @@ int sd_netlink_send(
if (r < 0)
return r;
if (serial)
*serial = message_get_serial(message);
if (ret_serial)
*ret_serial = message_get_serial(message);
return 1;
}
@@ -626,25 +626,25 @@ int sd_netlink_get_events(sd_netlink *nl) {
return ordered_set_isempty(nl->rqueue) ? POLLIN : 0;
}
int sd_netlink_get_timeout(sd_netlink *nl, uint64_t *timeout_usec) {
int sd_netlink_get_timeout(sd_netlink *nl, uint64_t *ret) {
struct reply_callback *c;
assert_return(nl, -EINVAL);
assert_return(timeout_usec, -EINVAL);
assert_return(ret, -EINVAL);
assert_return(!netlink_pid_changed(nl), -ECHILD);
if (!ordered_set_isempty(nl->rqueue)) {
*timeout_usec = 0;
*ret = 0;
return 1;
}
c = prioq_peek(nl->reply_callbacks_prioq);
if (!c) {
*timeout_usec = UINT64_MAX;
*ret = UINT64_MAX;
return 0;
}
*timeout_usec = c->timeout;
*ret = c->timeout;
return 1;
}

View File

@@ -108,7 +108,7 @@ TEST(message_address) {
assert_se(sd_netlink_message_read_in_addr(reply, IFA_LOCAL, &in_data) >= 0);
assert_se(sd_netlink_message_read_in_addr(reply, IFA_ADDRESS, &in_data) >= 0);
assert_se(sd_netlink_message_read_string(reply, IFA_LABEL, &label) >= 0);
assert_se(sd_netlink_message_read_cache_info(reply, IFA_CACHEINFO, &cache) == 0);
assert_se(sd_netlink_message_read_cache_info(reply, IFA_CACHEINFO, &cache) >= 0);
}
}

View File

@@ -307,8 +307,8 @@ static int routing_policy_rule_append_json(RoutingPolicyRule *rule, sd_json_vari
SD_JSON_BUILD_PAIR_UNSIGNED("Protocol", rule->protocol),
SD_JSON_BUILD_PAIR_STRING("ProtocolString", protocol),
SD_JSON_BUILD_PAIR_UNSIGNED("TOS", rule->tos),
SD_JSON_BUILD_PAIR_UNSIGNED("Type", rule->type),
SD_JSON_BUILD_PAIR_STRING("TypeString", fr_act_type_to_string(rule->type)),
SD_JSON_BUILD_PAIR_UNSIGNED("Type", rule->action),
SD_JSON_BUILD_PAIR_STRING("TypeString", fr_act_type_to_string(rule->action)),
SD_JSON_BUILD_PAIR_UNSIGNED("IPProtocol", rule->ipproto),
SD_JSON_BUILD_PAIR_STRING("IPProtocolString", ip_protocol_to_name(rule->ipproto)),
SD_JSON_BUILD_PAIR_UNSIGNED("Priority", rule->priority),

View File

@@ -194,7 +194,7 @@ RoutingPolicyRule.Family, config_parse_routing_policy_rule,
RoutingPolicyRule.User, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_UID_RANGE, 0
RoutingPolicyRule.SuppressInterfaceGroup, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_SUPPRESS_IFGROUP, 0
RoutingPolicyRule.SuppressPrefixLength, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_SUPPRESS_PREFIXLEN, 0
RoutingPolicyRule.Type, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_TYPE, 0
RoutingPolicyRule.Type, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_ACTION, 0
Route.Gateway, config_parse_gateway, 0, 0
Route.Destination, config_parse_destination, 0, 0
Route.Source, config_parse_destination, 0, 0

View File

@@ -29,7 +29,7 @@ typedef struct NextHop {
/* struct nhmsg */
int family;
uint8_t protocol;
uint8_t flags;
uint32_t flags;
/* attributes */
uint32_t id; /* NHA_ID */

View File

@@ -111,7 +111,7 @@ static int routing_policy_rule_new(RoutingPolicyRule **ret) {
.suppress_prefixlen = -1,
.suppress_ifgroup = -1,
.protocol = RTPROT_UNSPEC,
.type = FR_ACT_TO_TBL,
.action = FR_ACT_TO_TBL,
};
*ret = rule;
@@ -196,7 +196,7 @@ static void routing_policy_rule_hash_func(const RoutingPolicyRule *rule, struct
/* See rule_exists() in net/core/fib_rules.c of the kernel. */
siphash24_compress_typesafe(rule->family, state);
siphash24_compress_typesafe(rule->type, state);
siphash24_compress_typesafe(rule->action, state);
siphash24_compress_typesafe(rule->table, state);
siphash24_compress_typesafe(rule->priority, state);
siphash24_compress_string(rule->iif, state);
@@ -235,7 +235,7 @@ static int routing_policy_rule_compare_func_full(const RoutingPolicyRule *a, con
return r;
}
r = CMP(a->type, b->type);
r = CMP(a->action, b->action);
if (r != 0)
return r;
@@ -365,7 +365,7 @@ static bool routing_policy_rule_can_update(const RoutingPolicyRule *existing, co
return false;
/* GOTO target cannot be updated. */
if (existing->type == FR_ACT_GOTO && existing->priority_goto != requesting->priority_goto)
if (existing->action == FR_ACT_GOTO && existing->priority_goto != requesting->priority_goto)
return false;
return true;
@@ -515,7 +515,7 @@ static int routing_policy_rule_acquire_priority(Manager *manager, RoutingPolicyR
}
/* priority must be smaller than goto target */
for (priority = rule->type == FR_ACT_GOTO ? rule->priority_goto - 1 : 32765; priority > 0; priority--)
for (priority = rule->action == FR_ACT_GOTO ? rule->priority_goto - 1 : 32765; priority > 0; priority--)
if (!set_contains(priorities, UINT32_TO_PTR(priority)))
break;
@@ -560,7 +560,7 @@ static int routing_policy_rule_set_netlink_message(const RoutingPolicyRule *rule
if (r < 0)
return r;
r = sd_rtnl_message_routing_policy_rule_set_fib_src_prefixlen(m, rule->from_prefixlen);
r = sd_rtnl_message_routing_policy_rule_set_src_prefixlen(m, rule->from_prefixlen);
if (r < 0)
return r;
}
@@ -570,7 +570,7 @@ static int routing_policy_rule_set_netlink_message(const RoutingPolicyRule *rule
if (r < 0)
return r;
r = sd_rtnl_message_routing_policy_rule_set_fib_dst_prefixlen(m, rule->to_prefixlen);
r = sd_rtnl_message_routing_policy_rule_set_dst_prefixlen(m, rule->to_prefixlen);
if (r < 0)
return r;
}
@@ -667,11 +667,11 @@ static int routing_policy_rule_set_netlink_message(const RoutingPolicyRule *rule
return r;
}
r = sd_rtnl_message_routing_policy_rule_set_fib_type(m, rule->type);
r = sd_rtnl_message_routing_policy_rule_set_action(m, rule->action);
if (r < 0)
return r;
if (rule->type == FR_ACT_GOTO) {
if (rule->action == FR_ACT_GOTO) {
r = sd_netlink_message_append_u32(m, FRA_GOTO, rule->priority_goto);
if (r < 0)
return r;
@@ -1039,13 +1039,13 @@ int link_request_static_routing_policy_rules(Link *link) {
}
static const RoutingPolicyRule kernel_rules[] = {
{ .family = AF_INET, .priority_set = true, .priority = 0, .table = RT_TABLE_LOCAL, .type = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, },
{ .family = AF_INET, .priority_set = true, .priority = 1000, .table = RT_TABLE_UNSPEC, .type = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, .l3mdev = true },
{ .family = AF_INET, .priority_set = true, .priority = 32766, .table = RT_TABLE_MAIN, .type = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, },
{ .family = AF_INET, .priority_set = true, .priority = 32767, .table = RT_TABLE_DEFAULT, .type = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, },
{ .family = AF_INET6, .priority_set = true, .priority = 0, .table = RT_TABLE_LOCAL, .type = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, },
{ .family = AF_INET6, .priority_set = true, .priority = 1000, .table = RT_TABLE_UNSPEC, .type = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, .l3mdev = true },
{ .family = AF_INET6, .priority_set = true, .priority = 32766, .table = RT_TABLE_MAIN, .type = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, },
{ .family = AF_INET, .priority_set = true, .priority = 0, .table = RT_TABLE_LOCAL, .action = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, },
{ .family = AF_INET, .priority_set = true, .priority = 1000, .table = RT_TABLE_UNSPEC, .action = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, .l3mdev = true },
{ .family = AF_INET, .priority_set = true, .priority = 32766, .table = RT_TABLE_MAIN, .action = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, },
{ .family = AF_INET, .priority_set = true, .priority = 32767, .table = RT_TABLE_DEFAULT, .action = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, },
{ .family = AF_INET6, .priority_set = true, .priority = 0, .table = RT_TABLE_LOCAL, .action = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, },
{ .family = AF_INET6, .priority_set = true, .priority = 1000, .table = RT_TABLE_UNSPEC, .action = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, .l3mdev = true },
{ .family = AF_INET6, .priority_set = true, .priority = 32766, .table = RT_TABLE_MAIN, .action = FR_ACT_TO_TBL, .uid_range.start = UID_INVALID, .uid_range.end = UID_INVALID, .suppress_prefixlen = -1, .suppress_ifgroup = -1, },
};
static bool routing_policy_rule_is_created_by_kernel(const RoutingPolicyRule *rule) {
@@ -1105,7 +1105,7 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Man
log_warning_errno(r, "rtnl: could not get FRA_SRC attribute, ignoring: %m");
return 0;
} else if (r >= 0) {
r = sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen(message, &tmp->from_prefixlen);
r = sd_rtnl_message_routing_policy_rule_get_src_prefixlen(message, &tmp->from_prefixlen);
if (r < 0) {
log_warning_errno(r, "rtnl: received rule message without valid source prefix length, ignoring: %m");
return 0;
@@ -1117,7 +1117,7 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Man
log_warning_errno(r, "rtnl: could not get FRA_DST attribute, ignoring: %m");
return 0;
} else if (r >= 0) {
r = sd_rtnl_message_routing_policy_rule_get_fib_dst_prefixlen(message, &tmp->to_prefixlen);
r = sd_rtnl_message_routing_policy_rule_get_dst_prefixlen(message, &tmp->to_prefixlen);
if (r < 0) {
log_warning_errno(r, "rtnl: received rule message without valid destination prefix length, ignoring: %m");
return 0;
@@ -1157,9 +1157,9 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Man
return 0;
}
r = sd_rtnl_message_routing_policy_rule_get_fib_type(message, &tmp->type);
r = sd_rtnl_message_routing_policy_rule_get_action(message, &tmp->action);
if (r < 0 && r != -ENODATA) {
log_warning_errno(r, "rtnl: could not get FIB rule type, ignoring: %m");
log_warning_errno(r, "rtnl: could not get FIB rule action, ignoring: %m");
return 0;
}
@@ -1409,7 +1409,7 @@ static int config_parse_routing_policy_rule_goto(
return 0;
}
rule->type = FR_ACT_GOTO;
rule->action = FR_ACT_GOTO;
rule->priority_goto = priority;
return 1;
}
@@ -1605,7 +1605,7 @@ static int config_parse_routing_policy_rule_suppress(
return 1;
}
static int config_parse_routing_policy_rule_type(
static int config_parse_routing_policy_rule_action(
const char *unit,
const char *filename,
unsigned line,
@@ -1625,7 +1625,7 @@ static int config_parse_routing_policy_rule_type(
r = fr_act_type_from_string(rvalue);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Could not parse FIB rule type \"%s\", ignoring assignment: %m", rvalue);
"Could not parse FIB rule action \"%s\", ignoring assignment: %m", rvalue);
return 0;
}
@@ -1668,7 +1668,7 @@ int config_parse_routing_policy_rule(
[ROUTING_POLICY_RULE_SUPPRESS_PREFIXLEN] = { .parser = config_parse_routing_policy_rule_suppress, .ltype = 128, .offset = offsetof(RoutingPolicyRule, suppress_prefixlen), },
[ROUTING_POLICY_RULE_TABLE] = { .parser = config_parse_routing_policy_rule_table, .ltype = 0, .offset = offsetof(RoutingPolicyRule, table), },
[ROUTING_POLICY_RULE_TOS] = { .parser = config_parse_uint8, .ltype = 0, .offset = offsetof(RoutingPolicyRule, tos), },
[ROUTING_POLICY_RULE_TYPE] = { .parser = config_parse_routing_policy_rule_type, .ltype = 0, .offset = offsetof(RoutingPolicyRule, type), },
[ROUTING_POLICY_RULE_ACTION] = { .parser = config_parse_routing_policy_rule_action, .ltype = 0, .offset = offsetof(RoutingPolicyRule, action), },
[ROUTING_POLICY_RULE_UID_RANGE] = { .parser = config_parse_routing_policy_rule_uid_range, .ltype = 0, .offset = offsetof(RoutingPolicyRule, uid_range), },
};
@@ -1724,7 +1724,7 @@ static int routing_policy_rule_section_verify(RoutingPolicyRule *rule) {
if (rule->l3mdev)
rule->table = RT_TABLE_UNSPEC;
if (rule->type == FR_ACT_GOTO) {
if (rule->action == FR_ACT_GOTO) {
if (rule->priority_goto <= 0)
return log_rule_section(rule, "Type=goto is specified but the target priority GoTo= is unspecified.");

View File

@@ -28,7 +28,7 @@ typedef struct RoutingPolicyRule {
uint8_t to_prefixlen;
uint8_t from_prefixlen;
uint8_t tos;
uint8_t type; /* a.k.a action */
uint8_t action;
uint32_t flags;
/* attributes */
@@ -94,7 +94,7 @@ typedef enum RoutingPolicyRuleConfParserType {
ROUTING_POLICY_RULE_SUPPRESS_PREFIXLEN,
ROUTING_POLICY_RULE_TABLE,
ROUTING_POLICY_RULE_TOS,
ROUTING_POLICY_RULE_TYPE,
ROUTING_POLICY_RULE_ACTION,
ROUTING_POLICY_RULE_UID_RANGE,
_ROUTING_POLICY_RULE_CONF_PARSER_MAX,
_ROUTING_POLICY_RULE_CONF_PARSER_INVALID = -EINVAL,

View File

@@ -44,19 +44,18 @@ int sd_netlink_open(sd_netlink **ret);
int sd_netlink_open_fd(sd_netlink **ret, int fd);
int sd_netlink_increase_rxbuf(sd_netlink *nl, const size_t size);
sd_netlink *sd_netlink_ref(sd_netlink *nl);
sd_netlink *sd_netlink_unref(sd_netlink *nl);
sd_netlink* sd_netlink_ref(sd_netlink *nl);
sd_netlink* sd_netlink_unref(sd_netlink *nl);
int sd_netlink_send(sd_netlink *nl, sd_netlink_message *message, uint32_t *serial);
int sd_netlink_send(sd_netlink *nl, sd_netlink_message *message, uint32_t *ret_serial);
int sd_netlink_call_async(sd_netlink *nl, sd_netlink_slot **ret_slot, sd_netlink_message *message,
sd_netlink_message_handler_t callback, sd_netlink_destroy_t destroy_callback,
void *userdata, uint64_t usec, const char *description);
int sd_netlink_call(sd_netlink *nl, sd_netlink_message *message, uint64_t timeout,
sd_netlink_message **reply);
int sd_netlink_read(sd_netlink *nl, uint32_t serial, uint64_t timeout, sd_netlink_message **reply);
int sd_netlink_call(sd_netlink *nl, sd_netlink_message *message, uint64_t timeout, sd_netlink_message **ret);
int sd_netlink_read(sd_netlink *nl, uint32_t serial, uint64_t timeout, sd_netlink_message **ret);
int sd_netlink_get_events(sd_netlink *nl);
int sd_netlink_get_timeout(sd_netlink *nl, uint64_t *timeout);
int sd_netlink_get_timeout(sd_netlink *nl, uint64_t *ret);
int sd_netlink_process(sd_netlink *nl, sd_netlink_message **ret);
int sd_netlink_wait(sd_netlink *nl, uint64_t timeout);
@@ -104,19 +103,19 @@ int sd_netlink_message_open_array(sd_netlink_message *m, uint16_t type);
int sd_netlink_message_cancel_array(sd_netlink_message *m);
/* Reading messages */
int sd_netlink_message_read(sd_netlink_message *m, uint16_t attr_type, size_t size, void *data);
int sd_netlink_message_read(sd_netlink_message *m, uint16_t attr_type, size_t size, void *ret);
int sd_netlink_message_read_data(sd_netlink_message *m, uint16_t attr_type, size_t *ret_size, void **ret_data);
int sd_netlink_message_read_string_strdup(sd_netlink_message *m, uint16_t attr_type, char **data);
int sd_netlink_message_read_string(sd_netlink_message *m, uint16_t attr_type, const char **data);
int sd_netlink_message_read_string_strdup(sd_netlink_message *m, uint16_t attr_type, char **ret);
int sd_netlink_message_read_string(sd_netlink_message *m, uint16_t attr_type, const char **ret);
int sd_netlink_message_read_strv(sd_netlink_message *m, uint16_t container_type, uint16_t attr_type, char ***ret);
int sd_netlink_message_read_u8(sd_netlink_message *m, uint16_t attr_type, uint8_t *data);
int sd_netlink_message_read_u16(sd_netlink_message *m, uint16_t attr_type, uint16_t *data);
int sd_netlink_message_read_u32(sd_netlink_message *m, uint16_t attr_type, uint32_t *data);
int sd_netlink_message_read_u8(sd_netlink_message *m, uint16_t attr_type, uint8_t *ret);
int sd_netlink_message_read_u16(sd_netlink_message *m, uint16_t attr_type, uint16_t *ret);
int sd_netlink_message_read_u32(sd_netlink_message *m, uint16_t attr_type, uint32_t *ret);
int sd_netlink_message_read_u64(sd_netlink_message *m, uint16_t attr_type, uint64_t *ret);
int sd_netlink_message_read_ether_addr(sd_netlink_message *m, uint16_t attr_type, struct ether_addr *data);
int sd_netlink_message_read_cache_info(sd_netlink_message *m, uint16_t attr_type, struct ifa_cacheinfo *info);
int sd_netlink_message_read_in_addr(sd_netlink_message *m, uint16_t attr_type, struct in_addr *data);
int sd_netlink_message_read_in6_addr(sd_netlink_message *m, uint16_t attr_type, struct in6_addr *data);
int sd_netlink_message_read_ether_addr(sd_netlink_message *m, uint16_t attr_type, struct ether_addr *ret);
int sd_netlink_message_read_cache_info(sd_netlink_message *m, uint16_t attr_type, struct ifa_cacheinfo *ret);
int sd_netlink_message_read_in_addr(sd_netlink_message *m, uint16_t attr_type, struct in_addr *ret);
int sd_netlink_message_read_in6_addr(sd_netlink_message *m, uint16_t attr_type, struct in6_addr *ret);
int sd_netlink_message_has_flag(sd_netlink_message *m, uint16_t attr_type);
int sd_netlink_message_enter_container(sd_netlink_message *m, uint16_t attr_type);
int sd_netlink_message_enter_array(sd_netlink_message *m, uint16_t attr_type);
@@ -124,98 +123,108 @@ int sd_netlink_message_exit_container(sd_netlink_message *m);
int sd_netlink_message_rewind(sd_netlink_message *m, sd_netlink *nl);
sd_netlink_message *sd_netlink_message_next(sd_netlink_message *m);
sd_netlink_message* sd_netlink_message_next(sd_netlink_message *m);
sd_netlink_message *sd_netlink_message_ref(sd_netlink_message *m);
sd_netlink_message *sd_netlink_message_unref(sd_netlink_message *m);
sd_netlink_message* sd_netlink_message_ref(sd_netlink_message *m);
sd_netlink_message* sd_netlink_message_unref(sd_netlink_message *m);
int sd_netlink_message_set_request_dump(sd_netlink_message *m, int dump);
int sd_netlink_message_is_error(sd_netlink_message *m);
int sd_netlink_message_get_errno(sd_netlink_message *m);
int sd_netlink_message_get_type(sd_netlink_message *m, uint16_t *type);
int sd_netlink_message_get_type(sd_netlink_message *m, uint16_t *ret);
int sd_netlink_message_set_flags(sd_netlink_message *m, uint16_t flags);
int sd_netlink_message_is_broadcast(sd_netlink_message *m);
int sd_netlink_message_get_max_attribute(sd_netlink_message *m, uint16_t *ret);
/* rtnl */
int sd_rtnl_message_get_family(sd_netlink_message *m, int *family);
int sd_rtnl_message_get_family(sd_netlink_message *m, int *ret);
int sd_rtnl_message_new_addr(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int family);
int sd_rtnl_message_new_addr_update(sd_netlink *nl, sd_netlink_message **ret, int index, int family);
int sd_rtnl_message_addr_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
int sd_rtnl_message_addr_set_scope(sd_netlink_message *m, unsigned char scope);
int sd_rtnl_message_addr_set_flags(sd_netlink_message *m, unsigned char flags);
int sd_rtnl_message_addr_get_family(sd_netlink_message *m, int *family);
int sd_rtnl_message_addr_get_prefixlen(sd_netlink_message *m, unsigned char *ret_prefixlen);
int sd_rtnl_message_addr_get_scope(sd_netlink_message *m, unsigned char *ret_scope);
int sd_rtnl_message_addr_get_flags(sd_netlink_message *m, unsigned char *ret_flags);
int sd_rtnl_message_addr_get_ifindex(sd_netlink_message *m, int *ret_ifindex);
int sd_rtnl_message_new_addr(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int ifindex, int family);
int sd_rtnl_message_new_addr_update(sd_netlink *nl, sd_netlink_message **ret, int ifindex, int family);
/* struct ifaddrmsg */
int sd_rtnl_message_addr_get_ifindex(sd_netlink_message *m, int *ret); /* ifa_index */
int sd_rtnl_message_addr_get_family(sd_netlink_message *m, int *ret); /* ifa_family */
int sd_rtnl_message_addr_set_prefixlen(sd_netlink_message *m, uint8_t prefixlen); /* ifa_prefixlen */
int sd_rtnl_message_addr_get_prefixlen(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_addr_set_flags(sd_netlink_message *m, uint8_t flags); /* ifa_flags */
int sd_rtnl_message_addr_get_flags(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_addr_set_scope(sd_netlink_message *m, uint8_t scope); /* ifa_scope */
int sd_rtnl_message_addr_get_scope(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_new_link(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index);
int sd_rtnl_message_link_set_flags(sd_netlink_message *m, unsigned flags, unsigned change);
int sd_rtnl_message_link_set_type(sd_netlink_message *m, unsigned type);
int sd_rtnl_message_link_set_family(sd_netlink_message *m, unsigned family);
int sd_rtnl_message_link_get_ifindex(sd_netlink_message *m, int *ifindex);
int sd_rtnl_message_link_get_flags(sd_netlink_message *m, unsigned *flags);
int sd_rtnl_message_link_get_type(sd_netlink_message *m, unsigned short *type);
int sd_rtnl_message_new_link(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int ifindex);
/* struct ifinfomsg */
int sd_rtnl_message_link_get_ifindex(sd_netlink_message *m, int *ret); /* ifi_index */
int sd_rtnl_message_link_set_family(sd_netlink_message *m, int family); /* ifi_family */
int sd_rtnl_message_link_get_family(sd_netlink_message *m, int *ret);
int sd_rtnl_message_link_set_type(sd_netlink_message *m, uint16_t type); /* ifi_type */
int sd_rtnl_message_link_get_type(sd_netlink_message *m, uint16_t *ret);
int sd_rtnl_message_link_set_flags(sd_netlink_message *m, uint32_t flags, uint32_t change); /* ifi_flags and ifi_change */
int sd_rtnl_message_link_get_flags(sd_netlink_message *m, uint32_t *ret); /* ifi_flags */
int sd_rtnl_message_new_route(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type, int rtm_family, unsigned char rtm_protocol);
int sd_rtnl_message_route_set_dst_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
int sd_rtnl_message_route_set_src_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
int sd_rtnl_message_route_set_tos(sd_netlink_message *m, unsigned char tos);
int sd_rtnl_message_route_set_scope(sd_netlink_message *m, unsigned char scope);
int sd_rtnl_message_route_set_flags(sd_netlink_message *m, unsigned flags);
int sd_rtnl_message_route_set_table(sd_netlink_message *m, unsigned char table);
int sd_rtnl_message_route_set_type(sd_netlink_message *m, unsigned char type);
int sd_rtnl_message_route_get_flags(sd_netlink_message *m, unsigned *flags);
int sd_rtnl_message_route_get_family(sd_netlink_message *m, int *family);
int sd_rtnl_message_route_get_protocol(sd_netlink_message *m, unsigned char *protocol);
int sd_rtnl_message_route_get_scope(sd_netlink_message *m, unsigned char *scope);
int sd_rtnl_message_route_get_tos(sd_netlink_message *m, unsigned char *tos);
int sd_rtnl_message_route_get_table(sd_netlink_message *m, unsigned char *table);
int sd_rtnl_message_route_get_dst_prefixlen(sd_netlink_message *m, unsigned char *dst_len);
int sd_rtnl_message_route_get_src_prefixlen(sd_netlink_message *m, unsigned char *src_len);
int sd_rtnl_message_route_get_type(sd_netlink_message *m, unsigned char *type);
int sd_rtnl_message_new_route(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type, int family, uint8_t protocol);
/* struct rtmsg */
int sd_rtnl_message_route_get_family(sd_netlink_message *m, int *ret); /* rtm_family */
int sd_rtnl_message_route_set_dst_prefixlen(sd_netlink_message *m, uint8_t prefixlen); /* rtm_dst_len */
int sd_rtnl_message_route_get_dst_prefixlen(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_route_set_src_prefixlen(sd_netlink_message *m, uint8_t prefixlen); /* rtm_src_len */
int sd_rtnl_message_route_get_src_prefixlen(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_route_set_tos(sd_netlink_message *m, uint8_t tos); /* rtm_tos */
int sd_rtnl_message_route_get_tos(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_route_set_table(sd_netlink_message *m, uint8_t table); /* rtm_table */
int sd_rtnl_message_route_get_table(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_route_get_protocol(sd_netlink_message *m, uint8_t *ret); /* rtm_protocol */
int sd_rtnl_message_route_set_scope(sd_netlink_message *m, uint8_t scope); /* rtm_scope */
int sd_rtnl_message_route_get_scope(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_route_set_type(sd_netlink_message *m, uint8_t type); /* rtm_type */
int sd_rtnl_message_route_get_type(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_route_set_flags(sd_netlink_message *m, uint32_t flags); /* rtm_flags */
int sd_rtnl_message_route_get_flags(sd_netlink_message *m, uint32_t *ret);
int sd_rtnl_message_new_nexthop(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int nh_family, unsigned char nh_protocol);
int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint8_t flags);
int sd_rtnl_message_nexthop_get_flags(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_nexthop_get_family(sd_netlink_message *m, uint8_t *family);
int sd_rtnl_message_nexthop_get_protocol(sd_netlink_message *m, uint8_t *protocol);
int sd_rtnl_message_new_nexthop(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int family, uint8_t protocol);
/* struct nhmsg */
int sd_rtnl_message_nexthop_get_family(sd_netlink_message *m, int *ret); /* nh_family */
int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint32_t flags); /* nh_flags, RTNH_F flags */
int sd_rtnl_message_nexthop_get_flags(sd_netlink_message *m, uint32_t *ret);
int sd_rtnl_message_nexthop_get_protocol(sd_netlink_message *m, uint8_t *ret); /* nh_protocol */
int sd_rtnl_message_new_neigh(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type, int index, int nda_family);
int sd_rtnl_message_neigh_set_flags(sd_netlink_message *m, uint8_t flags);
int sd_rtnl_message_neigh_set_state(sd_netlink_message *m, uint16_t state);
int sd_rtnl_message_neigh_get_family(sd_netlink_message *m, int *family);
int sd_rtnl_message_neigh_get_ifindex(sd_netlink_message *m, int *index);
int sd_rtnl_message_neigh_get_state(sd_netlink_message *m, uint16_t *state);
int sd_rtnl_message_neigh_get_flags(sd_netlink_message *m, uint8_t *flags);
int sd_rtnl_message_new_neigh(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifindex, int family);
/* struct ndmsg */
int sd_rtnl_message_neigh_get_ifindex(sd_netlink_message *m, int *ret); /* ndm_ifindex */
int sd_rtnl_message_neigh_get_family(sd_netlink_message *m, int *ret); /* ndm_family */
int sd_rtnl_message_neigh_set_state(sd_netlink_message *m, uint16_t state); /* ndm_state */
int sd_rtnl_message_neigh_get_state(sd_netlink_message *m, uint16_t *ret);
int sd_rtnl_message_neigh_set_flags(sd_netlink_message *m, uint8_t flags); /* ndm_flags */
int sd_rtnl_message_neigh_get_flags(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_new_addrlabel(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifindex, int ifal_family);
int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen);
int sd_rtnl_message_new_addrlabel(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifindex, int family);
/* struct ifaddrlblmsg */
int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, uint8_t prefixlen); /* ifal_prefixlen */
int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_new_routing_policy_rule(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifal_family);
int sd_rtnl_message_routing_policy_rule_set_tos(sd_netlink_message *m, uint8_t tos);
int sd_rtnl_message_routing_policy_rule_get_tos(sd_netlink_message *m, uint8_t *tos);
int sd_rtnl_message_routing_policy_rule_set_table(sd_netlink_message *m, uint8_t table);
int sd_rtnl_message_routing_policy_rule_get_table(sd_netlink_message *m, uint8_t *table);
int sd_rtnl_message_routing_policy_rule_set_fib_src_prefixlen(sd_netlink_message *m, uint8_t len);
int sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen(sd_netlink_message *m, uint8_t *len);
int sd_rtnl_message_routing_policy_rule_set_fib_dst_prefixlen(sd_netlink_message *m, uint8_t len);
int sd_rtnl_message_routing_policy_rule_get_fib_dst_prefixlen(sd_netlink_message *m, uint8_t *len);
int sd_rtnl_message_routing_policy_rule_set_fib_type(sd_netlink_message *m, uint8_t type);
int sd_rtnl_message_routing_policy_rule_get_fib_type(sd_netlink_message *m, uint8_t *type);
int sd_rtnl_message_routing_policy_rule_set_flags(sd_netlink_message *m, uint32_t flags);
int sd_rtnl_message_routing_policy_rule_get_flags(sd_netlink_message *m, uint32_t *flags);
int sd_rtnl_message_new_routing_policy_rule(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int family);
/* struct fib_rule_hdr */
int sd_rtnl_message_routing_policy_rule_get_family(sd_netlink_message *m, int *ret); /* family */
int sd_rtnl_message_routing_policy_rule_set_dst_prefixlen(sd_netlink_message *m, uint8_t prefixlen); /* dst_len */
int sd_rtnl_message_routing_policy_rule_get_dst_prefixlen(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_routing_policy_rule_set_src_prefixlen(sd_netlink_message *m, uint8_t prefixlen); /* src_len*/
int sd_rtnl_message_routing_policy_rule_get_src_prefixlen(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_routing_policy_rule_set_tos(sd_netlink_message *m, uint8_t tos); /* tos */
int sd_rtnl_message_routing_policy_rule_get_tos(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_routing_policy_rule_set_table(sd_netlink_message *m, uint8_t table); /* table */
int sd_rtnl_message_routing_policy_rule_get_table(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_routing_policy_rule_set_action(sd_netlink_message *m, uint8_t action); /* action */
int sd_rtnl_message_routing_policy_rule_get_action(sd_netlink_message *m, uint8_t *ret);
int sd_rtnl_message_routing_policy_rule_set_flags(sd_netlink_message *m, uint32_t flags); /* flags */
int sd_rtnl_message_routing_policy_rule_get_flags(sd_netlink_message *m, uint32_t *ret);
int sd_rtnl_message_new_traffic_control(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type,
int ifindex, uint32_t handle, uint32_t parent);
int sd_rtnl_message_traffic_control_get_ifindex(sd_netlink_message *m, int *ret);
int sd_rtnl_message_traffic_control_get_handle(sd_netlink_message *m, uint32_t *ret);
int sd_rtnl_message_traffic_control_get_parent(sd_netlink_message *m, uint32_t *ret);
/* struct tcmsg */
int sd_rtnl_message_traffic_control_get_ifindex(sd_netlink_message *m, int *ret); /* tcm_ifindex */
int sd_rtnl_message_traffic_control_get_handle(sd_netlink_message *m, uint32_t *ret); /* tcm_handle */
int sd_rtnl_message_traffic_control_get_parent(sd_netlink_message *m, uint32_t *ret); /* tcm_parent */
int sd_rtnl_message_new_mdb(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int mdb_ifindex);
int sd_rtnl_message_new_mdb(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifindex);
int sd_rtnl_message_new_nsid(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type);
@@ -234,14 +243,14 @@ int sd_genl_add_match(sd_netlink *nl, sd_netlink_slot **ret_slot, const char *fa
sd_netlink_slot *sd_netlink_slot_ref(sd_netlink_slot *slot);
sd_netlink_slot *sd_netlink_slot_unref(sd_netlink_slot *slot);
sd_netlink *sd_netlink_slot_get_netlink(sd_netlink_slot *slot);
void *sd_netlink_slot_get_userdata(sd_netlink_slot *slot);
void *sd_netlink_slot_set_userdata(sd_netlink_slot *slot, void *userdata);
int sd_netlink_slot_get_destroy_callback(sd_netlink_slot *slot, sd_netlink_destroy_t *callback);
sd_netlink* sd_netlink_slot_get_netlink(sd_netlink_slot *slot);
void* sd_netlink_slot_get_userdata(sd_netlink_slot *slot);
void* sd_netlink_slot_set_userdata(sd_netlink_slot *slot, void *userdata);
int sd_netlink_slot_get_destroy_callback(sd_netlink_slot *slot, sd_netlink_destroy_t *ret);
int sd_netlink_slot_set_destroy_callback(sd_netlink_slot *slot, sd_netlink_destroy_t callback);
int sd_netlink_slot_get_floating(sd_netlink_slot *slot);
int sd_netlink_slot_set_floating(sd_netlink_slot *slot, int b);
int sd_netlink_slot_get_description(sd_netlink_slot *slot, const char **description);
int sd_netlink_slot_get_description(sd_netlink_slot *slot, const char **ret);
int sd_netlink_slot_set_description(sd_netlink_slot *slot, const char *description);
_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_netlink, sd_netlink_unref);