IDRP BNF syntax
- L_EOS means the semicolon character (';')
- Other L_* symbols stand for elements returned by the lexical
analyzer (the lexer.l file), and are generally self-explanatory;
e.g., L_NUMBER, L_ISOADDR, etc., are what they say they are.
- T_* symbols generally stand for a keyword; the exact keyword
(or range of keywords) can be discovered by fgrep-ing for the
T_... symbol in question in the parse.c file (NOT parser.c;
parse.c--one 'r').
- Other literal characters are indicated by the character enclosed
by single quotes, e.g., '{' and '}', which must be liter
Syntax
define_statement
::=
| T_RDI osi_rdi L_EOS
| osi_tagged_address L_EOS
;
idrp_statement ::= T_IDRP
onoff_option idrp_group
;
idrp_group ::= /* empty */
| '{' idrp_group_stmts '}'
;
idrp_group_stmts ::= /* empty */
| idrp_group_stmts idrp_group_stmt L_EOS
| idrp_group_stmts error L_EOS
;
idrp_group_stmt ::= T_TRACEOPTIONS trace_file_option trace_control_option idrp_trace_options_none
| T_LOCALNODE
'{' idrp_local_node_stmts '}'
| T_GROUP
idrp_group_options '{' idrp_peer_stmts '}'
| T_OSILOCAL
'{' idrp_local_routes '}'
;
idrp_peer_stmts ::= /* empty */
| idrp_peer_stmts idrp_peer_stmt L_EOS
| idrp_peer_stmts error L_EOS
;
idrp_local_node_stmts ::= /* empty */
| idrp_local_node_stmts idrp_local_node_stmt L_EOS
| idrp_local_node_stmts error L_EOS
;
idrp_local_node_stmt ::= T_PROTOSUPPORT idrp_proto_supp
| idrp_sock_support
| idrp_auth
| idrp_authcode
| T_CAPACITY idrp_capacity_value
| idrp_hold
| idrp_snpa_option
| T_EXPENSE idrp_expense_value
| T_MAXCPU L_NUMBER
| idrp_max_pdu
| T_RIBCHECK L_NUMBER
| T_MINADVRD L_NUMBER
| T_MULTIEXIT onoff_option
| T_PRIORITY idrp_priority_value
| T_RDLRE idrp_rdlre_value
| T_TRANSITDELAY idrp_transit_delay_value
| idrp_rexmit
| T_ROUTESERVER onoff_option
| T_VERSION L_NUMBER
/* idrp peer variables that can be set for local peer */
| idrp_close_time
| idrp_minadv
| idrp_max_outpdu
/* idrp for ip variables */
| T_ASRDI osi_address
/* special MERIT function switches */
| idrp_closestay
| T_EXTINFO
'{' idrp_ps_attribute_entries '}'
| T_LOCALINFO
'{' idrp_ps_attribute_entries '}'
| T_NET_AUTO_NLRI onoff_option
| T_EXPAND_NEXT_HOP onoff_option
| T_RIBSUPPORT
'{' idrp_rib_entries '}'
;
/* these clauses shared by local node and peers */
idrp_auth ::= T_AUTHTYPE idrp_auth_type
;
idrp_authcode ::= T_AUTHCODE L_HEXSTRING
;
idrp_auth_type::= T_TEST
| T_CLEAR
| T_CRYPT
| T_SIMPLE
;
idrp_close_time ::= T_CLOSEWAIT L_NUMBER
;
idrp_closestay ::= T_CLOSESTAY L_NUMBER
;
idrp_hold ::= T_HOLDTIME idrp_hold_time_value
;
idrp_listenopen ::= T_LISTENOPEN onoff_option
;
idrp_max_output ::= T_OUTPDUS L_NUMBER
;
idrp_max_pdu ::= T_MAXPDUSIZE L_NUMBER
;
idrp_max_outpdu ::= T_OUTPDUS L_NUMBER
;
idrp_minadv ::= T_MINADV idrp_minadv_value
;
idrp_minadv_value ::= L_NUMBER
;
idrp_rexmit ::= T_REXMIT L_NUMBER
;
idrp_rib_entries ::= idrp_rib_entry L_EOS
| idrp_rib_entries idrp_rib_entry L_EOS
| idrp_rib_entries error L_EOS
;
idrp_rib_entry::= T_RIB idrp_rib_value
'{' idrp_ps_rib_entries '}'
;
/* idrp rib id number */
idrp_rib_value ::= L_NUMBER
;
idrp_ps_rib_entries ::= idrp_ps_rib_entry L_EOS
| idrp_ps_rib_entries idrp_ps_rib_entry L_EOS
| idrp_ps_rib_entries error L_EOS
;
idrp_ps_rib_entry ::= T_TRANSITDELAY idrp_transit_delay_value
| T_RDLRE idrp_rdlre_value
| T_EXPENSE idrp_expense_value
| T_PRIORITY idrp_priority_value
| T_SECURITY idrp_security_type idrp_security_value
| T_KERNEL L_HEXSTRING
| T_ISO
| T_INET
;
/* this _was_ idrp_sock_options (i.e., plural form) */
idrp_sock_support::= T_PROTOSOCK idrp_sock_option
;
/* begin peer clauses */
idrp_peer_stmt ::= T_NEIGHBOR
onoff_option osi_tagged_address host T_RDI osi_address idrp_options
;
idrp_options::= /* empty */
| idrp_options idrp_option
| idrp_options error
;
idrp_option::= idrp_intf_option
| idrp_proto_option
| idrp_peer_option
;
idrp_local_routes::= /* empty */
| idrp_local_routes idrp_local_route L_EOS
| idrp_local_routes error L_EOS
;
idrp_local_route::= osi_prefix osi_prefix
| osi_prefix osi_prefix idrp_atts_clause
| osi_prefix osi_prefix T_EXTERIOR
;
/* idrp route parsing - for both export and local route parsing
* - routines are used in both
*/
/* gated parsing routines */
/* interior routes that idrp will translate to IDRP options
* -all implies any that idrp is ready to do
*/
idrp_interior_export ::= T_ALL
@BEGIN: PROTO_ISIS
| T_ISIS
@END: PROTO_ISIS
| T_ALL
;
@BEGIN: PROTO_TODO
/* here where we put all the idrp attributes including the QOS */
idrp_attribute_list ::= T_IDRP_ATTS
'{' idrp_attribute_entries '}'
;
idrp_attribute_entries ::= idrp_attribute_entry
| idrp_attribute_entries idrp_attribute_entry
;
idrp_attribute_entry ::= idrp_route_options
| idrp_pref_calc
| idrp_QOS_options
@BEGIN: PROTO_RDPATHS
| idrp_dist_options
@END: PROTO_RDPATHS
;
idrp_route_options ::= idrp_route_option L_EOS
| idrp_route_options idrp_route_option L_EOS
;
idrp_route_option ::= idrp_snpa_rt_option
| T_ROUTESERVER T_ON
| T_ROUTESERVER T_OFF
| T_ROUTESERVER
| osi_tagged_address
| T_GATEWAY host
| T_INTERFACE host
| idrp_multi
;
idrp_multi_exit_topeers ::= idrp_multi_exit_topeer
| idrp_multi_exit_topeers idrp_multi_exit_topeer
;
idrp_multi_exit_topeer ::= L_NUMBER
;
idrp_pref_calc ::= T_HOPCOUNT L_NUMBER L_EOS
;
@BEGIN: PROTO_RDPATHS
idrp_dist_options ::= idrp_dist_option
| idrp_dist_options idrp_dist_option
;
idrp_dist_option ::= T_PROHIBIT_DIST idrp_dist_list L_EOS
| T_ALLOW_DIST idrp_dist_list L_EOS
;
idrp_dist_list ::= idrp_dist_list idrp_dist_rdi
| idrp_dist_rdi
;
/* TODO::= HUH? */
idrp_dist_rdi ::= osi_prefix
;
@END: PROTO_RDPATHS
idrp_QOS_options ::= idrp_QOS_option L_EOS
| idrp_QOS_options idrp_QOS_option L_EOS
idrp_QOS_option ::= T_TRANSITDELAY idrp_transit_delay_value
| T_RDLRE idrp_rdlre_value
| T_EXPENSE idrp_expense_value
| T_PRIORITY idrp_priority_value
| T_CAPACITY idrp_capacity_value
| T_SECURITY idrp_security_type idrp_security_value
;
@END: PROTO_TODO
idrp_transit_delay_value ::= L_NUMBER
;
idrp_expense_value ::= L_NUMBER
;
idrp_rdlre_value ::= L_NUMBER
;
idrp_priority_value::= L_NUMBER
;
idrp_capacity_value::= L_NUMBER
;
idrp_security_type::= T_FAA_ADMIN
| T_FAA_GENCOM
| T_FAA_OPS
| T_FAA_SYSMGT
;
idrp_security_value::= L_NUMBER
;
idrp_multiexit_value::= L_NUMBER
;
idrp_hold_time_value::= L_NUMBER
;
idrp_intf_options ::= idrp_intf_option
| idrp_snpa_option
| idrp_intf_option idrp_snpa_option
| idrp_snpa_option idrp_intf_option
;
idrp_snpa_option ::= T_SNPA
idrp_snpa
;
idrp_snpa_rt_option ::= T_SNPA T_ISO
idrp_snpas
| T_SNPA T_IP
idrp_snpas
| T_SNPA
idrp_snpas
;
idrp_intf_option ::= T_INTERFACE host
| T_INTERFACE osi_tagged_address
| T_INTERFACE host osi_tagged_address
| T_INTERFACE osi_tagged_address host
;
idrp_snpas ::= idrp_snpa
| idrp_snpas idrp_snpa
;
idrp_snpa ::= L_HEXSTRING
;
idrp_group_options ::= idrp_group_option
| idrp_group_options idrp_group_option
;
idrp_group_option ::= T_RDI osi_rdi
| T_INTERNAL
| T_EXTERNAL
;
/*
idrp_proto_options ::= idrp_proto_option
| idrp_proto_options idrp_proto_option
;
*/
idrp_proto_option ::= T_PROTOSUPPORT idrp_proto_supp
| T_SOCKSUPPORT idrp_sock_support
| idrp_sock_support
;
/*
idrp_sock_options ::= idrp_sock_options idrp_sock_option
| idrp_sock_option
;
*/
idrp_sock_option ::= T_IP
| T_UDP
| T_ISO
| T_IDRP
;
idrp_proto_supp ::= T_ISO
| T_IP
| T_IP T_ISO
| T_ISO T_IP
;
idrp_peer_options ::= idrp_peer_options idrp_peer_option
| idrp_peer_option
;
idrp_peer_option ::= T_TRACEOPTIONS trace_file_option trace_control_option idrp_trace_options_none
| idrp_auth
| idrp_authcode
| idrp_close_time
| idrp_max_outpdu
| idrp_hold
| idrp_minadv
| idrp_listenopen
| idrp_rexmit
| idrp_closestay
| T_MULTIEXIT L_NUMBER
| T_RIB_REFRESH onoff_option
| T_RIB_REFRESH
| T_RIBSUPPORT T_ALL
| T_RIBSUPPORT idrp_peer_rib_ids
;
idrp_peer_rib_ids ::= idrp_peer_rib_id
| idrp_peer_rib_ids idrp_peer_rib_id
;
idrp_peer_rib_id ::= L_NUMBER
;
/*
* this formerly had 'osi_nsap' as an option, which caused 14 reduce/reduce
* conflicts between the osi_nsap and host productions -- sjr
*/
osi_tagged_address ::= osi_address_name osi_nsap
;
osi_address ::= addr_iso
| osi_hex
;
osi_nsap ::= addr_iso
| osi_hex
;
osi_rdi ::= addr_iso
| osi_hex
;
osi_rdi_or_any ::= osi_rdi
| T_ANY
;
osi_prefix ::= addr_iso
| osi_hex
;
osi_address_name::= T_NET
| T_NSAP
;
idrp_prop_init ::= T_IDRP
;
idrp_trace_options_none
::= T_NONE
| idrp_trace_options
| idrp_trace_options T_EXCEPT idrp_trace_options
;
idrp_trace_options
::= idrp_trace_option
| idrp_trace_options idrp_trace_option
;
idrp_trace_option ::= trace_option
| T_PHASE1
| T_MINADVTIMER
| T_PHASE3
| T_ROUTE_TIES
| T_IDRP_DEBUG
| T_IDRP
;
@BEGIN: PROTO_TODO
idrp_trace_option_index
::= T_PACKETS
/* TODO
| T_OPEN
| T_UPDATE
| T_KEEPALIVE
| T_PHASE1
*/
;
@END: PROTO_TODO
@END: PROTO_IDRP
control_statement
::=
| T_IMPORT T_PROTO control_idrp
T_RDI osi_rdi_or_any idrp_import_optional_info idrp_import_option L_EOS
| T_IMPORT T_PROTO control_idrp
T_RDPATH rdpath_spec idrp_import_optional_info idrp_import_option L_EOS
| T_EXPORT T_PROTO control_idrp
T_RDI osi_rdi_or_any prop_source_option_idrp L_EOS
;
import_interior ::= proto_interior
;
/*
N.B.::=
This architecture will allow for multiple specification of
each of the options; you should either::=
- issue a warning and only use the last one specified, or
- issue an error and exit when a duplicate field tag is
found.
*/
idrp_local_intf_test ::= T_LOCAL_INTERFACE host
/* TODO::= the following only uses NET for now; should be idrp_snpa! */
| T_LOCAL_NET osi_address
;
/*
* "$$" should contain the idrp_policy_atts_clause, if any;
* the idrp_atts_clause is stored in the global p_idrp_ps_atts.
*/
idrp_import_optional_info ::= /* Empty */
| idrp_local_intf_test
| idrp_policy_atts_clause
| idrp_atts_clause
| idrp_local_intf_test idrp_policy_atts_clause
| idrp_local_intf_test idrp_atts_clause
| idrp_policy_atts_clause idrp_atts_clause
| idrp_atts_clause idrp_policy_atts_clause
| idrp_local_intf_test idrp_policy_atts_clause idrp_atts_clause
| idrp_local_intf_test idrp_atts_clause idrp_policy_atts_clause
;
idrp_export_optional_info ::= /* Empty */
| idrp_policy_atts_clause
| idrp_atts_clause
| idrp_policy_atts_clause idrp_atts_clause
| idrp_atts_clause idrp_policy_atts_clause
;
idrp_policy_atts_clause::= T_IDRP_PS_POLICY_ATTS
'{' idrp_ps_policy_attribute_entries '}'
;
idrp_atts_clause::= T_IDRP_PS_ATTS
'{' idrp_ps_attribute_entries '}'
;
idrp_ps_policy_attribute_entries::= idrp_ps_policy_attribute_entry
| idrp_ps_policy_attribute_entries idrp_ps_policy_attribute_entry
;
idrp_ps_attribute_entries::= idrp_ps_attribute_entry
| idrp_ps_attribute_entries idrp_ps_attribute_entry
;
idrp_ps_policy_attribute_entry::= idrp_ps_policy_route_option L_EOS
| idrp_ps_policy_hopcount L_EOS
| idrp_ps_policy_nexthop L_EOS
| idrp_ps_policy_QOS_option L_EOS
/* TODO @BEGIN: PROTO_RDPATHS */
| idrp_ps_policy_dist_option L_EOS
/* @END: PROTO_RDPATHS */
;
idrp_ps_attribute_entry::= idrp_ps_route_option L_EOS
| idrp_ps_pref_calc L_EOS
| idrp_ps_QOS_option L_EOS
/* SJR TODO @BEGIN: PROTO_RDPATHS
*/
| idrp_ps_dist_option L_EOS
/* SJR TODO @END: PROTO_RDPATHS
*/
;
idrp_ps_policy_route_option::= T_ROUTESERVER null_or_restrict
| T_EXTINFO null_or_restrict
| T_HIERARCHICAL_REC null_or_restrict
| T_MULTIEXIT null_or_restrict
| T_MULTIEXIT number_compare_op idrp_multiexit_value
;
idrp_ps_policy_nexthop::= T_NET osi_address
/* TODO -- just one SNPA, now--sjr */
| T_NET osi_address T_SNPA idrp_snpa
| T_GATEWAY host
| T_INTERFACE host
;
idrp_ps_route_option::= T_ROUTESERVER onoff_option
| T_EXTINFO
| T_HIERARCHICAL_REC
| T_MULTIEXIT idrp_multiexit_value
/* TODO--it would make sense to use something akin to::=
* "NEXTHOP use-me;" for 7.12.4 a) 1 or b) 1
* "NEXTHOP none;" for 7.12.4 a) 2 or b) 2
* This has implications for SNPAs, etc.
*
* SJR
*/
;
idrp_ps_policy_hopcount ::= T_HOPCOUNT number_compare_op idrp_rd_hopcount_value
;
idrp_ps_pref_calc ::= T_HOPCOUNT_OFFSET idrp_preference
;
idrp_rd_hopcount_value ::= L_NUMBER
;
number_compare_op ::= /* empty */
| T_LT
| T_LE
| T_EQ
| T_NE
| T_GE
| T_GT
;
/* TODO::= sort as they are input */
/* TODO SJR take care of this when PROTO_RDPATHS is not limping @BEGIN: PROTO_RDPATHS */
idrp_ps_dist_option::= T_PROHIBIT_DIST '{' idrp_ps_dist_list '}'
| T_ALLOW_DIST '{' idrp_ps_dist_list '}'
;
idrp_ps_dist_list::= idrp_ps_dist_list idrp_ps_dist_rdi
| idrp_ps_dist_rdi
;
idrp_ps_dist_rdi::= osi_rdi
;
/* TODO SJR take care of this when PROTO_RDPATHS is not limping @END: PROTO_RDPATHS */
/*TODO--wrap in RDPATH */
idrp_ps_policy_dist_option::= T_DIST_LIST_INCL '{' idrp_ps_dist_list '}'
| T_DIST_LIST_EXCL '{' idrp_ps_dist_list '}'
;
idrp_ps_policy_QOS_option ::= T_TRANSITDELAY null_or_restrict
| T_TRANSITDELAY number_compare_op idrp_transit_delay_value
| T_RDLRE null_or_restrict
| T_RDLRE number_compare_op idrp_rdlre_value
| T_EXPENSE null_or_restrict
| T_EXPENSE number_compare_op idrp_expense_value
| T_PRIORITY null_or_restrict
| T_PRIORITY number_compare_op idrp_priority_value
| T_CAPACITY null_or_restrict
| T_CAPACITY number_compare_op idrp_capacity_value
;
idrp_ps_QOS_option::= T_TRANSITDELAY idrp_transit_delay_value
| T_RDLRE idrp_rdlre_value
| T_EXPENSE idrp_expense_value
| T_PRIORITY idrp_priority_value
| T_CAPACITY idrp_capacity_value
| T_SECURITY idrp_security_type idrp_security_value
;
idrp_ps_snpa_rt_option ::= T_SNPA
;
idrp_ps_snpa_rt_option ::= T_SNPA
idrp_snpas
;
/* TODO--@BEGIN: PROTO_RDPATHS */
rdpath_prop_init::= idrp_prop_init
rdpath_spec::= '/' rdpath_parts rdpath_any_or_null '/' rdpath_flag
| '/' rdpath_any '/'
;
rdpath_parts::= rdpath_part
| rdpath_parts rdpath_part
;
rdpath_part::= rdpath_special_part rdpath_real_part
| rdpath_real_part
;
rdpath_special_part::= '.'
| rdpath_any
;
rdpath_any::= L_RE_ANY
;
rdpath_any_or_null::= /* empty */
| rdpath_any
;
rdpath_real_part::= policy_rdpath_rdi
| '[' rdpath_set ']'
| '(' rdpath_or_list ')'
;
rdpath_set::= policy_rdpath_rdi
| rdpath_set policy_rdpath_rdi
;
rdpath_or_list::= policy_rdpath_rdi
| rdpath_or_list '|' policy_rdpath_rdi
;
policy_rdpath_rdi::= osi_rdi
;
rdpath_flag::= /* Empty */
| T_EXACT
| T_SUBSET
;
/* TODO--@END: PROTO_RDPATHS */
idrp_gateway_list::= L_NUMBER /* TODO! */
;
idrp_interface_list::= L_NUMBER /* TODO! */
;
idrp_parse_import_list::= /* Empty */
| idrp_parse_import_list idrp_import_listen L_EOS
| idrp_parse_import_list error L_EOS
;
idrp_import_listen::=
idrp_dest_mask idrp_preference_restrict_option
;
idrp_dest_mask::= osi_dest_mask
| T_IP dest_mask_inet
;
osi_dest_mask::= dest_mask_iso
| dest_mask_iso L_NUMBER
;
idrp_import_option
::= T_RESTRICT
| idrp_preference_option '{' idrp_parse_import_list '}'
;
idrp_preference_option
::= /* Empty */
/* just a GateD preference; same form as other GateD imports */
| T_GATED_PREF preference
| T_IDRP_PREF idrp_preference
| T_GATED_PREF preference T_IDRP_PREF idrp_preference
| T_IDRP_PREF idrp_preference T_GATED_PREF preference
;
idrp_preference_restrict_option
::= idrp_preference_option
| T_RESTRICT
;
idrp_preference::= L_NUMBER
;
@END: PROTO_IDRP
@BEGIN: PROTO_INET
/* IP Import stuff */
import_option_inet
::= T_RESTRICT
| preference_option '{' import_list_inet '}'
;
import_list_inet
::= /* Empty */
| import_list_inet import_listen_inet L_EOS
| import_list_inet error L_EOS
;
import_listen_inet
::=
dest_mask_inet preference_restrict_option
;
@END: PROTO_INET
@BEGIN: PROTO_ISO
/* ISO Import stuff */
import_option_iso ::= T_RESTRICT
| preference_option '{' import_list_iso '}'
;
import_list_iso ::= /* Empty */
| import_list_iso import_listen_iso L_EOS
| import_list_iso error L_EOS
;
import_listen_iso ::=
dest_mask_iso preference_restrict_option
;
@END: PROTO_ISO
/* */
/* Support for Export clauses */
export_interior ::= proto_interior
;
@BEGIN: PROTO_IDRP
prop_source_option_idrp
::= T_RESTRICT
| metric_option '{' prop_source_list_idrp '}'
;
prop_source_list_idrp
::= /* Empty */
| prop_source_list_idrp prop_source_idrp L_EOS
| prop_source_list_idrp error L_EOS
;
prop_source_idrp::=
/* Static routes */
T_PROTO prop_static interface_list_option prop_metric_option_idrp
/* IDRP--RDIs */
| T_PROTO idrp_prop_init T_RDI osi_rdi_or_any idrp_export_optional_info prop_metric_option_idrp
/* IDRP--RD paths */
| T_PROTO rdpath_prop_init T_RDPATH rdpath_spec prop_metric_option_idrp
;
prop_metric_option_idrp
::= T_RESTRICT
| metric_option prop_restrict_list_option_idrp
;
prop_restrict_list_option_idrp
::= /* Empty */
| '{' prop_restrict_list_idrp '}'
;
prop_restrict_list_idrp
::= /* Empty */
| prop_restrict_list_idrp prop_restrict_idrp L_EOS
| prop_restrict_list_idrp error L_EOS
;
prop_restrict_idrp ::= prop_restrict_iso
@BEGIN: PROTO_INET
| T_IP prop_restrict_inet
@END: PROTO_INET
;
@END: PROTO_IDRP
@BEGIN: PROTO_ISO
prop_source_option_iso
::= T_RESTRICT
| metric_option '{' prop_source_list_iso '}'
;
prop_source_list_iso
::= /* Empty */
| prop_source_list_iso prop_source_iso L_EOS
| prop_source_list_iso error L_EOS
;
prop_source_iso ::= T_PROTO prop_direct interface_list_option prop_metric_option_iso
/* Static routes */
| T_PROTO prop_static interface_list_option prop_metric_option_iso
/* Aggregate routes */
| T_PROTO prop_aggregate prop_metric_option_iso
/* Kernel static routes (routing socket) */
| T_PROTO prop_kernel interface_list_option prop_metric_option_iso
@BEGIN: PROTO_ISIS
/* ISIS imports */
| T_PROTO isis_prop_init prop_metric_option_iso
@END: PROTO_ISIS
;
prop_metric_option_iso
::= T_RESTRICT
| metric_option prop_restrict_list_option_iso
;
prop_restrict_list_option_iso
::= /* Empty */
| '{' prop_restrict_list_iso '}'
;
prop_restrict_list_iso
::= /* Empty */
| prop_restrict_list_iso prop_restrict_iso L_EOS
| prop_restrict_list_iso error L_EOS
;
prop_restrict_iso
::=
dest_mask_iso metric_restrict_option
;
@END: PROTO_ISO
@BEGIN: PROTO_INET
prop_source_option_inet
::= T_RESTRICT
| metric_option '{' prop_source_list_inet '}'
;
prop_source_list_inet
::= /* Empty */
| prop_source_list_inet prop_source_inet L_EOS
| prop_source_list_inet error L_EOS
;
prop_source_inet
/* Interfaces */
::= T_PROTO prop_direct interface_list_option prop_metric_option_inet
/* Static routes */
| T_PROTO prop_static interface_list_option prop_metric_option_inet
/* Aggregate routes */
| T_PROTO prop_aggregate prop_metric_option_inet
/* Kernel static routes (routing socket) */
| T_PROTO prop_kernel interface_list_option prop_metric_option_inet
/* Internal default route */
| T_PROTO prop_default prop_metric_option_inet
;
prop_direct ::= T_DIRECT
;
prop_static ::= T_STATIC
;
prop_aggregate ::= T_AGGREGATE
;
prop_kernel ::= T_KERNEL
;
prop_default ::= T_DEFAULT
;
@BEGIN: PROTO_INET
prop_metric_option_inet
::= T_RESTRICT
| metric_option prop_restrict_list_option_inet
;
prop_restrict_list_option_inet
::= /* Empty */
| '{' prop_restrict_list_inet '}'
;
prop_restrict_list_inet
::= /* Empty */
| prop_restrict_list_inet prop_restrict_inet L_EOS
| prop_restrict_list_inet error L_EOS
;
prop_restrict_inet
::=
dest_mask_inet metric_restrict_option
;
@END: PROTO_INET
/* */
@BEGIN: PROTO_INET
/* Addresses */
/* IP address */
dest_mask_inet ::= all_mask_inet
| default_mask_inet
| host_mask_inet
| network_mask_flags_inet
;
all_mask_inet ::= T_ALL
;
default_mask_inet
::= T_DEFAULT
;
/* Gateway list */
gateway_list_inet
::= gateway_inet
| gateway_list_inet gateway_inet
;
/* A gateway is a host on an attached network */
gateway_inet ::= host_inet
;
host_inet ::= host_name
| addr_inet
;
host_mask_inet ::= T_HOST host_inet
;
network_inet ::= host_name
| addr_inet
;
network_mask_inet
::= network_inet
| network_inet T_MASKLEN number
| network_inet T_MASK mask_inet
;
network_mask_flags_inet
::= network_mask_inet dm_flags
;
mask_inet ::= in_addr
;
addr_inet ::= in_addr
;
in_addr ::= L_NUMBER
| byte_string
;
/* TTLs */
inet_ttl ::= L_NUMBER
;
@END: PROTO_INET
/**/
@BEGIN: PROTO_ISO
dest_mask_iso ::= all_mask_iso
| default_mask_iso
| network_mask_flags_iso
| host_mask_iso
;
all_mask_iso ::= T_ALL
;
default_mask_iso
::= T_DEFAULT
;
/* Gateway list */
gateway_list_iso
::= gateway_iso
| gateway_list_iso gateway_iso
;
/* A gateway is a host on an attached network */
gateway_iso ::= host_iso
;
host_iso ::= addr_iso
;
host_mask_iso ::= T_HOST host_iso
;
network_iso ::= addr_iso
;
network_mask_iso
::= network_iso
| network_iso T_MASKLEN number
| network_iso T_MASK mask_iso
;
network_mask_flags_iso
::= network_mask_iso dm_flags
;
mask_iso ::= addr_iso
;
osi_hex::= L_HEXSTRING
;
addr_iso::= L_ISOADDR
/* SJR--to do, if we really need this (makes 54 reduce/reduce conflicts)...
| L_NUMBER
*/
| L_HEXNUMBER
;
@END: PROTO_ISO
/* Common to both */
host ::= T_NOP_SOCKADDR
@BEGIN: PROTO_INET
| host_inet
@END: PROTO_INET
@BEGIN: PROTO_ISO
| host_iso
@END: PROTO_ISO
;
mask ::= T_NOP_SOCKADDR
@BEGIN: PROTO_INET
| mask_inet
@END: PROTO_INET
@BEGIN: PROTO_ISO
| mask_iso
@END: PROTO_ISO
;
addr ::= T_NOP_SOCKADDR
@BEGIN: PROTO_INET
| addr_inet
@END: PROTO_INET
@BEGIN: PROTO_ISO
| addr_iso
@END: PROTO_ISO
;
gateway_list ::= T_NOP_ADV
@BEGIN: PROTO_INET
| gateway_list_inet
@END: PROTO_INET
@BEGIN: PROTO_ISO
| gateway_list_iso
@END: PROTO_ISO
;
dm_flags ::= /* Empty */
| T_EXACT
| T_REFINE
;
@END: PROTO_INET
/* Host name */
host_name ::= L_HNAME
| L_KEYWORD
| string
;
onoff_option ::= T_ON | T_OFF ;
null_or_restrict ::= /* empty */
| T_RESTRICT
;
/* Metric */
metric ::= number
| T_INFINITY
;
metric_option ::= /* Empty */
| T_METRIC metric
;
metric_restrict_option
::= metric_option
| T_RESTRICT
;
/* Preference */
preference_option
::= /* Empty */
| T_PREFERENCE preference
;
preference_restrict_option
::= preference_option
| T_RESTRICT
;
preference ::= L_NUMBER
;
/* Numbers and such */
string ::= L_STRING
;
number ::= L_NUMBER
| byte_string
;
byte_string ::= L_HEXSTRING
| L_OCTETSTRING
;
@BEGIN: PARSE_UTIME
utime ::= time '.' L_USEC
;
@END: PARSE_UTIME
time ::= L_NUMBER
| L_NUMBER ':' L_NUMBER
| L_NUMBER ':' L_NUMBER ':' L_NUMBER
;