From 974f6a33e3983880051470d1676745fd136f5d61 Mon Sep 17 00:00:00 2001 From: Dmitry Kozlov Date: Tue, 4 Apr 2017 11:59:23 +0300 Subject: ipoe: implemented ability to change ipset by CoA For this need to send 2 attributes: L4-Redirect=1,L4-Redirect-Ipset=new-set --- accel-pppd/ctrl/ipoe/ipoe.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) (limited to 'accel-pppd/ctrl/ipoe/ipoe.c') diff --git a/accel-pppd/ctrl/ipoe/ipoe.c b/accel-pppd/ctrl/ipoe/ipoe.c index 6834071f..62c06f0f 100644 --- a/accel-pppd/ctrl/ipoe/ipoe.c +++ b/accel-pppd/ctrl/ipoe/ipoe.c @@ -2179,8 +2179,9 @@ static void ev_radius_coa(struct ev_radius_t *ev) { struct ipoe_session *ses = container_of(ev->ses, typeof(*ses), ses); struct rad_attr_t *attr; - int l4_redirect; + int l4_redirect = -1; int lease_time_set = 0, renew_time_set = 0; + char *ipset = NULL; if (ev->ses->ctrl->type != CTRL_TYPE_IPOE) return; @@ -2190,9 +2191,9 @@ static void ev_radius_coa(struct ev_radius_t *ev) list_for_each_entry(attr, &ev->request->attrs, entry) { if (attr->attr->id == conf_attr_l4_redirect) { if (attr->attr->type == ATTR_TYPE_STRING) - ses->l4_redirect = attr->len && attr->val.string[0] != '0'; + l4_redirect = attr->len && attr->val.string[0] != '0'; else - ses->l4_redirect = ((unsigned int)attr->val.integer) > 0; + l4_redirect = ((unsigned int)attr->val.integer) > 0; } else if (strcmp(attr->attr->name, "Framed-IP-Address") == 0) { if (ses->ses.ipv4 && ses->ses.ipv4->peer_addr != attr->val.ipaddr) ipoe_change_addr(ses, attr->val.ipaddr); @@ -2206,10 +2207,8 @@ static void ev_radius_coa(struct ev_radius_t *ev) ses->l4_redirect_table = attr->val.integer; else if (attr->attr->id == conf_attr_l4_redirect_ipset) { if (attr->attr->type == ATTR_TYPE_STRING) { - if (ses->l4_redirect_ipset && strcmp(ses->l4_redirect_ipset, attr->val.string)) { - _free(ses->l4_redirect_ipset); - ses->l4_redirect_ipset = _strdup(attr->val.string); - } + if (!ses->l4_redirect_ipset || strcmp(ses->l4_redirect_ipset, attr->val.string)) + ipset = attr->val.string; } } } @@ -2221,9 +2220,23 @@ static void ev_radius_coa(struct ev_radius_t *ev) ses->renew_time = ses->lease_time / 2; } - //if (l4_redirect && !ses->l4_redirect) || (!l4_redirect && ses->l4_redirect)) - if (l4_redirect != ses->l4_redirect && ev->ses->state == AP_STATE_ACTIVE) - ipoe_change_l4_redirect(ses, l4_redirect); + if (l4_redirect >= 0 && ev->ses->state == AP_STATE_ACTIVE) { + if (ses->l4_redirect && l4_redirect && ipset) { + ipoe_change_l4_redirect(ses, 1); + ses->l4_redirect = 0; + } + + if (ipset) { + if (ses->l4_redirect_ipset) + _free(ses->l4_redirect_ipset); + ses->l4_redirect_ipset = _strdup(ipset); + } + + if (l4_redirect != ses->l4_redirect ) { + ipoe_change_l4_redirect(ses, l4_redirect == 0); + ses->l4_redirect = l4_redirect; + } + } } static int ipoe_rad_send_acct_request(struct rad_plugin_t *rad, struct rad_packet_t *pack) -- cgit v1.2.3