mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2025-01-03 07:31:54 +00:00
Merge commit '3fd1f461' into thread-next
closes #16 closes #17 closes #18
This commit is contained in:
commit
7901c40500
@ -42,6 +42,7 @@ proto: rpki_proto ;
|
|||||||
|
|
||||||
rpki_proto_start: proto_start RPKI {
|
rpki_proto_start: proto_start RPKI {
|
||||||
this_proto = proto_config_new(&proto_rpki, $1);
|
this_proto = proto_config_new(&proto_rpki, $1);
|
||||||
|
this_proto->loop_order = DOMAIN_ORDER(proto);
|
||||||
RPKI_CFG->retry_interval = RPKI_RETRY_INTERVAL;
|
RPKI_CFG->retry_interval = RPKI_RETRY_INTERVAL;
|
||||||
RPKI_CFG->refresh_interval = RPKI_REFRESH_INTERVAL;
|
RPKI_CFG->refresh_interval = RPKI_REFRESH_INTERVAL;
|
||||||
RPKI_CFG->expire_interval = RPKI_EXPIRE_INTERVAL;
|
RPKI_CFG->expire_interval = RPKI_EXPIRE_INTERVAL;
|
||||||
|
@ -233,7 +233,12 @@ static const size_t min_pdu_size[] = {
|
|||||||
[ERROR] = 16,
|
[ERROR] = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rpki_send_error_pdu(struct rpki_cache *cache, const enum pdu_error_type error_code, const u32 err_pdu_len, const struct pdu_header *erroneous_pdu, const char *fmt, ...);
|
static int rpki_send_error_pdu_(struct rpki_cache *cache, const enum pdu_error_type error_code, const u32 err_pdu_len, const struct pdu_header *erroneous_pdu, const char *fmt, ...);
|
||||||
|
|
||||||
|
#define rpki_send_error_pdu(cache, error_code, err_pdu_len, erroneous_pdu, fmt...) ({ \
|
||||||
|
rpki_send_error_pdu_(cache, error_code, err_pdu_len, erroneous_pdu, #fmt); \
|
||||||
|
CACHE_TRACE(D_PACKETS, cache, #fmt); \
|
||||||
|
})
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rpki_pdu_to_network_byte_order(struct pdu_header *pdu)
|
rpki_pdu_to_network_byte_order(struct pdu_header *pdu)
|
||||||
@ -595,6 +600,7 @@ rpki_handle_error_pdu(struct rpki_cache *cache, const struct pdu_error *pdu)
|
|||||||
case INTERNAL_ERROR:
|
case INTERNAL_ERROR:
|
||||||
case INVALID_REQUEST:
|
case INVALID_REQUEST:
|
||||||
case UNSUPPORTED_PDU_TYPE:
|
case UNSUPPORTED_PDU_TYPE:
|
||||||
|
CACHE_TRACE(D_PACKETS, cache, "Got UNSUPPORTED_PDU_TYPE");
|
||||||
rpki_cache_change_state(cache, RPKI_CS_ERROR_FATAL);
|
rpki_cache_change_state(cache, RPKI_CS_ERROR_FATAL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -652,21 +658,7 @@ rpki_handle_cache_response_pdu(struct rpki_cache *cache, const struct pdu_cache_
|
|||||||
{
|
{
|
||||||
if (cache->request_session_id)
|
if (cache->request_session_id)
|
||||||
{
|
{
|
||||||
if (cache->last_update)
|
rpki_start_refresh(cache->p);
|
||||||
{
|
|
||||||
/*
|
|
||||||
* This isn't the first sync and we already received records. This point
|
|
||||||
* is after Reset Query and before importing new records from cache
|
|
||||||
* server. We need to load new ones and kick out missing ones. So start
|
|
||||||
* a refresh cycle.
|
|
||||||
*/
|
|
||||||
if (cache->p->roa4_channel)
|
|
||||||
rt_refresh_begin(&cache->p->roa4_channel->in_req);
|
|
||||||
if (cache->p->roa6_channel)
|
|
||||||
rt_refresh_begin(&cache->p->roa6_channel->in_req);
|
|
||||||
|
|
||||||
cache->p->refresh_channels = 1;
|
|
||||||
}
|
|
||||||
cache->session_id = pdu->session_id;
|
cache->session_id = pdu->session_id;
|
||||||
cache->request_session_id = 0;
|
cache->request_session_id = 0;
|
||||||
}
|
}
|
||||||
@ -842,14 +834,7 @@ rpki_handle_end_of_data_pdu(struct rpki_cache *cache, const struct pdu_end_of_da
|
|||||||
(cf->keep_expire_interval ? "keeps " : ""), cache->expire_interval);
|
(cf->keep_expire_interval ? "keeps " : ""), cache->expire_interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cache->p->refresh_channels)
|
rpki_stop_refresh(cache->p);
|
||||||
{
|
|
||||||
cache->p->refresh_channels = 0;
|
|
||||||
if (cache->p->roa4_channel)
|
|
||||||
rt_refresh_end(&cache->p->roa4_channel->in_req);
|
|
||||||
if (cache->p->roa6_channel)
|
|
||||||
rt_refresh_end(&cache->p->roa6_channel->in_req);
|
|
||||||
}
|
|
||||||
|
|
||||||
cache->last_update = current_time();
|
cache->last_update = current_time();
|
||||||
cache->serial_num = pdu->serial_num;
|
cache->serial_num = pdu->serial_num;
|
||||||
@ -1040,7 +1025,7 @@ rpki_connected_hook(sock *sk)
|
|||||||
* This function prepares Error PDU and sends it to a cache server.
|
* This function prepares Error PDU and sends it to a cache server.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
rpki_send_error_pdu(struct rpki_cache *cache, const enum pdu_error_type error_code, const u32 err_pdu_len, const struct pdu_header *erroneous_pdu, const char *fmt, ...)
|
rpki_send_error_pdu_(struct rpki_cache *cache, const enum pdu_error_type error_code, const u32 err_pdu_len, const struct pdu_header *erroneous_pdu, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
char msg[128];
|
char msg[128];
|
||||||
|
@ -109,6 +109,7 @@ static void rpki_schedule_next_expire_check(struct rpki_cache *cache);
|
|||||||
static void rpki_stop_refresh_timer_event(struct rpki_cache *cache);
|
static void rpki_stop_refresh_timer_event(struct rpki_cache *cache);
|
||||||
static void rpki_stop_retry_timer_event(struct rpki_cache *cache);
|
static void rpki_stop_retry_timer_event(struct rpki_cache *cache);
|
||||||
static void rpki_stop_expire_timer_event(struct rpki_cache *cache);
|
static void rpki_stop_expire_timer_event(struct rpki_cache *cache);
|
||||||
|
static void rpki_stop_all_timers(struct rpki_cache *cache);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -136,6 +137,30 @@ rpki_table_remove_roa(struct rpki_cache *cache, struct channel *channel, const n
|
|||||||
rte_update(channel, &pfxr->n, NULL, p->p.main_source);
|
rte_update(channel, &pfxr->n, NULL, p->p.main_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rpki_start_refresh(struct rpki_proto *p)
|
||||||
|
{
|
||||||
|
if (p->roa4_channel)
|
||||||
|
rt_refresh_begin(&p->roa4_channel->in_req);
|
||||||
|
if (p->roa6_channel)
|
||||||
|
rt_refresh_begin(&p->roa6_channel->in_req);
|
||||||
|
|
||||||
|
p->refresh_channels = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rpki_stop_refresh(struct rpki_proto *p)
|
||||||
|
{
|
||||||
|
if (!p->refresh_channels)
|
||||||
|
return;
|
||||||
|
|
||||||
|
p->refresh_channels = 0;
|
||||||
|
|
||||||
|
if (p->roa4_channel)
|
||||||
|
rt_refresh_end(&p->roa4_channel->in_req);
|
||||||
|
if (p->roa6_channel)
|
||||||
|
rt_refresh_end(&p->roa6_channel->in_req);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RPKI Protocol Logic
|
* RPKI Protocol Logic
|
||||||
@ -192,6 +217,8 @@ rpki_force_restart_proto(struct rpki_proto *p)
|
|||||||
{
|
{
|
||||||
if (p->cache)
|
if (p->cache)
|
||||||
{
|
{
|
||||||
|
rpki_tr_close(p->cache->tr_sock);
|
||||||
|
rpki_stop_all_timers(p->cache);
|
||||||
CACHE_DBG(p->cache, "Connection object destroying");
|
CACHE_DBG(p->cache, "Connection object destroying");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,7 +342,7 @@ rpki_schedule_next_refresh(struct rpki_cache *cache)
|
|||||||
btime t = cache->refresh_interval S;
|
btime t = cache->refresh_interval S;
|
||||||
|
|
||||||
CACHE_DBG(cache, "after %t s", t);
|
CACHE_DBG(cache, "after %t s", t);
|
||||||
tm_start(cache->refresh_timer, t);
|
tm_start_in(cache->refresh_timer, t, cache->p->p.loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -324,7 +351,7 @@ rpki_schedule_next_retry(struct rpki_cache *cache)
|
|||||||
btime t = cache->retry_interval S;
|
btime t = cache->retry_interval S;
|
||||||
|
|
||||||
CACHE_DBG(cache, "after %t s", t);
|
CACHE_DBG(cache, "after %t s", t);
|
||||||
tm_start(cache->retry_timer, t);
|
tm_start_in(cache->retry_timer, t, cache->p->p.loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -335,7 +362,7 @@ rpki_schedule_next_expire_check(struct rpki_cache *cache)
|
|||||||
t = MAX(t, 1 S);
|
t = MAX(t, 1 S);
|
||||||
|
|
||||||
CACHE_DBG(cache, "after %t s", t);
|
CACHE_DBG(cache, "after %t s", t);
|
||||||
tm_start(cache->expire_timer, t);
|
tm_start_in(cache->expire_timer, t, cache->p->p.loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -352,13 +379,21 @@ rpki_stop_retry_timer_event(struct rpki_cache *cache)
|
|||||||
tm_stop(cache->retry_timer);
|
tm_stop(cache->retry_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UNUSED
|
static void
|
||||||
rpki_stop_expire_timer_event(struct rpki_cache *cache)
|
rpki_stop_expire_timer_event(struct rpki_cache *cache)
|
||||||
{
|
{
|
||||||
CACHE_DBG(cache, "Stop");
|
CACHE_DBG(cache, "Stop");
|
||||||
tm_stop(cache->expire_timer);
|
tm_stop(cache->expire_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rpki_stop_all_timers(struct rpki_cache *cache)
|
||||||
|
{
|
||||||
|
rpki_stop_refresh_timer_event(cache);
|
||||||
|
rpki_stop_retry_timer_event(cache);
|
||||||
|
rpki_stop_expire_timer_event(cache);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
rpki_do_we_recv_prefix_pdu_in_last_seconds(struct rpki_cache *cache)
|
rpki_do_we_recv_prefix_pdu_in_last_seconds(struct rpki_cache *cache)
|
||||||
{
|
{
|
||||||
@ -623,6 +658,7 @@ rpki_close_connection(struct rpki_cache *cache)
|
|||||||
{
|
{
|
||||||
CACHE_TRACE(D_EVENTS, cache, "Closing a connection");
|
CACHE_TRACE(D_EVENTS, cache, "Closing a connection");
|
||||||
rpki_tr_close(cache->tr_sock);
|
rpki_tr_close(cache->tr_sock);
|
||||||
|
rpki_stop_refresh(cache->p);
|
||||||
proto_notify_state(&cache->p->p, PS_START);
|
proto_notify_state(&cache->p->p, PS_START);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,6 +83,8 @@ const char *rpki_cache_state_to_str(enum rpki_cache_state state);
|
|||||||
void rpki_table_add_roa(struct rpki_cache *cache, struct channel *channel, const net_addr_union *pfxr);
|
void rpki_table_add_roa(struct rpki_cache *cache, struct channel *channel, const net_addr_union *pfxr);
|
||||||
void rpki_table_remove_roa(struct rpki_cache *cache, struct channel *channel, const net_addr_union *pfxr);
|
void rpki_table_remove_roa(struct rpki_cache *cache, struct channel *channel, const net_addr_union *pfxr);
|
||||||
|
|
||||||
|
void rpki_start_refresh(struct rpki_proto *p);
|
||||||
|
void rpki_stop_refresh(struct rpki_proto *p);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RPKI Protocol Logic
|
* RPKI Protocol Logic
|
||||||
|
@ -38,6 +38,8 @@ rpki_tr_ssh_open(struct rpki_tr_sock *tr)
|
|||||||
if (sk_open(sk) != 0)
|
if (sk_open(sk) != 0)
|
||||||
return RPKI_TR_ERROR;
|
return RPKI_TR_ERROR;
|
||||||
|
|
||||||
|
sk_start(sk);
|
||||||
|
|
||||||
return RPKI_TR_SUCCESS;
|
return RPKI_TR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,6 +31,8 @@ rpki_tr_tcp_open(struct rpki_tr_sock *tr)
|
|||||||
if (sk_open(sk) != 0)
|
if (sk_open(sk) != 0)
|
||||||
return RPKI_TR_ERROR;
|
return RPKI_TR_ERROR;
|
||||||
|
|
||||||
|
sk_start(sk);
|
||||||
|
|
||||||
return RPKI_TR_SUCCESS;
|
return RPKI_TR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +85,7 @@ rpki_tr_open(struct rpki_tr_sock *tr)
|
|||||||
sk->rbsize = RPKI_RX_BUFFER_SIZE;
|
sk->rbsize = RPKI_RX_BUFFER_SIZE;
|
||||||
sk->tbsize = RPKI_TX_BUFFER_SIZE;
|
sk->tbsize = RPKI_TX_BUFFER_SIZE;
|
||||||
sk->tos = IP_PREC_INTERNET_CONTROL;
|
sk->tos = IP_PREC_INTERNET_CONTROL;
|
||||||
|
sk->flags |= SKF_THREAD;
|
||||||
sk->vrf = cache->p->p.vrf;
|
sk->vrf = cache->p->p.vrf;
|
||||||
|
|
||||||
if (ipa_zero(sk->daddr) && sk->host)
|
if (ipa_zero(sk->daddr) && sk->host)
|
||||||
@ -120,6 +121,7 @@ rpki_tr_close(struct rpki_tr_sock *tr)
|
|||||||
|
|
||||||
if (tr->sk)
|
if (tr->sk)
|
||||||
{
|
{
|
||||||
|
sk_stop(tr->sk);
|
||||||
rfree(tr->sk);
|
rfree(tr->sk);
|
||||||
tr->sk = NULL;
|
tr->sk = NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user