Return to config.Y CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird2 / proto / rpki |
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