Annotation of embedaddon/bird2/proto/rpki/config.Y, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     BIRD -- The Resource Public Key Infrastructure (RPKI) to Router Protocol
                      3:  *
                      4:  *     (c) 2015 CZ.NIC
                      5:  *
                      6:  *     Can be freely distributed and used under the terms of the GNU GPL.
                      7:  */
                      8: 
                      9: CF_HDR
                     10: 
                     11: #include "proto/rpki/rpki.h"
                     12: 
                     13: CF_DEFINES
                     14: 
                     15: #define RPKI_CFG ((struct rpki_config *) this_proto)
                     16: #define RPKI_TR_SSH_CFG ((struct rpki_tr_ssh_config *) RPKI_CFG->tr_config.spec)
                     17: 
                     18: static void
                     19: rpki_check_unused_hostname(void)
                     20: {
                     21:   if (RPKI_CFG->hostname != NULL)
                     22:     cf_error("Only one cache server per protocol allowed");
                     23: }
                     24: 
                     25: static void
                     26: rpki_check_unused_transport(void)
                     27: {
                     28:   if (RPKI_CFG->tr_config.spec != NULL)
                     29:     cf_error("At the most one transport per protocol allowed");
                     30: }
                     31: 
                     32: CF_DECLS
                     33: 
                     34: CF_KEYWORDS(RPKI, REMOTE, BIRD, PRIVATE, PUBLIC, KEY, TCP, SSH, TRANSPORT, USER,
                     35:            RETRY, REFRESH, EXPIRE, KEEP)
                     36: 
                     37: %type <i> rpki_keep_interval
                     38: 
                     39: CF_GRAMMAR
                     40: 
                     41: proto: rpki_proto ;
                     42: 
                     43: rpki_proto_start: proto_start RPKI {
                     44:   this_proto = proto_config_new(&proto_rpki, $1);
                     45:   RPKI_CFG->retry_interval = RPKI_RETRY_INTERVAL;
                     46:   RPKI_CFG->refresh_interval = RPKI_REFRESH_INTERVAL;
                     47:   RPKI_CFG->expire_interval = RPKI_EXPIRE_INTERVAL;
                     48: };
                     49: 
                     50: rpki_proto: rpki_proto_start proto_name '{' rpki_proto_opts '}' { rpki_check_config(RPKI_CFG); };
                     51: 
                     52: rpki_proto_opts:
                     53:    /* empty */
                     54:  | rpki_proto_opts rpki_proto_item ';'
                     55:  ;
                     56: 
                     57: rpki_proto_item:
                     58:    proto_item
                     59:  | proto_channel
                     60:  | REMOTE rpki_cache_addr
                     61:  | REMOTE rpki_cache_addr rpki_proto_item_port
                     62:  | rpki_proto_item_port
                     63:  | TRANSPORT rpki_transport
                     64:  | REFRESH rpki_keep_interval expr {
                     65:      if (rpki_check_refresh_interval($3))
                     66:        cf_error(rpki_check_refresh_interval($3));
                     67:      RPKI_CFG->refresh_interval = $3;
                     68:      RPKI_CFG->keep_refresh_interval = $2;
                     69:    }
                     70:  | RETRY rpki_keep_interval expr {
                     71:      if (rpki_check_retry_interval($3))
                     72:        cf_error(rpki_check_retry_interval($3));
                     73:      RPKI_CFG->retry_interval = $3;
                     74:      RPKI_CFG->keep_retry_interval = $2;
                     75:    }
                     76:  | EXPIRE rpki_keep_interval expr {
                     77:      if (rpki_check_expire_interval($3))
                     78:        cf_error(rpki_check_expire_interval($3));
                     79:      RPKI_CFG->expire_interval = $3;
                     80:      RPKI_CFG->keep_expire_interval = $2;
                     81:    }
                     82:  ;
                     83: 
                     84: rpki_keep_interval:
                     85:  /* empty */ { $$ = 0; }
                     86:  | KEEP { $$ = 1; }
                     87:  ;
                     88: 
                     89: rpki_proto_item_port: PORT expr { check_u16($2); RPKI_CFG->port = $2; };
                     90: 
                     91: rpki_cache_addr:
                     92:    text {
                     93:      rpki_check_unused_hostname();
                     94:      RPKI_CFG->hostname = $1;
                     95:    }
                     96:  | ipa {
                     97:      rpki_check_unused_hostname();
                     98:      RPKI_CFG->ip = $1;
                     99:      /* Ensure hostname is filled */
                    100:      char *hostname = cfg_allocz(INET6_ADDRSTRLEN + 1);
                    101:      bsnprintf(hostname, INET6_ADDRSTRLEN+1, "%I", RPKI_CFG->ip);
                    102:      RPKI_CFG->hostname = hostname;
                    103:    }
                    104:  ;
                    105: 
                    106: rpki_transport:
                    107:    TCP rpki_transport_tcp_init
                    108:  | SSH rpki_transport_ssh_init '{' rpki_transport_ssh_opts '}' rpki_transport_ssh_check
                    109:  ;
                    110: 
                    111: rpki_transport_tcp_init:
                    112: {
                    113:   rpki_check_unused_transport();
                    114:   RPKI_CFG->tr_config.spec = cfg_allocz(sizeof(struct rpki_tr_tcp_config));
                    115:   RPKI_CFG->tr_config.type = RPKI_TR_TCP;
                    116: };
                    117: 
                    118: rpki_transport_ssh_init:
                    119: {
                    120:   rpki_check_unused_transport();
                    121:   RPKI_CFG->tr_config.spec = cfg_allocz(sizeof(struct rpki_tr_ssh_config));
                    122:   RPKI_CFG->tr_config.type = RPKI_TR_SSH;
                    123: };
                    124: 
                    125: rpki_transport_ssh_opts:
                    126:    /* empty */
                    127:  | rpki_transport_ssh_opts rpki_transport_ssh_item ';'
                    128:  ;
                    129: 
                    130: rpki_transport_ssh_item:
                    131:    BIRD PRIVATE KEY text  { RPKI_TR_SSH_CFG->bird_private_key = $4; }
                    132:  | REMOTE PUBLIC KEY text { RPKI_TR_SSH_CFG->cache_public_key = $4; }
                    133:  | USER text              { RPKI_TR_SSH_CFG->user = $2; }
                    134:  ;
                    135: 
                    136: rpki_transport_ssh_check:
                    137: {
                    138:   if (RPKI_TR_SSH_CFG->user == NULL)
                    139:     cf_error("User must be set");
                    140: };
                    141: 
                    142: CF_CODE
                    143: 
                    144: CF_END

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