From 8e7bfa9a779d86500991ecad0cebdc1a1ac67ee7 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Thu, 3 Nov 2022 13:27:51 +0100 Subject: [PATCH] Add mp_mrru option Some equipments seem not able to actually put options in Configure-Reject messages, so we then have to disable MRRU by hand. --- docs/manpages/startup-config.5 | 8 ++++++++ docs/src/html/manual.md | 4 ++++ etc/startup-config.default | 3 +++ l2tpns.c | 10 ++++++++-- l2tpns.h | 1 + pppoe.c | 7 +++++-- 6 files changed, 29 insertions(+), 4 deletions(-) diff --git a/docs/manpages/startup-config.5 b/docs/manpages/startup-config.5 index 050179c..ccc3143 100644 --- a/docs/manpages/startup-config.5 +++ b/docs/manpages/startup-config.5 @@ -233,6 +233,14 @@ MTU of interface for L2TP traffic (default: 1500). Used to set link MRU and adju \f[R] .fi .PP +\f[B]mp_mrru\f[R] (int) +.IP +.nf +\f[C] +MRRU for MP traffic (default: 1614). Can be set to 0 to disable MP negociation. +\f[R] +.fi +.PP \f[B]l2tp_secret\f[R] (string) .PP The secret used by l2tpns for authenticating tunnel request. diff --git a/docs/src/html/manual.md b/docs/src/html/manual.md index 262b3e9..e25c9c6 100644 --- a/docs/src/html/manual.md +++ b/docs/src/html/manual.md @@ -150,6 +150,10 @@ should be set by a line like: set configstring \"value\" set ipaddress : MTU of interface for L2TP traffic (default: `1500`). Used to set link MRU and adjust TCP MSS. +`mp_mrru` (int) + +: MRRU for MP traffic (default: `1614`). Can be set to 0 to disable MP negociation. + `ppp_restart_time` (int); `ppp_max_configure` (int); `ppp_max_failure` (int) : PPP counter and timer values, as described in ยง4.1 of diff --git a/etc/startup-config.default b/etc/startup-config.default index 87da7ca..2e8ed86 100644 --- a/etc/startup-config.default +++ b/etc/startup-config.default @@ -16,6 +16,9 @@ set l2tp_secret "secret" # MTU of interface for L2TP traffic #set l2tp_mtu 1500 +# MRRU for MP traffic +#set l2tp_mtu 1614 + # PPP counter and timer values #set ppp_restart_time 3 #set ppp_max_configure 10 diff --git a/l2tpns.c b/l2tpns.c index 8bbe46c..3d722e5 100644 --- a/l2tpns.c +++ b/l2tpns.c @@ -129,6 +129,7 @@ config_descriptt config_values[] = { CONFIG("random_device", random_device, STRING), CONFIG("l2tp_secret", l2tp_secret, STRING), CONFIG("l2tp_mtu", l2tp_mtu, INT), + CONFIG("mp_mrru", mp_mrru, INT), CONFIG("ppp_restart_time", ppp_restart_time, INT), CONFIG("ppp_max_configure", ppp_max_configure, INT), CONFIG("ppp_max_failure", ppp_max_failure, INT), @@ -3285,8 +3286,11 @@ void processudp(uint8_t *buf, int len, struct sockaddr_in *addr, uint16_t indexu sess_local[s].ppp_mru = MRU; // Set multilink options before sending initial LCP packet - sess_local[s].mp_mrru = 1614; - sess_local[s].mp_epdis = ntohl(config->iftun_address ? config->iftun_address : my_address); + sess_local[s].mp_mrru = config->mp_mrru; + if (config->mp_mrru) + sess_local[s].mp_epdis = ntohl(config->iftun_address ? config->iftun_address : my_address); + else + sess_local[s].mp_epdis = 0; sendlcp(s, t); change_state(s, lcp, RequestSent); @@ -5393,6 +5397,8 @@ static void update_config() else if (config->l2tp_mtu < MINMTU) config->l2tp_mtu = MINMTU; else if (config->l2tp_mtu > MAXMTU) config->l2tp_mtu = MAXMTU; + if (config->mp_mrru < 0) config->mp_mrru = 1614; // default + // reset MRU/MSS globals MRU = config->l2tp_mtu - L2TP_HDRS; if (MRU > PPPoE_MRU) diff --git a/l2tpns.h b/l2tpns.h index 7285fee..fa6111f 100644 --- a/l2tpns.h +++ b/l2tpns.h @@ -684,6 +684,7 @@ typedef struct char l2tp_secret[64]; // L2TP shared secret int l2tp_mtu; // MTU of interface used for L2TP + int mp_mrru; // MRRU of MP char random_device[256]; // random device path, defaults to RANDOMDEVICE diff --git a/pppoe.c b/pppoe.c index 28d0661..935bd0f 100644 --- a/pppoe.c +++ b/pppoe.c @@ -661,8 +661,11 @@ static void pppoe_recv_PADR(uint8_t *pack, int size) sess_local[sid].ppp_mru = MRU; // Set multilink options before sending initial LCP packet - sess_local[sid].mp_mrru = 1614; - sess_local[sid].mp_epdis = ntohl(config->iftun_address ? config->iftun_address : my_address); + sess_local[sid].mp_mrru = config->mp_mrru; + if (config->mp_mrru) + sess_local[sid].mp_epdis = ntohl(config->iftun_address ? config->iftun_address : my_address); + else + sess_local[sid].mp_epdis = 0; memcpy(session[sid].src_hwaddr, ethhdr->h_source, ETH_ALEN); pppoe_send_PADS(sid, ethhdr->h_source, host_uniq_tag, relay_sid_tag, service_name_tag);