summaryrefslogtreecommitdiff
path: root/src/tools/irm/irm_ipcp_connect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/irm/irm_ipcp_connect.c')
-rw-r--r--src/tools/irm/irm_ipcp_connect.c90
1 files changed, 79 insertions, 11 deletions
diff --git a/src/tools/irm/irm_ipcp_connect.c b/src/tools/irm/irm_ipcp_connect.c
index fb21faec..66646e7d 100644
--- a/src/tools/irm/irm_ipcp_connect.c
+++ b/src/tools/irm/irm_ipcp_connect.c
@@ -44,6 +44,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <arpa/inet.h>
#include <string.h>
#define DT "dt"
@@ -55,10 +56,14 @@ static void usage(void)
" name <ipcp name>\n"
" dst <name of destination IPCP>\n"
" [component [COMPONENT]]\n"
- "where COMPONENT in {" DT " " MGMT "}\n\n"
+ " [udp [UDP_PEER]]\n"
+ " [eth [dev <device>]"
+ " [ethertype <ethertype>]]\n"
+ "where COMPONENT in {" DT " " MGMT "}\n"
+ "and UDP_PEER is <IP address or host>[:<port>]\n\n"
"if COMPONENT == " DT "\n"
- " [qos [QOS]\n"
- "where QOS in {raw, best, voice, video, data}\n");
+ " [qos [QOS]]\n"
+ "where QOS in {raw, safe, rt, rt-safe, msg}\n");
}
int do_connect_ipcp(int argc,
@@ -69,13 +74,29 @@ int do_connect_ipcp(int argc,
char * comp = "*";
char * component = NULL;
char * qos = NULL;
+ char * udpstr = NULL;
+ char * devstr = NULL;
+ uint16_t ethertype = POA_ETHERTYPE;
+ bool eth = false;
+ struct poa_addr addr;
+ struct poa_addr * pa = NULL;
struct ipcp_list_info * ipcps;
ssize_t len = 0;
pid_t pid = -1;
ssize_t i;
+ int cargs;
qosspec_t qs = qos_raw;
while (argc > 0) {
+ cargs = 2;
+ if (strcmp(*argv, "eth") == 0)
+ cargs = 1;
+
+ if (argc < cargs) {
+ usage();
+ return -1;
+ }
+
if (matches(*argv, "name") == 0) {
ipcp = *(argv + 1);
} else if (matches(*argv, "dst") == 0) {
@@ -84,21 +105,66 @@ int do_connect_ipcp(int argc,
comp = *(argv + 1);
} else if (matches(*argv, "qos") == 0) {
qos = *(argv + 1);
+ } else if (strcmp(*argv, "udp") == 0) {
+ udpstr = *(argv + 1);
+ } else if (strcmp(*argv, "dev") == 0) {
+ devstr = *(argv + 1);
+ } else if (strcmp(*argv, "ethertype") == 0) {
+ if (parse_ethertype(*(argv + 1), &ethertype) < 0) {
+ printf("Invalid ethertype: \"%s\".\n",
+ *(argv + 1));
+ return -1;
+ }
+ } else if (strcmp(*argv, "eth") == 0) {
+ eth = true;
+ cargs = 1;
} else {
printf("\"%s\" is unknown, try \"irm "
"ipcp connect\".\n", *argv);
return -1;
}
- argc -= 2;
- argv += 2;
+ argc -= cargs;
+ argv += cargs;
}
- if (ipcp == NULL || dst == NULL || comp == NULL) {
+ if (ipcp == NULL || comp == NULL) {
usage();
return -1;
}
+ memset(&addr, 0, sizeof(addr));
+
+ if (udpstr != NULL) {
+ if (poa_addr_set_udp(&addr, udpstr) < 0)
+ return -1;
+ pa = &addr;
+ }
+
+ if (eth) {
+ if (udpstr != NULL) {
+ printf("Connect via udp or eth, not both.\n");
+ return -1;
+ }
+
+ if (dst == NULL) {
+ usage();
+ return -1;
+ }
+
+ if (poa_addr_set_eth(&addr, devstr, ethertype) < 0)
+ return -1;
+ pa = &addr;
+ }
+
+ if (dst == NULL && pa == NULL) {
+ usage();
+ return -1;
+ }
+
+ if (dst == NULL)
+ dst = "";
+
if (qos != NULL) {
if (strcmp(qos, "raw") == 0)
qs = qos_raw;
@@ -110,9 +176,11 @@ int do_connect_ipcp(int argc,
qs = qos_rt_safe;
else if (strcmp(qos, "msg") == 0)
qs = qos_msg;
- else if (strcmp(qos, "stream") == 0)
- qs = qos_stream;
- else
+ else if (strcmp(qos, "stream") == 0) {
+ printf("Stream QoS is not allowed on "
+ "IPCP component flows.\n");
+ return -1;
+ } else
printf("Unknown QoS cube, defaulting to raw.\n");
}
@@ -129,13 +197,13 @@ int do_connect_ipcp(int argc,
if (wildcard_match(comp, MGMT) == 0) {
component = MGMT_COMP;
/* FIXME: move to qos_msg when stable */
- if (irm_connect_ipcp(pid, dst, component, qos_raw))
+ if (irm_connect_ipcp(pid, dst, component, qos_raw, pa))
return -1;
}
if (wildcard_match(comp, DT) == 0) {
component = DT_COMP;
- if (irm_connect_ipcp(pid, dst, component, qs))
+ if (irm_connect_ipcp(pid, dst, component, qs, pa))
return -1;
}