提交 084510b3 编写于 作者: D Dmitry Kozlov

ipoe: calculate renew time if not specified

上级 2f881381
...@@ -1919,6 +1919,7 @@ static void ev_radius_access_accept(struct ev_radius_t *ev) ...@@ -1919,6 +1919,7 @@ static void ev_radius_access_accept(struct ev_radius_t *ev)
{ {
struct ipoe_session *ses = container_of(ev->ses, typeof(*ses), ses); struct ipoe_session *ses = container_of(ev->ses, typeof(*ses), ses);
struct rad_attr_t *attr; struct rad_attr_t *attr;
int lease_time_set = 0, renew_time_set = 0;
if (ev->ses->ctrl->type != CTRL_TYPE_IPOE) if (ev->ses->ctrl->type != CTRL_TYPE_IPOE)
return; return;
...@@ -1948,17 +1949,26 @@ static void ev_radius_access_accept(struct ev_radius_t *ev) ...@@ -1948,17 +1949,26 @@ static void ev_radius_access_accept(struct ev_radius_t *ev)
ses->l4_redirect = 1; ses->l4_redirect = 1;
} else if (attr->val.integer != 0) } else if (attr->val.integer != 0)
ses->l4_redirect = 1; ses->l4_redirect = 1;
} else if (attr->attr->id == conf_attr_dhcp_lease_time) } else if (attr->attr->id == conf_attr_dhcp_lease_time) {
ses->lease_time = attr->val.integer; ses->lease_time = attr->val.integer;
else if (attr->attr->id == conf_attr_dhcp_renew_time) lease_time_set = 1;
} else if (attr->attr->id == conf_attr_dhcp_renew_time) {
ses->renew_time = attr->val.integer; ses->renew_time = attr->val.integer;
else if (attr->attr->id == conf_attr_l4_redirect_table) renew_time_set = 1;
} else if (attr->attr->id == conf_attr_l4_redirect_table)
ses->l4_redirect_table = attr->val.integer; ses->l4_redirect_table = attr->val.integer;
else if (attr->attr->id == conf_attr_l4_redirect_ipset) { else if (attr->attr->id == conf_attr_l4_redirect_ipset) {
if (attr->attr->type == ATTR_TYPE_STRING) if (attr->attr->type == ATTR_TYPE_STRING)
ses->l4_redirect_ipset = _strdup(attr->val.string); ses->l4_redirect_ipset = _strdup(attr->val.string);
} }
} }
if (lease_time_set && !renew_time_set)
ses->renew_time = ses->lease_time / 2;
else if (renew_time_set && ses->renew_time > ses->lease_time) {
log_ppp_warn("ipoe: overriding renew time\n");
ses->renew_time = ses->lease_time / 2;
}
} }
static void ev_radius_coa(struct ev_radius_t *ev) static void ev_radius_coa(struct ev_radius_t *ev)
...@@ -1966,6 +1976,7 @@ static void ev_radius_coa(struct ev_radius_t *ev) ...@@ -1966,6 +1976,7 @@ static void ev_radius_coa(struct ev_radius_t *ev)
struct ipoe_session *ses = container_of(ev->ses, typeof(*ses), ses); struct ipoe_session *ses = container_of(ev->ses, typeof(*ses), ses);
struct rad_attr_t *attr; struct rad_attr_t *attr;
int l4_redirect; int l4_redirect;
int lease_time_set = 0, renew_time_set = 0;
if (ev->ses->ctrl->type != CTRL_TYPE_IPOE) if (ev->ses->ctrl->type != CTRL_TYPE_IPOE)
return; return;
...@@ -1981,11 +1992,13 @@ static void ev_radius_coa(struct ev_radius_t *ev) ...@@ -1981,11 +1992,13 @@ static void ev_radius_coa(struct ev_radius_t *ev)
} else if (strcmp(attr->attr->name, "Framed-IP-Address") == 0) { } else if (strcmp(attr->attr->name, "Framed-IP-Address") == 0) {
if (ses->ses.ipv4 && ses->ses.ipv4->peer_addr != attr->val.ipaddr) if (ses->ses.ipv4 && ses->ses.ipv4->peer_addr != attr->val.ipaddr)
ipoe_change_addr(ses, attr->val.ipaddr); ipoe_change_addr(ses, attr->val.ipaddr);
} else if (attr->attr->id == conf_attr_dhcp_lease_time) } else if (attr->attr->id == conf_attr_dhcp_lease_time) {
ses->lease_time = attr->val.integer; ses->lease_time = attr->val.integer;
else if (attr->attr->id == conf_attr_dhcp_renew_time) lease_time_set = 1;
} else if (attr->attr->id == conf_attr_dhcp_renew_time) {
ses->renew_time = attr->val.integer; ses->renew_time = attr->val.integer;
else if (attr->attr->id == conf_attr_l4_redirect_table) renew_time_set = 1;
} else if (attr->attr->id == conf_attr_l4_redirect_table)
ses->l4_redirect_table = attr->val.integer; ses->l4_redirect_table = attr->val.integer;
else if (attr->attr->id == conf_attr_l4_redirect_ipset) { else if (attr->attr->id == conf_attr_l4_redirect_ipset) {
if (attr->attr->type == ATTR_TYPE_STRING) { if (attr->attr->type == ATTR_TYPE_STRING) {
...@@ -1997,6 +2010,13 @@ static void ev_radius_coa(struct ev_radius_t *ev) ...@@ -1997,6 +2010,13 @@ static void ev_radius_coa(struct ev_radius_t *ev)
} }
} }
if (lease_time_set && !renew_time_set)
ses->renew_time = ses->lease_time / 2;
else if (renew_time_set && ses->renew_time > ses->lease_time) {
log_ppp_warn("ipoe: overriding renew time\n");
ses->renew_time = ses->lease_time / 2;
}
//if (l4_redirect && !ses->l4_redirect) || (!l4_redirect && ses->l4_redirect)) //if (l4_redirect && !ses->l4_redirect) || (!l4_redirect && ses->l4_redirect))
if (l4_redirect != ses->l4_redirect && ev->ses->state == AP_STATE_ACTIVE) if (l4_redirect != ses->l4_redirect && ev->ses->state == AP_STATE_ACTIVE)
ipoe_change_l4_redirect(ses, l4_redirect); ipoe_change_l4_redirect(ses, l4_redirect);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册