diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2012-10-11 10:11:51 +0300 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-10-11 15:30:21 +0200 |
commit | 635f1e814e4e5a0d4f8356475dff32515e78f692 (patch) | |
tree | ff7b73473f6c629b09dd14970279b817b6fb2548 /gdhcp/common.c | |
parent | 51ca65aa0586f7e96dde4bbccdf0fef170d1a3e9 (diff) | |
download | connman-635f1e814e4e5a0d4f8356475dff32515e78f692.tar.gz connman-635f1e814e4e5a0d4f8356475dff32515e78f692.tar.bz2 connman-635f1e814e4e5a0d4f8356475dff32515e78f692.zip |
gdhcp: Use host byte order internally
Convert to network byte order just before sending the packet.
Diffstat (limited to 'gdhcp/common.c')
-rw-r--r-- | gdhcp/common.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/gdhcp/common.c b/gdhcp/common.c index 8d5c284b..55fddcbf 100644 --- a/gdhcp/common.c +++ b/gdhcp/common.c @@ -280,11 +280,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_be16(data, option + OPT_DATA); + break; + case 4: + put_be32(data, option + OPT_DATA); + break; + default: + printf("Invalid option len %d for code 0x%x\n", len, code); + return; + } - dhcp_put_unaligned(data, (uint32_t *)(option + OPT_DATA)); dhcp_add_binary_option(packet, option); return; @@ -575,7 +585,7 @@ int dhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, memset(&client, 0, sizeof(client)); client.sin_family = AF_INET; client.sin_port = htons(source_port); - client.sin_addr.s_addr = source_ip; + client.sin_addr.s_addr = htonl(source_ip); if (bind(fd, (struct sockaddr *) &client, sizeof(client)) < 0) { close(fd); return -errno; |