fort_SOURCES = main.c
-fort_SOURCES += address.h address.c
fort_SOURCES += algorithm.h algorithm.c
fort_SOURCES += certificate_refs.h certificate_refs.c
fort_SOURCES += cert_stack.h cert_stack.c
fort_SOURCES += reqs_errors.h reqs_errors.c
fort_SOURCES += resource.h resource.c
fort_SOURCES += rpp.h rpp.c
-fort_SOURCES += serial.h serial.c
fort_SOURCES += sorted_array.h sorted_array.c
fort_SOURCES += state.h state.c
fort_SOURCES += str_token.h str_token.c
fort_SOURCES += thread_var.h thread_var.c
-fort_SOURCES += uri.h uri.c
fort_SOURCES += json_handler.h json_handler.c
fort_SOURCES += validation_handler.h validation_handler.c
fort_SOURCES += validation_run.h validation_run.c
fort_SOURCES += asn1/oid.h asn1/oid.c
fort_SOURCES += asn1/signed_data.h asn1/signed_data.c
+fort_SOURCES += types/address.h types/address.c
+fort_SOURCES += types/delta.c types/delta.h
+fort_SOURCES += types/router_key.c types/router_key.h
+fort_SOURCES += types/serial.h types/serial.c
+fort_SOURCES += types/uri.h types/uri.c
+fort_SOURCES += types/vrp.c types/vrp.h
+
fort_SOURCES += config/boolean.c config/boolean.h
fort_SOURCES += config/filename_format.h config/filename_format.c
fort_SOURCES += config/log_conf.h config/log_conf.c
fort_SOURCES += object/manifest.h object/manifest.c
fort_SOURCES += object/name.h object/name.c
fort_SOURCES += object/roa.h object/roa.c
-fort_SOURCES += object/router_key.c object/router_key.h
fort_SOURCES += object/signed_object.h object/signed_object.c
fort_SOURCES += object/tal.h object/tal.c
fort_SOURCES += object/vcard.h object/vcard.c
fort_SOURCES += rtr/db/db_table.c rtr/db/db_table.h
fort_SOURCES += rtr/db/delta.c rtr/db/delta.h
fort_SOURCES += rtr/db/deltas_array.c rtr/db/deltas_array.h
-fort_SOURCES += rtr/db/roa.c rtr/db/roa.h
-fort_SOURCES += rtr/db/vrp.c rtr/db/vrp.h
+fort_SOURCES += rtr/db/roa.h
fort_SOURCES += rtr/db/vrps.c rtr/db/vrps.h
fort_SOURCES += slurm/db_slurm.c slurm/db_slurm.h
/* Some wrappers for asn1/asn1c/ContentInfo.h. */
-#include "uri.h"
+#include "types/uri.h"
#include "asn1/asn1c/ContentInfo.h"
int content_info_load(struct rpki_uri *, struct ContentInfo **);
#include <openssl/x509.h>
#include <stdbool.h>
#include "resource.h"
-#include "uri.h"
#include "object/certificate.h"
#include "object/name.h"
+#include "types/uri.h"
/*
* One certificate stack is allocated per validation cycle, and it is used
#include <stdbool.h>
#include <stddef.h>
-#include "uri.h"
+#include "types/uri.h"
#include "asn1/asn1c/BIT_STRING.h"
int hash_validate_mft_file(char const *, struct rpki_uri *uri,
#include <stdbool.h>
#include <stddef.h>
-#include "uri.h"
+#include "types/uri.h"
/* Init on the main process */
int http_init(void);
#include "certificate_refs.h"
#include "resource.h"
#include "rpp.h"
-#include "uri.h"
+#include "types/uri.h"
#include "asn1/asn1c/ANY.h"
#include "asn1/asn1c/SignatureValue.h"
#define SRC_OBJECT_CRL_H_
#include <openssl/x509.h>
-#include "uri.h"
+#include "types/uri.h"
int crl_load(struct rpki_uri *uri, X509_CRL **);
#ifndef SRC_OBJECT_GHOSTBUSTERS_H_
#define SRC_OBJECT_GHOSTBUSTERS_H_
-#include "uri.h"
#include "rpp.h"
+#include "types/uri.h"
int ghostbusters_traverse(struct rpki_uri *, struct rpp *);
#define SRC_OBJECT_MANIFEST_H_
#include <stdbool.h>
-#include "uri.h"
#include "rpp.h"
int handle_manifest(struct rpki_uri *, bool, struct rpp **);
#ifndef SRC_OBJECT_ROA_H_
#define SRC_OBJECT_ROA_H_
-#include "address.h"
#include "rpp.h"
-#include "uri.h"
+#include "types/address.h"
+#include "types/uri.h"
int roa_traverse(struct rpki_uri *, struct rpp *);
/* This is RFC 8630. */
#include <stddef.h>
-#include "uri.h"
+#include "types/uri.h"
#include "rtr/db/db_table.h"
#include "thread/thread_pool.h"
#include "file.h"
#include "log.h"
#include "crypto/base64.h"
-#include "rtr/db/vrp.h"
+#include "types/vrp.h"
static char addr_buf[INET6_ADDRSTRLEN];
#include <errno.h>
#include <stdint.h> /* UINT32_MAX */
-#include "address.h"
#include "log.h"
#include "sorted_array.h"
#include "thread_var.h"
+#include "types/address.h"
#include "resource/ip4.h"
#include "resource/ip6.h"
#include <sys/socket.h>
#define SRC_RESOURCE_H_
#include <stdbool.h>
-#include "address.h"
#include "resource/asn.h"
+#include "types/address.h"
#include "asn1/asn1c/ASIdentifiers.h"
#include "asn1/asn1c/IPAddressFamily.h"
#define SRC_RESOURCE_IP4_H_
#include <stdbool.h>
-#include "address.h"
+#include "types/address.h"
struct resources_ipv4;
#define SRC_RESOURCE_IP6_H_
#include <stdbool.h>
-#include "address.h"
+#include "types/address.h"
struct resources_ipv6;
#include "cert_stack.h"
#include "log.h"
#include "thread_var.h"
-#include "uri.h"
+#include "types/uri.h"
#include "data_structure/array_list.h"
#include "object/certificate.h"
#include "object/crl.h"
#ifndef SRC_RPP_H_
#define SRC_RPP_H_
-#include "uri.h"
+#include "types/uri.h"
struct rpp;
#define SRC_RRDP_RRDP_LOADER_H_
#include <stdbool.h>
-#include "uri.h"
+#include "types/uri.h"
int rrdp_load(struct rpki_uri *, bool *);
int rrdp_reload_snapshot(struct rpki_uri *);
#define SRC_RRDP_RRDP_PARSER_H_
#include <stdbool.h>
+#include "types/uri.h"
#include "rrdp/rrdp_objects.h"
-#include "uri.h"
#include "visited_uris.h"
int rrdp_parse_notification(struct rpki_uri *, bool, bool,
#define SRC_RSYNC_RSYNC_H_
#include <stdbool.h>
-#include "uri.h"
+#include "types/uri.h"
struct uri_list;
#include <sys/types.h> /* AF_INET, AF_INET6 (needed in OpenBSD) */
#include <sys/socket.h> /* AF_INET, AF_INET6 (needed in OpenBSD) */
+
+#include "log.h"
#include "data_structure/uthash_nonfatal.h"
struct hashable_roa {
return error;
}
-static int
-add_roa_delta(struct deltas *deltas, struct hashable_roa *roa, int op)
-{
- union {
- struct v4_address v4;
- struct v6_address v6;
- } addr;
-
- switch (roa->data.addr_fam) {
- case AF_INET:
- addr.v4.prefix.addr = roa->data.prefix.v4;
- addr.v4.prefix.len = roa->data.prefix_length;
- addr.v4.max_length = roa->data.max_prefix_length;
- return deltas_add_roa_v4(deltas, roa->data.asn, &addr.v4, op);
- case AF_INET6:
- addr.v6.prefix.addr = roa->data.prefix.v6;
- addr.v6.prefix.len = roa->data.prefix_length;
- addr.v6.max_length = roa->data.max_prefix_length;
- return deltas_add_roa_v6(deltas, roa->data.asn, &addr.v6, op);
- }
-
- pr_crit("Unknown address family: %d", roa->data.addr_fam);
-}
-
/*
* Copies `@roas1 - roas2` into @deltas.
*
for (n1 = roas1; n1 != NULL; n1 = n1->hh.next) {
HASH_FIND(hh, roas2, &n1->data, sizeof(n1->data), n2);
if (n2 == NULL) {
- error = add_roa_delta(deltas, n1, op);
+ error = deltas_add_roa(deltas, &n1->data, op);
if (error)
return error;
}
#ifndef SRC_RTR_DB_DB_TABLE_H_
#define SRC_RTR_DB_DB_TABLE_H_
+#include "types/address.h"
+#include "types/vrp.h"
#include "rtr/db/delta.h"
-#include "rtr/db/vrp.h"
struct db_table;
#include <stdatomic.h>
#include <sys/types.h> /* AF_INET, AF_INET6 (needed in OpenBSD) */
#include <sys/socket.h> /* AF_INET, AF_INET6 (needed in OpenBSD) */
+#include "types/address.h"
#include "data_structure/array_list.h"
struct delta_v4 {
}
}
-int
-deltas_add_roa_v4(struct deltas *deltas, uint32_t as,
- struct v4_address const *addr, int op)
+static struct deltas_v4 *
+get_deltas_array4(struct deltas *deltas, int op)
{
- struct delta_v4 delta = {
- .as = as,
- .prefix = addr->prefix,
- .max_length = addr->max_length,
- };
-
switch (op) {
case FLAG_ANNOUNCEMENT:
- return deltas_v4_add(&deltas->v4.adds, &delta);
+ return &deltas->v4.adds;
case FLAG_WITHDRAWAL:
- return deltas_v4_add(&deltas->v4.removes, &delta);
+ return &deltas->v4.removes;
}
pr_crit("Unknown delta operation: %d", op);
}
-int
-deltas_add_roa_v6(struct deltas *deltas, uint32_t as,
- struct v6_address const *addr, int op)
+static struct deltas_v6 *
+get_deltas_array6(struct deltas *deltas, int op)
{
- struct delta_v6 delta = {
- .as = as,
- .prefix = addr->prefix,
- .max_length = addr->max_length,
- };
-
switch (op) {
case FLAG_ANNOUNCEMENT:
- return deltas_v6_add(&deltas->v6.adds, &delta);
+ return &deltas->v6.adds;
case FLAG_WITHDRAWAL:
- return deltas_v6_add(&deltas->v6.removes, &delta);
+ return &deltas->v6.removes;
}
pr_crit("Unknown delta operation: %d", op);
}
+int
+deltas_add_roa(struct deltas *deltas, struct vrp const *vrp, int op)
+{
+ union {
+ struct delta_v4 v4;
+ struct delta_v6 v6;
+ } delta;
+
+ switch (vrp->addr_fam) {
+ case AF_INET:
+ delta.v4.as = vrp->asn;
+ delta.v4.prefix.addr = vrp->prefix.v4;
+ delta.v4.prefix.len = vrp->prefix_length;
+ delta.v4.max_length = vrp->max_prefix_length;
+ return deltas_v4_add(get_deltas_array4(deltas, op), &delta.v4);
+ case AF_INET6:
+ delta.v6.as = vrp->asn;
+ delta.v6.prefix.addr = vrp->prefix.v6;
+ delta.v6.prefix.len = vrp->prefix_length;
+ delta.v6.max_length = vrp->max_prefix_length;
+ return deltas_v6_add(get_deltas_array6(deltas, op), &delta.v6);
+ }
+
+ pr_crit("Unknown protocol: %d", vrp->addr_fam);
+}
+
int
deltas_add_router_key(struct deltas *deltas, struct router_key const *key,
int op)
#ifndef SRC_DELTA_H_
#define SRC_DELTA_H_
-#include "object/router_key.h"
-#include "rtr/db/roa.h"
-#include "rtr/db/vrp.h"
+#include "types/delta.h"
struct deltas;
void deltas_refget(struct deltas *);
void deltas_refput(struct deltas *);
-int deltas_add_roa_v4(struct deltas *, uint32_t, struct v4_address const *, int);
-int deltas_add_roa_v6(struct deltas *, uint32_t, struct v6_address const *, int);
+int deltas_add_roa(struct deltas *, struct vrp const *, int);
int deltas_add_router_key(struct deltas *, struct router_key const *, int);
bool deltas_is_empty(struct deltas *);
#include "rtr/db/deltas_array.h"
+#include <limits.h>
+#include <errno.h>
+#include "config.h"
+
struct deltas_array {
struct deltas **array; /* It's a circular array. */
unsigned int len; /* Occupied slots. */
#ifndef SRC_RTR_DB_DELTAS_ARRAY_H_
#define SRC_RTR_DB_DELTAS_ARRAY_H_
-#include "serial.h"
+#include "types/serial.h"
#include "rtr/db/delta.h"
struct deltas_array;
+++ /dev/null
-#include "rtr/db/roa.h"
-
-DEFINE_ARRAY_LIST_FUNCTIONS(v4_addresses, struct v4_address, static)
-DEFINE_ARRAY_LIST_FUNCTIONS(v6_addresses, struct v6_address, static)
-
-int
-roa_create(uint32_t as, struct roa **_result)
-{
- struct roa *result;
-
- result = malloc(sizeof(struct roa));
- if (result == NULL)
- return pr_enomem();
-
- result->as = as;
- v4_addresses_init(&result->addrs4);
- v6_addresses_init(&result->addrs6);
-
- *_result = result;
- return 0;
-}
-
-void
-roa_destroy(struct roa *roa)
-{
- v4_addresses_cleanup(&roa->addrs4, NULL);
- v6_addresses_cleanup(&roa->addrs6, NULL);
-}
-
-int
-roa_add_v4(struct roa *roa, uint32_t as, struct ipv4_prefix const *prefix,
- uint8_t max_length)
-{
- struct v4_address addr;
-
- if (roa->as != as) {
- return pr_val_err("ROA has more than one ASN. (%u and %u)",
- roa->as, as);
- }
-
- addr.prefix = *prefix;
- addr.max_length = max_length;
- return v4_addresses_add(&roa->addrs4, &addr);
-}
-
-int
-roa_add_v6(struct roa *roa, uint32_t as, struct ipv6_prefix const *prefix,
- uint8_t max_length)
-{
- struct v6_address addr;
-
- if (roa->as != as) {
- return pr_val_err("ROA has more than one ASN. (%u and %u)",
- roa->as, as);
- }
-
- addr.prefix = *prefix;
- addr.max_length = max_length;
- return v6_addresses_add(&roa->addrs6, &addr);
-}
+++ /dev/null
-#ifndef SRC_RTR_DB_ROA_H_
-#define SRC_RTR_DB_ROA_H_
-
-#include "address.h"
-#include "data_structure/array_list.h"
-
-struct v4_address {
- struct ipv4_prefix prefix;
- uint8_t max_length;
-};
-
-struct v6_address {
- struct ipv6_prefix prefix;
- uint8_t max_length;
-};
-
-DEFINE_ARRAY_LIST_STRUCT(v4_addresses, struct v4_address);
-DEFINE_ARRAY_LIST_STRUCT(v6_addresses, struct v6_address);
-
-struct roa {
- uint32_t as;
- struct v4_addresses addrs4;
- struct v6_addresses addrs6;
-};
-
-int roa_create(uint32_t, struct roa **);
-void roa_destroy(struct roa *);
-
-int roa_add_v4(struct roa *, uint32_t, struct ipv4_prefix const *, uint8_t);
-int roa_add_v6(struct roa *, uint32_t, struct ipv6_prefix const *, uint8_t);
-
-#endif /* SRC_RTR_DB_ROA_H_ */
+++ /dev/null
-#ifndef SRC_RTR_DB_VRP_H_
-#define SRC_RTR_DB_VRP_H_
-
-#include <netinet/in.h>
-#include "address.h"
-#include "object/router_key.h"
-
-#define FLAG_WITHDRAWAL 0
-#define FLAG_ANNOUNCEMENT 1
-
-#define VRP_ASN_EQ(a, b) \
- (a)->asn == (b)->asn
-
-#define VRP_MAX_PREFIX_LEN_EQ(a, b) \
- (a)->max_prefix_length == (b)->max_prefix_length
-
-#define SAME_ADDR_FAM(a, b, fam) \
- (a)->addr_fam == fam && \
- (b)->addr_fam == fam
-
-#define VRP_PREFIX_V4_EQ(a, b) \
- (SAME_ADDR_FAM(a, b, AF_INET) && \
- (a)->prefix.v4.s_addr == (b)->prefix.v4.s_addr && \
- (a)->prefix_length == (b)->prefix_length)
-
-#define VRP_PREFIX_V4_COV(a, b) \
- (SAME_ADDR_FAM(a, b, AF_INET) && \
- ipv4_covered(&(a)->prefix.v4, (a)->prefix_length, \
- &(b)->prefix.v4) && \
- (a)->prefix_length <= (b)->prefix_length)
-
-#define VRP_PREFIX_V6_EQ(a, b) \
- (SAME_ADDR_FAM(a, b, AF_INET6) && \
- IN6_ARE_ADDR_EQUAL(&(a)->prefix.v6, &(b)->prefix.v6) && \
- (a)->prefix_length == (b)->prefix_length)
-
-#define VRP_PREFIX_V6_COV(a, b) \
- (SAME_ADDR_FAM(a, b, AF_INET6) && \
- ipv6_covered(&(a)->prefix.v6, (a)->prefix_length, \
- &(b)->prefix.v6) && \
- (a)->prefix_length <= (b)->prefix_length)
-
-#define VRP_PREFIX_EQ(a, b) \
- (VRP_PREFIX_V4_EQ(a, b) || VRP_PREFIX_V6_EQ(a, b))
-
-/* Checks if 'a' equals or covers 'b' */
-#define VRP_PREFIX_COV(a, b) \
- (VRP_PREFIX_V4_COV(a, b) || VRP_PREFIX_V6_COV(a, b))
-
-#define VRP_EQ(a, b) \
- (VRP_ASN_EQ(a, b) && VRP_PREFIX_EQ(a, b) && VRP_MAX_PREFIX_LEN_EQ(a, b))
-
-/*
- * A ROA.
- *
- * I think it's called "VRP" ("Validated ROA Payload") because it was originally
- * meant to represent an already validated ROA, and used exclusively by the RTR
- * code. But it doesn't matter anymore.
- */
-struct vrp {
- uint32_t asn;
- union {
- struct in_addr v4;
- struct in6_addr v6;
- } prefix;
- uint8_t prefix_length;
- uint8_t max_prefix_length;
- uint8_t addr_fam;
-};
-
-struct delta_vrp {
- struct vrp vrp;
- uint8_t flags;
-};
-
-struct delta_router_key {
- struct router_key router_key;
- uint8_t flags;
-};
-
-typedef int (*vrp_foreach_cb)(struct vrp const *, void *);
-typedef int (*router_key_foreach_cb)(struct router_key const *, void *);
-
-typedef int (*delta_vrp_foreach_cb)(struct delta_vrp const *, void *);
-typedef int (*delta_router_key_foreach_cb)(struct delta_router_key const *,
- void *);
-
-int vrp_print(struct vrp const *, void *);
-int delta_vrp_print(struct delta_vrp const *, void *);
-int router_key_print(struct router_key const *, void *);
-int delta_rk_print(struct delta_router_key const *, void *);
-
-#endif /* SRC_RTR_DB_VRP_H_ */
#include "common.h"
#include "output_printer.h"
#include "validation_handler.h"
+#include "types/router_key.h"
#include "data_structure/array_list.h"
-#include "object/router_key.h"
#include "object/tal.h"
#include "rtr/rtr.h"
#include "rtr/db/db_table.h"
filtered_vrps = &lists->prefixes;
SLIST_FOREACH(ptr, filtered_vrps, next)
- if (VRP_EQ(&delta->vrp, &ptr->delta.vrp) &&
+ if (vrp_equals(&delta->vrp, &ptr->delta.vrp) &&
delta->flags != ptr->delta.flags) {
SLIST_REMOVE(filtered_vrps, ptr, vrp_node, next);
free(ptr);
*/
#include <stdbool.h>
-
+#include "types/address.h"
#include "rtr/db/deltas_array.h"
int vrps_init(void);
#include <string.h>
#include <syslog.h>
-#include "address.h"
#include "common.h"
#include "log.h"
+#include "types/address.h"
#include "rtr/err_pdu.h"
#include "rtr/pdu_handler.h"
#include <netinet/in.h>
#include "common.h"
-#include "object/router_key.h"
+#include "types/router_key.h"
#include "rtr/primitive_reader.h"
#include "rtr/rtr.h"
#define SRC_RTR_PDU_SENDER_H_
#include "pdu.h"
-#include "object/router_key.h"
+#include "types/router_key.h"
#include "rtr/db/vrps.h"
int send_serial_notify_pdu(int, uint8_t, serial_t);
#include <sys/types.h>
#include <sys/socket.h>
-#include "address.h"
#include "config.h"
+#include "types/address.h"
#include "data_structure/array_list.h"
#include "rtr/pdu.h"
#include "thread/thread_pool.h"
#include "common.h"
#include "crypto/base64.h"
#include "data_structure/array_list.h"
-#include "object/router_key.h"
+#include "types/router_key.h"
struct slurm_prefix_wrap {
struct slurm_prefix element;
/* The filter has ASN and prefix */
if ((filter->data_flag & ~SLURM_COM_FLAG_COMMENT) ==
(SLURM_COM_FLAG_ASN | SLURM_PFX_FLAG_PREFIX))
- return VRP_ASN_EQ(filter_vrp, prefix_vrp) &&
- VRP_PREFIX_COV(filter_vrp, prefix_vrp);
+ return (filter_vrp->asn == prefix_vrp->asn) &&
+ vrp_prefix_cov(filter_vrp, prefix_vrp);
/* Both have ASN */
if ((filter->data_flag & SLURM_COM_FLAG_ASN) > 0 &&
(prefix->data_flag & SLURM_COM_FLAG_ASN) > 0)
- return VRP_ASN_EQ(filter_vrp, prefix_vrp);
+ return filter_vrp->asn == prefix_vrp->asn;
/* Both have a prefix of the same type */
if ((filter->data_flag & SLURM_PFX_FLAG_PREFIX) > 0 &&
(prefix->data_flag & SLURM_PFX_FLAG_PREFIX) > 0)
- return VRP_PREFIX_COV(filter_vrp, prefix_vrp);
+ return vrp_prefix_cov(filter_vrp, prefix_vrp);
return false;
}
/* It has the same data, compare it */
equal = true;
if (equal && (filter->data_flag & SLURM_COM_FLAG_ASN) > 0)
- equal = VRP_ASN_EQ(filter_vrp, prefix_vrp);
+ equal = filter_vrp->asn == prefix_vrp->asn;
if (equal && (filter->data_flag & SLURM_PFX_FLAG_PREFIX) > 0)
- equal = VRP_PREFIX_COV(filter_vrp, prefix_vrp);
+ equal = vrp_prefix_cov(filter_vrp, prefix_vrp);
return equal;
}
return (left->data_flag & SLURM_PFX_FLAG_PREFIX) > 0 &&
(right->data_flag & SLURM_PFX_FLAG_PREFIX) > 0 &&
- VRP_PREFIX_COV(left_vrp, right_vrp);
+ vrp_prefix_cov(left_vrp, right_vrp);
}
/*
#include <stdbool.h>
#include <sys/queue.h>
#include <openssl/evp.h>
-
-#include "rtr/db/vrp.h"
+#include "types/vrp.h"
+#include "types/router_key.h"
/* Flags to get data from structs */
#define SLURM_COM_FLAG_NONE 0x00
#include "crypto/base64.h"
#include "algorithm.h"
#include "log.h"
-#include "address.h"
#include "json_parser.h"
-#include "object/router_key.h"
+#include "types/address.h"
+#include "types/router_key.h"
#include "slurm/db_slurm.h"
/* JSON members */
-#include "address.h"
+#include "types/address.h"
#include <stdlib.h> /* strtoul() */
#include <string.h> /* memset(), memcpy() */
* Same as u32_suffix_mask(), except the result is in network byte order
* ("be", for "big endian").
*/
-uint32_t
+static uint32_t
be32_suffix_mask(unsigned int prefix_len)
{
return htonl(u32_suffix_mask(prefix_len));
bool
prefix4_equals(struct ipv4_prefix const *a, struct ipv4_prefix const *b)
{
- return (a->addr.s_addr == b->addr.s_addr) && (a->len == b->len);
+ return (a->len == b->len) && (a->addr.s_addr == b->addr.s_addr);
}
bool
prefix6_equals(struct ipv6_prefix const *a, struct ipv6_prefix const *b)
{
- unsigned int i;
-
- /*
- * Not sure if I can use a memcmp() instead.
- * I feel like in6_addr's union could cause padding in weird
- * implementations.
- */
- for (i = 0; i < 16; i++)
- if (a->addr.s6_addr[i] != b->addr.s6_addr[i])
- return false;
-
- return a->len == b->len;
+ return (a->len == b->len) && IN6_ARE_ADDR_EQUAL(&a->addr, &b->addr);
}
/**
* Check if @son_addr is covered by @f_addr prefix of @f_len length
*/
bool
-ipv4_covered(struct in_addr *f_addr, uint8_t f_len, struct in_addr *son_addr)
+ipv4_covered(struct in_addr const *f_addr, uint8_t f_len,
+ struct in_addr const *son_addr)
{
return (son_addr->s_addr & ~be32_suffix_mask(f_len)) == f_addr->s_addr;
}
* Check if @son_addr is covered by @f_addr prefix of @f_len length
*/
bool
-ipv6_covered(struct in6_addr *f_addr, uint8_t f_len, struct in6_addr *son_addr)
+ipv6_covered(struct in6_addr const *f_addr, uint8_t f_len,
+ struct in6_addr const *son_addr)
{
struct in6_addr suffix;
unsigned int i;
-#ifndef SRC_ADDRESS_H_
-#define SRC_ADDRESS_H_
+#ifndef SRC_TYPES_ADDRESS_H_
+#define SRC_TYPES_ADDRESS_H_
#include <stdbool.h>
#include <netinet/in.h>
void in6_addr_init(struct in6_addr *, uint32_t, uint32_t, uint32_t, uint32_t);
uint32_t u32_suffix_mask(unsigned int);
-uint32_t be32_suffix_mask(unsigned int);
void ipv6_suffix_mask(unsigned int, struct in6_addr *);
bool prefix4_equals(struct ipv4_prefix const *, struct ipv4_prefix const *);
int ipv4_prefix_validate(struct ipv4_prefix *);
int ipv6_prefix_validate(struct ipv6_prefix *);
-bool ipv4_covered(struct in_addr *, uint8_t, struct in_addr *);
-bool ipv6_covered(struct in6_addr *, uint8_t, struct in6_addr *);
+bool ipv4_covered(struct in_addr const *, uint8_t, struct in_addr const *);
+bool ipv6_covered(struct in6_addr const *, uint8_t, struct in6_addr const *);
char const *addr2str4(struct in_addr const *, char *);
char const *addr2str6(struct in6_addr const *, char *);
void sockaddr2str(struct sockaddr_storage *, char *buffer);
-#endif /* SRC_ADDRESS_H_ */
+#endif /* SRC_TYPES_ADDRESS_H_ */
-#include "rtr/db/vrp.h"
+#include "types/delta.h"
-#include <arpa/inet.h>
+#include <stdio.h>
static void
print_flag(uint8_t flag)
}
}
-int
-vrp_print(struct vrp const *roa, void *arg)
-{
- char buffer[INET6_ADDRSTRLEN];
- printf("- [ROA ASN:%u Prefix:%s/(%u-%u)]\n", roa->asn,
- inet_ntop(roa->addr_fam, &roa->prefix, buffer, INET6_ADDRSTRLEN),
- roa->prefix_length, roa->max_prefix_length);
- return 0;
-}
-
int
delta_vrp_print(struct delta_vrp const *delta, void *arg)
{
return vrp_print(&delta->vrp, arg);
}
-int
-router_key_print(struct router_key const *rk, void *arg)
-{
- printf("- [RK ASN:%u]\n", rk->as);
- return 0;
-}
-
int
delta_rk_print(struct delta_router_key const *delta, void *arg)
{
--- /dev/null
+#ifndef SRC_TYPES_DELTA_H_
+#define SRC_TYPES_DELTA_H_
+
+#include "types/router_key.h"
+#include "types/vrp.h"
+
+#define FLAG_WITHDRAWAL 0
+#define FLAG_ANNOUNCEMENT 1
+
+struct delta_vrp {
+ struct vrp vrp;
+ uint8_t flags;
+};
+
+struct delta_router_key {
+ struct router_key router_key;
+ uint8_t flags;
+};
+
+typedef int (*delta_vrp_foreach_cb)(struct delta_vrp const *, void *);
+typedef int (*delta_router_key_foreach_cb)(struct delta_router_key const *,
+ void *);
+
+int delta_vrp_print(struct delta_vrp const *, void *);
+int delta_rk_print(struct delta_router_key const *, void *);
+
+#endif /* SRC_TYPES_DELTA_H_ */
-#include "object/router_key.h"
+#include "types/router_key.h"
+#include <stdio.h>
#include <string.h>
void
memcpy(key->spk, spk, RK_SPKI_LEN);
key->as = as;
}
+
+int
+router_key_print(struct router_key const *rk, void *arg)
+{
+ printf("- [RK ASN:%u]\n", rk->as);
+ return 0;
+}
-#ifndef SRC_OBJECT_ROUTER_KEY_H_
-#define SRC_OBJECT_ROUTER_KEY_H_
+#ifndef SRC_TYPES_ROUTER_KEY_H_
+#define SRC_TYPES_ROUTER_KEY_H_
#include <stdint.h>
#include <stdlib.h>
unsigned char spk[RK_SPKI_LEN];
};
+typedef int (*router_key_foreach_cb)(struct router_key const *, void *);
+
void router_key_init(struct router_key *, unsigned char const *, uint32_t,
unsigned char const *);
+int router_key_print(struct router_key const *, void *);
-#endif /* SRC_OBJECT_ROUTER_KEY_H_ */
+#endif /* SRC_TYPES_ROUTER_KEY_H_ */
-#include "serial.h"
+#include "types/serial.h"
/*
* Returns s1 < s2 , according to RFC 1982 serial arithmetic.
-#ifndef SRC_SERIAL_H_
-#define SRC_SERIAL_H_
+#ifndef SRC_TYPES_SERIAL_H_
+#define SRC_TYPES_SERIAL_H_
#include <stdbool.h>
#include <stdint.h>
bool serial_lt(serial_t s1, serial_t s2);
-#endif /* SRC_SERIAL_H_ */
+#endif /* SRC_TYPES_SERIAL_H_ */
-#include "uri.h"
+#include "types/uri.h"
#include <errno.h>
#include <strings.h>
format = config_get_op_log_filename_format();
return uri_get_printable(uri, format);
}
-
-#ifndef SRC_URI_H_
-#define SRC_URI_H_
+#ifndef SRC_TYPES_URI_H_
+#define SRC_TYPES_URI_H_
#include <stdbool.h>
#include <openssl/x509v3.h>
char const *uri_val_get_printable(struct rpki_uri *);
char const *uri_op_get_printable(struct rpki_uri *);
-#endif /* SRC_URI_H_ */
+#endif /* SRC_TYPES_URI_H_ */
--- /dev/null
+#include "types/vrp.h"
+
+#include <arpa/inet.h>
+#include "log.h"
+#include "types/address.h"
+
+bool
+vrp_equals(struct vrp const *a, struct vrp const *b)
+{
+ if ((a->addr_fam != b->addr_fam) ||
+ (a->asn != b->asn) ||
+ (a->prefix_length != b->prefix_length) ||
+ (a->max_prefix_length != b->max_prefix_length))
+ return false;
+
+ switch (a->addr_fam) {
+ case AF_INET:
+ return a->prefix.v4.s_addr == b->prefix.v4.s_addr;
+ case AF_INET6:
+ return IN6_ARE_ADDR_EQUAL(&a->prefix.v6, &b->prefix.v6);
+ }
+
+ pr_crit("Unknown address family: %u", a->addr_fam);
+}
+
+/* Checks if a's prefix equals or covers b's prefix */
+bool
+vrp_prefix_cov(struct vrp const *a, struct vrp const *b)
+{
+ if (a->addr_fam != b->addr_fam)
+ return false;
+
+ switch (a->addr_fam) {
+ case AF_INET:
+ return ipv4_covered(&a->prefix.v4, a->prefix_length, &b->prefix.v4)
+ && (a->prefix_length <= b->prefix_length);
+ case AF_INET6:
+ return ipv6_covered(&a->prefix.v6, a->prefix_length, &b->prefix.v6)
+ && (a->prefix_length <= b->prefix_length);
+ }
+
+ pr_crit("Unknown address family: %u", a->addr_fam);
+}
+
+int
+vrp_print(struct vrp const *roa, void *arg)
+{
+ char buffer[INET6_ADDRSTRLEN];
+ printf("- [ROA ASN:%u Prefix:%s/(%u-%u)]\n", roa->asn,
+ inet_ntop(roa->addr_fam, &roa->prefix, buffer, INET6_ADDRSTRLEN),
+ roa->prefix_length, roa->max_prefix_length);
+ return 0;
+}
--- /dev/null
+#ifndef SRC_TYPES_VRP_H_
+#define SRC_TYPES_VRP_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <netinet/in.h>
+
+/*
+ * A ROA.
+ *
+ * I think it's called "VRP" ("Validated ROA Payload") because it was originally
+ * meant to represent an already validated ROA, and used exclusively by the RTR
+ * code. But it doesn't matter anymore.
+ */
+struct vrp {
+ uint32_t asn;
+ union {
+ struct in_addr v4;
+ struct in6_addr v6;
+ } prefix;
+ uint8_t prefix_length;
+ uint8_t max_prefix_length;
+ uint8_t addr_fam;
+};
+
+typedef int (*vrp_foreach_cb)(struct vrp const *, void *);
+
+bool vrp_equals(struct vrp const *, struct vrp const *);
+bool vrp_prefix_cov(struct vrp const *, struct vrp const *);
+int vrp_print(struct vrp const *, void *);
+
+#endif /* SRC_TYPES_VRP_H_ */
#ifndef SRC_VALIDATION_HANDLER_H_
#define SRC_VALIDATION_HANDLER_H_
-#include "address.h"
+#include "types/address.h"
+#include "types/router_key.h"
#include "object/name.h"
-#include "object/router_key.h"
/**
* Functions that handle validation results.
check_PROGRAMS += rtr/primitive_reader.test
TESTS = ${check_PROGRAMS}
-address_test_SOURCES = address_test.c
+address_test_SOURCES = types/address_test.c
address_test_LDADD = ${MY_LDADD}
deltas_array_test_SOURCES = rtr/db/deltas_array_test.c
rsync_test_SOURCES = rsync_test.c
rsync_test_LDADD = ${MY_LDADD}
-serial_test_SOURCES = serial_test.c
+serial_test_SOURCES = types/serial_test.c
serial_test_LDADD = ${MY_LDADD}
tal_test_SOURCES = tal_test.c
thread_pool_test_SOURCES = thread_pool_test.c
thread_pool_test_LDADD = ${MY_LDADD}
-uri_test_SOURCES = uri_test.c
+uri_test_SOURCES = types/uri_test.c
uri_test_LDADD = ${MY_LDADD}
vcard_test_SOURCES = vcard_test.c
#include "log.c"
#include "impersonator.c"
#include "str_token.c"
-#include "uri.c"
+#include "types/uri.c"
#include "rsync/rsync.c"
#include <check.h>
#include <stdlib.h>
-#include "address.c"
#include "common.c"
#include "log.c"
#include "impersonator.c"
-#include "object/router_key.c"
-#include "rtr/db/vrp.c"
+#include "types/address.c"
+#include "types/delta.c"
+#include "types/router_key.c"
+#include "types/vrp.c"
#include "rtr/db/delta.c"
#include "rtr/db/db_table.c"
#include "log.c"
#include "impersonator.c"
-#include "rtr/db/vrp.c"
+#include "types/address.c"
+#include "types/delta.c"
+#include "types/router_key.c"
+#include "types/vrp.c"
#include "rtr/db/delta.c"
#include "rtr/db/deltas_array.c"
#include <check.h>
#include "object/tal.h"
-#include "address.c"
+#include "types/address.c"
static unsigned char db_imp_ski[] = {
0x0e, 0xe9, 0x6a, 0x8e, 0x2f, 0xac, 0x50, 0xce, 0x6c, 0x5f,
#include "json_parser.c"
#include "log.c"
#include "output_printer.c"
-#include "serial.c"
-#include "object/router_key.c"
-#include "rtr/db/vrp.c"
+#include "types/delta.c"
+#include "types/router_key.c"
+#include "types/serial.c"
+#include "types/vrp.c"
#include "rtr/db/delta.c"
#include "rtr/db/deltas_array.c"
#include "rtr/db/db_table.c"
static int
vrp_add(struct delta_vrp const *delta, void *arg)
{
- union {
- struct v4_address v4;
- struct v6_address v6;
- } addr;
-
- switch (delta->vrp.addr_fam) {
- case AF_INET:
- addr.v4.prefix.len = delta->vrp.prefix_length;
- addr.v4.prefix.addr = delta->vrp.prefix.v4;
- addr.v4.max_length = delta->vrp.max_prefix_length;
- return deltas_add_roa_v4(arg, delta->vrp.asn, &addr.v4,
- delta->flags);
- case AF_INET6:
- addr.v6.prefix.len = delta->vrp.prefix_length;
- addr.v6.prefix.addr = delta->vrp.prefix.v6;
- addr.v6.max_length = delta->vrp.max_prefix_length;
- return deltas_add_roa_v6(arg, delta->vrp.asn, &addr.v6,
- delta->flags);
- }
-
- ck_abort_msg("Unknown family: %u", delta->vrp.addr_fam);
+ return deltas_add_roa(arg, &delta->vrp, delta->flags);
}
static int
#include "json_parser.c"
#include "log.c"
#include "output_printer.c"
-#include "serial.c"
#include "crypto/base64.c"
-#include "object/router_key.c"
+#include "types/delta.c"
+#include "types/router_key.c"
+#include "types/serial.c"
+#include "types/vrp.c"
#include "rtr/pdu.c"
#include "rtr/pdu_handler.c"
#include "rtr/primitive_reader.c"
#include "rtr/primitive_writer.c"
#include "rtr/err_pdu.c"
-#include "rtr/db/vrp.c"
#include "rtr/db/delta.c"
#include "rtr/db/deltas_array.c"
#include "rtr/db/db_table.c"
#include "log.c"
#include "state.h"
#include "str_token.c"
-#include "uri.c"
#include "random.c"
+#include "types/uri.c"
#include "crypto/base64.c"
#include "rsync/rsync.c"
#include "thread/thread_pool.c"
#include <errno.h>
#include <stdlib.h>
-#include "address.c"
#include "common.c"
#include "log.c"
#include "impersonator.c"
+#include "types/address.c"
static void
test_range4(uint32_t min, uint32_t max, bool valid)
#include <check.h>
#include <stdlib.h>
-#include "serial.c"
+#include "types/serial.c"
START_TEST(pivot_0)
{
#include <errno.h>
#include <stdint.h>
-#include "uri.c"
#include "common.c"
#include "log.c"
#include "impersonator.c"
+#include "types/uri.c"
static int
test_validate(char const *src)