summaryrefslogtreecommitdiff
path: root/accel-pppd/radius
diff options
context:
space:
mode:
authorDenys Fedoryshchenko <denys.f@collabora.com>2026-09-01 09:08:47 +0300
committerDenys Fedoryshchenko <denys.f@collabora.com>2026-09-01 09:08:47 +0300
commit7d4f8524f57ba0ac77e47171bebfc0370df667b1 (patch)
treeb3020b4e2aac0deac02721b7ebfe96c5ca4519b9 /accel-pppd/radius
parentc12e1242c0ab98255661f84be3eb37148c00cb38 (diff)
downloadaccel-ppp-7d4f8524f57ba0ac77e47171bebfc0370df667b1.tar.gz
accel-ppp-7d4f8524f57ba0ac77e47171bebfc0370df667b1.zip
utils: centralize unaligned integer accessors
Diffstat (limited to 'accel-pppd/radius')
-rw-r--r--accel-pppd/radius/backup.c39
-rw-r--r--accel-pppd/radius/packet.c51
2 files changed, 22 insertions, 68 deletions
diff --git a/accel-pppd/radius/backup.c b/accel-pppd/radius/backup.c
index 73825336..bfca0e49 100644
--- a/accel-pppd/radius/backup.c
+++ b/accel-pppd/radius/backup.c
@@ -6,6 +6,7 @@
#include "log.h"
#include "memdebug.h"
+#include "utils.h"
#include "backup.h"
#include "ap_session_backup.h"
@@ -23,26 +24,6 @@
#define RAD_TAG_ACCT_SERVER_PORT 10
#define RAD_TAG_IDLE_TIMEOUT 11
-static uint16_t backup_read_u16(const void *ptr)
-{
- uint16_t value;
- memcpy(&value, ptr, sizeof(value));
- return value;
-}
-
-static uint32_t backup_read_u32(const void *ptr)
-{
- uint32_t value;
- memcpy(&value, ptr, sizeof(value));
- return value;
-}
-
-static uint64_t backup_read_u64(const void *ptr)
-{
- uint64_t value;
- memcpy(&value, ptr, sizeof(value));
- return value;
-}
#define RAD_TAG_ACCT_USERNAME 12
@@ -115,10 +96,10 @@ static void restore_ipv4_addr(struct ap_session *ses)
list_for_each_entry(tag, &m->tag_list, entry) {
switch (tag->id) {
case SES_TAG_IPV4_ADDR:
- ses->ipv4->addr = backup_read_u32(tag->data);
+ ses->ipv4->addr = u_read_native32(tag->data);
break;
case SES_TAG_IPV4_PEER_ADDR:
- ses->ipv4->peer_addr = backup_read_u32(tag->data);
+ ses->ipv4->peer_addr = u_read_native32(tag->data);
break;
}
}
@@ -142,16 +123,16 @@ void radius_restore_session(struct ap_session *ses, struct radius_pd_t *rpd)
list_for_each_entry(tag, &m->tag_list, entry) {
switch (tag->id) {
case RAD_TAG_INTERIM_INTERVAL:
- rpd->acct_interim_interval = backup_read_u32(tag->data);
+ rpd->acct_interim_interval = u_read_native32(tag->data);
break;
case RAD_TAG_INTERIM_JITTER:
- rpd->acct_interim_jitter = backup_read_u32(tag->data);
+ rpd->acct_interim_jitter = u_read_native32(tag->data);
break;
case RAD_TAG_SESSION_TIMEOUT:
- rpd->session_timeout.expire_tv.tv_sec = backup_read_u64(tag->data) - ses->start_time;
+ rpd->session_timeout.expire_tv.tv_sec = u_read_native64(tag->data) - ses->start_time;
break;
case RAD_TAG_IDLE_TIMEOUT:
- rpd->idle_timeout.period = backup_read_u32(tag->data) * 1000;
+ rpd->idle_timeout.period = u_read_native32(tag->data) * 1000;
break;
case RAD_TAG_IPV4_ADDR:
ses->ipv4 = &rpd->ipv4_addr;
@@ -171,16 +152,16 @@ void radius_restore_session(struct ap_session *ses, struct radius_pd_t *rpd)
rpd->attr_state_len = tag->size;
break;
case RAD_TAG_TERMINATION_ACTION:
- rpd->termination_action = backup_read_u32(tag->data);
+ rpd->termination_action = u_read_native32(tag->data);
break;
case RAD_TAG_ACCT_USERNAME:
rpd->acct_username = _strndup(tag->data, tag->size);
break;
case RAD_TAG_ACCT_SERVER_ADDR:
- acct_addr = backup_read_u32(tag->data);
+ acct_addr = u_read_native32(tag->data);
break;
case RAD_TAG_ACCT_SERVER_PORT:
- acct_port = backup_read_u16(tag->data);
+ acct_port = u_read_native16(tag->data);
break;
}
}
diff --git a/accel-pppd/radius/packet.c b/accel-pppd/radius/packet.c
index 782ecffe..4a0ab244 100644
--- a/accel-pppd/radius/packet.c
+++ b/accel-pppd/radius/packet.c
@@ -24,6 +24,7 @@
#include "mempool.h"
#include "radius_p.h"
#include "attr_defs.h"
+#include "utils.h"
#include "memdebug.h"
@@ -35,34 +36,6 @@ static mempool_t packet_pool;
static mempool_t attr_pool;
static mempool_t buf_pool;
-static uint16_t radius_read_u16(const void *ptr)
-{
- uint16_t value;
-
- memcpy(&value, ptr, sizeof(value));
- return ntohs(value);
-}
-
-static uint32_t radius_read_u32(const void *ptr)
-{
- uint32_t value;
-
- memcpy(&value, ptr, sizeof(value));
- return ntohl(value);
-}
-
-static void radius_write_u16(void *ptr, uint16_t value)
-{
- value = htons(value);
- memcpy(ptr, &value, sizeof(value));
-}
-
-static void radius_write_u32(void *ptr, uint32_t value)
-{
- value = htonl(value);
- memcpy(ptr, &value, sizeof(value));
-}
-
struct rad_packet_t *rad_packet_alloc(int code)
{
struct rad_packet_t *pack;
@@ -139,20 +112,20 @@ int rad_packet_build(struct rad_packet_t *pack, uint8_t *RA)
*ptr = pack->code; ptr++;
*ptr = pack->id; ptr++;
- radius_write_u16(ptr, pack->len); ptr += 2;
+ u_write_be16(ptr, pack->len); ptr += 2;
memcpy(ptr, RA, 16); ptr+=16;
list_for_each_entry(attr, &pack->attrs, entry) {
if (attr->vendor) {
*ptr = 26; ptr++;
*ptr = attr->len + 2 + 6; ptr++;
- radius_write_u32(ptr, attr->vendor->id); ptr += 4;
+ u_write_be32(ptr, attr->vendor->id); ptr += 4;
}
*ptr = attr->attr->id; ptr++;
*ptr = attr->len + 2; ptr++;
switch(attr->attr->type) {
case ATTR_TYPE_INTEGER:
- radius_write_u32(ptr, attr->val.integer);
+ u_write_be32(ptr, attr->val.integer);
break;
case ATTR_TYPE_OCTETS:
case ATTR_TYPE_STRING:
@@ -164,7 +137,7 @@ int rad_packet_build(struct rad_packet_t *pack, uint8_t *RA)
memcpy(ptr, &attr->val, attr->len);
break;
case ATTR_TYPE_DATE:
- radius_write_u32(ptr, attr->val.date);
+ u_write_be32(ptr, attr->val.date);
break;
case ATTR_TYPE_IPV6PREFIX:
ptr[0] = 0;
@@ -232,7 +205,7 @@ int rad_packet_recv(int fd, struct rad_packet_t **p, struct sockaddr_in *addr)
pack->code = *ptr; ptr++;
pack->id = *ptr; ptr++;
- pack->len = radius_read_u16(ptr); ptr += 2;
+ pack->len = u_read_be16(ptr); ptr += 2;
if (pack->len < 20 || pack->len > n) {
log_ppp_warn("radius:packet: short packet received %i, expected %i\n", pack->len, n);
@@ -263,7 +236,7 @@ int rad_packet_recv(int fd, struct rad_packet_t **p, struct sockaddr_in *addr)
log_ppp_warn("radius:packet: vendor attribute too short (%i)\n", len);
goto out_err;
}
- vendor_id = radius_read_u32(ptr);
+ vendor_id = u_read_be32(ptr);
vendor = rad_dict_find_vendor_id(vendor_id);
if (vendor) {
if (len < 4 + vendor->tag + vendor->len) {
@@ -273,14 +246,14 @@ int rad_packet_recv(int fd, struct rad_packet_t **p, struct sockaddr_in *addr)
ptr += 4;
if (vendor->tag == 2)
- id = radius_read_u16(ptr);
+ id = u_read_be16(ptr);
else
id = *ptr;
ptr += vendor->tag;
if (vendor->len == 2)
- len = radius_read_u16(ptr);
+ len = u_read_be16(ptr);
else
len = *ptr;
@@ -333,15 +306,15 @@ int rad_packet_recv(int fd, struct rad_packet_t **p, struct sockaddr_in *addr)
break;
}
if (len == 4)
- attr->val.integer = radius_read_u32(ptr);
+ attr->val.integer = u_read_be32(ptr);
else if (len == 2)
- attr->val.integer = radius_read_u16(ptr);
+ attr->val.integer = u_read_be16(ptr);
else if (len == 1)
attr->val.integer = *ptr;
break;
case ATTR_TYPE_DATE:
if (len == 4)
- attr->val.integer = radius_read_u32(ptr);
+ attr->val.integer = u_read_be32(ptr);
else
log_ppp_warn("radius:packet: attribute %s has invalid length %i (must be 4)\n", da->name, len);
break;