diff options
| author | Denys Fedoryshchenko <denys.f@collabora.com> | 2026-09-01 09:08:47 +0300 |
|---|---|---|
| committer | Denys Fedoryshchenko <denys.f@collabora.com> | 2026-09-01 09:08:47 +0300 |
| commit | 7d4f8524f57ba0ac77e47171bebfc0370df667b1 (patch) | |
| tree | b3020b4e2aac0deac02721b7ebfe96c5ca4519b9 /accel-pppd/radius | |
| parent | c12e1242c0ab98255661f84be3eb37148c00cb38 (diff) | |
| download | accel-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.c | 39 | ||||
| -rw-r--r-- | accel-pppd/radius/packet.c | 51 |
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; |
