summaryrefslogtreecommitdiff
path: root/accel-pppd/radius/dm_coa.c
diff options
context:
space:
mode:
authorKozlov Dmitry <xeb@mail.ru>2012-07-13 12:38:38 +0400
committerKozlov Dmitry <xeb@mail.ru>2012-07-13 12:38:38 +0400
commit00e44c01c236a0e805add33dc983c270315dd7c7 (patch)
tree3cd4102fb6a0a52e31faa93978c011f36c406b2d /accel-pppd/radius/dm_coa.c
parentbd15694dbb3c455b49c095e3d697bedece309cc5 (diff)
parent178b27b0b6d60afdc5039dc3d995f4ad000b5486 (diff)
downloadaccel-ppp-00e44c01c236a0e805add33dc983c270315dd7c7.tar.gz
accel-ppp-00e44c01c236a0e805add33dc983c270315dd7c7.zip
Merge commit '178b27b0b6d60afdc5039dc3d995f4ad000b5486'
* commit '178b27b0b6d60afdc5039dc3d995f4ad000b5486': radius: update Class attribute by CoA request
Diffstat (limited to 'accel-pppd/radius/dm_coa.c')
-rw-r--r--accel-pppd/radius/dm_coa.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/accel-pppd/radius/dm_coa.c b/accel-pppd/radius/dm_coa.c
index a2757362..68ec0dcf 100644
--- a/accel-pppd/radius/dm_coa.c
+++ b/accel-pppd/radius/dm_coa.c
@@ -145,6 +145,8 @@ static void disconnect_request(struct radius_pd_t *rpd)
static void coa_request(struct radius_pd_t *rpd)
{
+ struct rad_attr_t *class;
+ void *prev_class;
struct ev_radius_t ev = {
.ses = rpd->ses,
.request = rpd->dm_coa_req,
@@ -159,8 +161,30 @@ static void coa_request(struct radius_pd_t *rpd)
if (ev.res)
dm_coa_send_nak(serv.hnd.fd, rpd->dm_coa_req, &rpd->dm_coa_addr, 0);
- else
+ else {
+ class = rad_packet_find_attr(rpd->dm_coa_req, NULL, "Class");
+ if (class) {
+ prev_class = rpd->attr_class;
+
+ if (rpd->attr_class_len < class->len) {
+ if (rpd->attr_class)
+ _free(rpd->attr_class);
+ rpd->attr_class = _malloc(class->len);
+ }
+
+ memcpy(rpd->attr_class, class->val.octets, class->len);
+ rpd->attr_class_len = class->len;
+ }
+
+ if (rpd->acct_req && rpd->acct_req->pack) {
+ if (prev_class)
+ rad_packet_change_octets(rpd->acct_req->pack, NULL, "Class", rpd->attr_class, rpd->attr_class_len);
+ else
+ rad_packet_add_octets(rpd->acct_req->pack, NULL, "Class", rpd->attr_class, rpd->attr_class_len);
+ }
+
dm_coa_send_ack(serv.hnd.fd, rpd->dm_coa_req, &rpd->dm_coa_addr);
+ }
rad_packet_free(rpd->dm_coa_req);