Merge branch 'common-cvs-git-upstream' into fdn-mods
[l2tpns.git] / radius.c
index e337a75..02b29b7 100644 (file)
--- a/radius.c
+++ b/radius.c
@@ -1,7 +1,5 @@
 // L2TPNS Radius Stuff
 
-char const *cvs_id_radius = "$Id: radius.c,v 1.56 2009/12/08 14:49:28 bodea Exp $";
-
 #include <time.h>
 #include <stdio.h>
 #include <sys/types.h>
@@ -365,6 +363,13 @@ void radiussend(uint16_t r, uint8_t state)
                                }
                        }
 
+                       if (session[s].classlen) {
+                               *p = 25;        // class
+                               p[1] = session[s].classlen + 2;
+                               memcpy(p + 2, session[s].class, session[s].classlen);
+                               p += p[1];
+                       }
+
                        {
                                struct param_radius_account acct = { &tunnel[session[s].tunnel], &session[s], &p };
                                run_plugins(PLUGIN_RADIUS_ACCOUNT, &acct);
@@ -723,7 +728,7 @@ void processrad(uint8_t *buf, int len, char socket_index)
                                                else if (ip)
                                                {
                                                        LOG(3, s, session[s].tunnel, "   Radius reply contains route for %s/%d\n",
-                                                               fmtaddr(htonl(ip), 0), bits, 1));
+                                                               fmtaddr(htonl(ip), 0), bits);
                                                        
                                                        session[s].route[routes].ip = ip;
                                                        session[s].route[routes].prefixlen = bits;
@@ -809,6 +814,15 @@ void processrad(uint8_t *buf, int len, char socket_index)
                                                        session[s].ipv6prefixlen = prefixlen;
                                                }
                                        }
+                                       else if (*p == 25)
+                                       {
+                                               // Class
+                                               if (p[1] < 3) continue;
+                                               session[s].classlen = p[1] - 2;
+                                               if (session[s].classlen > MAXCLASS)
+                                                       session[s].classlen = MAXCLASS;
+                                               memcpy(session[s].class, p + 2, session[s].classlen);
+                                       }
                                }
                        }
                        else if (r_code == AccessReject)