summaryrefslogtreecommitdiff
path: root/accel-pptpd/radius/packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/radius/packet.c')
-rw-r--r--accel-pptpd/radius/packet.c208
1 files changed, 91 insertions, 117 deletions
diff --git a/accel-pptpd/radius/packet.c b/accel-pptpd/radius/packet.c
index 08991ddd..4e24dedc 100644
--- a/accel-pptpd/radius/packet.c
+++ b/accel-pptpd/radius/packet.c
@@ -324,15 +324,25 @@ void rad_packet_print(struct rad_packet_t *pack, void (*print)(const char *fmt,
print("]\n");
}
-int rad_packet_add_int(struct rad_packet_t *pack, const char *name, int val)
+int __export rad_packet_add_int(struct rad_packet_t *pack, const char *vendor_name, const char *name, int val)
{
struct rad_attr_t *ra;
struct rad_dict_attr_t *attr;
+ struct rad_dict_vendor_t *vendor;
- if (pack->len + 2 + 4 >= REQ_LENGTH_MAX)
+ if (pack->len + (vendor_name ? 8 : 2) + 4 >= REQ_LENGTH_MAX)
return -1;
- attr = rad_dict_find_attr(name);
+ if (vendor_name) {
+ vendor = rad_dict_find_vendor_name(vendor_name);
+ if (!vendor)
+ return -1;
+ attr = rad_dict_find_vendor_attr(vendor, name);
+ } else {
+ vendor = NULL;
+ attr = rad_dict_find_attr(name);
+ }
+
if (!attr)
return -1;
@@ -341,20 +351,21 @@ int rad_packet_add_int(struct rad_packet_t *pack, const char *name, int val)
return -1;
memset(ra, 0, sizeof(*ra));
+ ra->vendor = vendor;
ra->attr = attr;
ra->len = 4;
ra->val.integer = val;
list_add_tail(&ra->entry, &pack->attrs);
- pack->len += 2 + 4;
+ pack->len += (vendor_name ? 8 : 2) + 4;
return 0;
}
-int rad_packet_change_int(struct rad_packet_t *pack, const char *name, int val)
+int __export rad_packet_change_int(struct rad_packet_t *pack, const char *vendor_name, const char *name, int val)
{
struct rad_attr_t *ra;
- ra = rad_packet_find_attr(pack, name);
+ ra = rad_packet_find_attr(pack, vendor_name, name);
if (!ra)
return -1;
@@ -363,15 +374,25 @@ int rad_packet_change_int(struct rad_packet_t *pack, const char *name, int val)
return 0;
}
-int rad_packet_add_octets(struct rad_packet_t *pack, const char *name, const uint8_t *val, int len)
+int __export rad_packet_add_octets(struct rad_packet_t *pack, const char *vendor_name, const char *name, const uint8_t *val, int len)
{
struct rad_attr_t *ra;
struct rad_dict_attr_t *attr;
+ struct rad_dict_vendor_t *vendor;
- if (pack->len + 2 + len >= REQ_LENGTH_MAX)
+ if (pack->len + (vendor_name ? 8 : 2) + len >= REQ_LENGTH_MAX)
return -1;
- attr = rad_dict_find_attr(name);
+ if (vendor_name) {
+ vendor = rad_dict_find_vendor_name(vendor_name);
+ if (!vendor)
+ return -1;
+ attr = rad_dict_find_vendor_attr(vendor, name);
+ } else {
+ vendor = NULL;
+ attr = rad_dict_find_attr(name);
+ }
+
if (!attr)
return -1;
@@ -382,6 +403,7 @@ int rad_packet_add_octets(struct rad_packet_t *pack, const char *name, const uin
}
memset(ra, 0, sizeof(*ra));
+ ra->vendor = vendor;
ra->attr = attr;
ra->len = len;
ra->val.octets = _malloc(len);
@@ -392,16 +414,16 @@ int rad_packet_add_octets(struct rad_packet_t *pack, const char *name, const uin
}
memcpy(ra->val.octets, val, len);
list_add_tail(&ra->entry, &pack->attrs);
- pack->len += 2 + len;
+ pack->len += (vendor_name ? 8 : 2) + len;
return 0;
}
-int rad_packet_change_octets(struct rad_packet_t *pack, const char *name, const uint8_t *val, int len)
+int __export rad_packet_change_octets(struct rad_packet_t *pack, const char *vendor_name, const char *name, const uint8_t *val, int len)
{
struct rad_attr_t *ra;
- ra = rad_packet_find_attr(pack, name);
+ ra = rad_packet_find_attr(pack, vendor_name, name);
if (!ra)
return -1;
@@ -425,15 +447,26 @@ int rad_packet_change_octets(struct rad_packet_t *pack, const char *name, const
}
-int rad_packet_add_str(struct rad_packet_t *pack, const char *name, const char *val, int len)
+int __export rad_packet_add_str(struct rad_packet_t *pack, const char *vendor_name, const char *name, const char *val)
{
struct rad_attr_t *ra;
struct rad_dict_attr_t *attr;
+ struct rad_dict_vendor_t *vendor;
+ int len = strlen(val);
- if (pack->len + 2 + len >= REQ_LENGTH_MAX)
+ if (pack->len + (vendor_name ? 8 : 2) + len >= REQ_LENGTH_MAX)
return -1;
- attr = rad_dict_find_attr(name);
+ if (vendor_name) {
+ vendor = rad_dict_find_vendor_name(vendor_name);
+ if (!vendor)
+ return -1;
+ attr = rad_dict_find_vendor_attr(vendor, name);
+ } else {
+ vendor = NULL;
+ attr = rad_dict_find_attr(name);
+ }
+
if (!attr)
return -1;
@@ -444,9 +477,10 @@ int rad_packet_add_str(struct rad_packet_t *pack, const char *name, const char *
}
memset(ra, 0, sizeof(*ra));
+ ra->vendor = vendor;
ra->attr = attr;
ra->len = len;
- ra->val.string = _malloc(len+1);
+ ra->val.string = _malloc(len + 1);
if (!ra->val.string) {
log_emerg("radius: out of memory\n");
_free(ra);
@@ -455,16 +489,16 @@ int rad_packet_add_str(struct rad_packet_t *pack, const char *name, const char *
memcpy(ra->val.string, val, len);
ra->val.string[len] = 0;
list_add_tail(&ra->entry, &pack->attrs);
- pack->len += 2 + len;
+ pack->len += (vendor_name ? 8 : 2) + len;
return 0;
}
-int rad_packet_change_str(struct rad_packet_t *pack, const char *name, const char *val, int len)
+int __export rad_packet_change_str(struct rad_packet_t *pack, const char *vendor_name, const char *name, const char *val, int len)
{
struct rad_attr_t *ra;
- ra = rad_packet_find_attr(pack, name);
+ ra = rad_packet_find_attr(pack, vendor_name, name);
if (!ra)
return -1;
@@ -488,19 +522,29 @@ int rad_packet_change_str(struct rad_packet_t *pack, const char *name, const cha
return 0;
}
-int rad_packet_add_val(struct rad_packet_t *pack, const char *name, const char *val)
+int __export rad_packet_add_val(struct rad_packet_t *pack, const char *vendor_name, const char *name, const char *val)
{
struct rad_attr_t *ra;
struct rad_dict_attr_t *attr;
struct rad_dict_value_t *v;
+ struct rad_dict_vendor_t *vendor;
- if (pack->len + 2 + 4 >= REQ_LENGTH_MAX)
+ if (pack->len + (vendor_name ? 8 : 2) + 4 >= REQ_LENGTH_MAX)
return -1;
- attr = rad_dict_find_attr(name);
+ if (vendor_name) {
+ vendor = rad_dict_find_vendor_name(vendor_name);
+ if (!vendor)
+ return -1;
+ attr = rad_dict_find_vendor_attr(vendor, name);
+ } else {
+ vendor = NULL;
+ attr = rad_dict_find_attr(name);
+ }
+
if (!attr)
return -1;
-
+
v = rad_dict_find_val_name(attr, val);
if (!v)
return -1;
@@ -510,21 +554,22 @@ int rad_packet_add_val(struct rad_packet_t *pack, const char *name, const char *
return -1;
memset(ra, 0, sizeof(*ra));
+ ra->vendor = vendor;
ra->attr = attr;
ra->len = 4;
ra->val = v->val;
list_add_tail(&ra->entry, &pack->attrs);
- pack->len += 2 + 4;
+ pack->len += (vendor_name ? 8 : 2) + 4;
return 0;
}
-int rad_packet_change_val(struct rad_packet_t *pack, const char *name, const char *val)
+int __export rad_packet_change_val(struct rad_packet_t *pack, const char *vendor_name, const char *name, const char *val)
{
struct rad_attr_t *ra;
struct rad_dict_value_t *v;
- ra = rad_packet_find_attr(pack, name);
+ ra = rad_packet_find_attr(pack, vendor_name, name);
if (!ra)
return -1;
@@ -537,19 +582,33 @@ int rad_packet_change_val(struct rad_packet_t *pack, const char *name, const cha
return 0;
}
-int rad_packet_add_ipaddr(struct rad_packet_t *pack, const char *name, in_addr_t ipaddr)
+int __export rad_packet_add_ipaddr(struct rad_packet_t *pack, const char *vendor_name, const char *name, in_addr_t ipaddr)
{
- return rad_packet_add_int(pack, name, ipaddr);
+ return rad_packet_add_int(pack, vendor_name, name, ipaddr);
}
-struct rad_attr_t *rad_packet_find_attr(struct rad_packet_t *pack, const char *name)
+struct rad_attr_t __export *rad_packet_find_attr(struct rad_packet_t *pack, const char *vendor_name, const char *name)
{
struct rad_attr_t *ra;
+ struct rad_dict_vendor_t *vendor;
- list_for_each_entry(ra, &pack->attrs, entry)
- if (!strcmp(ra->attr->name, name))
- return ra;
+ if (vendor_name) {
+ vendor = rad_dict_find_vendor_name(vendor_name);
+ if (!vendor)
+ return NULL;
+ } else
+ vendor = NULL;
+
+ list_for_each_entry(ra, &pack->attrs, entry) {
+ if (vendor && vendor != ra->vendor)
+ continue;
+
+ if (strcmp(ra->attr->name, name))
+ continue;
+
+ return ra;
+ }
return NULL;
}
@@ -578,91 +637,6 @@ int rad_packet_send(struct rad_packet_t *pack, int fd, struct sockaddr_in *addr)
return 0;
}
-int rad_packet_add_vendor_octets(struct rad_packet_t *pack, const char *vendor_name, const char *name, const uint8_t *val, int len)
-{
- struct rad_attr_t *ra;
- struct rad_dict_attr_t *attr;
- struct rad_dict_vendor_t *vendor;
-
- if (pack->len + 6 + 2 + len >= REQ_LENGTH_MAX)
- return -1;
-
- vendor = rad_dict_find_vendor_name(vendor_name);
- if (!vendor)
- return -1;
-
- attr = rad_dict_find_vendor_attr(vendor, name);
- if (!attr)
- return -1;
-
- ra = mempool_alloc(attr_pool);
- if (!ra) {
- log_emerg("radius: out of memory\n");
- return -1;
- }
-
- memset(ra, 0, sizeof(*ra));
- ra->vendor = vendor;
- ra->attr = attr;
- ra->len = len;
- ra->val.octets = _malloc(len);
- if (!ra->val.octets) {
- log_emerg("radius: out of memory\n");
- _free(ra);
- return -1;
- }
- memcpy(ra->val.octets, val, len);
- list_add_tail(&ra->entry, &pack->attrs);
- pack->len += 6 + 2 + len;
-
- return 0;
-}
-
-int rad_packet_change_vendor_octets(struct rad_packet_t *pack, const char *vendor_name, const char *name, const uint8_t *val, int len)
-{
- struct rad_attr_t *ra;
-
- ra = rad_packet_find_vendor_attr(pack, vendor_name, name);
- if (!ra)
- return -1;
-
- if (ra->len != len) {
- if (pack->len - ra->len + len >= REQ_LENGTH_MAX)
- return -1;
-
- ra->val.octets = _realloc(ra->val.octets, len);
- if (!ra->val.octets) {
- log_emerg("radius: out of memory\n");
- return -1;
- }
-
- pack->len += len - ra->len;
- ra->len = len;
- }
-
- memcpy(ra->val.octets, val, len);
-
- return 0;
-}
-
-struct rad_attr_t *rad_packet_find_vendor_attr(struct rad_packet_t *pack, const char *vendor_name, const char *name)
-{
- struct rad_attr_t *ra;
-
- list_for_each_entry(ra, &pack->attrs, entry) {
- if (!ra->vendor)
- continue;
- if (strcmp(ra->vendor->name, vendor_name))
- continue;
- if (strcmp(ra->attr->name, name))
- continue;
-
- return ra;
- }
-
- return NULL;
-}
-
static void __init init(void)
{
attr_pool = mempool_create(sizeof(struct rad_attr_t));