From 9c9ff616d53127f6018143154aa53ad16bec9eca Mon Sep 17 00:00:00 2001 From: Guillaume Nault Date: Mon, 11 Feb 2013 21:02:35 +0100 Subject: l2tp: Set LNS address with the one really bound to 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 --- accel-pppd/ctrl/l2tp/l2tp.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'accel-pppd/ctrl/l2tp/l2tp.c') diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c index 9dc0d26..ef818c2 100644 --- a/accel-pppd/ctrl/l2tp/l2tp.c +++ b/accel-pppd/ctrl/l2tp/l2tp.c @@ -793,6 +793,7 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer, uint32_t framing_cap) { struct l2tp_conn_t *conn; + socklen_t lnsaddrlen = sizeof(conn->lns_addr); uint16_t tid; int flag; @@ -871,8 +872,17 @@ static struct l2tp_conn_t *l2tp_tunnel_alloc(const struct sockaddr_in *peer, goto out_err; } + if (getsockname(conn->hnd.fd, &conn->lns_addr, &lnsaddrlen) < 0) { + log_error("l2tp: getsockname: %s\n", strerror(errno)); + goto out_err; + } + if (lnsaddrlen != sizeof(conn->lns_addr)) { + log_error("l2tp: getsockname: invalid address length: %i\n", + lnsaddrlen); + goto out_err; + } + memcpy(&conn->lac_addr, peer, sizeof(*peer)); - memcpy(&conn->lns_addr, host, sizeof(*host)); conn->framing_cap = framing_cap; conn->ctx.before_switch = log_switch; -- cgit v1.2.3