Annotation of embedaddon/bird2/proto/rpki/rpki.h, revision 1.1
1.1 ! misho 1: /*
! 2: * BIRD -- The Resource Public Key Infrastructure (RPKI) to Router Protocol
! 3: *
! 4: * (c) 2015 CZ.NIC
! 5: * (c) 2015 Pavel Tvrdik <pawel.tvrdik@gmail.com>
! 6: *
! 7: * Using RTRlib: http://rpki.realmv6.org/
! 8: *
! 9: * Can be freely distributed and used under the terms of the GNU GPL.
! 10: */
! 11:
! 12: #ifndef _BIRD_RPKI_H_
! 13: #define _BIRD_RPKI_H_
! 14:
! 15: #include "nest/bird.h"
! 16: #include "nest/route.h"
! 17: #include "nest/protocol.h"
! 18: #include "lib/socket.h"
! 19: #include "lib/ip.h"
! 20:
! 21: #include "transport.h"
! 22: #include "packets.h"
! 23:
! 24: #define RPKI_TCP_PORT 323
! 25: #define RPKI_SSH_PORT 22
! 26: #define RPKI_RETRY_INTERVAL 600
! 27: #define RPKI_REFRESH_INTERVAL 3600
! 28: #define RPKI_EXPIRE_INTERVAL 7200
! 29:
! 30: #define RPKI_VERSION_0 0
! 31: #define RPKI_VERSION_1 1
! 32: #define RPKI_MAX_VERSION RPKI_VERSION_1
! 33:
! 34:
! 35: /*
! 36: * RPKI Cache
! 37: */
! 38:
! 39: enum rpki_cache_state {
! 40: RPKI_CS_CONNECTING, /* Socket is establishing the transport connection. */
! 41: RPKI_CS_ESTABLISHED, /* Connection is established, socket is waiting for a Serial Notify or expiration of the refresh_interval timer */
! 42: RPKI_CS_RESET, /* Resetting RTR connection. */
! 43: RPKI_CS_SYNC_START, /* Sending a Serial/Reset Query PDU and expecting a Cache Response PDU */
! 44: RPKI_CS_SYNC_RUNNING, /* Receiving validation records from the RTR server. A state between Cache Response PDU and End of Data PDU */
! 45: RPKI_CS_FAST_RECONNECT, /* Reconnect without any waiting period */
! 46: RPKI_CS_NO_INCR_UPDATE_AVAIL, /* Server is unable to answer the last Serial Query and sent Cache Reset. */
! 47: RPKI_CS_ERROR_NO_DATA_AVAIL, /* Server is unable to answer either a Serial Query or a Reset Query because it has no useful data available at this time. */
! 48: RPKI_CS_ERROR_FATAL, /* Fatal protocol error occurred. */
! 49: RPKI_CS_ERROR_TRANSPORT, /* Error on the transport socket occurred. */
! 50: RPKI_CS_SHUTDOWN, /* RTR Socket is stopped. */
! 51: };
! 52:
! 53: struct rpki_cache {
! 54: pool *pool; /* Pool containing cache objects */
! 55: struct rpki_proto *p;
! 56:
! 57: struct rpki_tr_sock *tr_sock; /* Transport specific socket */
! 58: enum rpki_cache_state state; /* RPKI_CS_* */
! 59: u32 session_id;
! 60: u8 request_session_id; /* 1: have to request new session id; 0: we have already received session id */
! 61: u32 serial_num; /* Serial number denotes the logical version of data from cache server */
! 62: u8 version; /* Protocol version */
! 63: btime last_update; /* Last successful synchronization with cache server */
! 64: btime last_rx_prefix; /* Last received prefix PDU */
! 65:
! 66: /* Intervals can be changed by cache server on the fly */
! 67: u32 refresh_interval; /* Actual refresh interval (in seconds) */
! 68: u32 retry_interval;
! 69: u32 expire_interval;
! 70: timer *retry_timer; /* Retry timer event */
! 71: timer *refresh_timer; /* Refresh timer event */
! 72: timer *expire_timer; /* Expire timer event */
! 73: };
! 74:
! 75: const char *rpki_get_cache_ident(struct rpki_cache *cache);
! 76: const char *rpki_cache_state_to_str(enum rpki_cache_state state);
! 77:
! 78:
! 79: /*
! 80: * Routes handling
! 81: */
! 82:
! 83: void rpki_table_add_roa(struct rpki_cache *cache, struct channel *channel, const net_addr_union *pfxr);
! 84: void rpki_table_remove_roa(struct rpki_cache *cache, struct channel *channel, const net_addr_union *pfxr);
! 85:
! 86:
! 87: /*
! 88: * RPKI Protocol Logic
! 89: */
! 90:
! 91: void rpki_cache_change_state(struct rpki_cache *cache, const enum rpki_cache_state new_state);
! 92:
! 93:
! 94: /*
! 95: * RPKI Timer Events
! 96: */
! 97:
! 98: const char *rpki_check_refresh_interval(uint seconds);
! 99: const char *rpki_check_retry_interval(uint seconds);
! 100: const char *rpki_check_expire_interval(uint seconds);
! 101:
! 102:
! 103: /*
! 104: * RPKI Protocol Configuration
! 105: */
! 106:
! 107: struct rpki_proto {
! 108: struct proto p;
! 109: struct rpki_cache *cache;
! 110:
! 111: struct channel *roa4_channel;
! 112: struct channel *roa6_channel;
! 113: u8 refresh_channels; /* For non-incremental updates using rt_refresh_begin(), rt_refresh_end() */
! 114: };
! 115:
! 116: struct rpki_config {
! 117: struct proto_config c;
! 118: const char *hostname; /* Full domain name or stringified IP address of cache server */
! 119: ip_addr ip; /* IP address of cache server or IPA_NONE */
! 120: u16 port; /* Port number of cache server */
! 121: struct rpki_tr_config tr_config; /* Specific transport configuration structure */
! 122: u32 refresh_interval; /* Time interval (in seconds) for periodical downloading data from cache server */
! 123: u32 retry_interval; /* Time interval (in seconds) for an unreachable server */
! 124: u32 expire_interval; /* Maximal lifetime (in seconds) of ROAs without any successful refreshment */
! 125: u8 keep_refresh_interval:1; /* Do not overwrite refresh interval by cache server update */
! 126: u8 keep_retry_interval:1; /* Do not overwrite retry interval by cache server update */
! 127: u8 keep_expire_interval:1; /* Do not overwrite expire interval by cache server update */
! 128: };
! 129:
! 130: void rpki_check_config(struct rpki_config *cf);
! 131:
! 132:
! 133: /*
! 134: * Logger
! 135: */
! 136:
! 137: #define RPKI_LOG(log_level, rpki, msg, args...) \
! 138: do { \
! 139: log(log_level "%s: " msg, (rpki)->p.name , ## args); \
! 140: } while(0)
! 141:
! 142: #if defined(LOCAL_DEBUG) || defined(GLOBAL_DEBUG)
! 143: #define CACHE_DBG(cache,msg,args...) \
! 144: do { \
! 145: RPKI_LOG(L_DEBUG, (cache)->p, "%s [%s] %s " msg, rpki_get_cache_ident(cache), rpki_cache_state_to_str((cache)->state), __func__, ## args); \
! 146: } while(0)
! 147: #else
! 148: #define CACHE_DBG(cache,msg,args...) do { } while(0)
! 149: #endif
! 150:
! 151: #define RPKI_TRACE(level,rpki,msg,args...) \
! 152: do { \
! 153: if ((rpki)->p.debug & level) \
! 154: RPKI_LOG(L_TRACE, rpki, msg, ## args); \
! 155: } while(0)
! 156:
! 157: #define CACHE_TRACE(level,cache,msg,args...) \
! 158: do { \
! 159: if ((cache)->p->p.debug & level) \
! 160: RPKI_LOG(L_TRACE, (cache)->p, msg, ## args); \
! 161: } while(0)
! 162:
! 163: #define RPKI_WARN(p, msg, args...) RPKI_LOG(L_WARN, p, msg, ## args);
! 164:
! 165: #endif /* _BIRD_RPKI_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>