aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/transport/zerotier/zerotier.c66
1 files changed, 25 insertions, 41 deletions
diff --git a/src/transport/zerotier/zerotier.c b/src/transport/zerotier/zerotier.c
index 2522138f..a5ca739c 100644
--- a/src/transport/zerotier/zerotier.c
+++ b/src/transport/zerotier/zerotier.c
@@ -2053,7 +2053,7 @@ zt_ep_fini(void *arg)
}
static int
-zt_parsehex(const char **sp, uint64_t *valp, int wildok)
+zt_parsehex(const char **sp, uint64_t *valp, bool wildok)
{
int n;
const char *s = *sp;
@@ -2109,17 +2109,12 @@ zt_ep_init(void **epp, nni_url *url, nni_sock *sock, int mode)
int n;
int rv;
char c;
- const char *u;
+ const char *h;
if ((ep = NNI_ALLOC_STRUCT(ep)) == NULL) {
return (NNG_ENOMEM);
}
- // URL parsing...
- // URL is form zt://<nwid>[/<remoteaddr>]:<port>
- // The <remoteaddr> part is required for remote dialers, but is
- // not used at all for listeners. (We have no notion of binding
- // to different node addresses.)
ep->ze_mode = mode;
ep->ze_mtu = ZT_MIN_MTU;
ep->ze_aio = NULL;
@@ -2135,20 +2130,33 @@ zt_ep_init(void **epp, nni_url *url, nni_sock *sock, int mode)
return (rv);
}
- u = url->u_rawurl + strlen("zt://");
+ // Our URL format is:
+ //
+ // zt://<nodeid>.<nwid>:<port>
+ //
+ // The port must be specified, but may be zero. The nodeid
+ // may be '*' to refer to ourself. There may be a trailing slash
+ // which will be ignored.
+
+ h = url->u_hostname;
+ if (((strlen(url->u_path) == 1) && (url->u_path[0] != '/')) ||
+ (strlen(url->u_path) > 1) || (url->u_fragment != NULL) ||
+ (url->u_query != NULL) || (url->u_userinfo != NULL) ||
+ (zt_parsehex(&h, &node, true) != 0) || (*h++ != '.') ||
+ (zt_parsehex(&h, &ep->ze_nwid, false) != 0) ||
+ (node > 0xffffffffffull)) {
+ return (NNG_EADDRINVAL);
+ }
+ h = url->u_port;
+ if ((zt_parsedec(&h, &port) != 0) || (port > zt_max_port)) {
+ return (NNG_EADDRINVAL);
+ }
// Parse the URL.
switch (mode) {
case NNI_EP_MODE_DIAL:
- // We require zt://<nwid>/<remotenode>:<port>
- // The remote node must be a 40 bit address
- // (max), and we require a non-zero port to
- // connect to.
- if ((zt_parsehex(&u, &nwid, 0) != 0) || (*u++ != '/') ||
- (zt_parsehex(&u, &node, 1) != 0) ||
- (node > 0xffffffffffull) || (*u++ != ':') ||
- (zt_parsedec(&u, &port) != 0) || (*u != '\0') ||
- (port > zt_max_port) || (port == 0)) {
+ /// We have to have a non-zero port number to connect to.
+ if (port == 0) {
return (NNG_EADDRINVAL);
}
ep->ze_raddr = node;
@@ -2157,28 +2165,6 @@ zt_ep_init(void **epp, nni_url *url, nni_sock *sock, int mode)
ep->ze_laddr = 0;
break;
case NNI_EP_MODE_LISTEN:
- // Listen mode is just zt://<nwid>:<port>. The
- // port may be zero in this case, to indicate
- // that the server should allocate an ephemeral
- // port. We do allow the same form of URL including
- // the node address, but that must be zero, a wild
- // card,
- // or our own node address.
- if (zt_parsehex(&u, &nwid, 0) != 0) {
- return (NNG_EADDRINVAL);
- }
- node = 0;
- // Look for optional node address.
- if (*u == '/') {
- u++;
- if (zt_parsehex(&u, &node, 1) != 0) {
- return (NNG_EADDRINVAL);
- }
- }
- if ((*u++ != ':') || (zt_parsedec(&u, &port) != 0) ||
- (*u != '\0') || (port > zt_max_port)) {
- return (NNG_EADDRINVAL);
- }
ep->ze_laddr = node;
ep->ze_laddr <<= 24;
ep->ze_laddr |= port;
@@ -2189,8 +2175,6 @@ zt_ep_init(void **epp, nni_url *url, nni_sock *sock, int mode)
break;
}
- ep->ze_nwid = nwid;
-
nni_mtx_lock(&zt_lk);
rv = zt_node_find(ep);
nni_mtx_unlock(&zt_lk);