The compiler will do this for us.
be16_t code;
be16_t len;
uint8_t data[];
be16_t code;
be16_t len;
uint8_t data[];
static int option_append_hdr(uint8_t **buf, size_t *buflen, uint16_t optcode,
size_t optlen) {
static int option_append_hdr(uint8_t **buf, size_t *buflen, uint16_t optcode,
size_t optlen) {
- DHCP6Option *option = (DHCP6Option*) *buf; /* unaligned! */
+ DHCP6Option *option = (DHCP6Option*) *buf;
assert_return(buf, -EINVAL);
assert_return(*buf, -EINVAL);
assert_return(buf, -EINVAL);
assert_return(*buf, -EINVAL);
if (optlen > 0xffff || *buflen < optlen + sizeof(DHCP6Option))
return -ENOBUFS;
if (optlen > 0xffff || *buflen < optlen + sizeof(DHCP6Option))
return -ENOBUFS;
- unaligned_write_be16(&option->code, optcode);
- unaligned_write_be16(&option->len, (uint16_t) optlen);
+ option->code = htobe16(optcode);
+ option->len = htobe16(optlen);
*buf += sizeof(DHCP6Option);
*buflen -= sizeof(DHCP6Option);
*buf += sizeof(DHCP6Option);
*buflen -= sizeof(DHCP6Option);
-static int option_parse_hdr(uint8_t **buf, size_t *buflen, uint16_t *optcode,
- size_t *optlen) {
- DHCP6Option *option = (DHCP6Option*) *buf; /* unaligned! */
+static int option_parse_hdr(uint8_t **buf, size_t *buflen, uint16_t *optcode, size_t *optlen) {
+ DHCP6Option *option = (DHCP6Option*) *buf;
uint16_t len;
assert_return(buf, -EINVAL);
uint16_t len;
assert_return(buf, -EINVAL);
if (*buflen < sizeof(DHCP6Option))
return -ENOMSG;
if (*buflen < sizeof(DHCP6Option))
return -ENOMSG;
- len = unaligned_read_be16(&option->len);
+ len = be16toh(option->len);
if (len > *buflen)
return -ENOMSG;
if (len > *buflen)
return -ENOMSG;
- *optcode = unaligned_read_be16(&option->code);
+ *optcode = be16toh(option->code);
*optlen = len;
*buf += 4;
*optlen = len;
*buf += 4;
be16toh((header)->length)
#define PPPOE_PACKET_TAIL(packet) \
be16toh((header)->length)
#define PPPOE_PACKET_TAIL(packet) \
- (struct pppoe_tag *)((uint8_t*)(packet) + sizeof(struct pppoe_hdr) + PPPOE_PACKET_LENGTH(packet))
+ (struct pppoe_tag*)((uint8_t*)(packet) + sizeof(struct pppoe_hdr) + PPPOE_PACKET_LENGTH(packet))
-#define PPPOE_TAG_LENGTH(tag) \
- unaligned_read_be16(&(tag)->tag_len)
+#define PPPOE_TAG_LENGTH(tag) \
+ be16toh((tag)->tag_len)
-#define PPPOE_TAG_TYPE(tag) \
- htobe16(unaligned_read_be16(&(tag)->tag_type))
-
-#define PPPOE_TAG_SET_LENGTH(tag, len) \
- unaligned_write_be16(&(tag)->tag_len, len)
-
-#define PPPOE_TAG_SET_TYPE(tag, len) \
- unaligned_write_be16(&(tag)->tag_type, be16toh(len))
+#define PPPOE_TAG_TYPE(tag) \
+ (tag)->tag_type
#define PPPOE_TAG_NEXT(tag) \
(struct pppoe_tag *)((uint8_t *)(tag) + sizeof(struct pppoe_tag) + PPPOE_TAG_LENGTH(tag))
#define PPPOE_TAG_NEXT(tag) \
(struct pppoe_tag *)((uint8_t *)(tag) + sizeof(struct pppoe_tag) + PPPOE_TAG_LENGTH(tag))
tag = PPPOE_PACKET_TAIL(packet);
tag = PPPOE_PACKET_TAIL(packet);
- PPPOE_TAG_SET_LENGTH(tag, tag_len);
- PPPOE_TAG_SET_TYPE(tag, tag_type);
+ tag->tag_len = htobe16(tag_len);
+ tag->tag_type = tag_type;
if (tag_data)
memcpy(tag->tag_data, tag_data, tag_len);
if (tag_data)
memcpy(tag->tag_data, tag_data, tag_len);