Rudolf's Radius Klassenbibliothek
Left Up Right Klassenbibliothek

Klasse Cacherecverw

Zweck

Klasse Cacherecverw verwaltet einen Cacherecord so, dass die Replyattribute direkt in eine Radius-Nachricht kopiert werden können.

Die Überlegung ist, das die Authoriesierung schnell gehen soll, während die Verwaltung länger Zeit hat.

Die Struktur Cacherecord ist die Speicherstruktur in der Datenbasis

Beschreibung

Headerfile usercache.h Eine Dienstbeschreibung im Cache enthält alle Attribute für den NAS wenn ein Dienst ( Attribut USER-SERVICE zusammen mit dem Framed-Protocal) angefordert wird. Beim Aufruf kann daher festgestellt werden, ob der Anfordernde für den Dienst überhaupt berechtigt ist. Dieselbe Struktur wird auch als default-Struktur für die NAS benutzt. In diesem Kontext beschreibt sie, welche Dienste ein NAS überhaupt anbietet. Dienst 0 sind die Check-attribute wie Paßwort und Endezeit
struct CRDienst
{
  UINT4     dienst;   // Dienste /Userservice
                      // ( User-service << 16 | Framed-Protokol)
  time_t    czeit;    // Zeit des Cachings
  u_int16_t offset;   // offset der Nutzdaten vom beginn des Satzes
  u_int16_t lang;     // Länge der Nutzdaten
};

const UINT4 HDIENSTMASK=0xffff;
inline UINT4 hauptdienst(UINT4 d) { return d & HDIENSTMASK; } 
inline UINT4 dienstattr(UINT4 d)  { return d >> 16; }
Layout:
----------------------------------------------------------
| zeit | ng | CRDienst |daten | CRDienst | Daten | .....
----------------------------------------------------------
Die eigentliche Speicherstruktur ...
struct Cacherecord
{
  u_int32_t ng;       // Zahl der Gruppen (größe wegen alignment)
  CRDienst data;     // Erster Dienst
  char rest[1];       // ....
};
Die Verwaltungsstruktur ....
class Cacherecverw
{
  Cacherecord *ur;
  CRDienst *aktd; // Aktueller Dienst
  int aktdnr;     // Dienstnummer für Iteration		       

  u_char *ptr;    // Aktuelles Attribut in Attributiterator
  u_char *eptr;   // Zeiger hinter das letzte Attribut
public:
  // Initialisierungen
  Userrecverw();
  Userrecverw(char *buffer);
  void init(char *buffer);
  void setbuffer(char *buffer);
  void clear();

  // Abfragen
  int totallen();
  const Cacherecord *data() { return ur;  }

  //----- Iteratoren --------
  //   Dienstiteratoren
  CRDienst *ersterdienst(); 
  CRDienst *weitererdienst();
  CRDienst *findedienst(UINT4 dn);
   
  int lenreply() { return (aktd ? aktd->lang : 0); }
  
  auth_attr *erstes(CRDienst *d) { return (auth_attr *)((u_char *)ur+d->offset); }
  u_char *ende(CRDienst *d) { return (u_char *)ur+d->offset+d->lang; }
  // Attributiterator
  auth_attr *first(CRDienst *d);
  auth_attr *next();
  auth_attr *finde(u_char attribut);

  //--------- Aufbauiteratoren ------------
  void neuerdienst(UINT4 dn);

  int add(Attreintrag *attr,char *value);
  int add(u_char attribut,char *wert,int len);
  int add(u_char attribut,UINT4 w);
  int add(auth_attr *a);

  //--------- Operationen-----------------
  int update(Cacherecverw &upd,Cacherecverw &alt);

  //--------- Ausgabe --------------------  
  void print(ostream &ostr); // bis auf Dienst 0
  void print(char *username,ostream &ostr); // invers zu parser
};
Remark: On some Processorarchitectures like a Sparc-Processor the Alignment of shorts and longs mut be aligned. Caution when porting: The length of a Servicedescription must be paded.
Rudolf Weber Informatik- und Netzwerkverein Ravensburg e.V