Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions raddict.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#ifndef RAD_DICT
#define RAD_DICT

const char* RAD_Attr_Acct_Terminate_Cause_Dict[] = {
"User-Request",
"Lost-Carrier",
"Lost-Service",
"Idle-Timeout",
"Session-Timeout",
"Admin-Reset",
"Admin-Reboot",
"Port-Error",
"NAS-Error",
"NAS-Request",
"NAS-Reboot",
"Port-Unneeded",
"Port-Preempted",
"Port-Suspended",
"Service-Unavailable",
"Callback",
"User-Error",
"Host-Request",
};

const char* RAD_Attr_Acct_Status_Type_Dict[] = {
"Start",
"Stop",
"Interim-Update",
[7] = "Accounting-On",
[8] = "Accounting-Off",
[9] = "Tunnel-Start",
[10] = "Tunnel-Stop",
[11] = "Tunnel-Reject",
[12] = "Tunnel-Link-Start",
[13] = "Tunnel-Link-Stop",
[14] = "Tunnel-Link-Reject",
[15] = "Failed",
};

#endif
21 changes: 21 additions & 0 deletions radmsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <pthread.h>
#include <nettle/hmac.h>
#include <openssl/rand.h>
#include "raddict.h"

#define RADLEN(x) ntohs(((uint16_t *)(x))[1])

Expand Down Expand Up @@ -414,6 +415,26 @@ int resizeattr(struct tlv *attr, uint8_t newlen) {
return 0;
}

char* attrval2str(struct tlv *attr) {
if(!attr) return '\0';
uint32_t val = tlv2longint(attr) - 1;
switch (attr->t) {
case RAD_Attr_Acct_Status_Type:
if(val < sizeof(RAD_Attr_Acct_Status_Type_Dict)/sizeof(uint32_t))
return RAD_Attr_Acct_Status_Type_Dict[val] ? strdup(RAD_Attr_Acct_Status_Type_Dict[val]) : strdup(RAD_Dict_Unknown_Value);
break;

case RAD_Attr_Acct_Terminate_Cause:
if(val < sizeof(RAD_Attr_Acct_Terminate_Cause_Dict)/sizeof(uint32_t))
return RAD_Attr_Acct_Terminate_Cause_Dict[val] ? strdup(RAD_Attr_Acct_Terminate_Cause_Dict[val]) : strdup(RAD_Dict_Unknown_Value);
break;

default:
break;
}
return strdup(RAD_Dict_Unknown_Value);
}

/* Local Variables: */
/* c-file-style: "stroustrup" */
/* End: */
23 changes: 23 additions & 0 deletions radmsg.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,39 @@
#define RAD_Attr_User_Name 1
#define RAD_Attr_User_Password 2
#define RAD_Attr_CHAP_Password 3
#define RAD_Attr_NAS_IP_Address 4
#define RAD_Attr_Framed_IP_Address 8
#define RAD_Attr_Reply_Message 18
#define RAD_Attr_Vendor_Specific 26
#define RAD_Attr_Called_Station_Id 30
#define RAD_Attr_Calling_Station_Id 31
#define RAD_Attr_Proxy_State 33
#define RAD_Attr_CHAP_Challenge 60
#define RAD_Attr_Tunnel_Password 69
#define RAD_Attr_Message_Authenticator 80
#define RAD_Attr_Acct_Status_Type 40
#define RAD_Attr_Acct_Input_Octets 42
#define RAD_Attr_Acct_Output_Octets 43
#define RAD_Attr_Acct_Session_Id 44
#define RAD_Attr_Acct_Session_Time 46
#define RAD_Attr_Acct_Input_Packets 47
#define RAD_Attr_Acct_Output_Packets 48
#define RAD_Attr_Acct_Terminate_Cause 49
#define RAD_Attr_Event_Timestamp 55

#define RAD_Acct_Status_Start 1
#define RAD_Acct_Status_Stop 2
#define RAD_Acct_Status_Alive 3
#define RAD_Acct_Status_Interim_Update 3
#define RAD_Acct_Status_Accounting_On 7
#define RAD_Acct_Status_Accounting_Off 8
#define RAD_Acct_Status_Failed 15

#define RAD_VS_ATTR_MS_MPPE_Send_Key 16
#define RAD_VS_ATTR_MS_MPPE_Recv_Key 17

#define RAD_Dict_Unknown_Value "UNKNOWN"

struct radmsg {
uint8_t code;
uint8_t id;
Expand Down Expand Up @@ -60,6 +82,7 @@ int vattrname2val(char *attrname, uint32_t *vendor, uint32_t *type);
int attrvalidate(unsigned char *attrs, int length);
struct tlv *makevendortlv(uint32_t vendor, struct tlv *attr);
int resizeattr(struct tlv *attr, uint8_t newlen);
char* attrval2str(struct tlv *attr);

#endif /*_RADMSG_H*/

Expand Down
43 changes: 43 additions & 0 deletions radsecproxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -1305,6 +1305,49 @@ int radsrv(struct request *rq) {
debug(DBG_INFO, "radsrv: sending %s (id %d) to %s (%s) for %s", radmsgtype2string(RAD_Access_Reject), msg->id, from->conf->name, addr2string(from->addr, tmp, sizeof(tmp)), userascii);
respond(rq, RAD_Access_Reject, realm->message, 1, 1);
} else if (realm->accresp && msg->code == RAD_Accounting_Request) {
//uint8_t* framed_ip_address = tlv2str(radmsg_gettype(msg, RAD_Attr_Framed_IP_Address));
char* status_type = attrval2str(radmsg_gettype(msg, RAD_Attr_Acct_Status_Type));
char* nas_ip_address = tlv2ipv4addr(radmsg_gettype(msg, RAD_Attr_NAS_IP_Address));
char* framed_ip_address = tlv2ipv4addr(radmsg_gettype(msg, RAD_Attr_Framed_IP_Address));

time_t event_timestamp_i = tlv2longint(radmsg_gettype(msg, RAD_Attr_Event_Timestamp));
char event_timestamp[64];

uint8_t *session_id = radattr2ascii(radmsg_gettype(msg, RAD_Attr_Acct_Session_Id));
uint8_t *called_station_id = radattr2ascii(radmsg_gettype(msg, RAD_Attr_Called_Station_Id));
uint8_t *calling_station_id = radattr2ascii(radmsg_gettype(msg, RAD_Attr_Calling_Station_Id));
char* terminate_cause = attrval2str(radmsg_gettype(msg, RAD_Attr_Acct_Terminate_Cause));

strftime(event_timestamp, sizeof(event_timestamp), "%FT%TZ", gmtime(&event_timestamp_i));

debug(DBG_NOTICE, "Accounting %s (id %d) at %s from client %s (%s): { SID=%s, User-Name=%s, Ced-S-Id=%s, Cing-S-Id=%s, NAS-IP=%s, Framed-IP=%s, Sess-Time=%u, In-Packets=%u, In-Octets=%u, Out-Packets=%u, Out-Octets=%u, Terminate-Cause=%s }",
status_type,
msg->id,
event_timestamp,
from->conf->name,
addr2string(from->addr, tmp, sizeof(tmp)),

session_id,
userascii,
called_station_id,
calling_station_id,
nas_ip_address,
framed_ip_address,
tlv2longint(radmsg_gettype(msg, RAD_Attr_Acct_Session_Time)),
tlv2longint(radmsg_gettype(msg, RAD_Attr_Acct_Input_Packets)),
tlv2longint(radmsg_gettype(msg, RAD_Attr_Acct_Input_Octets)),
tlv2longint(radmsg_gettype(msg, RAD_Attr_Acct_Output_Packets)),
tlv2longint(radmsg_gettype(msg, RAD_Attr_Acct_Output_Octets)),
terminate_cause
);
free(status_type);
free(framed_ip_address);
free(nas_ip_address);
free(session_id);
free(called_station_id);
free(calling_station_id);
free(terminate_cause);
// accounting_log(rq);
respond(rq, RAD_Accounting_Response, NULL, 1, 0);
}
goto exit;
Expand Down
28 changes: 28 additions & 0 deletions tlv11.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
* Copyright (c) 2010, NORDUnet A/S */
/* See LICENSE for licensing information. */

#define _GNU_SOURCE
#ifdef SYS_SOLARIS9
#include <sys/inttypes.h>
#else
Expand All @@ -12,6 +13,7 @@
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdio.h>

struct tlv *maketlv(uint8_t t, uint8_t l, void *v) {
struct tlv *tlv;
Expand Down Expand Up @@ -97,6 +99,8 @@ void rmtlv(struct list *tlvs, uint8_t t) {
}

uint8_t *tlv2str(struct tlv *tlv) {
if(!tlv)
return '\0';
uint8_t *s = malloc(tlv->l + 1);
if (s) {
memcpy(s, tlv->v, tlv->l);
Expand All @@ -117,6 +121,30 @@ struct tlv *resizetlv(struct tlv *tlv, uint8_t newlen) {
return tlv;
}

uint32_t tlv2longint(struct tlv *tlv) {
if(!tlv) return 0;
uint32_t n = 0;
n += tlv->v[3];
n += tlv->v[2] << 8;
n += tlv->v[1] << 16;
n += tlv->v[0] << 24;
return n;
}

char* tlv2ipv4addr(struct tlv *tlv) {
if(!tlv) return 0;
char *rval = "undef";
if(tlv->v) {
uint8_t *v = tlv2str(tlv);
char *str;
if(asprintf(&str, "%d.%d.%d.%d", v[0], v[1], v[2], v[3]) >=0) {
rval = str;
}
free(v);
}
return rval;
}

/* Local Variables: */
/* c-file-style: "stroustrup" */
/* End: */
2 changes: 2 additions & 0 deletions tlv11.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ void freetlvlist(struct list *);
void rmtlv(struct list *, uint8_t);
uint8_t *tlv2str(struct tlv *tlv);
struct tlv *resizetlv(struct tlv *, uint8_t);
uint32_t tlv2longint(struct tlv *tlv);
char* tlv2ipv4addr(struct tlv *tlv);

/* Local Variables: */
/* c-file-style: "stroustrup" */
Expand Down