refactor: move variable declarations to function beginnings
This commit is contained in:
parent
85543f3d19
commit
865f9d0ccb
9 changed files with 23 additions and 16 deletions
|
|
@ -16,16 +16,19 @@ icmp_build_packet(void *buffer, size_t buffer_len, uint8_t type, uint8_t code,
|
||||||
size_t payload_len)
|
size_t payload_len)
|
||||||
{
|
{
|
||||||
const size_t required_len = sizeof(struct icmp_header) + payload_len;
|
const size_t required_len = sizeof(struct icmp_header) + payload_len;
|
||||||
|
struct icmp_header *h;
|
||||||
|
|
||||||
if (buffer_len < required_len)
|
if (buffer_len < required_len)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
struct icmp_header *h = (struct icmp_header *)buffer;
|
h = (struct icmp_header *)buffer;
|
||||||
|
|
||||||
write_icmp_header(h, type, code, header_rest);
|
write_icmp_header(h, type, code, header_rest);
|
||||||
if (payload_len > 0)
|
if (payload_len > 0)
|
||||||
|
{
|
||||||
memcpy((uint8_t *)buffer + sizeof(struct icmp_header), payload,
|
memcpy((uint8_t *)buffer + sizeof(struct icmp_header), payload,
|
||||||
payload_len);
|
payload_len);
|
||||||
|
}
|
||||||
|
|
||||||
h->checksum = htons(icmp_checksum(h, required_len));
|
h->checksum = htons(icmp_checksum(h, required_len));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,12 +18,15 @@ icmp_parse_icmp_payload(const void *buffer, size_t buffer_len,
|
||||||
size_t ip_hdr_len, uint8_t *type, uint8_t *code,
|
size_t ip_hdr_len, uint8_t *type, uint8_t *code,
|
||||||
const void **payload, size_t *payload_len)
|
const void **payload, size_t *payload_len)
|
||||||
{
|
{
|
||||||
|
size_t payload_offset;
|
||||||
|
const struct icmp_header *hdr;
|
||||||
|
|
||||||
if (validate_icmp_size(buffer_len, ip_hdr_len) != 0)
|
if (validate_icmp_size(buffer_len, ip_hdr_len) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
const struct icmp_header *hdr = get_icmp_header(buffer, ip_hdr_len);
|
hdr = get_icmp_header(buffer, ip_hdr_len);
|
||||||
extract_icmp_fields(hdr, type, code);
|
extract_icmp_fields(hdr, type, code);
|
||||||
size_t payload_offset = ip_hdr_len + ICMP_HEADER_SIZE;
|
payload_offset = ip_hdr_len + ICMP_HEADER_SIZE;
|
||||||
|
|
||||||
*payload_len = buffer_len - payload_offset;
|
*payload_len = buffer_len - payload_offset;
|
||||||
*payload = (const uint8_t *)buffer + payload_offset;
|
*payload = (const uint8_t *)buffer + payload_offset;
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,14 @@ icmp_parse_ip_header(const void *buffer, size_t buffer_len, uint8_t *ttl,
|
||||||
struct in_addr *src_addr, size_t *ip_hdr_len,
|
struct in_addr *src_addr, size_t *ip_hdr_len,
|
||||||
struct in_addr *dst_addr, uint8_t *protocol)
|
struct in_addr *dst_addr, uint8_t *protocol)
|
||||||
{
|
{
|
||||||
|
const struct ip_header *h;
|
||||||
|
size_t ihl_bytes;
|
||||||
|
|
||||||
if (buffer_len < MIN_IP_HEADER_SIZE)
|
if (buffer_len < MIN_IP_HEADER_SIZE)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
const struct ip_header *h = (const struct ip_header *)buffer;
|
h = (const struct ip_header *)buffer;
|
||||||
size_t ihl_bytes = extract_ip_header_length(h->version_ihl);
|
ihl_bytes = extract_ip_header_length(h->version_ihl);
|
||||||
|
|
||||||
if (0 != validate_ip_header(h, buffer_len))
|
if (0 != validate_ip_header(h, buffer_len))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
||||||
|
|
@ -19,15 +19,17 @@ icmp_send_raw(icmp_handle_t *h, uint8_t type, uint8_t code,
|
||||||
const void *payload, size_t len, struct in_addr dest,
|
const void *payload, size_t len, struct in_addr dest,
|
||||||
uint8_t ttl)
|
uint8_t ttl)
|
||||||
{
|
{
|
||||||
|
uint8_t buffer[ICMP_HEADER_SIZE + MAX_PAYLOAD_SIZE];
|
||||||
|
int packet_len;
|
||||||
|
|
||||||
if (0 == send_validate_handle(h))
|
if (0 == send_validate_handle(h))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (0 == validate_payload(h, payload, len))
|
if (0 == validate_payload(h, payload, len))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
uint8_t buffer[ICMP_HEADER_SIZE + MAX_PAYLOAD_SIZE];
|
|
||||||
|
|
||||||
int packet_len = icmp_build_packet(buffer, sizeof(buffer),
|
packet_len = icmp_build_packet(buffer, sizeof(buffer),
|
||||||
type, code, header_rest, payload, len);
|
type, code, header_rest, payload, len);
|
||||||
if (-1 == packet_len)
|
if (-1 == packet_len)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,11 @@ int
|
||||||
send_to_destination(struct icmp_handle *h, const void *packet, size_t len,
|
send_to_destination(struct icmp_handle *h, const void *packet, size_t len,
|
||||||
struct in_addr dest, uint8_t ttl)
|
struct in_addr dest, uint8_t ttl)
|
||||||
{
|
{
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
|
||||||
if (send_set_socket_ttl(h, ttl) < 0)
|
if (send_set_socket_ttl(h, ttl) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
struct sockaddr_in addr;
|
|
||||||
send_prepare_destination(&addr, dest);
|
send_prepare_destination(&addr, dest);
|
||||||
|
|
||||||
if (send_packet(h, packet, len, &addr) < 0)
|
if (send_packet(h, packet, len, &addr) < 0)
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,11 @@ int
|
||||||
send_set_socket_ttl(struct icmp_handle *h, uint8_t ttl)
|
send_set_socket_ttl(struct icmp_handle *h, uint8_t ttl)
|
||||||
{
|
{
|
||||||
int ttl_val = ttl;
|
int ttl_val = ttl;
|
||||||
|
int saved_errno;
|
||||||
|
|
||||||
if (setsockopt(h->fd, IPPROTO_IP, IP_TTL, &ttl_val, sizeof(ttl_val)) < 0)
|
if (setsockopt(h->fd, IPPROTO_IP, IP_TTL, &ttl_val, sizeof(ttl_val)) < 0)
|
||||||
{
|
{
|
||||||
int saved_errno = errno;
|
saved_errno = errno;
|
||||||
icmp_set_error_fmt(h, ICMP_ERR_SOCKET, "Failed to set TTL: %s",
|
icmp_set_error_fmt(h, ICMP_ERR_SOCKET, "Failed to set TTL: %s",
|
||||||
strerror(saved_errno));
|
strerror(saved_errno));
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@ socket_configure(struct icmp_handle *h)
|
||||||
{
|
{
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
/* Get current file status flags */
|
|
||||||
flags = fcntl(h->fd, F_GETFL, 0);
|
flags = fcntl(h->fd, F_GETFL, 0);
|
||||||
if (-1 == flags)
|
if (-1 == flags)
|
||||||
{
|
{
|
||||||
|
|
@ -21,14 +20,12 @@ socket_configure(struct icmp_handle *h)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set non-blocking flag */
|
|
||||||
if (-1 == fcntl(h->fd, F_SETFL, flags | O_NONBLOCK))
|
if (-1 == fcntl(h->fd, F_SETFL, flags | O_NONBLOCK))
|
||||||
{
|
{
|
||||||
handle_configure_error(h, "fcntl(F_SETFL)");
|
handle_configure_error(h, "fcntl(F_SETFL)");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear error state on success */
|
|
||||||
icmp_clear_error(h);
|
icmp_clear_error(h);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ socket_create(struct icmp_handle *h)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
/* Create raw ICMP socket */
|
|
||||||
fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
||||||
|
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
|
|
@ -23,10 +22,8 @@ socket_create(struct icmp_handle *h)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store file descriptor in handle */
|
|
||||||
h->fd = fd;
|
h->fd = fd;
|
||||||
|
|
||||||
/* Clear error state on success */
|
|
||||||
icmp_clear_error(h);
|
icmp_clear_error(h);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,8 @@ static uint32_t
|
||||||
sum_words(const uint8_t *data, size_t len)
|
sum_words(const uint8_t *data, size_t len)
|
||||||
{
|
{
|
||||||
const uint8_t *ptr = data;
|
const uint8_t *ptr = data;
|
||||||
|
const size_t words = len >> 1;
|
||||||
uint32_t sum = 0;
|
uint32_t sum = 0;
|
||||||
size_t words = len >> 1;
|
|
||||||
|
|
||||||
/* Duff's device: unroll loop by 4 */
|
/* Duff's device: unroll loop by 4 */
|
||||||
if (words > 0)
|
if (words > 0)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue