diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2021-02-24 18:03:33 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2023-10-11 17:53:28 +0900 |
commit | b0b7f14398e868417eb80a7a7ebd31aed94297ac (patch) | |
tree | 106920bf374a761f891e3a624fe386900f475862 | |
parent | 0e1fbaa5b21db8e5c64a732dbaf0b8afe707a147 (diff) | |
download | bird-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.Y | 2 | ||||
-rw-r--r-- | filter/f-inst.c | 29 |
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)); |