summaryrefslogtreecommitdiff
path: root/accel-pppd
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pppd')
-rw-r--r--accel-pppd/ctrl/l2tp/l2tp.c5
-rw-r--r--accel-pppd/ctrl/l2tp/l2tp.h1
-rw-r--r--accel-pppd/ctrl/l2tp/packet.c17
3 files changed, 17 insertions, 6 deletions
diff --git a/accel-pppd/ctrl/l2tp/l2tp.c b/accel-pppd/ctrl/l2tp/l2tp.c
index 50523cfa..d8a98f8d 100644
--- a/accel-pppd/ctrl/l2tp/l2tp.c
+++ b/accel-pppd/ctrl/l2tp/l2tp.c
@@ -47,6 +47,7 @@
#define STATE_CLOSE 0
int conf_verbose = 0;
+int conf_avp_permissive = 0;
static int conf_timeout = 60;
static int conf_rtimeout = 5;
static int conf_retransmit = 5;
@@ -1157,6 +1158,10 @@ static void load_config(void)
if (opt && atoi(opt) > 0)
conf_verbose = 1;
+ opt = conf_get_opt("l2tp", "avp_permissive");
+ if (opt && atoi(opt) > 0)
+ conf_avp_permissive = 1;
+
opt = conf_get_opt("l2tp", "hello-interval");
if (opt && atoi(opt) > 0)
conf_hello_interval = atoi(opt);
diff --git a/accel-pppd/ctrl/l2tp/l2tp.h b/accel-pppd/ctrl/l2tp/l2tp.h
index ac9b8e0b..8a8cffdd 100644
--- a/accel-pppd/ctrl/l2tp/l2tp.h
+++ b/accel-pppd/ctrl/l2tp/l2tp.h
@@ -66,6 +66,7 @@ struct l2tp_packet_t
};
extern int conf_verbose;
+extern int conf_avp_permissive;
struct l2tp_dict_attr_t *l2tp_dict_find_attr_by_name(const char *name);
struct l2tp_dict_attr_t *l2tp_dict_find_attr_by_id(int id);
diff --git a/accel-pppd/ctrl/l2tp/packet.c b/accel-pppd/ctrl/l2tp/packet.c
index d3121188..f8a46e7f 100644
--- a/accel-pppd/ctrl/l2tp/packet.c
+++ b/accel-pppd/ctrl/l2tp/packet.c
@@ -172,19 +172,22 @@ int l2tp_recv(int fd, struct l2tp_packet_t **p, struct in_pktinfo *pkt_info)
if (hdr->L == 0) {
if (conf_verbose)
log_warn("l2tp: incorrect message received (L=0)\n");
- goto out_err_hdr;
+ if (!conf_avp_permissive)
+ goto out_err_hdr;
}
if (hdr->S == 0) {
if (conf_verbose)
log_warn("l2tp: incorrect message received (S=0)\n");
- goto out_err_hdr;
+ if (!conf_avp_permissive)
+ goto out_err_hdr;
}
if (hdr->O == 1) {
if (conf_verbose)
log_warn("l2tp: incorrect message received (O=1)\n");
- goto out_err_hdr;
+ if (!conf_avp_permissive)
+ goto out_err_hdr;
}
} else if (hdr->ver != 3) {
if (conf_verbose)
@@ -222,19 +225,21 @@ int l2tp_recv(int fd, struct l2tp_packet_t **p, struct in_pktinfo *pkt_info)
if (!da) {
if (conf_verbose)
log_warn("l2tp: unknown avp received (type=%i, M=%u)\n", ntohs(avp->type), avp->M);
- if (avp->M)
+ if (avp->M && !conf_avp_permissive)
goto out_err;
} else {
if (da->M != -1 && da->M != avp->M) {
if (conf_verbose)
log_warn("l2tp: incorrect avp received (type=%i, M=%i, must be %i)\n", ntohs(avp->type), avp->M, da->M);
- goto out_err;
+ if (!conf_avp_permissive)
+ goto out_err;
}
if (da->H != -1 && da->H != avp->H) {
if (conf_verbose)
log_warn("l2tp: incorrect avp received (type=%i, H=%i, must be %i)\n", ntohs(avp->type), avp->H, da->H);
- goto out_err;
+ if (!conf_avp_permissive)
+ goto out_err;
}
if (avp->H) {