Change radius_msg_free() to free the buffer
[libeap.git] / src / radius / radius.h
index 61ec459..6050b54 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * hostapd / RADIUS message processing
- * Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi>
+ * RADIUS message processing
+ * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -87,6 +87,7 @@ enum { RADIUS_ATTR_USER_NAME = 1,
        RADIUS_ATTR_MESSAGE_AUTHENTICATOR = 80,
        RADIUS_ATTR_TUNNEL_PRIVATE_GROUP_ID = 81,
        RADIUS_ATTR_ACCT_INTERIM_INTERVAL = 85,
+       RADIUS_ATTR_CHARGEABLE_USER_IDENTITY = 89,
        RADIUS_ATTR_NAS_IPV6_ADDRESS = 95
 };
 
@@ -172,19 +173,47 @@ struct radius_ms_mppe_keys {
 };
 
 
-/* RADIUS message structure for new and parsed messages */
+/**
+ * struct radius_msg - RADIUS message structure for new and parsed messages
+ */
 struct radius_msg {
+       /**
+        * buf - Allocated buffer for RADIUS message
+        */
        unsigned char *buf;
-       size_t buf_size; /* total size allocated for buf */
-       size_t buf_used; /* bytes used in buf */
 
+       /**
+        * buf_size - Total size of the allocated buf in octets
+        */
+       size_t buf_size;
+
+       /**
+        * buf_used - bytes used in buf
+        */
+       size_t buf_used;
+
+       /**
+        * hdr - Pointer to the RADIUS header in buf
+        */
        struct radius_hdr *hdr;
 
-       size_t *attr_pos; /* array of indexes to attributes (number of bytes
-                          * from buf to the beginning of
-                          * struct radius_attr_hdr). */
-       size_t attr_size; /* total size of the attribute pointer array */
-       size_t attr_used; /* total number of attributes in the array */
+       /**
+        * attr_pos - Array of indexes to attributes
+        *
+        * The values are number of bytes from buf to the beginning of
+        * struct radius_attr_hdr.
+        */
+       size_t *attr_pos;
+
+       /**
+        * attr_size - Total size of the attribute pointer array
+        */
+       size_t attr_size;
+
+       /**
+        * attr_used - Total number of attributes in the array
+        */
+       size_t attr_used;
 };
 
 
@@ -201,19 +230,18 @@ struct radius_msg {
 /* MAC address ASCII format for non-802.1X use */
 #define RADIUS_ADDR_FORMAT "%02x%02x%02x%02x%02x%02x"
 
-struct radius_msg *radius_msg_new(u8 code, u8 identifier);
-int radius_msg_initialize(struct radius_msg *msg, size_t init_len);
-void radius_msg_set_hdr(struct radius_msg *msg, u8 code, u8 identifier);
+struct radius_msg * radius_msg_new(u8 code, u8 identifier);
 void radius_msg_free(struct radius_msg *msg);
 void radius_msg_dump(struct radius_msg *msg);
-int radius_msg_finish(struct radius_msg *msg, u8 *secret, size_t secret_len);
+int radius_msg_finish(struct radius_msg *msg, const u8 *secret,
+                     size_t secret_len);
 int radius_msg_finish_srv(struct radius_msg *msg, const u8 *secret,
                          size_t secret_len, const u8 *req_authenticator);
-void radius_msg_finish_acct(struct radius_msg *msg, u8 *secret,
+void radius_msg_finish_acct(struct radius_msg *msg, const u8 *secret,
                            size_t secret_len);
-struct radius_attr_hdr *radius_msg_add_attr(struct radius_msg *msg, u8 type,
-                                           const u8 *data, size_t data_len);
-struct radius_msg *radius_msg_parse(const u8 *data, size_t len);
+struct radius_attr_hdr * radius_msg_add_attr(struct radius_msg *msg, u8 type,
+                                            const u8 *data, size_t data_len);
+struct radius_msg * radius_msg_parse(const u8 *data, size_t len);
 int radius_msg_add_eap(struct radius_msg *msg, const u8 *data,
                       size_t data_len);
 u8 *radius_msg_get_eap(struct radius_msg *msg, size_t *len);
@@ -228,10 +256,10 @@ void radius_msg_make_authenticator(struct radius_msg *msg,
                                   const u8 *data, size_t len);
 struct radius_ms_mppe_keys *
 radius_msg_get_ms_keys(struct radius_msg *msg, struct radius_msg *sent_msg,
-                      u8 *secret, size_t secret_len);
+                      const u8 *secret, size_t secret_len);
 struct radius_ms_mppe_keys *
 radius_msg_get_cisco_keys(struct radius_msg *msg, struct radius_msg *sent_msg,
-                         u8 *secret, size_t secret_len);
+                         const u8 *secret, size_t secret_len);
 int radius_msg_add_mppe_keys(struct radius_msg *msg,
                             const u8 *req_authenticator,
                             const u8 *secret, size_t secret_len,
@@ -239,8 +267,8 @@ int radius_msg_add_mppe_keys(struct radius_msg *msg,
                             const u8 *recv_key, size_t recv_key_len);
 struct radius_attr_hdr *
 radius_msg_add_attr_user_password(struct radius_msg *msg,
-                                 u8 *data, size_t data_len,
-                                 u8 *secret, size_t secret_len);
+                                 const u8 *data, size_t data_len,
+                                 const u8 *secret, size_t secret_len);
 int radius_msg_get_attr(struct radius_msg *msg, u8 type, u8 *buf, size_t len);
 int radius_msg_get_vlanid(struct radius_msg *msg);
 
@@ -267,4 +295,19 @@ int radius_msg_get_attr_ptr(struct radius_msg *msg, u8 type, u8 **buf,
                            size_t *len, const u8 *start);
 int radius_msg_count_attr(struct radius_msg *msg, u8 type, int min_len);
 
+
+struct radius_attr_data {
+       u8 *data;
+       size_t len;
+};
+
+struct radius_class_data {
+       struct radius_attr_data *attr;
+       size_t count;
+};
+
+void radius_free_class(struct radius_class_data *c);
+int radius_copy_class(struct radius_class_data *dst,
+                     const struct radius_class_data *src);
+
 #endif /* RADIUS_H */