56a2bed46b
Added real comparison of BGP routes (inspired by the Cisco one). Default local preference and default MED are now settable. Defined filter keywords for all BGP attributes we know.
79 lines
2.9 KiB
Text
79 lines
2.9 KiB
Text
/*
|
|
* BIRD -- Border Gateway Protocol Configuration
|
|
*
|
|
* (c) 2000 Martin Mares <mj@ucw.cz>
|
|
*
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
*/
|
|
|
|
CF_HDR
|
|
|
|
#include "proto/bgp/bgp.h"
|
|
|
|
#define BGP_CFG ((struct bgp_config *) this_proto)
|
|
|
|
CF_DECLS
|
|
|
|
CF_KEYWORDS(BGP, LOCAL, NEIGHBOR, AS, HOLD, TIME, CONNECT, RETRY, KEEPALIVE,
|
|
MULTIHOP, STARTUP, VIA, NEXT, HOP, SELF, DEFAULT, PATH, METRIC,
|
|
BGP_PATH, BGP_LOCAL_PREF, BGP_MED, BGP_ORIGIN, BGP_NEXT_HOP,
|
|
BGP_ATOMIC_AGGR, BGP_AGGREGATOR, BGP_COMMUNITY)
|
|
|
|
CF_GRAMMAR
|
|
|
|
CF_ADDTO(proto, bgp_proto '}' { bgp_check(BGP_CFG); } )
|
|
|
|
bgp_proto_start: proto_start BGP {
|
|
this_proto = proto_config_new(&proto_bgp, sizeof(struct bgp_config));
|
|
this_proto->preference = DEF_PREF_BGP;
|
|
BGP_CFG->hold_time = 240;
|
|
BGP_CFG->connect_retry_time = 120;
|
|
BGP_CFG->initial_hold_time = 240;
|
|
BGP_CFG->default_med = ~0;
|
|
BGP_CFG->compare_path_lengths = 1;
|
|
}
|
|
;
|
|
|
|
bgp_proto:
|
|
bgp_proto_start proto_name '{'
|
|
| bgp_proto proto_item ';'
|
|
| bgp_proto LOCAL AS NUM ';' {
|
|
if ($4 < 0 || $4 > 65535) cf_error("AS number out of range");
|
|
BGP_CFG->local_as = $4;
|
|
}
|
|
| bgp_proto NEIGHBOR IPA AS NUM ';' {
|
|
if ($5 < 0 || $5 > 65535) cf_error("AS number out of range");
|
|
BGP_CFG->remote_ip = $3;
|
|
BGP_CFG->remote_as = $5;
|
|
}
|
|
| bgp_proto HOLD TIME NUM ';' { BGP_CFG->hold_time = $4; }
|
|
| bgp_proto STARTUP HOLD TIME NUM ';' { BGP_CFG->initial_hold_time = $5; }
|
|
| bgp_proto CONNECT RETRY TIME NUM ';' { BGP_CFG->connect_retry_time = $5; }
|
|
| bgp_proto KEEPALIVE TIME NUM ';' { BGP_CFG->connect_retry_time = $4; }
|
|
| bgp_proto MULTIHOP NUM VIA IPA ';' { BGP_CFG->multihop = $3; BGP_CFG->multihop_via = $5; }
|
|
| bgp_proto NEXT HOP SELF ';' { BGP_CFG->next_hop_self = 1; }
|
|
| bgp_proto PATH METRIC NUM ';' { BGP_CFG->compare_path_lengths = $4; }
|
|
| bgp_proto DEFAULT BGP_MED NUM ';' { BGP_CFG->default_med = $4; }
|
|
| bgp_proto DEFAULT BGP_LOCAL_PREF NUM ';' { BGP_CFG->default_local_pref = $4; }
|
|
;
|
|
|
|
CF_ADDTO(dynamic_attr, BGP_PATH
|
|
{ $$ = f_new_dynamic_attr(EAF_TYPE_AS_PATH, T_PATH, EA_CODE(EAP_BGP, BA_AS_PATH)); })
|
|
CF_ADDTO(dynamic_attr, BGP_LOCAL_PREF
|
|
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(EAP_BGP, BA_LOCAL_PREF)); })
|
|
CF_ADDTO(dynamic_attr, BGP_MED
|
|
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(EAP_BGP, BA_MULTI_EXIT_DISC)); })
|
|
CF_ADDTO(dynamic_attr, BGP_ORIGIN
|
|
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(EAP_BGP, BA_ORIGIN)); })
|
|
CF_ADDTO(dynamic_attr, BGP_NEXT_HOP
|
|
{ $$ = f_new_dynamic_attr(EAF_TYPE_IP_ADDRESS, T_IP, EA_CODE(EAP_BGP, BA_NEXT_HOP)); })
|
|
CF_ADDTO(dynamic_attr, BGP_ATOMIC_AGGR
|
|
{ $$ = f_new_dynamic_attr(EAF_TYPE_OPAQUE, T_ENUM_EMPTY, EA_CODE(EAP_BGP, BA_ATOMIC_AGGR)); })
|
|
CF_ADDTO(dynamic_attr, BGP_AGGREGATOR
|
|
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_CODE(EAP_BGP, BA_AGGREGATOR)); })
|
|
CF_ADDTO(dynamic_attr, BGP_COMMUNITY
|
|
{ $$ = f_new_dynamic_attr(EAF_TYPE_INT_SET, T_CLIST, EA_CODE(EAP_BGP, BA_COMMUNITY)); })
|
|
|
|
CF_CODE
|
|
|
|
CF_END
|