Age | Commit message (Collapse) | Author |
|
Define STATE_WAIT_SCCRP which will be required for creating new tunnels
on behalf of the host. This state will be entered right after sending
an SCCRQ message.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Change the meaning of the Nr field in struct l2tp_conn_t: instead of
setting it to the last received message sequence, set it with the
value of the next expected message sequence number (i.e. one above
the previous value). This simplifies processing and avoids the
l2tp_send() function to increment the L2TP packet Nr field (it's now
directly set to the correct value).
Having Nr correctly set before calling l2tp_send() is necessary for
implementing tunnel establishment requests (SCCRQ messages) since the
Nr field of this message must be 0.
This patch also replaces the formula used to check if a message Ns is
lower than a tunnel Nr.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
When allocating tunnels, set the lns_addr field of tunnels using
getsockname() instead of using the "host" parameter. This will allow
the caller to pass an unspecified port in "host" (for binding to
any source port) and to set the lns_addr field with the address really
bound to.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Remove the "serv" parameter from l2tp_tunnel_alloc() prototype.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Send the Challenge AVP in SCCRP messages and check for the Challenge
Response AVP in SCCCN.
This patch adds two functions:
-l2tp_tunnel_genchall() generates the Challenge, stores it in the
tunnel structure and adds the AVP in the packet to be sent.
-l2tp_tunnel_checkchallresp() reads a Challenge Response, computes
the expected response using the Challenge stored in the tunnel
structure and finally checks if both responses match.
These two functions are meant to be used in the upcoming implementation
of SCCRQ message sending and SCCRP message reception.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Create the l2tp_tunnel_genchallresp() function for building and
adding the Challenge Response AVP to messages that need it.
Support for this AVP is needed for sending SCCRP and SCCCN messages.
This patch replaces the previous Challenge Response computation by
calling the new function and prepares implementation of SCCCN message
sending.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Move challenge computation out of tunnel allocation by using a
generic CHAP-MD5 calculation function. This will allow to initiate
tunnels on the host side (i.e. sending SCCRQ) and to compute the
challenge response later on, when handling the peer response (i.e.
during SCCRP handling).
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Use a "struct sockaddr_in" pointer for passing the peer address to the
tunnel allocation function (instead of a "struct l2tp_packet_t *"). This
makes l2tp_tunnel_alloc() usable in situations where tunnel creation
doesn't happen in response to a peer request.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
The "recv <SCCRQ packet>" message printing should logically belong to
the SCCRQ message reception function. This patch moves this message
from l2tp_tunnel_alloc() to l2tp_recv_SCCRQ() in order to make
l2tp_tunnel_alloc() usable in situations different than SCCRQ
message handling.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Pass the host address as a directly usable sockaddr_in in
l2tp_tunnel_alloc(), instead of an in_pktinfo. This will allow to
allocate tunnels without having to artificially create in_pktinfo
structures in situations where the tunnel is not created in response
to an SCCRQ.
As a side effect, this patch makes accel-ppp reply to SCCRQ using
an arbitrary source port, as specified in RFC 2661.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Directly pass the framing capabilities argument of l2tp_tunnel_alloc()
as an integer. The previous type (struct l2tp_attr_t *) won't
make make sense when creating a tunnel in situations different from
SCCRQ message handling.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Peer TID assignment is specific to SCCRQ message processing. When
creating a tunnel in different conditions (e.g. upon user request),
the peer TID will be unknown.
This patch moves peer TID assignment from l2tp_tunnel_alloc() to
l2tp_recv_SCCRQ().
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Register and start triton contexts/handlers in l2tp_tunnel_start()
instead of l2tp_tunnel_alloc(). The objective is to make
l2tp_tunnel_alloc() more generic by removing some specific
initialisation code. At a later stage, these would be done by the
caller between the calls to l2tp_tunnel_alloc() and l2tp_tunnel_start().
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Avoid unregistering uninitialised tunnel data when freeing tunnel
structures. This makes l2tp_tunnel_free() suitable for freeing
partially initialised tunnels.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Update the prototype of l2tp_tunnel_alloc() so that it returns the
allocated tunnel structure. This will allow the caller to act on the
newly created tunnel in different ways depending on the creation
context.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Verify return values of functions called by l2tp_tunnel_alloc().
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Don't send the EV_CTRL_FINISHED event when closing sessions which
haven't been established, because no corresponding EV_CTRL_STARTED
events have been sent by such sessions.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Match PPPoE "exec" and "help" commands. This makes the PPPoE module
behave nicely with the new help command handling.
For example:
* "help pppoe set" won't print help messages for the "pppoe show"
set of commands
* "help pppoe mac-filter add" will only print help message for this
specific command (i.e. without the other "pppoe mac-filter" ones)
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Since it's not possible to mix incomming and outgoing states in
a session, the "state2" field isn't necessary.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Add the "l2tp create session" command to place an outgoing call.
For example, "l2tp create session tid 3" will send an OCRQ within
tunnel 3.
This allows the LNS to request establishment of a new session inside
an existing tunnel.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
This patch removes the automatic sending of a CDN message when
cancelling creation of new sessions. This is necessary in order
to give the possibility for a tunnel to create (and possibly cancel)
new sessions on its own (e.g. for placing outgoing calls). In such
cases, sending a CDN message would not make sense if the session gets
cancelled before any creation message was sent.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
|
|
ipoe: fixed DHCP Discover handling when session is in active state
|
|
|
|
|
|
|
|
|
|
This reverts commit cde7ee4d629b32c810ceac836b70a4289b4f00b3.
|
|
|
|
|
|
|
|
This reverts commit 2b9c6812f4558b74843c6e3740ee5319dc1df48d.
|
|
|
|
|
|
|
|
|
|
|
|
Explicitely interpret zero values when parsing boolean options. This
allows to unset boolean parameters such as "verbose" when reloading
the configuration.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
|
|
Retrieve the socket address size from the address passed to connect().
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Use l2tp_tunnel_alloc() cleanup code for handling TID assignment
failure. The previous manual cleanup did not close the triton handler
file descriptor.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Tunnel establishment may not be immediately followed by the creation of
a new session. In this case there is no message to send to the peer
after receiving an SCCCN; so it won't be acknowledged and the peer will
then have to retransmit it.
This patch makes the tunnel always acknowledge SCCCN by replying with a
ZLB, thus avoiding useless retransmission from the peer.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Send a ZLB upon reception of a CDN message.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Update call to l2tp_send_CDN() to avoid using the 0 result code
(reserved by RFC 2661).
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
The sessions timeout timers were registered in the triton context of
their parent tunnel. This patch uses the session's context instead
because the timer's callback function, l2tp_session_timeout(), expects
to be called from a session context.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
When a PPP session terminates on its own (i.e. not on behalf of a L2TP
tunnel/session request), the l2tp_ppp_finished() callback calls the
L2TP session disconnection function without updating the session's
state.
Session disconnection code then works like if the PPP session was still
up: it tries to disconnect the PPP by calling ap_session_terminate().
But since the PPP is already terminated, it returns immediately,
without calling the l2tp_ppp_finished() callback; so session cleanup
won't happen.
This patch updates the session's state upon PPP disconnection, so that
the session disconnection code won't try to disconnect the PPP in
__l2tp_session_free().
The stat_active counter is now updated inside the l2tp_ppp_finished()
callback so that it gets called upon any PPP disconnection.
Sending of the EV_CTRL_FINISHED event has also been moved. It is now
performed in the generic part of __l2tp_session_free() because it has
to be done every time the session really terminates.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
PPP and L2TP session contexts are the same. So since l2tp_ppp_finished()
is called within the PPP context, it doesn't need to switch to the
session context for calling l2tp_ppp_session_disconnect().
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Freeing a session requires four steps:
1-The session asynchronously requests its parent tunnel to
remove the session (the tunnel must start the process).
2-The parent tunnel removes its reference to this session,
then makes an asynchronous call to the session cleanup
function.
3-The session performs its cleanup, frees its memory and
asynchronously notifies its parent tunnel.
4-The parent tunnel decrements its sessions counter (so that
it knows when it doesn't have any session depending on it).
If two requests, A and B, for removing the same session, arrive
almost simultaneously, then the following scenario may occur:
1a-The session handles request A and transmits it to its
parent tunnel.
2a-The parent tunnel removes its reference to this session
and requests the session to perform cleanup.
1b-In the mean time, the session handles request B and
transmit it to its parent tunnel.
3a-The session continues to handle request A, cleans up the
session and frees memory.
2b-The parent tunnel handles request B: it removes its
reference to the session and tells it to perform cleanup.
But the session pointer used has just been freed at step 3a.
This patch modifies step 1, so that the session transmit the
session-id instead of a pointer to the session structure. That
way, the tunnel can check if the session has already been
deleted (or is pending deletion), without having to manipulate a
potentially invalid pointer.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
Use a session counter for each tunnel to avoid freeing a tunnel
while still having sessions depending on it.
Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
|
|
* l2tp: Fix allocation checking when adding octets AVP
* cli, tcp: Fix non-NULL terminated string reception
* Fix va_end() missing calls
* chap-secrets: implemented encryption
* auth_pap: make messages like other auth modules
* cli: check xmit_buf is not null at enter to write function
* pppoe: implemented regular expression support
* chap-secrets: implemented encryption
* ippool: fixed initialization order
* optional shaper compiling
* ppp: dns/wins code cleanup
|