summaryrefslogtreecommitdiff
path: root/sysdep/linux/netlink.c
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2022-08-18 17:44:00 +0200
committerMaria Matejka <mq@ucw.cz>2022-08-18 17:44:00 +0200
commit16ac6c3c74020f043204ecf44aba30ba7257a3e3 (patch)
treeaa638f91c706c17a429b4200042b3e67d65d6ef0 /sysdep/linux/netlink.c
parentbc4ad83dacb07ad6bb454b75d78daa2f9c953088 (diff)
Fixed initialization of Linux kernel route attributes
Diffstat (limited to 'sysdep/linux/netlink.c')
-rw-r--r--sysdep/linux/netlink.c52
1 files changed, 28 insertions, 24 deletions
diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c
index 342b746c..8da26e37 100644
--- a/sysdep/linux/netlink.c
+++ b/sysdep/linux/netlink.c
@@ -1775,30 +1775,33 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h)
ra->eattrs = ea;
ea->flags = EALF_SORTED;
ea->count = 1;
- ea->attrs[0].id = EA_KRT_SCOPE;
- ea->attrs[0].flags = 0;
- ea->attrs[0].type = EAF_TYPE_INT;
- ea->attrs[0].u.data = i->rtm_scope;
+ ea->attrs[0] = (eattr) {
+ .id = EA_KRT_SCOPE,
+ .flags = 0,
+ .type = EAF_TYPE_INT,
+ .u.data = i->rtm_scope,
+ };
}
if (a[RTA_PREFSRC])
{
ip_addr ps = rta_get_ipa(a[RTA_PREFSRC]);
+ struct adata *ad = lp_alloc(s->pool, sizeof(struct adata) + sizeof(ps));
+ ad->length = sizeof(ps);
+ memcpy(ad->data, &ps, sizeof(ps));
+
ea_list *ea = lp_alloc(s->pool, sizeof(ea_list) + sizeof(eattr));
ea->next = ra->eattrs;
ra->eattrs = ea;
ea->flags = EALF_SORTED;
ea->count = 1;
- ea->attrs[0].id = EA_KRT_PREFSRC;
- ea->attrs[0].flags = 0;
- ea->attrs[0].type = EAF_TYPE_IP_ADDRESS;
-
- struct adata *ad = lp_alloc(s->pool, sizeof(struct adata) + sizeof(ps));
- ad->length = sizeof(ps);
- memcpy(ad->data, &ps, sizeof(ps));
-
- ea->attrs[0].u.ptr = ad;
+ ea->attrs[0] = (eattr) {
+ .id = EA_KRT_PREFSRC,
+ .flags = 0,
+ .type = EAF_TYPE_IP_ADDRESS,
+ .u.ptr = ad,
+ };
}
/* Can be set per-route or per-nexthop */
@@ -1809,10 +1812,12 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h)
ra->eattrs = ea;
ea->flags = EALF_SORTED;
ea->count = 1;
- ea->attrs[0].id = EA_KRT_REALM;
- ea->attrs[0].flags = 0;
- ea->attrs[0].type = EAF_TYPE_INT;
- ea->attrs[0].u.data = s->rta_flow;
+ ea->attrs[0] = (eattr) {
+ .id = EA_KRT_REALM,
+ .flags = 0,
+ .type = EAF_TYPE_INT,
+ .u.data = s->rta_flow,
+ };
}
if (a[RTA_METRICS])
@@ -1829,13 +1834,12 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h)
for (t = 1; t < KRT_METRICS_MAX; t++)
if (metrics[0] & (1 << t))
- {
- ea->attrs[n].id = EA_CODE(PROTOCOL_KERNEL, KRT_METRICS_OFFSET + t);
- ea->attrs[n].flags = 0;
- ea->attrs[n].type = EAF_TYPE_INT; /* FIXME: Some are EAF_TYPE_BITFIELD */
- ea->attrs[n].u.data = metrics[t];
- n++;
- }
+ ea->attrs[n++] = (eattr) {
+ .id = EA_CODE(PROTOCOL_KERNEL, KRT_METRICS_OFFSET + t),
+ .flags = 0,
+ .type = EAF_TYPE_INT, /* FIXME: Some are EAF_TYPE_BITFIELD */
+ .u.data = metrics[t],
+ };
if (n > 0)
{