send nsctl responses back using the correct source address
[l2tpns.git] / radius.c
index 55aa6cb..6cb9e16 100644 (file)
--- a/radius.c
+++ b/radius.c
@@ -1,6 +1,6 @@
 // L2TPNS Radius Stuff
 
-char const *cvs_id_radius = "$Id: radius.c,v 1.44 2005/10/11 09:04:53 bodea Exp $";
+char const *cvs_id_radius = "$Id: radius.c,v 1.47 2005/12/19 06:18:13 bodea Exp $";
 
 #include <time.h>
 #include <stdio.h>
@@ -304,20 +304,30 @@ void radiussend(uint16_t r, uint8_t state)
                                p[1] = 6;
                                *(uint32_t *) (p + 2) = htonl(session[s].cout_wrap);
                                p += p[1];
+                       }
 
-                               {
-                                       struct param_radius_account acct = { &tunnel[session[s].tunnel], &session[s], &p };
-                                       run_plugins(PLUGIN_RADIUS_ACCOUNT, &acct);
-                               }
+                       {
+                               struct param_radius_account acct = { &tunnel[session[s].tunnel], &session[s], &p };
+                               run_plugins(PLUGIN_RADIUS_ACCOUNT, &acct);
                        }
                }
        }
        if (s)
        {
-               *p = 5; // NAS-Port
+               *p = 5;         // NAS-Port
                p[1] = 6;
                *(uint32_t *) (p + 2) = htonl(s);
                p += p[1];
+
+               *p = 6;         // Service-Type
+               p[1] = 6;
+               *(uint32_t *) (p + 2) = htonl(2); // Framed-User
+               p += p[1];
+                  
+               *p = 7;         // Framed-Protocol
+               p[1] = 6;
+               *(uint32_t *) (p + 2) = htonl(1); // PPP
+               p += p[1];
        }
        if (s && session[s].ip)
        {
@@ -326,6 +336,30 @@ void radiussend(uint16_t r, uint8_t state)
                *(uint32_t *) (p + 2) = htonl(session[s].ip);
                p += p[1];
        }
+       if (s && session[s].route[0].ip)
+       {
+               int r;
+               for (r = 0; s && r < MAXROUTE && session[s].route[r].ip; r++)
+               {
+                       int width = 32;
+                       if (session[s].route[r].mask)
+                       {
+                           int mask = session[s].route[r].mask;
+                           while (!(mask & 1))
+                           {
+                               width--;
+                               mask >>= 1;
+                           }
+                       }
+
+                       *p = 22;        // Framed-Route
+                       p[1] = sprintf((char *) p + 2, "%s/%d %s 1",
+                               fmtaddr(htonl(session[s].route[r].ip), 0),
+                               width, fmtaddr(htonl(session[s].ip), 1)) + 2;
+
+                       p += p[1];
+               }
+       }
        if (*session[s].called)
        {
                *p = 30;                // called