summaryrefslogtreecommitdiff
path: root/src/tools/irm/irm_ipcp_bootstrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/irm/irm_ipcp_bootstrap.c')
-rw-r--r--src/tools/irm/irm_ipcp_bootstrap.c202
1 files changed, 120 insertions, 82 deletions
diff --git a/src/tools/irm/irm_ipcp_bootstrap.c b/src/tools/irm/irm_ipcp_bootstrap.c
index 4eeedbd3..07dcea0f 100644
--- a/src/tools/irm/irm_ipcp_bootstrap.c
+++ b/src/tools/irm/irm_ipcp_bootstrap.c
@@ -36,6 +36,12 @@
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <ouroboros/irm.h>
+
+#include "irm_ops.h"
+#include "irm_utils.h"
+
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -43,10 +49,6 @@
#ifdef __FreeBSD__
#include <sys/socket.h>
#endif
-#include <ouroboros/irm.h>
-
-#include "irm_ops.h"
-#include "irm_utils.h"
#define NORMAL "normal"
#define UDP "udp"
@@ -83,7 +85,7 @@ static void usage(void)
printf("Usage: irm ipcp bootstrap\n"
" name <ipcp name>\n"
" layer <layer name>\n"
- " type [TYPE]\n"
+ " [type [TYPE]]\n"
"where TYPE = {" NORMAL " " LOCAL " "
UDP " " ETH_LLC " " ETH_DIX " " RAPTOR "},\n\n"
"if TYPE == " NORMAL "\n"
@@ -132,8 +134,8 @@ static void usage(void)
int do_bootstrap_ipcp(int argc,
char ** argv)
{
- char * name = NULL;
- pid_t pid;
+ 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;
@@ -145,10 +147,11 @@ int do_bootstrap_ipcp(int argc,
uint32_t ip_addr = 0;
uint32_t dns_addr = DEFAULT_DDNS;
char * ipcp_type = NULL;
- char * layer_name = NULL;
+ enum ipcp_type type;
+ char * layer = NULL;
char * dev = NULL;
uint16_t ethertype = DEFAULT_ETHERTYPE;
- pid_t * pids = NULL;
+ struct ipcp_info * ipcps;
ssize_t len = 0;
int i = 0;
bool autobind = false;
@@ -159,9 +162,9 @@ int do_bootstrap_ipcp(int argc,
if (matches(*argv, "type") == 0) {
ipcp_type = *(argv + 1);
} else if (matches(*argv, "layer") == 0) {
- layer_name = *(argv + 1);
+ layer = *(argv + 1);
} else if (matches(*argv, "name") == 0) {
- name = *(argv + 1);
+ ipcp = *(argv + 1);
} else if (matches(*argv, "hash") == 0) {
if (strcmp(*(argv + 1), SHA3_224) == 0)
hash_algo = DIR_HASH_SHA3_224;
@@ -231,98 +234,133 @@ int do_bootstrap_ipcp(int argc,
argv += cargs;
}
- if (name == NULL || layer_name == NULL || ipcp_type == NULL) {
+ if (ipcp == NULL || layer == NULL) {
usage();
return -1;
}
- strcpy(conf.layer_info.layer_name, layer_name);
- if (strcmp(ipcp_type, UDP) != 0)
- conf.layer_info.dir_hash_algo = hash_algo;
-
- if (strcmp(ipcp_type, NORMAL) == 0) {
- conf.type = IPCP_NORMAL;
- conf.addr_size = addr_size;
- conf.eid_size = eid_size;
- conf.max_ttl = max_ttl;
- conf.addr_auth_type = addr_auth_type;
- conf.routing_type = routing_type;
- conf.pff_type = pff_type;
- } else if (strcmp(ipcp_type, UDP) == 0) {
- conf.type = IPCP_UDP;
- if (ip_addr == 0) {
- usage();
- return -1;
- }
- conf.ip_addr = ip_addr;
- conf.dns_addr = dns_addr;
- } else if (strcmp(ipcp_type, LOCAL) == 0) {
- conf.type = IPCP_LOCAL;
- } else if (strcmp(ipcp_type, RAPTOR) == 0) {
- conf.type = IPCP_RAPTOR;
- } else if (strcmp(ipcp_type, ETH_LLC) == 0) {
- conf.type = IPCP_ETH_LLC;
- if (dev == NULL) {
- usage();
- return -1;
- }
- conf.dev = dev;
- } else if (strcmp(ipcp_type, ETH_DIX) == 0) {
- conf.type = IPCP_ETH_DIX;
- if (dev == NULL) {
- usage();
- return -1;
+ len = irm_list_ipcps(&ipcps);
+ for (i = 0; i < len; i++) {
+ if (wildcard_match(ipcps[i].name, ipcp) == 0) {
+ pid = ipcps[i].pid;
+ break;
}
- conf.dev = dev;
- conf.ethertype = ethertype;
- } else {
- usage();
- return -1;
}
- if (autobind && conf.type != IPCP_NORMAL) {
- printf("Can only bind normal IPCPs, autobind disabled.\n");
- autobind = false;
- }
+ if (pid == -1) {
+ if (ipcp_type == NULL) {
+ printf("No IPCPs matching %s found.\n\n", ipcp);
+ goto fail;
+ } else {
+ if (strcmp(ipcp_type, NORMAL) == 0)
+ type = IPCP_NORMAL;
+ 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)
+ type = IPCP_ETH_DIX;
+ else if (strcmp(ipcp_type, LOCAL) == 0)
+ type = IPCP_LOCAL;
+ else if (strcmp(ipcp_type, RAPTOR) == 0)
+ type = IPCP_RAPTOR;
+ else goto fail_usage;
+ }
- len = irm_list_ipcps(name, &pids);
- if (len <= 0) {
- pid = irm_create_ipcp(name, conf.type);
- if (pid <= 0)
- return -1;
- len = irm_list_ipcps(name, &pids);
+ pid = irm_create_ipcp(ipcp, type);
+ if (pid < 0)
+ goto fail;
+ free(ipcps);
+ len = irm_list_ipcps(&ipcps);
}
for (i = 0; i < len; i++) {
- if (autobind && irm_bind_process(pids[i], name)) {
- printf("Failed to bind %d to %s.\n", pids[i], name);
- free(pids);
- return -1;
- }
+ if (wildcard_match(ipcps[i].name, ipcp) == 0) {
+ pid = ipcps[i].pid;
+ if (ipcp_type != NULL && type != ipcps[i].type) {
+ printf("Types do not match.\n\n");
+ goto fail;
+ }
+ conf.type = ipcps[i].type;
- if (autobind && irm_bind_process(pids[i], layer_name)) {
- printf("Failed to bind %d to %s.\n",
- pids[i], layer_name);
- irm_unbind_process(pids[i], name);
- free(pids);
- return -1;
- }
+ if (autobind && conf.type != IPCP_NORMAL) {
+ printf("Can only bind normal IPCPs, "
+ "autobind disabled.\n");
+ autobind = false;
+ }
+
+ strcpy(conf.layer_info.layer_name, layer);
+ if (conf.type == IPCP_UDP)
+ conf.layer_info.dir_hash_algo = hash_algo;
- if (irm_bootstrap_ipcp(pids[i], &conf)) {
- if (autobind) {
- irm_unbind_process(pids[i], name);
- irm_unbind_process(pids[i], layer_name);
+ switch (conf.type) {
+ case IPCP_NORMAL:
+ conf.addr_size = addr_size;
+ conf.eid_size = eid_size;
+ conf.max_ttl = max_ttl;
+ conf.addr_auth_type = addr_auth_type;
+ conf.routing_type = routing_type;
+ conf.pff_type = pff_type;
+ break;
+ case IPCP_UDP:
+ if (ip_addr == 0)
+ goto fail_usage;
+ conf.ip_addr = ip_addr;
+ conf.dns_addr = dns_addr;
+ break;
+ case IPCP_ETH_LLC:
+ if (dev == NULL)
+ goto fail_usage;
+ conf.dev = dev;
+ break;
+ case IPCP_ETH_DIX:
+ if (dev == NULL)
+ goto fail_usage;
+ conf.dev = dev;
+ conf.ethertype = ethertype;
+ break;
+ case IPCP_LOCAL:
+ /* FALLTHRU */
+ case IPCP_RAPTOR:
+ break;
+ default:
+ assert(false);
+ break;
+ }
+
+ if (autobind && irm_bind_process(pid, ipcp)) {
+ printf("Failed to bind %d to %s.\n", pid, ipcp);
+ goto fail;
+ }
+
+ if (autobind && irm_bind_process(pid, layer)) {
+ printf("Failed to bind %d to %s.\n",
+ pid, layer);
+ irm_unbind_process(pid, ipcp);
+ goto fail;
+ }
+
+ if (irm_bootstrap_ipcp(pid, &conf)) {
+ if (autobind) {
+ irm_unbind_process(pid, ipcp);
+ irm_unbind_process(pid, layer);
+ }
+ goto fail;
}
- free(pids);
- return -1;
}
}
- free(pids);
+ free(ipcps);
return 0;
unknown_param:
printf("Unknown parameter for %s: \"%s\".\n", *argv, *(argv + 1));
return -1;
+
+ fail_usage:
+ usage();
+ fail:
+ free(ipcps);
+ return -1;
}