diff options
author | Dmitry Kozlov <xeb@mail.ru> | 2016-04-10 10:56:08 +0300 |
---|---|---|
committer | Dmitry Kozlov <xeb@mail.ru> | 2016-04-10 10:56:08 +0300 |
commit | fc098b3062badfd802f91241533069cad4886b6f (patch) | |
tree | a973fa494e6dde3945710b394044d4b33095495e | |
parent | 950c13a76e76438d6dd40a8e716ad351e546ed46 (diff) | |
download | accel-ppp-xebd-fc098b3062badfd802f91241533069cad4886b6f.tar.gz accel-ppp-xebd-fc098b3062badfd802f91241533069cad4886b6f.zip |
pppoe: do not negotiate LCP MRU option if it is larger than 1492
-rw-r--r-- | accel-pppd/ctrl/pppoe/pppoe.c | 1 | ||||
-rw-r--r-- | accel-pppd/include/ap_session.h | 1 | ||||
-rw-r--r-- | accel-pppd/ppp/lcp_opt_mru.c | 21 |
3 files changed, 17 insertions, 6 deletions
diff --git a/accel-pppd/ctrl/pppoe/pppoe.c b/accel-pppd/ctrl/pppoe/pppoe.c index a4d1ca9..c130f84 100644 --- a/accel-pppd/ctrl/pppoe/pppoe.c +++ b/accel-pppd/ctrl/pppoe/pppoe.c @@ -341,6 +341,7 @@ static struct pppoe_conn_t *allocate_channel(struct pppoe_serv_t *serv, const ui conn->ctrl.finished = ppp_finished; conn->ctrl.terminate = ppp_terminate; conn->ctrl.max_mtu = min(ETH_DATA_LEN, serv->mtu) - 8; + conn->ctrl.no_lcp_mru = conn->ctrl.max_mtu > (ETH_DATA_LEN - 8); conn->ctrl.type = CTRL_TYPE_PPPOE; conn->ctrl.ppp = 1; conn->ctrl.name = "pppoe"; diff --git a/accel-pppd/include/ap_session.h b/accel-pppd/include/ap_session.h index 0baaab2..c9f6821 100644 --- a/accel-pppd/include/ap_session.h +++ b/accel-pppd/include/ap_session.h @@ -50,6 +50,7 @@ struct ap_ctrl { char *called_station_id; int dont_ifcfg:1; int ppp:1; + int no_lcp_mru:1; void (*started)(struct ap_session*); void (*finished)(struct ap_session *); int (*terminate)(struct ap_session *, int hard); diff --git a/accel-pppd/ppp/lcp_opt_mru.c b/accel-pppd/ppp/lcp_opt_mru.c index 5f19bb2..56c8b6c 100644 --- a/accel-pppd/ppp/lcp_opt_mru.c +++ b/accel-pppd/ppp/lcp_opt_mru.c @@ -54,12 +54,21 @@ static struct lcp_option_t *mru_init(struct ppp_lcp_t *lcp) struct mru_option_t *mru_opt = _malloc(sizeof(*mru_opt)); memset(mru_opt, 0, sizeof(*mru_opt)); - mru_opt->mru = (conf_mru && conf_mru <= lcp->ppp->ses.ctrl->max_mtu) ? conf_mru : lcp->ppp->ses.ctrl->max_mtu; - if (mru_opt->mru > conf_max_mtu) - mru_opt->mru = conf_max_mtu; - mru_opt->mtu = (conf_mtu && conf_mtu <= lcp->ppp->ses.ctrl->max_mtu) ? conf_mtu : lcp->ppp->ses.ctrl->max_mtu; - if (mru_opt->mtu > conf_max_mtu) - mru_opt->mtu = conf_max_mtu; + if (lcp->ppp->ses.ctrl->no_lcp_mru) { + mru_opt->mru = lcp->ppp->ses.ctrl->max_mtu; + mru_opt->mtu = lcp->ppp->ses.ctrl->max_mtu; + lcp->ppp->mru = mru_opt->mru; + lcp->ppp->mtu = mru_opt->mtu; + mru_opt->naked = 1; + } else { + mru_opt->mru = (conf_mru && conf_mru <= lcp->ppp->ses.ctrl->max_mtu) ? conf_mru : lcp->ppp->ses.ctrl->max_mtu; + if (mru_opt->mru > conf_max_mtu) + mru_opt->mru = conf_max_mtu; + mru_opt->mtu = (conf_mtu && conf_mtu <= lcp->ppp->ses.ctrl->max_mtu) ? conf_mtu : lcp->ppp->ses.ctrl->max_mtu; + if (mru_opt->mtu > conf_max_mtu) + mru_opt->mtu = conf_max_mtu; + } + mru_opt->opt.id = CI_MRU; mru_opt->opt.len = 4; |