aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2021-02-24 18:03:33 +0900
committerKazuki Yamaguchi <k@rhe.jp>2023-10-11 17:53:28 +0900
commitb0b7f14398e868417eb80a7a7ebd31aed94297ac (patch)
tree106920bf374a761f891e3a624fe386900f475862
parent0e1fbaa5b21db8e5c64a732dbaf0b8afe707a147 (diff)
downloadbird-ky/bgp-attach-aggregator.tar.gz
Filter: Allow manually setting AGGREGATOR attributeky/bgp-attach-aggregator
Uhm this is not a great way, but works.
-rw-r--r--filter/config.Y2
-rw-r--r--filter/f-inst.c29
2 files changed, 31 insertions, 0 deletions
diff --git a/filter/config.Y b/filter/config.Y
index f3ed2dc5..5bdef72e 100644
--- a/filter/config.Y
+++ b/filter/config.Y
@@ -371,6 +371,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
EMPTY,
FILTER, WHERE, EVAL, ATTRIBUTE,
FROM_HEX,
+ ATTACH_BGP_AGGREGATOR,
BT_ASSERT, BT_TEST_SUITE, BT_CHECK_ASSIGN, BT_TEST_SAME, FORMAT)
%nonassoc THEN
@@ -1070,6 +1071,7 @@ cmd:
}
| BT_ASSERT '(' get_cf_position term get_cf_position ')' ';' { $$ = assert_done($4, $3 + 1, $5 - 1); }
| BT_CHECK_ASSIGN '(' get_cf_position lvalue get_cf_position ',' term ')' ';' { $$ = assert_assign(&$4, $7, $3 + 1, $5 - 1); }
+ | ATTACH_BGP_AGGREGATOR '(' term ',' term ')' ';' { $$ = f_new_inst(FI_ATTACH_BGP_AGGREGATOR, $3, $5); }
;
get_cf_position:
diff --git a/filter/f-inst.c b/filter/f-inst.c
index 9cc46aa0..4b54dc38 100644
--- a/filter/f-inst.c
+++ b/filter/f-inst.c
@@ -1556,6 +1556,35 @@
RESULT(T_BYTESTRING, bs, bs);
}
+ INST(FI_ATTACH_BGP_AGGREGATOR, 2, 0) { /* attach_bgp_aggregator(as, ip) */
+ ACCESS_RTE;
+ ACCESS_EATTRS;
+ ARG(1, T_INT);
+ ARG(2, T_IP);
+
+ uint u1 = v1.val.i;
+ ip_addr u2 = v2.val.ip;
+ if (!ipa_is_ip4(u2))
+ runtime("IPv4 address required for AGGREGATOR");
+
+ struct adata *ad = lp_alloc_adata(fs->pool, 8);
+ put_u32(ad->data + 0, u1);
+ put_u32(ad->data + 4, ipa_to_u32(u2));
+
+ f_rta_cow(fs);
+ eattr *eattr = ea_set_attr(
+ fs->eattrs,
+ fs->pool,
+#define BA_AGGREGATOR 0x07 /* proto/bgp/bgp.h */
+ EA_CODE(PROTOCOL_BGP, BA_AGGREGATOR),
+ 0,
+ EAF_TYPE_OPAQUE,
+ (uintptr_t)ad
+ );
+ eattr->originated = 1;
+ eattr->fresh = 1;
+ }
+
INST(FI_FORMAT, 1, 1) { /* Format */
ARG_ANY(1);
RESULT(T_STRING, s, val_format_str(fpool, &v1));