Annotation of embedaddon/bird2/sysdep/unix/krt.Y, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     BIRD -- UNIX Kernel Syncer Configuration
                      3:  *
                      4:  *     (c) 1998--2000 Martin Mares <mj@ucw.cz>
                      5:  *
                      6:  *     Can be freely distributed and used under the terms of the GNU GPL.
                      7:  */
                      8: 
                      9: CF_HDR
                     10: 
                     11: #include "sysdep/unix/krt.h"
                     12: 
                     13: CF_DEFINES
                     14: 
                     15: #define THIS_KRT ((struct krt_config *) this_proto)
                     16: #define THIS_KIF ((struct kif_config *) this_proto)
                     17: #define KIF_IFACE ((struct kif_iface_config *) this_ipatt)
                     18: 
                     19: static void
                     20: kif_set_preferred(ip_addr ip)
                     21: {
                     22:   if (ipa_is_ip4(ip))
                     23:     KIF_IFACE->pref_v4 = ip;
                     24:   else if (!ipa_is_link_local(ip))
                     25:     KIF_IFACE->pref_v6 = ip;
                     26:   else
                     27:     KIF_IFACE->pref_ll = ip;
                     28: }
                     29: 
                     30: CF_DECLS
                     31: 
                     32: CF_KEYWORDS(KERNEL, PERSIST, SCAN, TIME, LEARN, DEVICE, ROUTES, GRACEFUL, RESTART, KRT_SOURCE, KRT_METRIC, MERGE, PATHS)
                     33: CF_KEYWORDS(INTERFACE, PREFERRED)
                     34: 
                     35: %type <i> kern_mp_limit
                     36: 
                     37: CF_GRAMMAR
                     38: 
                     39: /* Kernel syncer protocol */
                     40: 
                     41: proto: kern_proto '}' ;
                     42: 
                     43: kern_proto_start: proto_start KERNEL {
                     44:      this_proto = krt_init_config($1);
                     45: }
                     46:  ;
                     47: 
                     48: kern_proto: kern_proto_start proto_name '{' ;
                     49: kern_proto: kern_proto kern_item ';' ;
                     50: 
                     51: kern_mp_limit:
                     52:    /* empty */ { $$ = KRT_DEFAULT_ECMP_LIMIT; }
                     53:  | LIMIT expr  { $$ = $2; if (($2 <= 0) || ($2 > 255)) cf_error("Merge paths limit must be in range 1-255"); }
                     54:  ;
                     55: 
                     56: kern_item:
                     57:    proto_item
                     58:  | proto_channel { this_proto->net_type = $1->net_type; }
                     59:  | PERSIST bool { THIS_KRT->persist = $2; }
                     60:  | SCAN TIME expr {
                     61:       /* Scan time of 0 means scan on startup only */
                     62:       THIS_KRT->scan_time = $3 S_;
                     63:    }
                     64:  | LEARN bool {
                     65:       THIS_KRT->learn = $2;
                     66: #ifndef KRT_ALLOW_LEARN
                     67:       if ($2)
                     68:        cf_error("Learning of kernel routes not supported on this platform");
                     69: #endif
                     70:    }
                     71:  | GRACEFUL RESTART bool { THIS_KRT->graceful_restart = $3; }
                     72:  | MERGE PATHS bool kern_mp_limit {
                     73:       THIS_KRT->merge_paths = $3 ? $4 : 0;
                     74: #ifndef KRT_ALLOW_MERGE_PATHS
                     75:       if ($3)
                     76:        cf_error("Path merging not supported on this platform");
                     77: #endif
                     78:    }
                     79:  ;
                     80: 
                     81: /* Kernel interface protocol */
                     82: 
                     83: proto: kif_proto '}' ;
                     84: 
                     85: kif_proto_start: proto_start DEVICE { this_proto = kif_init_config($1); }
                     86:  ;
                     87: 
                     88: kif_proto: kif_proto_start proto_name '{' ;
                     89: kif_proto: kif_proto kif_item ';' ;
                     90: 
                     91: kif_item:
                     92:    proto_item
                     93:  | INTERFACE kif_iface
                     94:  | SCAN TIME expr {
                     95:       /* Scan time of 0 means scan on startup only */
                     96:       THIS_KIF->scan_time = $3 S_;
                     97:    }
                     98:  ;
                     99: 
                    100: kif_iface_start:
                    101: {
                    102:   this_ipatt = cfg_allocz(sizeof(struct kif_iface_config));
                    103:   add_tail(&THIS_KIF->iface_list, NODE this_ipatt);
                    104:   init_list(&this_ipatt->ipn_list);
                    105: }
                    106: 
                    107: kif_iface_item:
                    108:    PREFERRED ipa { kif_set_preferred($2); }
                    109:  ;
                    110: 
                    111: kif_iface_opts:
                    112:    /* empty */
                    113:  | kif_iface_opts kif_iface_item ';'
                    114:  ;
                    115: 
                    116: kif_iface_opt_list:
                    117:    /* empty */
                    118:  | '{' kif_iface_opts '}'
                    119:  ;
                    120: 
                    121: kif_iface:
                    122:   kif_iface_start iface_patt_list_nopx kif_iface_opt_list;
                    123: 
                    124: 
                    125: dynamic_attr: KRT_SOURCE { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_SOURCE); } ;
                    126: dynamic_attr: KRT_METRIC { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_METRIC); } ;
                    127: 
                    128: CF_CODE
                    129: 
                    130: CF_END

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>