]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Protocols use EA_LITERAL_* to set attributes
authorMaria Matejka <mq@ucw.cz>
Sun, 10 Apr 2022 17:31:50 +0000 (19:31 +0200)
committerMaria Matejka <mq@ucw.cz>
Wed, 4 May 2022 13:37:41 +0000 (15:37 +0200)
lib/route.h
proto/babel/babel.c
proto/bgp/attrs.c
proto/ospf/rt.c
proto/rip/rip.c

index 49810887ce0f0e82349fa76d586f55bba1fcf425..431da4d80d804eca0db394517aad5d7b6118176d 100644 (file)
@@ -225,9 +225,14 @@ struct ea_one_attr_list {
     EA_LITERAL_GENERIC(_id, _type, _flags, .u.i = _val); \
     })
 
-#define EA_LITERAL_ADATA(_id, _type, _flags, _buf, _len) ({ \
+#define EA_LITERAL_STORE_ADATA(_id, _type, _flags, _buf, _len) ({ \
     ASSERT_DIE(!(_type & EAF_EMBEDDED)); \
-    EA_LITERAL_GENERIC(_id, _type, _flags, .u.ad = tmp_store_adata(_buf, _len)); \
+    EA_LITERAL_GENERIC(_id, _type, _flags, .u.ad = tmp_store_adata((_buf), (_len))); \
+    })
+
+#define EA_LITERAL_DIRECT_ADATA(_id, _type, _flags, _adata) ({ \
+    ASSERT_DIE(!(_type & EAF_EMBEDDED)); \
+    EA_LITERAL_GENERIC(_id, _type, _flags, .u.ad = _adata); \
     })
 
 #define EA_LITERAL_GENERIC(_id, _type, _flags, ...) \
@@ -261,7 +266,7 @@ ea_set_attr_u32(ea_list **to, uint id, uint flags, uint type, u32 data)
 
 static inline void
 ea_set_attr_data(ea_list **to, uint id, uint flags, uint type, void *data, uint len)
-{ ea_set_attr(to, EA_LITERAL_ADATA(id, type, flags, data, len)); }
+{ ea_set_attr(to, EA_LITERAL_STORE_ADATA(id, type, flags, data, len)); }
 
 
 #define NEXTHOP_MAX_SIZE (sizeof(struct nexthop) + sizeof(u32)*MPLS_MAX_LABEL_STACK)
index a6cc7aa30f55d7458663dfa0442d2d3c252a3e4a..db710a0de43061e02e1fd7108d5755fcf233bebb 100644 (file)
@@ -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,
     };
 
     /*
index a7b6d0cd87798204b50049500cd84915f45c7f0d..4c67b1619d7a638035436cee085dd975f13bd6ff 100644 (file)
@@ -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,
index 8643f456471003afa2eec51aa2a709fdc754fbe7..5969b7c7c3961d0870f0958b35a925d771aa008b 100644 (file)
@@ -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 *a = rta_lookup(&a0);
        rte *e = rte_get_temp(a, p->p.main_source);
index fa5b128910f764420b568a3873c9335147211845..2b5babcb01023438e817b3d8ea1fa540c14e7eb2 100644 (file)
@@ -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) },