chiark / gitweb /
libsystemd-network: don't use unaligned helpers in _packed_ structs
authorTom Gundersen <teg@jklm.no>
Tue, 4 Nov 2014 19:19:07 +0000 (20:19 +0100)
committerTom Gundersen <teg@jklm.no>
Wed, 5 Nov 2014 15:54:22 +0000 (16:54 +0100)
The compiler will do this for us.

src/libsystemd-network/dhcp6-option.c
src/libsystemd-network/sd-pppoe.c

index a46b6e3096c8b96ff19b80bc442f5b1a4359f1ab..ea863f45e4ea13a400461949a62cbce71c913379 100644 (file)
@@ -37,11 +37,11 @@ typedef struct DHCP6Option {
         be16_t code;
         be16_t len;
         uint8_t data[];
-} DHCP6Option;
+} _packed_ DHCP6Option;
 
 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);
@@ -50,8 +50,8 @@ static int option_append_hdr(uint8_t **buf, size_t *buflen, uint16_t optcode,
         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);
@@ -136,9 +136,8 @@ int dhcp6_option_append_ia(uint8_t **buf, size_t *buflen, DHCP6IA *ia) {
 }
 
 
-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);
@@ -148,12 +147,12 @@ static int option_parse_hdr(uint8_t **buf, size_t *buflen, uint16_t *optcode,
         if (*buflen < sizeof(DHCP6Option))
                 return -ENOMSG;
 
-        len = unaligned_read_be16(&option->len);
+        len = be16toh(option->len);
 
         if (len > *buflen)
                 return -ENOMSG;
 
-        *optcode = unaligned_read_be16(&option->code);
+        *optcode = be16toh(option->code);
         *optlen = len;
 
         *buf += 4;
index 075e10204bacd50a57092d3177d8795d48e8faa9..0a962235e073787c18b34a0d908f2472f76c60e5 100644 (file)
@@ -100,19 +100,13 @@ struct sd_pppoe {
         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))
@@ -278,8 +272,8 @@ static void pppoe_tag_append(struct pppoe_hdr *packet, size_t packet_size, be16_
 
         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);