Files
qse/qse/include/qse/rad/radmsg.h

338 lines
10 KiB
C

/*
* $Id$
*
Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _QSE_RAD_RADMSG_H_
#define _QSE_RAD_RADMSG_H_
#include <qse/types.h>
#include <qse/macros.h>
#include <qse/cmn/ipad.h>
#define QSE_RAD_PACKET_MAX 65535
/* radius code */
enum qse_rad_code_t
{
QSE_RAD_ACCESS_REQUEST = 1,
QSE_RAD_ACCESS_ACCEPT = 2,
QSE_RAD_ACCESS_REJECT = 3,
QSE_RAD_ACCOUNTING_REQUEST = 4,
QSE_RAD_ACCOUNTING_RESPONSE = 5,
QSE_RAD_ACCESS_CHALLENGE = 6,
QSE_RAD_DISCONNECT_REQUEST = 40,
QSE_RAD_DISCONNECT_ACK = 41,
QSE_RAD_DISCONNECT_NAK = 42,
QSE_RAD_COA_REQUEST = 43,
QSE_RAD_COA_ACK = 44,
QSE_RAD_COA_NAK = 45,
QSE_RAD_ACCOUNTING_ERROR = 255 /* this is not a real radius code */
};
typedef enum qse_rad_code_t qse_rad_code_t;
#define QSE_RAD_MAX_AUTHENTICATOR_LEN 16
#define QSE_RAD_MAX_ATTR_VALUE_LEN (QSE_TYPE_MAX(qse_uint8_t) - QSE_SIZEOF(qse_rad_attr_hdr_t))
#define QSE_RAD_MAX_VSATTR_VALUE_LEN (QSE_TYPE_MAX(qse_uint8_t) - QSE_SIZEOF(qse_rad_attr_hdr_t) - QSE_SIZEOF(qse_rad_vsattr_hdr_t))
typedef struct qse_rad_hdr_t qse_rad_hdr_t;
typedef struct qse_rad_attr_hdr_t qse_rad_attr_hdr_t;
typedef struct qse_rad_vsattr_hdr_t qse_rad_vsattr_hdr_t;
typedef struct qse_rad_attr_int_t qse_rad_attr_int_t;
#include <qse/pack1.h>
struct qse_rad_hdr_t
{
qse_uint8_t code; /* qse_rad_code_t */
qse_uint8_t id;
qse_uint16_t length;
qse_uint8_t authenticator[QSE_RAD_MAX_AUTHENTICATOR_LEN]; /* authenticator */
};
struct qse_rad_attr_hdr_t
{
qse_uint8_t id; /* qse_rad_attr_id_t */
qse_uint8_t length;
};
struct qse_rad_vsattr_hdr_t
{
qse_uint8_t id;
qse_uint8_t length;
qse_uint32_t vendor; /* in network-byte order */
};
struct qse_rad_attr_int_t
{
qse_rad_attr_hdr_t hdr;
qse_uint32_t val;
};
#include <qse/unpack.h>
typedef int (*qse_rad_attr_walker_t) (
const qse_rad_hdr_t* hdr,
qse_uint32_t vendor, /* in host-byte order */
const qse_rad_attr_hdr_t* attr,
void* ctx
);
enum qse_rad_attr_id_t
{
QSE_RAD_ATTR_USER_NAME = 1, /* string */
QSE_RAD_ATTR_USER_PASSWORD = 2, /* string encrypted */
QSE_RAD_ATTR_NAS_IP_ADDRESS = 4, /* ipaddr */
QSE_RAD_ATTR_NAS_PORT = 5, /* integer */
QSE_RAD_ATTR_SERVICE_TYPE = 6, /* integer */
QSE_RAD_ATTR_FRAMED_IP_ADDRESS = 8, /* ipaddr */
QSE_RAD_ATTR_REPLY_MESSAGE = 18, /* string */
QSE_RAD_ATTR_CLASS = 25, /* octets */
QSE_RAD_ATTR_VENDOR_SPECIFIC = 26, /* octets */
QSE_RAD_ATTR_SESSION_TIMEOUT = 27, /* integer */
QSE_RAD_ATTR_IDLE_TIMEOUT = 28, /* integer */
QSE_RAD_ATTR_TERMINATION_ACTION = 29, /* integer. 0:default, 1:radius-request */
QSE_RAD_ATTR_CALLING_STATION_ID = 31, /* string */
QSE_RAD_ATTR_NAS_IDENTIFIER = 32, /* string */
QSE_RAD_ATTR_ACCT_STATUS_TYPE = 40, /* integer */
QSE_RAD_ATTR_ACCT_INPUT_OCTETS = 42, /* integer */
QSE_RAD_ATTR_ACCT_OUTPUT_OCTETS = 43, /* integer */
QSE_RAD_ATTR_ACCT_SESSION_ID = 44, /* string */
QSE_RAD_ATTR_ACCT_SESSION_TIME = 46, /* integer */
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE = 49, /* integer */
QSE_RAD_ATTR_ACCT_INPUT_GIGAWORDS = 52, /* integer */
QSE_RAD_ATTR_ACCT_OUTPUT_GIGAWORDS = 53, /* integer */
QSE_RAD_ATTR_EVENT_TIMESTAMP = 55, /* integer */
QSE_RAD_ATTR_NAS_PORT_TYPE = 61, /* integer */
QSE_RAD_ATTR_ACCT_INTERIM_INTERVAL = 85, /* integer */
QSE_RAD_ATTR_NAS_PORT_ID = 87, /* string */
QSE_RAD_ATTR_FRAMED_IPV6_PREFIX = 97 /* ipv6prefix */
};
enum qse_rad_attr_acct_status_type_t
{
QSE_RAD_ATTR_ACCT_STATUS_TYPE_START = 1, /* accounting start */
QSE_RAD_ATTR_ACCT_STATUS_TYPE_STOP = 2, /* accounting stop */
QSE_RAD_ATTR_ACCT_STATUS_TYPE_UPDATE = 3, /* interim update */
QSE_RAD_ATTR_ACCT_STATUS_TYPE_ON = 7, /* accounting on */
QSE_RAD_ATTR_ACCT_STATUS_TYPE_OFF = 8, /* accounting off */
QSE_RAD_ATTR_ACCT_STATUS_TYPE_FAILED = 15
};
enum qse_rad_attr_acct_terminate_cause_t
{
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_USER_REQUEST = 1,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_LOST_CARRIER = 2,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_LOST_SERVICE = 3,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_IDLE_TIMEOUT = 4,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_SESSION_TIMEOUT = 5,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_ADMIN_RESET = 6,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_ADMIN_REBOOT = 7,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_PORT_ERROR = 8,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_NAS_ERROR = 9,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_NAS_REQUEST = 10,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_NAS_REBOOT = 11,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_PORT_UNNEEDED = 12,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_PORT_PREEMPTED = 13,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_PORT_SUSPENDED = 14,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_SERVICE_UNAVAILABLE = 15,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_CALLBACK = 16,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_USER_ERROR = 17,
QSE_RAD_ATTR_ACCT_TERMINATE_CAUSE_HOST_REQUEST = 18
};
enum qse_rad_attr_nas_port_type_t
{
QSE_RAD_ATTR_NAS_PORT_TYPE_ASYNC = 0,
QSE_RAD_ATTR_NAS_PORT_TYPE_SYNC = 1,
QSE_RAD_ATTR_NAS_PORT_TYPE_ISDN = 2,
QSE_RAD_ATTR_NAS_PORT_TYPE_ISDN_V120 = 3,
QSE_RAD_ATTR_NAS_PORT_TYPE_ISDN_V110 = 4,
QSE_RAD_ATTR_NAS_PORT_TYPE_VIRTUAL = 5
/* TODO: more types */
};
#ifdef __cplusplus
extern "C" {
#endif
QSE_EXPORT void qse_rad_initialize (
qse_rad_hdr_t* hdr,
qse_rad_code_t code,
qse_uint8_t id
);
QSE_EXPORT qse_rad_attr_hdr_t* qse_rad_find_attribute (
qse_rad_hdr_t* hdr,
qse_uint8_t attrid,
int index
);
QSE_EXPORT qse_rad_attr_hdr_t* qse_rad_find_vendor_specific_attribute (
qse_rad_hdr_t* hdr,
qse_uint32_t vendor,
qse_uint8_t id,
int index
);
QSE_EXPORT int qse_rad_walk_attributes (
const qse_rad_hdr_t* hdr,
qse_rad_attr_walker_t walker,
void* ctx
);
QSE_EXPORT int qse_rad_insert_attribute (
qse_rad_hdr_t* auth,
int max,
qse_uint8_t id,
const void* ptr,
qse_uint8_t len
);
QSE_EXPORT int qse_rad_insert_vendor_specific_attribute (
qse_rad_hdr_t* auth,
int max,
qse_uint32_t vendor,
qse_uint8_t attrid,
const void* ptr,
qse_uint8_t len
);
QSE_EXPORT int qse_rad_delete_attribute (
qse_rad_hdr_t* hdr,
qse_uint8_t attrid
);
QSE_EXPORT int qse_rad_delete_vendor_specific_attribute (
qse_rad_hdr_t* hdr,
qse_uint32_t vendor,
qse_uint8_t id
);
QSE_EXPORT int qse_rad_insert_string_attribute (
qse_rad_hdr_t* auth,
int max,
qse_uint32_t vendor, /* in host-byte order */
qse_uint8_t id,
const qse_mchar_t* value
);
QSE_EXPORT int qse_rad_insert_wide_string_attribute (
qse_rad_hdr_t* auth,
int max,
qse_uint32_t vendor, /* in host-byte order */
qse_uint8_t id,
const qse_wchar_t* value
);
QSE_EXPORT int qse_rad_insert_string_attribute_with_length (
qse_rad_hdr_t* auth,
int max,
qse_uint32_t vendor, /* in host-byte order */
qse_uint8_t id,
const qse_mchar_t* value,
qse_uint8_t length
);
QSE_EXPORT int qse_rad_insert_wide_string_attribute_with_length (
qse_rad_hdr_t* auth,
int max,
qse_uint32_t vendor, /* in host-byte order */
qse_uint8_t id,
const qse_wchar_t* value,
qse_uint8_t length
);
QSE_EXPORT int qse_rad_insert_integer_attribute (
qse_rad_hdr_t* auth,
int max,
qse_uint32_t vendor, /* in host-byte order */
qse_uint8_t id,
qse_uint32_t value /* in host-byte order */
);
QSE_EXPORT int qse_rad_insert_ipv6prefix_attribute (
qse_rad_hdr_t* auth,
int max,
qse_uint32_t vendor, /* in host-byte order */
qse_uint8_t id,
qse_uint8_t prefix_bits,
const qse_ip6ad_t* value
);
QSE_EXPORT int qse_rad_insert_giga_attribute (
qse_rad_hdr_t* auth,
int max,
qse_uint32_t vendor,
int low_id,
int high_id,
qse_uint64_t value
);
QSE_EXPORT int qse_rad_set_user_password (
qse_rad_hdr_t* auth,
int max,
const qse_mchar_t* password,
const qse_mchar_t* secret
);
QSE_EXPORT void qse_rad_fill_authenticator (
qse_rad_hdr_t* auth
);
QSE_EXPORT void qse_rad_copy_authenticator (
qse_rad_hdr_t* dst,
const qse_rad_hdr_t* src
);
QSE_EXPORT int qse_rad_set_authenticator (
qse_rad_hdr_t* req,
const qse_mchar_t* secret
);
/*
* verify an accounting request.
* the authenticator of an access request is filled randomly.
* so this function doesn't apply
*/
QSE_EXPORT int qse_rad_verify_request (
qse_rad_hdr_t* req,
const qse_mchar_t* secret
);
QSE_EXPORT int qse_rad_verify_response (
qse_rad_hdr_t* res,
const qse_rad_hdr_t* req,
const qse_mchar_t* secret
);
#ifdef __cplusplus
}
#endif
#endif