Hi Jukka, > gdhcp/client.c | 17 +++++++---------- > gdhcp/common.c | 19 +++++++++++++++---- > gdhcp/common.h | 16 ---------------- > gdhcp/server.c | 8 ++++---- > 4 files changed, 26 insertions(+), 34 deletions(-) > > diff --git a/gdhcp/client.c b/gdhcp/client.c > index cf04ced..801d652 100644 > --- a/gdhcp/client.c > +++ b/gdhcp/client.c > @@ -41,6 +41,7 @@ > > #include <glib.h> > > +#include <connman/unaligned.h> > #include "gdhcp.h" > #include "common.h" > #include "ipv4ll.h" > @@ -1340,8 +1341,7 @@ static uint32_t get_lease(struct dhcp_packet *packet) > if (option_u8 == NULL) > return 3600; > > - lease_seconds = dhcp_get_unaligned((uint32_t *) option_u8); > - lease_seconds = ntohl(lease_seconds); > + lease_seconds = get_unaligned_be32(option_u8);
this looks way nicer now. > /* paranoia: must not be prone to overflows */ > lease_seconds &= 0x0fffffff; > if (lease_seconds < 10) > @@ -1518,16 +1518,14 @@ static char *malloc_option_value_string(uint8_t > *option, GDHCPOptionType type) > dest += sprint_nip(dest, "", option); > break; > case OPTION_U16: { > - uint16_t val_u16 = dhcp_get_unaligned( > - (uint16_t *) option); > - dest += sprintf(dest, "%u", ntohs(val_u16)); > + uint16_t val_u16 = get_unaligned_be16(option); > + dest += sprintf(dest, "%u", val_u16); > break; > } > case OPTION_U32: { > - uint32_t val_u32 = dhcp_get_unaligned( > - (uint32_t *) option); > + uint32_t val_u32 = get_unaligned_be32(option); > dest += sprintf(dest, type == OPTION_U32 ? "%lu" : > - "%ld", (unsigned long) ntohl(val_u32)); > + "%ld", (unsigned long)val_u32); I do not get this unsigned long magic here? Why are we doing that instead of just using %u? > break; > } > case OPTION_STRING: > @@ -1924,8 +1922,7 @@ static gboolean listener_event(GIOChannel *channel, > GIOCondition condition, > dhcp_client->retry_times = 0; > > option_u8 = dhcp_get_option(&packet, DHCP_SERVER_ID); > - dhcp_client->server_ip = > - dhcp_get_unaligned((uint32_t *) option_u8); > + dhcp_client->server_ip = get_unaligned((uint32_t *)option_u8); Why is this used in native endian? > dhcp_client->requested_ip = packet.yiaddr; > > dhcp_client->state = REQUESTING; > diff --git a/gdhcp/common.c b/gdhcp/common.c > index 8d5c284..7cca3a3 100644 > --- a/gdhcp/common.c > +++ b/gdhcp/common.c > @@ -36,6 +36,7 @@ > #include <net/ethernet.h> > #include <arpa/inet.h> > > +#include <connman/unaligned.h> Can we keep this gdhcp/unaligned.h for now. > #include "gdhcp.h" > #include "common.h" > > @@ -280,11 +281,21 @@ void dhcp_add_simple_option(struct dhcp_packet *packet, > uint8_t code, > len = dhcp_option_lengths[type & OPTION_TYPE_MASK]; > option[OPT_LEN] = len; > > -#if __BYTE_ORDER == __BIG_ENDIAN > - data <<= 8 * (4 - len); > -#endif > + switch (len) { > + case 1: > + option[OPT_DATA] = data; > + break; > + case 2: > + put_unaligned(data, (uint16_t *)(option + OPT_DATA)); > + break; > + case 4: > + put_unaligned(data, (uint32_t *)(option + OPT_DATA)); > + break; > + default: > + printf("Invalid option len %d for code 0x%x\n", len, code); > + return; > + } Are we not missing endian conversion here. This is going back onto the wire, right? > > - dhcp_put_unaligned(data, (uint32_t *)(option + OPT_DATA)); > dhcp_add_binary_option(packet, option); > > return; > diff --git a/gdhcp/common.h b/gdhcp/common.h > index 13f49d8..c1c5e4f 100644 > --- a/gdhcp/common.h > +++ b/gdhcp/common.h > @@ -26,22 +26,6 @@ > > #include "gdhcp.h" > > -#define dhcp_get_unaligned(ptr) \ > -({ \ > - struct __attribute__((packed)) { \ > - typeof(*(ptr)) __v; \ > - } *__p = (void *) (ptr); \ > - __p->__v; \ > -}) > - > -#define dhcp_put_unaligned(val, ptr) \ > -do { \ > - struct __attribute__((packed)) { \ > - typeof(*(ptr)) __v; \ > - } *__p = (void *) (ptr); \ > - __p->__v = (val); \ > -} while (0) > - > #define CLIENT_PORT 68 > #define SERVER_PORT 67 > > diff --git a/gdhcp/server.c b/gdhcp/server.c > index a342985..3c2d057 100644 > --- a/gdhcp/server.c > +++ b/gdhcp/server.c > @@ -40,6 +40,7 @@ > > #include <glib.h> > > +#include <connman/unaligned.h> > #include "common.h" > > /* 8 hours */ > @@ -664,8 +665,8 @@ static gboolean listener_event(GIOChannel *channel, > GIOCondition condition, > > server_id_option = dhcp_get_option(&packet, DHCP_SERVER_ID); > if (server_id_option) { > - uint32_t server_nid = dhcp_get_unaligned( > - (uint32_t *) server_id_option); > + uint32_t server_nid = > + get_unaligned((uint32_t *)server_id_option); Same here. I do not get it. Why can we not convert this into native endian. > > if (server_nid != dhcp_server->server_nip) > return TRUE; > @@ -673,8 +674,7 @@ static gboolean listener_event(GIOChannel *channel, > GIOCondition condition, > > request_ip_option = dhcp_get_option(&packet, DHCP_REQUESTED_IP); > if (request_ip_option) > - requested_nip = dhcp_get_unaligned( > - (uint32_t *) request_ip_option); > + requested_nip = get_unaligned((uint32_t *)request_ip_option); And here again. Native endian? > > lease = find_lease_by_mac(dhcp_server, packet.chaddr); > Regards Marcel _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman