Annotation of embedaddon/bird2/proto/rpki/rpki.h, 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: * (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>