summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Grishenko <themiron@mail.ru>2020-01-11 01:57:14 +0500
committerVladislav Grishenko <themiron@mail.ru>2020-01-11 01:57:14 +0500
commitf532c72d0cb33b16b9794d83a46969538bdf2596 (patch)
treebcfab735d95546e9992aafb3303e360893a9a140
parent70952034ecaf0ecb732052d6837f7a4c084ba7bc (diff)
downloadaccel-ppp-f532c72d0cb33b16b9794d83a46969538bdf2596.tar.gz
accel-ppp-f532c72d0cb33b16b9794d83a46969538bdf2596.zip
ipv6pool: add per-proto ipv6-pool and ipv6-pool-delegate options
also, disable ipv6 pools via chap-secrets, need to find another syntax for it, may be with comments.
-rw-r--r--accel-pppd/accel-ppp.conf8
-rw-r--r--accel-pppd/ctrl/ipoe/ipoe.c16
-rw-r--r--accel-pppd/ctrl/l2tp/l2tp.c25
-rw-r--r--accel-pppd/ctrl/pppoe/pppoe.c8
-rw-r--r--accel-pppd/ctrl/pptp/pptp.c8
-rw-r--r--accel-pppd/ctrl/sstp/sstp.c8
-rw-r--r--accel-pppd/extra/chap-secrets.c8
-rw-r--r--accel-pppd/extra/ipv6pool.c8
-rw-r--r--accel-pppd/include/ap_session.h2
-rw-r--r--accel-pppd/session.c6
10 files changed, 85 insertions, 12 deletions
diff --git a/accel-pppd/accel-ppp.conf b/accel-pppd/accel-ppp.conf
index e9fe77c..a54731c 100644
--- a/accel-pppd/accel-ppp.conf
+++ b/accel-pppd/accel-ppp.conf
@@ -83,6 +83,8 @@ called-sid=mac
#tr101=1
#padi-limit=0
#ip-pool=pppoe
+#ipv6-pool=pppoe
+#ipv6-pool-delegate=pppoe
#ifname=pppoe%d
#sid-uppercase=0
#vlan-mon=eth0,10-200
@@ -106,6 +108,8 @@ verbose=1
#dataseq=allow
#reorder-timeout=0
#ip-pool=l2tp
+#ipv6-pool=l2tp
+#ipv6-pool-delegate=l2tp
#ifname=l2tp%d
[sstp]
@@ -127,6 +131,8 @@ verbose=1
#timeout=60
#hello-interval=60
#ip-pool=sstp
+#ipv6-pool=sstp
+#ipv6-pool-delegate=sstp
#ifname=sstp%d
[ipoe]
@@ -170,6 +176,8 @@ start=dhcpv4
#vlan-timeout=60
#vlan-name=%I.%N
#ip-pool=ipoe
+#ipv6-pool=ipoe
+#ipv6-pool-delegate=ipoe
#idle-timeout=0
#session-timeout=0
#soft-terminate=0
diff --git a/accel-pppd/ctrl/ipoe/ipoe.c b/accel-pppd/ctrl/ipoe/ipoe.c
index 45f66b7..b1504a2 100644
--- a/accel-pppd/ctrl/ipoe/ipoe.c
+++ b/accel-pppd/ctrl/ipoe/ipoe.c
@@ -119,6 +119,8 @@ static int conf_arp;
static int conf_ipv6;
static uint32_t conf_src;
static const char *conf_ip_pool;
+static const char *conf_ipv6_pool;
+static const char *conf_dpv6_pool;
static const char *conf_l4_redirect_pool;
//static int conf_dhcpv6;
static int conf_username;
@@ -1366,6 +1368,10 @@ static struct ipoe_session *ipoe_session_create_dhcpv4(struct ipoe_serv *serv, s
if (conf_ip_pool)
ses->ses.ipv4_pool_name = _strdup(conf_ip_pool);
+ if (conf_ipv6_pool)
+ ses->ses.ipv6_pool_name = _strdup(conf_ipv6_pool);
+ if (conf_dpv6_pool)
+ ses->ses.dpv6_pool_name = _strdup(conf_dpv6_pool);
triton_context_register(&ses->ctx, &ses->ses);
@@ -2073,6 +2079,10 @@ static struct ipoe_session *ipoe_session_create_up(struct ipoe_serv *serv, struc
if (conf_ip_pool)
ses->ses.ipv4_pool_name = _strdup(conf_ip_pool);
+ if (conf_ipv6_pool)
+ ses->ses.ipv6_pool_name = _strdup(conf_ipv6_pool);
+ if (conf_dpv6_pool)
+ ses->ses.dpv6_pool_name = _strdup(conf_dpv6_pool);
ses->ctrl.dont_ifcfg = 1;
@@ -2118,6 +2128,10 @@ static void ipoe_session_create_auto(struct ipoe_serv *serv)
if (conf_ip_pool)
ses->ses.ipv4_pool_name = _strdup(conf_ip_pool);
+ if (conf_ipv6_pool)
+ ses->ses.ipv6_pool_name = _strdup(conf_ipv6_pool);
+ if (conf_dpv6_pool)
+ ses->ses.dpv6_pool_name = _strdup(conf_dpv6_pool);
ses->ctrl.dont_ifcfg = 1;
@@ -3915,6 +3929,8 @@ static void load_config(void)
conf_offer_timeout = 10;
conf_ip_pool = conf_get_opt("ipoe", "ip-pool");
+ conf_ipv6_pool = conf_get_opt("ipoe", "ipv6-pool");
+ conf_dpv6_pool = conf_get_opt("ipoe", "ipv6-pool-delegate");
conf_l4_redirect_pool = conf_get_opt("ipoe", "l4-redirect-ip-pool");
conf_vlan_name = conf_get_opt("ipoe", "vlan-name");
diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c
index 6c10848..0d1ca21 100644
--- a/accel-pppd/ctrl/l2tp/l2tp.c
+++ b/accel-pppd/ctrl/l2tp/l2tp.c
@@ -94,6 +94,8 @@ static int conf_mppe = MPPE_UNSET;
static int conf_dataseq = L2TP_DATASEQ_ALLOW;
static int conf_reorder_timeout = 0;
static const char *conf_ip_pool;
+static const char *conf_ipv6_pool;
+static const char *conf_dpv6_pool;
static const char *conf_ifname;
static unsigned int stat_conn_starting;
@@ -1791,12 +1793,23 @@ static int l2tp_session_start_data_channel(struct l2tp_sess_t *sess)
if (conf_ip_pool) {
sess->ppp.ses.ipv4_pool_name = _strdup(conf_ip_pool);
if (sess->ppp.ses.ipv4_pool_name == NULL) {
+ err_pool:
log_session(log_error, sess,
"impossible to start data channel:"
- " allocation of IPv4 pool name failed\n");
+ " allocation of pool name failed\n");
goto err;
}
}
+ if (conf_ipv6_pool) {
+ sess->ppp.ses.ipv6_pool_name = _strdup(conf_ipv6_pool);
+ if (sess->ppp.ses.ipv6_pool_name == NULL)
+ goto err_pool;
+ }
+ if (conf_dpv6_pool) {
+ sess->ppp.ses.dpv6_pool_name = _strdup(conf_dpv6_pool);
+ if (sess->ppp.ses.dpv6_pool_name == NULL)
+ goto err_pool;
+ }
if (conf_ifname)
sess->ppp.ses.ifname_rename = _strdup(conf_ifname);
@@ -1836,6 +1849,14 @@ err:
_free(sess->ppp.ses.ipv4_pool_name);
sess->ppp.ses.ipv4_pool_name = NULL;
}
+ if (sess->ppp.ses.ipv6_pool_name) {
+ _free(sess->ppp.ses.ipv6_pool_name);
+ sess->ppp.ses.ipv6_pool_name = NULL;
+ }
+ if (sess->ppp.ses.dpv6_pool_name) {
+ _free(sess->ppp.ses.dpv6_pool_name);
+ sess->ppp.ses.dpv6_pool_name = NULL;
+ }
if (sess->ctrl.called_station_id) {
_free(sess->ctrl.called_station_id);
sess->ctrl.called_station_id = NULL;
@@ -4938,6 +4959,8 @@ static void load_config(void)
}
conf_ip_pool = conf_get_opt("l2tp", "ip-pool");
+ conf_ipv6_pool = conf_get_opt("l2tp", "ipv6-pool");
+ conf_dpv6_pool = conf_get_opt("l2tp", "ipv6-pool-delegate");
conf_ifname = conf_get_opt("l2tp", "ifname");
switch (iprange_check_activation()) {
diff --git a/accel-pppd/ctrl/pppoe/pppoe.c b/accel-pppd/ctrl/pppoe/pppoe.c
index 12b5400..120e161 100644
--- a/accel-pppd/ctrl/pppoe/pppoe.c
+++ b/accel-pppd/ctrl/pppoe/pppoe.c
@@ -98,6 +98,8 @@ int conf_padi_limit = 0;
int conf_mppe = MPPE_UNSET;
int conf_sid_uppercase = 0;
static const char *conf_ip_pool;
+static const char *conf_ipv6_pool;
+static const char *conf_dpv6_pool;
static const char *conf_ifname;
enum {CSID_MAC, CSID_IFNAME, CSID_IFNAME_MAC};
static int conf_called_sid;
@@ -408,6 +410,10 @@ static struct pppoe_conn_t *allocate_channel(struct pppoe_serv_t *serv, const ui
if (conf_ip_pool)
conn->ppp.ses.ipv4_pool_name = _strdup(conf_ip_pool);
+ if (conf_ipv6_pool)
+ conn->ppp.ses.ipv6_pool_name = _strdup(conf_ipv6_pool);
+ if (conf_dpv6_pool)
+ conn->ppp.ses.dpv6_pool_name = _strdup(conf_dpv6_pool);
if (conf_ifname)
conn->ppp.ses.ifname_rename = _strdup(conf_ifname);
@@ -2014,6 +2020,8 @@ static void load_config(void)
}
conf_ip_pool = conf_get_opt("pppoe", "ip-pool");
+ conf_ipv6_pool = conf_get_opt("pppoe", "ipv6-pool");
+ conf_dpv6_pool = conf_get_opt("pppoe", "ipv6-pool-delegate");
conf_ifname = conf_get_opt("pppoe", "ifname");
conf_called_sid = CSID_MAC;
diff --git a/accel-pppd/ctrl/pptp/pptp.c b/accel-pppd/ctrl/pptp/pptp.c
index 081e921..1161da5 100644
--- a/accel-pppd/ctrl/pptp/pptp.c
+++ b/accel-pppd/ctrl/pptp/pptp.c
@@ -63,6 +63,8 @@ static int conf_echo_failure = 3;
static int conf_verbose = 0;
static int conf_mppe = MPPE_UNSET;
static const char *conf_ip_pool;
+static const char *conf_ipv6_pool;
+static const char *conf_dpv6_pool;
static const char *conf_ifname;
static mempool_t conn_pool;
@@ -713,6 +715,10 @@ static int pptp_connect(struct triton_md_handler_t *h)
if (conf_ip_pool)
conn->ppp.ses.ipv4_pool_name = _strdup(conf_ip_pool);
+ if (conf_ipv6_pool)
+ conn->ppp.ses.ipv6_pool_name = _strdup(conf_ipv6_pool);
+ if (conf_dpv6_pool)
+ conn->ppp.ses.dpv6_pool_name = _strdup(conf_dpv6_pool);
if (conf_ifname)
conn->ppp.ses.ifname_rename = _strdup(conf_ifname);
@@ -802,6 +808,8 @@ static void load_config(void)
}
conf_ip_pool = conf_get_opt("pptp", "ip-pool");
+ conf_ipv6_pool = conf_get_opt("pptp", "ipv6-pool");
+ conf_dpv6_pool = conf_get_opt("pptp", "ipv6-pool-delegate");
conf_ifname = conf_get_opt("pptp", "ifname");
switch (iprange_check_activation()) {
diff --git a/accel-pppd/ctrl/sstp/sstp.c b/accel-pppd/ctrl/sstp/sstp.c
index 62e574c..5bf8fd8 100644
--- a/accel-pppd/ctrl/sstp/sstp.c
+++ b/accel-pppd/ctrl/sstp/sstp.c
@@ -159,6 +159,8 @@ static int conf_hello_interval = SSTP_HELLO_TIMEOUT;
static int conf_verbose = 0;
static int conf_ppp_max_mtu = 1452;
static const char *conf_ip_pool;
+static const char *conf_ipv6_pool;
+static const char *conf_dpv6_pool;
static const char *conf_ifname;
static int conf_proxyproto = 0;
@@ -2276,6 +2278,10 @@ static int sstp_connect(struct triton_md_handler_t *h)
conn->ppp.ses.chan_name = _strdup(addr_buf);
if (conf_ip_pool)
conn->ppp.ses.ipv4_pool_name = _strdup(conf_ip_pool);
+ if (conf_ipv6_pool)
+ conn->ppp.ses.ipv6_pool_name = _strdup(conf_ipv6_pool);
+ if (conf_dpv6_pool)
+ conn->ppp.ses.dpv6_pool_name = _strdup(conf_dpv6_pool);
if (conf_ifname)
conn->ppp.ses.ifname_rename = _strdup(conf_ifname);
@@ -2693,6 +2699,8 @@ static void load_config(void)
conf_ppp_max_mtu = atoi(opt);
conf_ip_pool = conf_get_opt("sstp", "ip-pool");
+ conf_ipv6_pool = conf_get_opt("sstp", "ipv6-pool");
+ conf_dpv6_pool = conf_get_opt("sstp", "ipv6-pool-delegate");
conf_ifname = conf_get_opt("sstp", "ifname");
ipmode = (serv.addr.u.sa.sa_family == AF_INET && !conf_proxyproto) ?
diff --git a/accel-pppd/extra/chap-secrets.c b/accel-pppd/extra/chap-secrets.c
index 2d8593c..0fadc9c 100644
--- a/accel-pppd/extra/chap-secrets.c
+++ b/accel-pppd/extra/chap-secrets.c
@@ -313,12 +313,14 @@ static struct ipv4db_item_t *get_ip(struct ap_session *ses)
if (ses->ipv4_pool_name)
_free(ses->ipv4_pool_name);
ses->ipv4_pool_name = _strdup(pd->pool);
+/* TODO: wrong to use same pool name, but there's no other syntax
if (ses->ipv6_pool_name)
_free(ses->ipv6_pool_name);
ses->ipv6_pool_name = _strdup(pd->pool);
- if (ses->ipv6_dppool_name)
- _free(ses->ipv6_dppool_name);
- ses->ipv6_dppool_name = _strdup(pd->pool);
+ if (ses->dpv6_pool_name)
+ _free(ses->dpv6_pool_name);
+ ses->dpv6_pool_name = _strdup(pd->pool);
+*/
return NULL;
} else if (!pd->ip.peer_addr)
return NULL;
diff --git a/accel-pppd/extra/ipv6pool.c b/accel-pppd/extra/ipv6pool.c
index f00dbcf..a2cf30d 100644
--- a/accel-pppd/extra/ipv6pool.c
+++ b/accel-pppd/extra/ipv6pool.c
@@ -302,7 +302,7 @@ static struct ipv6db_prefix_t *get_dp(struct ap_session *ses)
struct ippool_t *pool;
if (ses->ipv6_pool_name)
- pool = find_pool(IPPOOL_PREFIX, ses->ipv6_dppool_name, 0);
+ pool = find_pool(IPPOOL_PREFIX, ses->dpv6_pool_name, 0);
else
pool = def_dppool;
@@ -356,9 +356,9 @@ static void ev_radius_access_accept(struct ev_radius_t *ev)
continue;
if (conf_dppool_attr && conf_dppool_attr == attr->attr->id) {
- if (ses->ipv6_dppool_name)
- _free(ses->ipv6_dppool_name);
- ses->ipv6_dppool_name = _strdup(attr->val.string);
+ if (ses->dpv6_pool_name)
+ _free(ses->dpv6_pool_name);
+ ses->dpv6_pool_name = _strdup(attr->val.string);
} else
if (conf_ippool_attr && conf_ippool_attr == attr->attr->id) {
if (ses->ipv6_pool_name)
diff --git a/accel-pppd/include/ap_session.h b/accel-pppd/include/ap_session.h
index cf49e32..6a6b950 100644
--- a/accel-pppd/include/ap_session.h
+++ b/accel-pppd/include/ap_session.h
@@ -84,7 +84,7 @@ struct ap_session
struct ipv6db_prefix_t *ipv6_dp;
char *ipv4_pool_name;
char *ipv6_pool_name;
- char *ipv6_dppool_name;
+ char *dpv6_pool_name;
struct ap_net *net;
const struct ap_ctrl *ctrl;
diff --git a/accel-pppd/session.c b/accel-pppd/session.c
index 8326ffa..81247d1 100644
--- a/accel-pppd/session.c
+++ b/accel-pppd/session.c
@@ -239,9 +239,9 @@ void __export ap_session_finished(struct ap_session *ses)
ses->ipv6_pool_name = NULL;
}
- if (ses->ipv6_dppool_name) {
- _free(ses->ipv6_dppool_name);
- ses->ipv6_dppool_name = NULL;
+ if (ses->dpv6_pool_name) {
+ _free(ses->dpv6_pool_name);
+ ses->dpv6_pool_name = NULL;
}
if (ses->ifname_rename) {