summaryrefslogtreecommitdiff
path: root/src/tools/irm
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/irm')
-rw-r--r--src/tools/irm/CMakeLists.txt7
-rw-r--r--src/tools/irm/irm_ipcp_bootstrap.c345
-rw-r--r--src/tools/irm/irm_ipcp_create.c11
-rw-r--r--src/tools/irm/irm_ipcp_list.c17
-rw-r--r--src/tools/irm/irm_name_create.c113
-rw-r--r--src/tools/irm/irm_name_reg.c37
6 files changed, 381 insertions, 149 deletions
diff --git a/src/tools/irm/CMakeLists.txt b/src/tools/irm/CMakeLists.txt
index e5e5c466..7acd5396 100644
--- a/src/tools/irm/CMakeLists.txt
+++ b/src/tools/irm/CMakeLists.txt
@@ -4,7 +4,7 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${CMAKE_BINARY_DIR}/include)
-set(SOURCE_FILES
+set(TOOLS_IRM_SOURCE_FILES
# Add source files here
irm.c
irm_bind_program.c
@@ -32,8 +32,11 @@ set(SOURCE_FILES
irm_utils.c
)
-add_executable(irm ${SOURCE_FILES})
+add_executable(irm ${TOOLS_IRM_SOURCE_FILES})
target_link_libraries(irm LINK_PUBLIC ouroboros-irm)
install(TARGETS irm RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR})
+
+# enable when we have tests
+# add_subdirectory(tests)
diff --git a/src/tools/irm/irm_ipcp_bootstrap.c b/src/tools/irm/irm_ipcp_bootstrap.c
index b8e5c54d..3fabc3cc 100644
--- a/src/tools/irm/irm_ipcp_bootstrap.c
+++ b/src/tools/irm/irm_ipcp_bootstrap.c
@@ -46,90 +46,131 @@
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
+#include <netinet/in.h>
#ifdef __FreeBSD__
#include <sys/socket.h>
#endif
-#define UNICAST "unicast"
-#define BROADCAST "broadcast"
-#define UDP "udp"
-#define ETH_LLC "eth-llc"
-#define ETH_DIX "eth-dix"
-#define LOCAL "local"
-
-#define MD5 "MD5"
-#define SHA3_224 "SHA3_224"
-#define SHA3_256 "SHA3_256"
-#define SHA3_384 "SHA3_384"
-#define SHA3_512 "SHA3_512"
-
-#define DEFAULT_ADDR_SIZE 4
-#define DEFAULT_EID_SIZE 8
-#define DEFAULT_DDNS 0
-#define DEFAULT_TTL 60
-#define DEFAULT_ADDR_AUTH ADDR_AUTH_FLAT_RANDOM
-#define DEFAULT_ROUTING ROUTING_LINK_STATE
-#define DEFAULT_CONG_AVOID CA_MB_ECN
-#define DEFAULT_HASH_ALGO DIR_HASH_SHA3_256
-#define DEFAULT_ETHERTYPE 0xA000
-#define DEFAULT_UDP_PORT 0x0D6B /* 3435 */
-
-#define FLAT_RANDOM_ADDR_AUTH "flat"
-#define LINK_STATE_ROUTING "link_state"
-#define LINK_STATE_LFA_ROUTING "lfa"
-#define LINK_STATE_ECM_ROUTING "ecmp"
-#define NONE_CA "none"
-#define MB_ECN_CA "mb-ecn"
+#define UNICAST "unicast"
+#define BROADCAST "broadcast"
+#define IP_UDP4 "udp4"
+#define IP_UDP6 "udp6"
+#define ETH_LLC "eth-llc"
+#define ETH_DIX "eth-dix"
+#define LOCAL "local"
+
+#define MD5 "MD5"
+#define SHA3_224 "SHA3_224"
+#define SHA3_256 "SHA3_256"
+#define SHA3_384 "SHA3_384"
+#define SHA3_512 "SHA3_512"
+
+#define FLAT_RANDOM "flat"
+#define DHT_DIR "DHT"
+#define LINK_STATE "link_state"
+#define LINK_STATE_LFA "lfa"
+#define LINK_STATE_ECM "ecmp"
+#define NONE_CA "none"
+#define MB_ECN_CA "mb-ecn"
+
+#define DT(x) default_dt_config.x
+#define DHT(x) default_dht_config.params.x
+#define UNI(x) default_uni_config.x
+#define DIX(x) eth_dix_default_conf.eth.x
+#define LLC(x) eth_llc_default_conf.eth.x
+#define UD4(x) udp4_default_conf.udp4.x
+#define UD6(x) udp6_default_conf.udp6.x
+
+static char * usage_str = \
+ "Usage: irm ipcp bootstrap\n"
+ " name <ipcp name>\n"
+ " layer <layer name>\n"
+ " [type [TYPE]]\n"
+ "where TYPE in {" UNICAST " " BROADCAST " " LOCAL " "
+ IP_UDP4 " " IP_UDP6 " " ETH_LLC " " ETH_DIX "},\n\n"
+ "if TYPE == " UNICAST "\n"
+ " [addr_auth <ADDRESS_POLICY> (default: %s)]\n"
+ " [directory <DIRECTORY_POLICY> (default: %s)]\n"
+ " [hash [ALGORITHM] (default: %s)]\n"
+ " [routing <ROUTING_POLICY> (default: %s)]\n"
+ " [congestion <CONG_POLICY> (default: %s)]\n"
+ " [autobind]\n\n"
+ "where ADDRESS_POLICY in {" FLAT_RANDOM "}\n"
+ " DIRECTORY_POLICY in {" DHT_DIR "}\n"
+ " ALGORITHM in {" SHA3_224 " " SHA3_256 " "
+ SHA3_384 " " SHA3_512 "}\n"
+ " ROUTING_POLICY in {" LINK_STATE " "
+ LINK_STATE_LFA " " LINK_STATE_ECM "}\n"
+ " CONG_POLICY in {" NONE_CA " " MB_ECN_CA "}\n"
+ " [Data Transfer Constants]\n"
+ " [addr <address size> (default: %d)]\n"
+ " [eid <eid size> (default: %d)]\n"
+ " [ttl <max time-to-live>, default: %d)]\n\n"
+ "if DIRECTORY_POLICY == " DHT_DIR "\n"
+ " [dht_alpha <search factor> (default: %u)]\n"
+ " [dht_k <replication factor> (default: %u)]\n"
+ " [dht_t_expire <expiration (s)> (default: %u)]\n"
+ " [dht_t_refresh <contact refresh (s)> (default: %u)]\n"
+ " [dht_t_replicate <replication (s)> (default: %u)]\n\n"
+ "if ROUTING_POLICY == " LINK_STATE "\n"
+ " [ls_t_recalc <pff recalc interval (s)> (default: %ld)]\n"
+ " [ls_t_update <LSA update interval (s)> (default: %ld)]\n"
+ " [ls_t_timeo <link timeout (s)> (default: %ld)]\n\n"
+ "if TYPE == " IP_UDP4 "\n"
+ " ip <IP address in dotted notation>\n"
+ " [port <UDP port> (default: %d)]\n"
+ " [dns <DDNS IPv4 address in dotted notation>"
+ " (default: none)]\n\n"
+ "if TYPE == " IP_UDP6 "\n"
+ " ip <IPv6 address>\n"
+ " [port <UDP port> (default: %d)]\n"
+ " [dns <DDNS IPv6 address>"
+ " (default: none)]\n\n"
+
+ "if TYPE == " ETH_LLC "\n"
+ " dev <interface name>\n"
+ " [hash [ALGORITHM] (default: %s)]\n"
+ "where ALGORITHM in {" SHA3_224 " " SHA3_256 " "
+ SHA3_384 " " SHA3_512 "}\n\n"
+ "if TYPE == " ETH_DIX "\n"
+ " dev <interface name>\n"
+ " [ethertype <ethertype> (default: 0x%4X)]\n"
+ " [hash [ALGORITHM] (default: %s)]\n"
+ "where ALGORITHM in {" SHA3_224 " " SHA3_256 " "
+ SHA3_384 " " SHA3_512 "}\n\n"
+ "if TYPE == " LOCAL "\n"
+ " [hash [ALGORITHM] (default: %s)]\n"
+ "where ALGORITHM in {" SHA3_224 " " SHA3_256 " "
+ SHA3_384 " " SHA3_512 "}\n\n"
+ "if TYPE == " BROADCAST "\n"
+ " [autobind]\n\n";
static void usage(void)
{
/* FIXME: Add ipcp_config stuff. */
- printf("Usage: irm ipcp bootstrap\n"
- " name <ipcp name>\n"
- " layer <layer name>\n"
- " [type [TYPE]]\n"
- "where TYPE in {" UNICAST " " BROADCAST " " LOCAL " "
- UDP " " ETH_LLC " " ETH_DIX "},\n\n"
- "if TYPE == " UNICAST "\n"
- " [addr <address size> (default: %d)]\n"
- " [eid <eid size> (default: %d)]\n"
- " [ttl (max time-to-live value, default: %d)]\n"
- " [addr_auth <ADDRESS_POLICY> (default: %s)]\n"
- " [routing <ROUTING_POLICY> (default: %s)]\n"
- " [congestion <CONG_POLICY> (default: %s)]\n"
- " [hash [ALGORITHM] (default: %s)]\n"
- " [autobind]\n"
- "where ADDRESS_POLICY in {" FLAT_RANDOM_ADDR_AUTH "}\n"
- " ROUTING_POLICY in {" LINK_STATE_ROUTING " "
- LINK_STATE_LFA_ROUTING " " LINK_STATE_ECM_ROUTING "}\n"
- " CONG_POLICY in {" NONE_CA " " MB_ECN_CA "}\n"
- " ALGORITHM in {" SHA3_224 " " SHA3_256 " "
- SHA3_384 " " SHA3_512 "}\n\n"
- "if TYPE == " UDP "\n"
- " ip <IP address in dotted notation>\n"
- " [port <UDP port> (default: %d)]\n"
- " [dns <DDNS IP address in dotted notation>"
- " (default: none)]\n\n"
- "if TYPE == " ETH_LLC "\n"
- " dev <interface name>\n"
- " [hash [ALGORITHM] (default: %s)]\n"
- "where ALGORITHM in {" SHA3_224 " " SHA3_256 " "
- SHA3_384 " " SHA3_512 "}\n\n"
- "if TYPE == " ETH_DIX "\n"
- " dev <interface name>\n"
- " [ethertype <ethertype> (default: 0x%4X)]\n"
- " [hash [ALGORITHM] (default: %s)]\n"
- "where ALGORITHM in {" SHA3_224 " " SHA3_256 " "
- SHA3_384 " " SHA3_512 "}\n\n"
- "if TYPE == " LOCAL "\n"
- " [hash [ALGORITHM] (default: %s)]\n"
- "where ALGORITHM in {" SHA3_224 " " SHA3_256 " "
- SHA3_384 " " SHA3_512 "}\n\n"
- "if TYPE == " BROADCAST "\n"
- " [autobind]\n\n",
- DEFAULT_ADDR_SIZE, DEFAULT_EID_SIZE, DEFAULT_TTL,
- FLAT_RANDOM_ADDR_AUTH, LINK_STATE_ROUTING, MB_ECN_CA,
- SHA3_256, DEFAULT_UDP_PORT, SHA3_256, 0xA000, SHA3_256,
+ printf(usage_str,
+ /* unicast */
+ FLAT_RANDOM, DHT_DIR, SHA3_256, LINK_STATE, MB_ECN_CA,
+ /* dt */
+ DT(addr_size), DT(eid_size), DT(max_ttl),
+ /* dht */
+ DHT(alpha), DHT(k), DHT(t_expire),
+ DHT(t_refresh), DHT(t_replicate),
+ /* ls */
+ default_ls_config.t_recalc, default_ls_config.t_update,
+ default_ls_config.t_timeo,
+ /* udp4 */
+ UD4(port),
+ /* udp6 */
+ UD6(port),
+ /* eth_llc */
+ SHA3_256,
+ /* eth_dix */
+ DIX(ethertype),
+ SHA3_256,
+ /* local */
+ SHA3_256,
+ /* broadcast */
SHA3_256);
}
@@ -139,26 +180,32 @@ int do_bootstrap_ipcp(int argc,
char * ipcp = NULL;
pid_t pid = -1;
struct ipcp_config conf;
- uint8_t addr_size = DEFAULT_ADDR_SIZE;
- uint8_t eid_size = DEFAULT_EID_SIZE;
- uint8_t max_ttl = DEFAULT_TTL;
- enum pol_addr_auth addr_auth_type = DEFAULT_ADDR_AUTH;
- enum pol_routing routing_type = DEFAULT_ROUTING;
- enum pol_dir_hash hash_algo = DEFAULT_HASH_ALGO;
- enum pol_cong_avoid cong_avoid = DEFAULT_CONG_AVOID;
- uint32_t ip_addr = 0;
- uint32_t dns_addr = DEFAULT_DDNS;
+ struct dir_config dir_config = default_dir_config;
+ uint8_t addr_size = DT(addr_size);
+ uint8_t eid_size = DT(eid_size);
+ uint8_t max_ttl = DT(max_ttl);
+ struct routing_config routing = default_routing_config;
+ enum pol_addr_auth addr_auth_type = UNI(addr_auth_type);
+ enum pol_cong_avoid cong_avoid = UNI(cong_avoid);
+ enum pol_dir_hash hash_algo = DIR_HASH_SHA3_256;
+ char * ipstr = NULL;
+ char * dnsstr = NULL;
+ struct in_addr ip4_addr = {.s_addr = INADDR_ANY};
+ struct in_addr dns4_addr = UD4(dns_addr);
+ int port4 = UD4(port);
+ struct in6_addr ip6_addr = IN6ADDR_ANY_INIT;
+ struct in6_addr dns6_addr = UD6(dns_addr);
+ int port6 = UD6(port);
char * ipcp_type = NULL;
enum ipcp_type type = IPCP_INVALID;
char * layer = NULL;
char * dev = NULL;
- uint16_t ethertype = DEFAULT_ETHERTYPE;
+ uint16_t ethertype = DIX(ethertype);
struct ipcp_list_info * ipcps;
ssize_t len = 0;
int i = 0;
bool autobind = false;
int cargs;
- int port = DEFAULT_UDP_PORT;
while (argc > 0) {
cargs = 2;
@@ -180,11 +227,9 @@ int do_bootstrap_ipcp(int argc,
else
goto unknown_param;
} else if (matches(*argv, "ip") == 0) {
- if (inet_pton (AF_INET, *(argv + 1), &ip_addr) != 1)
- goto unknown_param;
+ ipstr = *(argv + 1);
} else if (matches(*argv, "dns") == 0) {
- if (inet_pton(AF_INET, *(argv + 1), &dns_addr) != 1)
- goto unknown_param;
+ dnsstr = *(argv + 1);
} else if (matches(*argv, "device") == 0) {
dev = *(argv + 1);
} else if (matches(*argv, "ethertype") == 0) {
@@ -206,26 +251,50 @@ int do_bootstrap_ipcp(int argc,
} else if (matches(*argv, "ttl") == 0) {
max_ttl = atoi(*(argv + 1));
} else if (matches(*argv, "port") == 0) {
- port = atoi(*(argv + 1));
+ port4 = atoi(*(argv + 1));
+ port6 = port4;
} else if (matches(*argv, "autobind") == 0) {
autobind = true;
cargs = 1;
} else if (matches(*argv, "addr_auth") == 0) {
- if (strcmp(FLAT_RANDOM_ADDR_AUTH, *(argv + 1)) == 0)
+ if (strcmp(FLAT_RANDOM, *(argv + 1)) == 0)
addr_auth_type = ADDR_AUTH_FLAT_RANDOM;
else
goto unknown_param;
- } else if (matches(*argv, "routing") == 0) {
- if (strcmp(LINK_STATE_ROUTING, *(argv + 1)) == 0)
- routing_type = ROUTING_LINK_STATE;
- else if (strcmp(LINK_STATE_LFA_ROUTING,
- *(argv + 1)) == 0)
- routing_type = ROUTING_LINK_STATE_LFA;
- else if (strcmp(LINK_STATE_ECM_ROUTING,
- *(argv + 1)) == 0)
- routing_type = ROUTING_LINK_STATE_ECMP;
+ } else if (matches(*argv, "directory") == 0) {
+ if (strcmp(DHT_DIR, *(argv + 1)) == 0)
+ dir_config.pol = DIR_DHT;
else
goto unknown_param;
+ } else if (matches(*argv, "dht_alpha") == 0) {
+ dir_config.dht.params.alpha = atoi(*(argv + 1));
+ } else if (matches(*argv, "dht_k") == 0) {
+ dir_config.dht.params.k = atoi(*(argv + 1));
+ } else if (matches(*argv, "dht_t_expire") == 0) {
+ dir_config.dht.params.t_expire = atoi(*(argv + 1));
+ } else if (matches(*argv, "dht_t_refresh") == 0) {
+ dir_config.dht.params.t_refresh = atoi(*(argv + 1));
+ } else if (matches(*argv, "dht_t_replicate") == 0) {
+ dir_config.dht.params.t_replicate = atoi(*(argv + 1));
+ } else if (matches(*argv, "routing") == 0) {
+ if (strcmp(LINK_STATE, *(argv + 1)) == 0) {
+ routing.pol = ROUTING_LINK_STATE;
+ routing.ls.pol = LS_SIMPLE;
+ } else if (strcmp(LINK_STATE_LFA, *(argv + 1)) == 0) {
+ routing.pol = ROUTING_LINK_STATE;
+ routing.ls.pol = LS_LFA;
+ } else if (strcmp(LINK_STATE_ECM, *(argv + 1)) == 0) {
+ routing.pol = ROUTING_LINK_STATE;
+ routing.ls.pol = LS_ECMP;
+ } else {
+ goto unknown_param;
+ }
+ } else if (matches(*argv, "ls_t_timeo") == 0) {
+ routing.ls.t_timeo = atoi(*(argv + 1));
+ } else if (matches(*argv, "ls_t_update") == 0) {
+ routing.ls.t_update = atoi(*(argv + 1));
+ } else if (matches(*argv, "ls_t_recalc") == 0) {
+ routing.ls.t_recalc = atoi(*(argv + 1));
} else if (matches(*argv, "congestion") == 0) {
if (strcmp(NONE_CA, *(argv + 1)) == 0)
cong_avoid = CA_NONE;
@@ -257,21 +326,59 @@ int do_bootstrap_ipcp(int argc,
}
if (ipcp_type != NULL) {
- if (strcmp(ipcp_type, UNICAST) == 0)
+ if (matches(ipcp_type, UNICAST) == 0)
type = IPCP_UNICAST;
- else if (strcmp(ipcp_type, BROADCAST) == 0)
+ else if (matches(ipcp_type, BROADCAST) == 0)
type = IPCP_BROADCAST;
- else if (strcmp(ipcp_type, UDP) == 0)
- type = IPCP_UDP;
- else if (strcmp(ipcp_type, ETH_LLC) == 0)
- type = IPCP_ETH_LLC;
- else if (strcmp(ipcp_type, ETH_DIX) == 0)
+ else if (matches(ipcp_type, IP_UDP4) == 0)
+ type = IPCP_UDP4;
+ else if (matches(ipcp_type, IP_UDP6) == 0)
+ type = IPCP_UDP6;
+ else if (matches(ipcp_type, ETH_DIX) == 0)
type = IPCP_ETH_DIX;
- else if (strcmp(ipcp_type, LOCAL) == 0)
+ else if (matches(ipcp_type, ETH_LLC) == 0)
+ type = IPCP_ETH_LLC;
+ else if (matches(ipcp_type, LOCAL) == 0)
type = IPCP_LOCAL;
else goto fail_usage;
}
+ if (type == IPCP_UDP4) {
+ if (inet_pton (AF_INET, ipstr, &ip4_addr) != 1) {
+ printf("Invalid IPv4 address: \"%s\".\n", ipstr);
+ goto fail_usage;
+ }
+
+ if (ip4_addr.s_addr == INADDR_ANY) {
+ printf("Cannot use IPv4 address: \"%s\".\n", ipstr);
+ goto fail_usage;
+ }
+
+ if (dnsstr != NULL &&
+ inet_pton(AF_INET, dnsstr, &dns4_addr) != 1) {
+ printf("Invalid DNS IPv4 address: \"%s\".\n", dnsstr);
+ goto fail_usage;
+ }
+ }
+
+ if (type == IPCP_UDP6) {
+ if (inet_pton(AF_INET6, ipstr, &ip6_addr) != 1) {
+ printf("Invalid IPv6 address: \"%s\".\n", ipstr);
+ goto fail_usage;
+ }
+
+ if (IN6_IS_ADDR_UNSPECIFIED(&ip6_addr)) {
+ printf("Cannot use IPv6 address: \"%s\".\n", ipstr);
+ goto fail_usage;
+ }
+
+ if (dnsstr != NULL &&
+ inet_pton(AF_INET6, dnsstr, &dns6_addr) != 1) {
+ printf("Invalid DNS IPv6 address: \"%s\".\n", dnsstr);
+ goto fail_usage;
+ }
+ }
+
if (pid == -1) {
if (ipcp_type == NULL) {
printf("No IPCPs matching %s found.\n\n", ipcp);
@@ -315,16 +422,20 @@ int do_bootstrap_ipcp(int argc,
conf.unicast.dt.addr_size = addr_size;
conf.unicast.dt.eid_size = eid_size;
conf.unicast.dt.max_ttl = max_ttl;
- conf.unicast.dt.routing_type = routing_type;
+ conf.unicast.dt.routing = routing;
conf.unicast.addr_auth_type = addr_auth_type;
conf.unicast.cong_avoid = cong_avoid;
+ conf.unicast.dir = dir_config;
break;
- case IPCP_UDP:
- if (ip_addr == 0)
- goto fail_usage;
- conf.udp.ip_addr = ip_addr;
- conf.udp.dns_addr = dns_addr;
- conf.udp.port = port;
+ case IPCP_UDP4:
+ conf.udp4.ip_addr = ip4_addr;
+ conf.udp4.dns_addr = dns4_addr;
+ conf.udp4.port = port4;
+ break;
+ case IPCP_UDP6:
+ conf.udp6.ip_addr = ip6_addr;
+ conf.udp6.dns_addr = dns6_addr;
+ conf.udp6.port = port6;
break;
case IPCP_ETH_DIX:
conf.eth.ethertype = ethertype;
diff --git a/src/tools/irm/irm_ipcp_create.c b/src/tools/irm/irm_ipcp_create.c
index 35d33782..e2a5c488 100644
--- a/src/tools/irm/irm_ipcp_create.c
+++ b/src/tools/irm/irm_ipcp_create.c
@@ -46,7 +46,8 @@
#define UNICAST "unicast"
#define BROADCAST "broadcast"
-#define UDP "udp"
+#define UDP4 "udp4"
+#define UDP6 "udp6"
#define ETH_LLC "eth-llc"
#define ETH_DIX "eth-dix"
#define LOCAL "local"
@@ -57,7 +58,7 @@ static void usage(void)
" name <ipcp name>\n"
" type [TYPE]\n\n"
"where TYPE in {" UNICAST " " BROADCAST " " LOCAL " "
- UDP " " ETH_LLC " " ETH_DIX "}\n");
+ UDP4 " " UDP6 " " ETH_LLC " " ETH_DIX "}\n");
}
int do_create_ipcp(int argc,
@@ -92,8 +93,10 @@ int do_create_ipcp(int argc,
type = IPCP_UNICAST;
else if (strcmp(ipcp_type, BROADCAST) == 0)
type = IPCP_BROADCAST;
- else if (strcmp(ipcp_type, UDP) == 0)
- type = IPCP_UDP;
+ else if (strcmp(ipcp_type, UDP4) == 0)
+ type = IPCP_UDP4;
+ else if (strcmp(ipcp_type, UDP6) == 0)
+ type = IPCP_UDP6;
else if (strcmp(ipcp_type, LOCAL) == 0)
type = IPCP_LOCAL;
else if (strcmp(ipcp_type, ETH_LLC) == 0)
diff --git a/src/tools/irm/irm_ipcp_list.c b/src/tools/irm/irm_ipcp_list.c
index dfa3099f..54985eb4 100644
--- a/src/tools/irm/irm_ipcp_list.c
+++ b/src/tools/irm/irm_ipcp_list.c
@@ -48,7 +48,8 @@
#define UNICAST "unicast"
#define BROADCAST "broadcast"
-#define UDP "udp"
+#define UDP4 "udp4"
+#define UDP6 "udp6"
#define ETH_LLC "eth-llc"
#define ETH_DIX "eth-dix"
#define LOCAL "local"
@@ -60,7 +61,7 @@ static void usage(void)
" [layer <layer_name>]\n\n"
" [type [TYPE]]\n\n"
"where TYPE = {" UNICAST " " LOCAL " "
- UDP " " ETH_LLC " " ETH_DIX "}\n");
+ UDP4 " " UDP6 " " ETH_LLC " " ETH_DIX "}\n");
}
static char * str_type(enum ipcp_type type)
@@ -74,8 +75,10 @@ static char * str_type(enum ipcp_type type)
return ETH_LLC;
case IPCP_ETH_DIX:
return ETH_DIX;
- case IPCP_UDP:
- return UDP;
+ case IPCP_UDP4:
+ return UDP4;
+ case IPCP_UDP6:
+ return UDP6;
case IPCP_LOCAL:
return LOCAL;
default:
@@ -113,8 +116,10 @@ int do_list_ipcp(int argc,
type = IPCP_UNICAST;
else if (strcmp(ipcp_type, BROADCAST) == 0)
type = IPCP_BROADCAST;
- else if (strcmp(ipcp_type, UDP) == 0)
- type = IPCP_UDP;
+ else if (strcmp(ipcp_type, UDP4) == 0)
+ type = IPCP_UDP4;
+ else if (strcmp(ipcp_type, UDP6) == 0)
+ type = IPCP_UDP6;
else if (strcmp(ipcp_type, LOCAL) == 0)
type = IPCP_LOCAL;
else if (strcmp(ipcp_type, ETH_LLC) == 0)
diff --git a/src/tools/irm/irm_name_create.c b/src/tools/irm/irm_name_create.c
index a0079cad..22341d2e 100644
--- a/src/tools/irm/irm_name_create.c
+++ b/src/tools/irm/irm_name_create.c
@@ -36,31 +36,82 @@
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#define _POSIX_C_SOURCE 200809L
+#define _XOPEN_SOURCE 500
+
+#include <ouroboros/errno.h>
#include <ouroboros/irm.h>
#include <stdio.h>
#include <string.h>
+#include <stdlib.h>
#include "irm_ops.h"
#include "irm_utils.h"
#define RR "round-robin"
#define SPILL "spillover"
+#define SENC "<security_dir>/server/<name>/enc.cfg"
+#define SCRT "<security_dir>/server/<name>/crt.pem"
+#define SKEY "<security_dir>/server/<name>/key.pem"
+#define CENC "<security_dir>/client/<name>/enc.cfg"
+#define CCRT "<security_dir>/client/<name>/crt.pem"
+#define CKEY "<security_dir>/client/<name>/key.pem"
static void usage(void)
{
printf("Usage: irm name create\n"
- " <name>\n"
- " lb [LB_POLICY], default: %s\n\n"
- "where LB_POLICY in {" RR " " SPILL "}\n", RR);
+ " <name>. max %d chars.\n"
+ " [lb LB_POLICY], default: %s\n"
+ " [sencpath <path>, default: " SENC "]\n"
+ " [scrtpath <path>, default: " SCRT "]\n"
+ " [skeypath <path>, default: " SKEY "]\n"
+ " [cencpath <path>, default: " CENC "]\n"
+ " [ccrtpath <path>, default: " CCRT "]\n"
+ " [ckeypath <path>, default: " CKEY "]\n"
+ "\n"
+ "where LB_POLICY in {" RR " " SPILL "}\n",
+ NAME_SIZE, RR);
+}
+
+static int cp_chk_path(char * buf,
+ const char * path)
+{
+ char * rp = realpath(path, NULL);
+ if (rp == NULL) {
+ printf("Failed to check path %s: %s\n.",
+ path, strerror(errno));
+ goto fail_rp;
+ }
+
+ if (strlen(rp) > NAME_PATH_SIZE) {
+ printf("File path too long: %s.\n", rp);
+ goto fail_len;
+ }
+
+ strcpy(buf, rp);
+ free(rp);
+
+ return 0;
+
+ fail_len:
+ free(rp);
+ fail_rp:
+ return -1;
}
int do_create_name(int argc,
char ** argv)
{
- char * name = NULL;
- char * lb_pol = RR;
- enum pol_balance pol_lb = LB_RR;
+ struct name_info info = {};
+ char * name = NULL;
+ char * sencpath = NULL;
+ char * scrtpath = NULL;
+ char * skeypath = NULL;
+ char * cencpath = NULL;
+ char * ccrtpath = NULL;
+ char * ckeypath = NULL;
+ char * lb_pol = RR;
name = *(argv++);
--argc;
@@ -68,6 +119,18 @@ int do_create_name(int argc,
while (argc > 0) {
if (matches(*argv, "lb") == 0) {
lb_pol = *(argv + 1);
+ } else if (matches(*argv, "sencpath") == 0) {
+ sencpath = *(argv + 1);
+ } else if (matches(*argv, "scrtpath") == 0) {
+ scrtpath = *(argv + 1);
+ } else if (matches(*argv, "skeypath") == 0) {
+ skeypath = *(argv + 1);
+ } else if (matches(*argv, "cencpath") == 0) {
+ cencpath = *(argv + 1);
+ } else if (matches(*argv, "ccrtpath") == 0) {
+ ccrtpath = *(argv + 1);
+ } else if (matches(*argv, "ckeypath") == 0) {
+ ckeypath = *(argv + 1);
} else {
printf("\"%s\" is unknown, try \"irm "
"name create\".\n", *argv);
@@ -78,19 +141,45 @@ int do_create_name(int argc,
argv += 2;
}
- if (name == NULL) {
- usage();
- return -1;
+ if (name == NULL)
+ goto fail;
+
+ if (strlen(name) > NAME_SIZE) {
+ printf("Name too long.\n");
+ goto fail;
}
+ strcpy(info.name, name);
+
+ if (sencpath != NULL && cp_chk_path(info.s.enc, sencpath) < 0)
+ goto fail;
+
+ if (scrtpath != NULL && cp_chk_path(info.s.crt, scrtpath) < 0)
+ goto fail;
+
+ if (skeypath != NULL && cp_chk_path(info.s.key, skeypath) < 0)
+ goto fail;
+
+ if (cencpath != NULL && cp_chk_path(info.c.enc, cencpath) < 0)
+ goto fail;
+
+ if (ccrtpath != NULL && cp_chk_path(info.c.crt, ccrtpath) < 0)
+ goto fail;
+
+ if (ckeypath != NULL && cp_chk_path(info.c.key, ckeypath) < 0)
+ goto fail;
+
if (strcmp(lb_pol, RR) == 0)
- pol_lb = LB_RR;
+ info.pol_lb = LB_RR;
else if (strcmp(lb_pol, SPILL) == 0)
- pol_lb = LB_SPILL;
+ info.pol_lb = LB_SPILL;
else {
usage();
return -1;
}
- return irm_create_name(name, pol_lb);
+ return irm_create_name(&info);
+ fail:
+ usage();
+ return -1;
}
diff --git a/src/tools/irm/irm_name_reg.c b/src/tools/irm/irm_name_reg.c
index 061ed8be..7689119a 100644
--- a/src/tools/irm/irm_name_reg.c
+++ b/src/tools/irm/irm_name_reg.c
@@ -107,14 +107,23 @@ int do_reg_name(int argc,
return -1;
}
+ if (strlen(name) > NAME_SIZE) {
+ printf("Name too long.\n");
+ usage();
+ return -1;
+ }
+
ipcps_len = irm_list_ipcps(&ipcps);
- if (ipcps_len < 0)
- return ipcps_len;
+ if (ipcps_len <= 0) {
+ printf("Failed to list IPCPs.\n");
+ return -1;
+ }
names_len = irm_list_names(&names);
if (names_len < 0) {
+ printf("Failed to list names.\n");
free(ipcps);
- return names_len;
+ return -1;
}
for (i = 0; i < names_len; ++i) {
@@ -124,11 +133,19 @@ int do_reg_name(int argc,
}
}
- if (name_create && irm_create_name(name, LB_SPILL)) {
- printf("Error creating name.");
- free(ipcps);
- free(name);
- return -1;
+ if (name_create) {
+ struct name_info info = {
+ .pol_lb = LB_SPILL
+ };
+
+ strcpy(info.name, name);
+
+ if (irm_create_name(&info) < 0) {
+ printf("Error creating name.");
+ free(ipcps);
+ free(names);
+ return -1;
+ }
}
for (i = 0; i < ipcps_len; ++i) {
@@ -136,6 +153,8 @@ int do_reg_name(int argc,
for (j = 0; j < layers_len; j++) {
if (wildcard_match(layers[j], ipcps[i].layer) == 0) {
if (irm_reg_name(name, ipcps[i].pid)) {
+ printf("Failed to register with %s",
+ ipcps[i].layer);
free(ipcps);
free(names);
return -1;
@@ -145,6 +164,8 @@ int do_reg_name(int argc,
for (j = 0; j < ipcp_len; j++) {
if (wildcard_match(ipcp[j], ipcps[i].name) == 0) {
if (irm_reg_name(name, ipcps[i].pid)) {
+ printf("Failed to register with %s",
+ ipcps[i].name);
free(ipcps);
free(names);
return -1;