dhcp: stop using magic constants; use (htonl(CONST) != a) - it's smaller
function old new delta udhcp_get_packet 146 134 -12 get_raw_packet 368 353 -15
This commit is contained in:
@ -171,7 +171,7 @@ int get_raw_packet(struct dhcpMessage *payload, int fd)
|
|||||||
bytes = read(fd, &packet, sizeof(struct udp_dhcp_packet));
|
bytes = read(fd, &packet, sizeof(struct udp_dhcp_packet));
|
||||||
if (bytes < 0) {
|
if (bytes < 0) {
|
||||||
DEBUG("Cannot read on raw listening socket - ignoring");
|
DEBUG("Cannot read on raw listening socket - ignoring");
|
||||||
usleep(500000); /* possible down interface, looping condition */
|
sleep(1); /* possible down interface, looping condition */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,7 +190,7 @@ int get_raw_packet(struct dhcpMessage *payload, int fd)
|
|||||||
|
|
||||||
/* Make sure its the right packet for us, and that it passes sanity checks */
|
/* Make sure its the right packet for us, and that it passes sanity checks */
|
||||||
if (packet.ip.protocol != IPPROTO_UDP || packet.ip.version != IPVERSION
|
if (packet.ip.protocol != IPPROTO_UDP || packet.ip.version != IPVERSION
|
||||||
|| packet.ip.ihl != sizeof(packet.ip) >> 2
|
|| packet.ip.ihl != (sizeof(packet.ip) >> 2)
|
||||||
|| packet.udp.dest != htons(CLIENT_PORT)
|
|| packet.udp.dest != htons(CLIENT_PORT)
|
||||||
|| bytes > (int) sizeof(struct udp_dhcp_packet)
|
|| bytes > (int) sizeof(struct udp_dhcp_packet)
|
||||||
|| ntohs(packet.udp.len) != (uint16_t)(bytes - sizeof(packet.ip))
|
|| ntohs(packet.udp.len) != (uint16_t)(bytes - sizeof(packet.ip))
|
||||||
@ -207,7 +207,7 @@ int get_raw_packet(struct dhcpMessage *payload, int fd)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* verify the UDP checksum by replacing the header with a psuedo header */
|
/* verify the UDP checksum by replacing the header with a pseudo header */
|
||||||
source = packet.ip.saddr;
|
source = packet.ip.saddr;
|
||||||
dest = packet.ip.daddr;
|
dest = packet.ip.daddr;
|
||||||
check = packet.udp.check;
|
check = packet.udp.check;
|
||||||
@ -225,7 +225,7 @@ int get_raw_packet(struct dhcpMessage *payload, int fd)
|
|||||||
|
|
||||||
memcpy(payload, &(packet.data), bytes - (sizeof(packet.ip) + sizeof(packet.udp)));
|
memcpy(payload, &(packet.data), bytes - (sizeof(packet.ip) + sizeof(packet.udp)));
|
||||||
|
|
||||||
if (ntohl(payload->cookie) != DHCP_MAGIC) {
|
if (payload->cookie != htonl(DHCP_MAGIC)) {
|
||||||
bb_error_msg("received bogus message (bad magic) - ignoring");
|
bb_error_msg("received bogus message (bad magic) - ignoring");
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
@ -38,12 +38,18 @@ struct dhcpMessage {
|
|||||||
uint8_t file[128];
|
uint8_t file[128];
|
||||||
uint32_t cookie;
|
uint32_t cookie;
|
||||||
uint8_t options[308]; /* 312 - cookie */
|
uint8_t options[308]; /* 312 - cookie */
|
||||||
};
|
} ATTRIBUTE_PACKED;
|
||||||
|
|
||||||
struct udp_dhcp_packet {
|
struct udp_dhcp_packet {
|
||||||
struct iphdr ip;
|
struct iphdr ip;
|
||||||
struct udphdr udp;
|
struct udphdr udp;
|
||||||
struct dhcpMessage data;
|
struct dhcpMessage data;
|
||||||
|
} ATTRIBUTE_PACKED;
|
||||||
|
|
||||||
|
/* Let's see whether compiler understood us right */
|
||||||
|
struct BUG_bad_sizeof_struct_udp_dhcp_packet {
|
||||||
|
char BUG_bad_sizeof_struct_udp_dhcp_packet
|
||||||
|
[sizeof(struct udp_dhcp_packet) != 576 ? -1 : 1];
|
||||||
};
|
};
|
||||||
|
|
||||||
void udhcp_init_header(struct dhcpMessage *packet, char type);
|
void udhcp_init_header(struct dhcpMessage *packet, char type);
|
||||||
|
@ -73,12 +73,13 @@ uint8_t *get_option(struct dhcpMessage *packet, int code)
|
|||||||
{
|
{
|
||||||
int i, length;
|
int i, length;
|
||||||
uint8_t *optionptr;
|
uint8_t *optionptr;
|
||||||
int over = 0, done = 0, curr = OPTION_FIELD;
|
int over = 0;
|
||||||
|
int curr = OPTION_FIELD;
|
||||||
|
|
||||||
optionptr = packet->options;
|
optionptr = packet->options;
|
||||||
i = 0;
|
i = 0;
|
||||||
length = 308;
|
length = sizeof(packet->options);
|
||||||
while (!done) {
|
while (1) {
|
||||||
if (i >= length) {
|
if (i >= length) {
|
||||||
bb_error_msg("bogus packet, option fields too long");
|
bb_error_msg("bogus packet, option fields too long");
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -103,17 +104,18 @@ uint8_t *get_option(struct dhcpMessage *packet, int code)
|
|||||||
i += optionptr[OPT_LEN] + 2;
|
i += optionptr[OPT_LEN] + 2;
|
||||||
break;
|
break;
|
||||||
case DHCP_END:
|
case DHCP_END:
|
||||||
if (curr == OPTION_FIELD && over & FILE_FIELD) {
|
if (curr == OPTION_FIELD && (over & FILE_FIELD)) {
|
||||||
optionptr = packet->file;
|
optionptr = packet->file;
|
||||||
i = 0;
|
i = 0;
|
||||||
length = 128;
|
length = sizeof(packet->file);
|
||||||
curr = FILE_FIELD;
|
curr = FILE_FIELD;
|
||||||
} else if (curr == FILE_FIELD && over & SNAME_FIELD) {
|
} else if (curr == FILE_FIELD && (over & SNAME_FIELD)) {
|
||||||
optionptr = packet->sname;
|
optionptr = packet->sname;
|
||||||
i = 0;
|
i = 0;
|
||||||
length = 64;
|
length = sizeof(packet->sname);
|
||||||
curr = SNAME_FIELD;
|
curr = SNAME_FIELD;
|
||||||
} else done = 1;
|
} else
|
||||||
|
return NULL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
i += optionptr[OPT_LEN + i] + 2;
|
i += optionptr[OPT_LEN + i] + 2;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#define TYPE_MASK 0x0F
|
#define TYPE_MASK 0x0F
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
OPTION_IP=1,
|
OPTION_IP = 1,
|
||||||
OPTION_IP_PAIR,
|
OPTION_IP_PAIR,
|
||||||
OPTION_STRING,
|
OPTION_STRING,
|
||||||
#if ENABLE_FEATURE_RFC3397
|
#if ENABLE_FEATURE_RFC3397
|
||||||
|
@ -57,7 +57,7 @@ int udhcp_get_packet(struct dhcpMessage *packet, int fd)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ntohl(packet->cookie) != DHCP_MAGIC) {
|
if (packet->cookie != htonl(DHCP_MAGIC)) {
|
||||||
bb_error_msg("received bogus message, ignoring");
|
bb_error_msg("received bogus message, ignoring");
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
@ -123,7 +123,6 @@ uint16_t udhcp_checksum(void *addr, int count)
|
|||||||
|
|
||||||
|
|
||||||
/* Construct a ip/udp header for a packet, and specify the source and dest hardware address */
|
/* Construct a ip/udp header for a packet, and specify the source and dest hardware address */
|
||||||
void BUG_sizeof_struct_udp_dhcp_packet_must_be_576(void);
|
|
||||||
int udhcp_raw_packet(struct dhcpMessage *payload,
|
int udhcp_raw_packet(struct dhcpMessage *payload,
|
||||||
uint32_t source_ip, int source_port,
|
uint32_t source_ip, int source_port,
|
||||||
uint32_t dest_ip, int dest_port, const uint8_t *dest_arp, int ifindex)
|
uint32_t dest_ip, int dest_port, const uint8_t *dest_arp, int ifindex)
|
||||||
@ -169,9 +168,6 @@ int udhcp_raw_packet(struct dhcpMessage *payload,
|
|||||||
packet.ip.ttl = IPDEFTTL;
|
packet.ip.ttl = IPDEFTTL;
|
||||||
packet.ip.check = udhcp_checksum(&(packet.ip), sizeof(packet.ip));
|
packet.ip.check = udhcp_checksum(&(packet.ip), sizeof(packet.ip));
|
||||||
|
|
||||||
if (sizeof(struct udp_dhcp_packet) != 576)
|
|
||||||
BUG_sizeof_struct_udp_dhcp_packet_must_be_576();
|
|
||||||
|
|
||||||
result = sendto(fd, &packet, sizeof(struct udp_dhcp_packet), 0,
|
result = sendto(fd, &packet, sizeof(struct udp_dhcp_packet), 0,
|
||||||
(struct sockaddr *) &dest, sizeof(dest));
|
(struct sockaddr *) &dest, sizeof(dest));
|
||||||
if (result <= 0) {
|
if (result <= 0) {
|
||||||
|
Reference in New Issue
Block a user