Hello,

It seems I found a possible source of this bug.
The problem is in the way the pppol2tp driver initializes 
internal kernel tunnel and socket structures. It implicitly assumes
that you want to use the kernel-based tunnel immediately after
you've got a peer tunnel id. This means you must prepare kernel
socket as follows

struct sockaddr_pppol2tp sax;
int fd, session_fd;

fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP);
sax.sa_family = AF_PPPOX;
sax.sa_protocol = PX_PROTO_OL2TP;
sax.pppol2tp.fd = tunnel_fd;
sax.pppol2tp.addr.sin_addr.s_addr = addr->sin_addr.s_addr;
sax.pppol2tp.addr.sin_port = addr->sin_port;
sax.pppol2tp.addr.sin_family = AF_INET;
sax.pppol2tp.s_tunnel  = tunnel_id;
sax.pppol2tp.s_session = 0;
sax.pppol2tp.d_tunnel  = peer_tunnel_id;
sax.pppol2tp.d_session = 0;

session_fd = connect(fd, (struct sockaddr *)&sax, sizeof(sax));

Note, that s_session, d_session members must be 0 and you must perform 
connect() call.
Only in this case you get properly prepared sockets.

Now, take a look at init_network() function. They use only socket() call to 
prepare kernel sockets
and this is not enough. Thus, when they make connect() to the kernel socket in 
start_pppd(), they
get this bug.

To test this, I moved the kernel support code from init_network() to 
start_pppd() and 
add modification of the above initialization code. The bug disappeared. 
However, this is not whole story. When kernel support is on, pppd uses plugin 
pppol2tp.so, 
which is not present in Debian repositories (but present in openltp). 
So, I'm still unable to get xl2tpd work with kernel support.




-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to