summaryrefslogtreecommitdiff
path: root/proto
diff options
context:
space:
mode:
Diffstat (limited to 'proto')
-rw-r--r--proto/babel/babel.c36
-rw-r--r--proto/bgp/attrs.c7
-rw-r--r--proto/ospf/rt.c42
-rw-r--r--proto/rip/rip.c24
4 files changed, 40 insertions, 69 deletions
diff --git a/proto/babel/babel.c b/proto/babel/babel.c
index 6df80922..fcd7eafb 100644
--- a/proto/babel/babel.c
+++ b/proto/babel/babel.c
@@ -640,6 +640,18 @@ babel_announce_rte(struct babel_proto *p, struct babel_entry *e)
if (r)
{
+ struct {
+ ea_list l;
+ eattr a[3];
+ } eattrs = {
+ .l.count = 3,
+ .a = {
+ EA_LITERAL_EMBEDDED(EA_BABEL_METRIC, T_INT, 0, r->metric),
+ EA_LITERAL_STORE_ADATA(EA_BABEL_ROUTER_ID, T_OPAQUE, 0, &r->router_id, sizeof(r->router_id)),
+ EA_LITERAL_EMBEDDED(EA_BABEL_SEQNO, T_INT, 0, r->seqno),
+ }
+ };
+
rta a0 = {
.source = RTS_BABEL,
.scope = SCOPE_UNIVERSE,
@@ -648,29 +660,7 @@ babel_announce_rte(struct babel_proto *p, struct babel_entry *e)
.from = r->neigh->addr,
.nh.gw = r->next_hop,
.nh.iface = r->neigh->ifa->iface,
- .eattrs = alloca(sizeof(ea_list) + 3*sizeof(eattr)),
- };
-
- *a0.eattrs = (ea_list) { .count = 3 };
- a0.eattrs->attrs[0] = (eattr) {
- .id = EA_BABEL_METRIC,
- .type = T_INT,
- .u.data = r->metric,
- };
-
- struct adata *ad = alloca(sizeof(struct adata) + sizeof(u64));
- ad->length = sizeof(u64);
- memcpy(ad->data, &(r->router_id), sizeof(u64));
- a0.eattrs->attrs[1] = (eattr) {
- .id = EA_BABEL_ROUTER_ID,
- .type = T_OPAQUE,
- .u.ptr = ad,
- };
-
- a0.eattrs->attrs[2] = (eattr) {
- .id = EA_BABEL_SEQNO,
- .type = T_INT,
- .u.data = r->seqno,
+ .eattrs = &eattrs.l,
};
/*
diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c
index e5165a96..e6f11a88 100644
--- a/proto/bgp/attrs.c
+++ b/proto/bgp/attrs.c
@@ -94,13 +94,12 @@ void bgp_set_attr_u32(ea_list **to, uint code, uint flags, u32 val)
void bgp_set_attr_ptr(ea_list **to, uint code, uint flags, const struct adata *ad)
{
ASSERT(bgp_attr_known(code));
- ASSERT_DIE(!(bgp_attr_table[code].type & EAF_EMBEDDED));
- ea_set_attr(to, EA_LITERAL_GENERIC(
+ ea_set_attr(to, EA_LITERAL_DIRECT_ADATA(
EA_CODE(PROTOCOL_BGP, code),
bgp_attr_table[code].type,
flags & ~BAF_EXT_LEN,
- .u.ad = ad
+ ad
));
}
@@ -109,7 +108,7 @@ bgp_set_attr_data(ea_list **to, uint code, uint flags, void *data, uint len)
{
ASSERT(bgp_attr_known(code));
- ea_set_attr(to, EA_LITERAL_ADATA(
+ ea_set_attr(to, EA_LITERAL_STORE_ADATA(
EA_CODE(PROTOCOL_BGP, code),
bgp_attr_table[code].type,
flags & ~BAF_EXT_LEN,
diff --git a/proto/ospf/rt.c b/proto/ospf/rt.c
index 7cb541d4..900fe82c 100644
--- a/proto/ospf/rt.c
+++ b/proto/ospf/rt.c
@@ -2062,39 +2062,33 @@ again1:
if (reload || ort_changed(nf, &a0))
{
- a0.eattrs = alloca(sizeof(ea_list) + 4 * sizeof(eattr));
- memset(a0.eattrs, 0, sizeof(ea_list));
-
nf->old_metric1 = nf->n.metric1;
nf->old_metric2 = nf->n.metric2;
nf->old_tag = nf->n.tag;
nf->old_rid = nf->n.rid;
- a0.eattrs->attrs[a0.eattrs->count++] = (eattr) {
- .id = EA_OSPF_METRIC1,
- .type = T_INT,
- .u.data = nf->n.metric1,
- };
+ struct {
+ ea_list l;
+ eattr a[4];
+ } eattrs;
+
+ eattrs.l = (ea_list) {};
+
+ eattrs.a[eattrs.l.count++] =
+ EA_LITERAL_EMBEDDED(EA_OSPF_METRIC1, T_INT, 0, nf->n.metric1);
if (nf->n.type == RTS_OSPF_EXT2)
- a0.eattrs->attrs[a0.eattrs->count++] = (eattr) {
- .id = EA_OSPF_METRIC2,
- .type = T_INT,
- .u.data = nf->n.metric2,
- };
+ eattrs.a[eattrs.l.count++] =
+ EA_LITERAL_EMBEDDED(EA_OSPF_METRIC2, T_INT, 0, nf->n.metric2);
if ((nf->n.type == RTS_OSPF_EXT1) || (nf->n.type == RTS_OSPF_EXT2))
- a0.eattrs->attrs[a0.eattrs->count++] = (eattr) {
- .id = EA_OSPF_TAG,
- .type = T_INT,
- .u.data = nf->n.tag,
- };
-
- a0.eattrs->attrs[a0.eattrs->count++] = (eattr) {
- .id = EA_OSPF_ROUTER_ID,
- .type = T_QUAD,
- .u.data = nf->n.rid,
- };
+ eattrs.a[eattrs.l.count++] =
+ EA_LITERAL_EMBEDDED(EA_OSPF_TAG, T_INT, 0, nf->n.tag);
+
+ eattrs.a[eattrs.l.count++] =
+ EA_LITERAL_EMBEDDED(EA_OSPF_ROUTER_ID, T_QUAD, 0, nf->n.rid);
+
+ a0.eattrs = &eattrs.l;
rta_free(nf->old_rta);
nf->old_rta = rta_lookup(&a0);
diff --git a/proto/rip/rip.c b/proto/rip/rip.c
index e263172c..b21a416b 100644
--- a/proto/rip/rip.c
+++ b/proto/rip/rip.c
@@ -195,26 +195,14 @@ rip_announce_rte(struct rip_proto *p, struct rip_entry *en)
struct {
ea_list l;
- eattr e[3];
+ eattr a[3];
struct rip_iface_adata riad;
} ea_block = {
- .l = { .count = 3, },
- .e = {
- {
- .id = EA_RIP_METRIC,
- .type = T_INT,
- .u.data = rt_metric,
- },
- {
- .id = EA_RIP_TAG,
- .type = T_INT,
- .u.data = rt_tag,
- },
- {
- .id = EA_RIP_FROM,
- .type = T_IFACE,
- .u.ptr = &ea_block.riad.ad,
- }
+ .l.count = 3,
+ .a = {
+ EA_LITERAL_EMBEDDED(EA_RIP_METRIC, T_INT, 0, rt_metric),
+ EA_LITERAL_EMBEDDED(EA_RIP_TAG, T_INT, 0, rt_tag),
+ EA_LITERAL_DIRECT_ADATA(EA_RIP_FROM, T_IFACE, 0, &ea_block.riad.ad),
},
.riad = {
.ad = { .length = sizeof(struct rip_iface_adata) - sizeof(struct adata) },