problems with L2TP

From: Sam Protsenko
Date: Fri Jul 03 2015 - 09:50:05 EST


Hi,

I'm having issues running user-space code, which uses net/l2tp/l2tp_ppp.c.
The code is supposed to be running in LAC mode (which is I believe is default).
My server configuration described here: https://wiki.linaro.org/LMG/Kernel/PPP

I was trying to use next code snippets as user-space part:
1. Code example from comments in net/l2tp/l2tp_ppp.c
2. Code examples from Documentation/networking/l2tp.txt
3. Code from this project: http://www.kvack.org/~bcrl/pppol2tp/multihop.c

Basically, I was trying two options for user-space code:
1. Creating only one sockaddr_pppol2tp, like this:

<<<<<<<<<<<<<<<<<<<<<< cut here >>>>>>>>>>>>>>>>>>
session_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP);
session_sa.sa_family = AF_PPPOX;
session_sa.sa_protocol = PX_PROTO_OL2TP;
session_sa.pppol2tp.fd = udp_fd;
session_sa.pppol2tp.s_tunnel = local_tunnel;
session_sa.pppol2tp.s_session = local_session;
session_sa.pppol2tp.d_tunnel = remote_tunnel;
session_sa.pppol2tp.d_session = remote_session;
connect(session_fd, (struct sockaddr *)&session_sa,
sizeof(session_sa));
<<<<<<<<<<<<<<<<<<<<<< cut here >>>>>>>>>>>>>>>>>>

In that case user-space tool was failing on connect() call.

2. Creating two sockaddr_pppol2tp, like this:

<<<<<<<<<<<<<<<<<<<<<< cut here >>>>>>>>>>>>>>>>>>

tunnel_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP);
tunnel_sa.sa_family = AF_PPPOX;
tunnel_sa.sa_protocol = PX_PROTO_OL2TP;
tunnel_sa.pppol2tp.fd = the_socket; /* UDP socket */
tunnel_sa.pppol2tp.s_tunnel = local_tunnel;
tunnel_sa.pppol2tp.s_session = 0; /* special case: mgmt socket */
tunnel_sa.pppol2tp.d_tunnel = remote_tunnel;
tunnel_sa.pppol2tp.d_session = 0; /* special case: mgmt socket */
connect(tunnel_fd, (struct sockaddr *)&tunnel_sa,
sizeof(tunnel_sa));

session_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP);
session_sa.sa_family = AF_PPPOX;
session_sa.sa_protocol = PX_PROTO_OL2TP;
session_sa.pppol2tp.fd = udp_fd;
session_sa.pppol2tp.s_tunnel = local_tunnel;
session_sa.pppol2tp.s_session = local_session;
session_sa.pppol2tp.d_tunnel = remote_tunnel;
session_sa.pppol2tp.d_session = remote_session;
connect(session_fd, (struct sockaddr *)&session_sa,
sizeof(session_sa));
<<<<<<<<<<<<<<<<<<<<<< cut here >>>>>>>>>>>>>>>>>>

In this case my user-space tool works fine, but my server shows
next errors in /var/log/syslog:

<<<<<<<<<<<<<<<<<<<<<< cut here >>>>>>>>>>>>>>>>>>
Jul 3 16:32:49 joe-laptop xl2tpd[2978]: Can not find tunnel 25061
(refhim=0)
Jul 3 16:32:49 joe-laptop xl2tpd[2978]: network_thread: unable to
find call or tunnel to handle packet. call = 48566, tunnel = 25061
Dumping.
<<<<<<<<<<<<<<<<<<<<<< cut here >>>>>>>>>>>>>>>>>>

UDP socket was created next way (for both cases):
https://android.googlesource.com/platform/external/mtpd/+/0269612ac00a0700997dda333faf0a3c33a388b8/mtpd.c#253

(see the_socket variable in create_socket() function).

So my questions are:
1. Am I doing something wrong in userspace part? Because my server
part is working fine with Android kernel implementation of LAC
(drivers/net/ppp/pppolac.c). When I'm trying to do the same with
mainline kernel implementation of LAC -- I'm having issues described
above.
2. Do we have some testing code for L2TP (particularly LAC)? Or maybe
just some working user-space code sample?

Thanks!
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/