--- src/l2tp.c.orig 2026-07-04 22:41:42.891486000 +0700 +++ src/l2tp.c 2026-07-04 22:52:38.088850000 +0700 @@ -405,21 +405,28 @@ L2tpOpen(Link l) /* Sanity check. */ if (l->state != PHYS_STATE_DOWN) { - Log(LG_PHYS, ("[%s] L2TP: allready active", l->name)); + Log(LG_PHYS, ("[%s] L2TP: already active", l->name)); return; }; - l->state = PHYS_STATE_CONNECTING; - strlcpy(pi->callingnum, pi->conf.callingnum, sizeof(pi->callingnum)); - strlcpy(pi->callednum, pi->conf.callednum, sizeof(pi->callednum)); - - if ((!Enabled(&pi->conf.options, L2TP_CONF_RESOLVE_ONCE)) && + if ((!Enabled(&pi->conf.options, L2TP_CONF_RESOLVE_ONCE) || + u_addrempty(&pi->conf.peer_addr.addr)) && (pi->conf.fqdn_peer_addr != NULL)) { struct u_range rng; if (ParseRange(pi->conf.fqdn_peer_addr, &rng, ALLOW_IPV4|ALLOW_IPV6)) pi->conf.peer_addr = rng; + else { + Log(LG_PHYS, ("[%s] L2TP: failed to resolve peer name: %s", + l->name, pi->conf.fqdn_peer_addr)); + PhysDown(l, STR_CON_FAILED, "failed to resolve peer name"); + return; + } } + l->state = PHYS_STATE_CONNECTING; + strlcpy(pi->callingnum, pi->conf.callingnum, sizeof(pi->callingnum)); + strlcpy(pi->callednum, pi->conf.callednum, sizeof(pi->callednum)); + ghash_walk_init(gL2tpTuns, &walk); while ((tun = ghash_walk_next(gL2tpTuns, &walk)) != NULL) { if (tun->ctrl && tun->alive && tun->active_sessions < gL2TPtunlimit && @@ -1767,24 +1774,27 @@ L2tpSetCommand(Context ctx, int ac, const char *const Freee(*fqdn_peer_addr); *fqdn_peer_addr = Mstrdup(MB_PHYS, av[0]); } - if (ac < 1 || ac > 2 || !ParseRange(av[0], &rng, ALLOW_IPV4|ALLOW_IPV6)) - return(-1); if (ac > 1) { if ((port = atoi(av[1])) < 0 || port > 0xffff) return(-1); } else { port = 0; } + if ((intptr_t)arg == SET_SELFADDR) + l2tp->conf.self_port = port; + else { + l2tp->conf.peer_port = port; + } + if (ac < 1 || ac > 2 || !ParseRange(av[0], &rng, ALLOW_IPV4|ALLOW_IPV6)) + return(-1); if ((intptr_t)arg == SET_SELFADDR) { l2tp->conf.self_addr = rng.addr; - l2tp->conf.self_port = port; if (l2tp->server) { L2tpUnListen(ctx->lnk); L2tpListen(ctx->lnk); } } else { l2tp->conf.peer_addr = rng; - l2tp->conf.peer_port = port; } break; case SET_CALLINGNUM: