Statistics
| Branch: | Revision:

iof-bird / bird-2.0.1 / proto / rpki / rpki.h @ 6b3f1a54

History | View | Annotate | Download (5.51 KB)

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_ */