l2tplac: fast-forward session that triggered tunnel creation

Previously, when we got a call to be forwarded to another LNS and we didn't
have a tunnel to it yet, we would wait for a PAP/CHAP re-send to trigger the
creation of a session in the fresh tunnel. We do not have to wait, we can
trigger that on SCCCN ack.
This commit is contained in:
Samuel Thibault 2025-03-09 17:08:13 +01:00
parent b409fb7b9d
commit b5c198ae87
3 changed files with 14 additions and 1 deletions

View file

@ -341,6 +341,8 @@ static int lac_create_tunnelsession(tunnelidt t, sessionidt s, confrlnsidt i_con
tunnel[t].window = 4; // default window tunnel[t].window = 4; // default window
tunnel[t].isremotelns = i_conf; tunnel[t].isremotelns = i_conf;
tunnel[t].indexudp = config->indexlacudpfd; tunnel[t].indexudp = config->indexlacudpfd;
tunn_local[t].initialsession = s;
strncpy(tunn_local[t].initialuser, puser, sizeof(tunn_local[t].initialuser) - 1);
STAT(tunnel_created); STAT(tunnel_created);
random_data(pconfigrlns[i_conf].auth, sizeof(pconfigrlns[i_conf].auth)); random_data(pconfigrlns[i_conf].auth, sizeof(pconfigrlns[i_conf].auth));
@ -354,7 +356,9 @@ static int lac_create_tunnelsession(tunnelidt t, sessionidt s, confrlnsidt i_con
} }
else else
{ {
/** TODO **/ /** TODO: ideally we would queue all sessions waiting for the tunnel to
* be finished creating, to trigger forwarding them all on SCCCN ack,
* not just the initial one **/
LOG(1, 0, t, "(REMOTE LNS) tunnel is not open\n"); LOG(1, 0, t, "(REMOTE LNS) tunnel is not open\n");
} }

View file

@ -4289,6 +4289,13 @@ void processudp(uint8_t *buf, int len, struct sockaddr_in *addr, uint16_t indexu
LOG(3, s, t, "REMOTE LNS acked our SCCCN %d\n", tunn_local[t].scccn); LOG(3, s, t, "REMOTE LNS acked our SCCCN %d\n", tunn_local[t].scccn);
tunn_local[t].scccn = -1; tunn_local[t].scccn = -1;
tunnel[t].state = TUNNELOPEN; tunnel[t].state = TUNNELOPEN;
if (tunn_local[t].initialsession)
{
// Forward the call that triggered the tunnel creation
lac_create_session(t, tunn_local[t].initialsession, tunn_local[t].initialuser);
tunn_local[t].initialsession = 0;
}
} }
} }
if (l) if (l)

View file

@ -520,6 +520,8 @@ typedef struct
int32_t scccn; // seq number of last sccn waiting for an ack (-1 if none) int32_t scccn; // seq number of last sccn waiting for an ack (-1 if none)
controlt *controlr; // queue of OoO-received messages controlt *controlr; // queue of OoO-received messages
int l2tp_fd; // kernel acceleration UDP socket int l2tp_fd; // kernel acceleration UDP socket
sessionidt initialsession; // initial session that triggered creating the tunnel to another LNS
char initialuser[MAXUSER]; // user of initial session
} }
tunnellocalt; tunnellocalt;