return !rpki_config.work_offline && rpki_config.rsync.enabled;
}
+unsigned int
+config_get_rsync_priority(void)
+{
+ return rpki_config.rsync.priority;
+}
+
unsigned int
config_get_rsync_retry_count(void)
{
return !rpki_config.work_offline && rpki_config.http.enabled;
}
+unsigned int
+config_get_http_priority(void)
+{
+ return rpki_config.http.priority;
+}
+
unsigned int
config_get_http_retry_count(void)
{
long config_get_http_max_file_size(void);
char const *config_get_http_ca_path(void);
bool config_get_rsync_enabled(void);
+unsigned int config_get_rsync_priority(void);
unsigned int config_get_rsync_retry_count(void);
unsigned int config_get_rsync_retry_interval(void);
char *config_get_rsync_program(void);
struct string_array const *config_get_rsync_args(void);
bool config_get_http_enabled(void);
+unsigned int config_get_http_priority(void);
unsigned int config_get_http_retry_count(void);
unsigned int config_get_http_retry_interval(void);
char const *config_get_output_roa(void);
return 0;
}
-static int
-download_rpp(struct sia_uris *uris)
+static bool
+try_uris(struct sia_uris *uris, enum uri_type const *filter)
{
struct rpki_uri **node, *uri;
-
- if (uris->rpp.len == 0)
- return pr_val_err("SIA lacks both caRepository and rpkiNotify.");
+ enum uri_type type;
ARRAYLIST_FOREACH(&uris->rpp, node) {
uri = *node;
- switch (uri_get_type(uri)) {
+ type = uri_get_type(uri);
+
+ if (filter != NULL && (*filter) != type)
+ continue;
+
+ switch (type) {
case UT_RSYNC:
if (cache_download(uri, NULL) == 0)
- return 0;
+ return true;
break;
case UT_HTTPS:
if (rrdp_update(uri) == 0)
- return 0;
+ return true;
break;
default:
- pr_crit("Unknown URI type: %u", uri_get_type(uri));
+ pr_crit("Unknown URI type: %u", type);
}
}
+ return false;
+}
+
+static int
+download_rpp(struct sia_uris *uris)
+{
+ static const enum uri_type HTTP = UT_HTTPS;
+ static const enum uri_type RSYNC = UT_RSYNC;
+
+ if (uris->rpp.len == 0)
+ return pr_val_err("SIA lacks both caRepository and rpkiNotify.");
+
+ if (config_get_http_priority() > config_get_rsync_priority()) {
+ if (try_uris(uris, &HTTP))
+ return 0;
+ if (try_uris(uris, &RSYNC))
+ return 0;
+
+ } else if (config_get_http_priority() < config_get_rsync_priority()) {
+ if (try_uris(uris, &RSYNC))
+ return 0;
+ if (try_uris(uris, &HTTP))
+ return 0;
+
+ } else {
+ if (try_uris(uris, NULL))
+ return 0;
+ }
+
return pr_val_err("The RPP could not be downloaded.");
}
}
static int
-foreach_uri(struct tal *tal, foreach_uri_cb cb, void *arg)
+foreach(enum uri_type const *filter, struct tal *tal,
+ foreach_uri_cb cb, void *arg)
{
+ struct rpki_uri *uri;
unsigned int i;
int error;
for (i = 0; i < tal->uris.count; i++) {
- error = cb(tal, tal->uris.array[i], arg);
- if (error)
- return error;
+ uri = tal->uris.array[i];
+ if (filter == NULL || (*filter) == uri_get_type(uri)) {
+ error = cb(tal, uri, arg);
+ if (error)
+ return error;
+ }
}
return 0;
}
+static int
+foreach_uri(struct tal *tal, foreach_uri_cb cb, void *arg)
+{
+ static const enum uri_type HTTP = UT_HTTPS;
+ static const enum uri_type RSYNC = UT_RSYNC;
+ int error;
+
+ if (config_get_http_priority() > config_get_rsync_priority()) {
+ error = foreach(&HTTP, tal, cb, arg);
+ if (!error)
+ error = foreach(&RSYNC, tal, cb, arg);
+
+ } else if (config_get_http_priority() < config_get_rsync_priority()) {
+ error = foreach(&RSYNC, tal, cb, arg);
+ if (!error)
+ error = foreach(&HTTP, tal, cb, arg);
+
+ } else {
+ error = foreach(NULL, tal, cb, arg);
+
+ }
+
+ return error;
+}
+
char const *
tal_get_file_name(struct tal *tal)
{