Hello,
patch 6,
# HG changeset patch
# User MJP
# Date 1452862925 -3600
# Fri Jan 15 14:02:05 2016 +0100
# Node ID 90fa2a12bfaa8776e883c168aaf39be0b16fea4d
# Parent fd7f48f3955596de5fe098de0f4208106578c9db
Feature: Can listen on an interface with a specific rdomain.
diff -r fd7f48f39555 -r 90fa2a12bfaa usr.sbin/npppd/l2tp/l2tpd.c
--- usr.sbin/npppd/l2tp/l2tpd.c Fri Jan 15 13:38:16 2016 +0100
+++ usr.sbin/npppd/l2tp/l2tpd.c Fri Jan 15 14:02:05 2016 +0100
@@ -60,6 +60,7 @@
#include "l2tp_local.h"
#include "addr_range.h"
#include "net_utils.h"
+#include <net/if.h> /* for IF_NAMESIZE */
#ifdef L2TPD_DEBUG
#define L2TPD_ASSERT(x) ASSERT(x)
@@ -261,7 +262,8 @@
l2tpd_listener_start(l2tpd_listener *_this)
{
l2tpd *_l2tpd;
- int af, lvl, opt, sock, ival;
+ int af, lvl, opt, sock, ival, rdomain;
+ char ifname[IF_NAMESIZE];
char hbuf[NI_MAXHOST + NI_MAXSERV + 16];
_l2tpd = _this->self;
@@ -301,6 +303,23 @@
"setsockopt(,,SO_REUSEPORT) failed in %s(): %m", __func__);
goto fail;
}
+ rdomain = 0;
+ get_ifname_by_sockaddr((struct sockaddr *)&_this->bind, ifname);
+ if (strlen(ifname) > 0) {
+ if (ifname_get_rdomain(ifname, &rdomain) != 0) {
+ l2tpd_log(_l2tpd, LOG_ERR,
+ "ifname_get_rdomain(%s) failed in %s()", ifname,
__func__);
+ goto fail;
+ }
+ }
+ if (rdomain != 0) {
+ if (setsockopt(sock, SOL_SOCKET, SO_RTABLE, &rdomain,
+ sizeof(rdomain)) == -1) {
+ l2tpd_log(_l2tpd, LOG_ERR,
+ "setsockopt(,,SO_RTABLE) failed in %s(): %m",
__func__);
+ goto fail;
+ }
+ }
if (bind(sock, (struct sockaddr *)&_this->bind,
_this->bind.sin6.sin6_len) != 0) {
l2tpd_log(_l2tpd, LOG_ERR, "Binding %s/udp: %m",
@@ -401,9 +420,11 @@
l2tpd_io_event, _this);
event_add(&_this->ev_sock, NULL);
- l2tpd_log(_l2tpd, LOG_INFO, "Listening %s/udp (L2TP LNS) [%s]",
+ l2tpd_log(_l2tpd, LOG_INFO,
+ "Listening %s/udp (rdomain %i) (L2TP LNS) [%s]",
addrport_tostring((struct sockaddr *)&_this->bind,
- _this->bind.sin6.sin6_len, hbuf, sizeof(hbuf)), _this->tun_name);
+ _this->bind.sin6.sin6_len, hbuf, sizeof(hbuf)), rdomain,
+ _this->tun_name);
return 0;
fail:
diff -r fd7f48f39555 -r 90fa2a12bfaa usr.sbin/npppd/pptp/pptpd.c
--- usr.sbin/npppd/pptp/pptpd.c Fri Jan 15 13:38:16 2016 +0100
+++ usr.sbin/npppd/pptp/pptpd.c Fri Jan 15 14:02:05 2016 +0100
@@ -290,7 +290,8 @@
static int
pptpd_listener_start(pptpd_listener *_this)
{
- int sock, ival, sock_gre;
+ int sock, ival, sock_gre, rdomain;
+ char ifname[IF_NAMESIZE];
struct sockaddr_in bind_sin, bind_sin_gre;
int wildcardbinding;
@@ -327,6 +328,23 @@
"fcntl(F_SET_FL) failed at %s(): %m", __func__);
goto fail;
}
+ rdomain = 0;
+ get_ifname_by_sockaddr((struct sockaddr *)&_this->bind_sin, ifname);
+ if (strlen(ifname) > 0) {
+ if (ifname_get_rdomain(ifname, &rdomain) != 0) {
+ pptpd_log(_this->self, LOG_ERR,
+ "ifname_get_rdomain(%s) failed in %s()", ifname,
__func__);
+ goto fail;
+ }
+ }
+ if (rdomain != 0) {
+ if (setsockopt(sock, SOL_SOCKET, SO_RTABLE, &rdomain,
+ sizeof(rdomain)) == -1) {
+ pptpd_log(_this->self, LOG_ERR,
+ "setsockopt(,,SO_RTABLE) failed in %s(): %m",
__func__);
+ goto fail;
+ }
+ }
if (bind(sock, (struct sockaddr *)&_this->bind_sin,
_this->bind_sin.sin_len) != 0) {
pptpd_log(_this->self, LOG_ERR,
@@ -376,6 +394,14 @@
"fcntl(F_SET_FL) failed at %s(): %m", __func__);
goto fail;
}
+ if (rdomain != 0) {
+ if (setsockopt(sock_gre, SOL_SOCKET, SO_RTABLE, &rdomain,
+ sizeof(rdomain)) == -1) {
+ pptpd_log(_this->self, LOG_ERR,
+ "setsockopt(,,SO_RTABLE) failed in %s(): %m",
__func__);
+ goto fail;
+ }
+ }
if (bind(sock_gre, (struct sockaddr *)&bind_sin_gre,
bind_sin_gre.sin_len) != 0) {
pptpd_log(_this->self, LOG_ERR,