From 34025797b15e19804ca66eebe172f22aa7a73e60 Mon Sep 17 00:00:00 2001 From: Michal Zima Date: Wed, 4 Jul 2012 11:37:42 +0200 Subject: [PATCH] Specialized logging functions; can control debug --- configure.ac | 27 ++++++++++++- src/Makefile.am | 1 + src/arp.c | 10 ++--- src/checksum.c | 18 ++++----- src/icmp.c | 30 +++++++------- src/ipv4.c | 14 +++---- src/ipv6.c | 14 +++---- src/log.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++ src/log.h | 27 +++++++++++++ src/nat.c | 6 +-- src/radixtree.c | 8 ++-- src/tcp.c | 24 +++++------ src/transmitter.c | 36 ++++++++--------- src/udp.c | 15 ++++--- src/wrapper.c | 28 +++++++------ 15 files changed, 254 insertions(+), 104 deletions(-) create mode 100644 src/log.c create mode 100644 src/log.h diff --git a/configure.ac b/configure.ac index 8eabfbb..5abf3e1 100644 --- a/configure.ac +++ b/configure.ac @@ -1,11 +1,36 @@ AC_INIT([WrapSix], [0.1.99.0], [xhire@mujmalysvet.cz]) AM_INIT_AUTOMAKE([-Wall -Werror]) + +# prevent automatic adding of "-g -O2" to CFLAGS +OLD_CFLAGS=$CFLAGS AC_PROG_CC +CFLAGS=$OLD_CFLAGS + AC_CONFIG_FILES([ Makefile src/Makefile ]) -CFLAGS="-g -ggdb -O0 -pipe -pedantic -Wshadow -Wall -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline -Wformat-nonliteral -Wformat-security -Wswitch-enum -Wswitch-default -Winit-self -Wmissing-include-dirs -Wundef -Waggregate-return -Wmissing-format-attribute -Wnested-externs -Wunsafe-loop-optimizations" +### +# Configuration options +### + +AC_ARG_ENABLE([debug], + AS_HELP_STRING([--enable-debug], [enable debugging]), + [debug=$enableval], + [debug=no]) + +if test "x$debug" = "xyes"; then + AM_CFLAGS="${AM_CFLAGS} -g -ggdb -O0 -pipe -pedantic -Wshadow -Wall -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline -Wformat-nonliteral -Wformat-security -Wswitch-enum -Wswitch-default -Winit-self -Wmissing-include-dirs -Wundef -Waggregate-return -Wnested-externs -Wunsafe-loop-optimizations" + AC_DEFINE([DEBUG]) +else + AM_CFLAGS="${AM_CFLAGS} -O2" +fi + +### +# Final commands +### + +AC_SUBST([AM_CFLAGS]) AC_OUTPUT diff --git a/src/Makefile.am b/src/Makefile.am index cb7d8e1..aa18816 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,6 +7,7 @@ wrapsix_wrapper_SOURCES = \ icmp.c icmp.h \ ipv4.c ipv4.h \ ipv6.c ipv6.h \ + log.c log.h \ nat.c nat.h \ radixtree.c radixtree.h \ tcp.c tcp.h \ diff --git a/src/arp.c b/src/arp.c index 0c0a060..f3ffe0f 100644 --- a/src/arp.c +++ b/src/arp.c @@ -18,11 +18,11 @@ #include /* ETHERTYPE_* */ #include /* htons */ -#include #include /* malloc */ #include /* memcmp, memset */ #include "arp.h" +#include "log.h" #include "transmitter.h" #include "wrapper.h" @@ -32,8 +32,8 @@ * @param ethq Ethernet header of the packet * @param payload Data of the packet * - * @return 0 for success - * @return 1 for failure + * @return 0 for success + * @return 1 for failure */ int arp(struct s_ethernet *ethq, char *payload) { @@ -51,7 +51,7 @@ int arp(struct s_ethernet *ethq, char *payload) /* test if this packet belongs to us */ if (memcmp(&wrapsix_ipv4_addr, &arpq->ip_dest, 4)) { - printf("[Debug] This is unfamiliar packet\n"); + log_debug("This is unfamiliar ARP packet"); return 1; } @@ -60,7 +60,7 @@ int arp(struct s_ethernet *ethq, char *payload) /* allocate enough memory */ if ((packet = (unsigned char *) malloc(ARP_PACKET_SIZE)) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 1; } memset(packet, 0x0, ARP_PACKET_SIZE); diff --git a/src/checksum.c b/src/checksum.c index 2d286fa..b8686b6 100644 --- a/src/checksum.c +++ b/src/checksum.c @@ -17,13 +17,13 @@ */ #include /* htonl */ -#include #include /* malloc */ #include /* memcpy */ #include "checksum.h" #include "ipv4.h" #include "ipv6.h" +#include "log.h" /** * General checksum computation function @@ -31,7 +31,7 @@ * @param data Pointer to data of which to compute the checksum * @param length Length of the data (in bytes) * - * @return Checksum + * @return Checksum */ unsigned short checksum(const void *data, int length) { @@ -76,7 +76,7 @@ unsigned short checksum(const void *data, int length) * number of octets * @param new_len Length of new data * - * @return Updated checksum + * @return Updated checksum */ unsigned short checksum_update(unsigned short old_sum, unsigned short *old_data, short old_len, @@ -116,7 +116,7 @@ unsigned short checksum_update(unsigned short old_sum, * @param proto Protocol in the payload * @param payload Pointer to payload data * - * @return Checksum + * @return Checksum */ unsigned short checksum_ipv4(struct s_ipv4_addr ip_src, struct s_ipv4_addr ip_dest, @@ -128,7 +128,7 @@ unsigned short checksum_ipv4(struct s_ipv4_addr ip_src, unsigned short sum; if ((buffer = malloc(sizeof(struct s_ipv4_pseudo) + length)) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 0; } @@ -158,7 +158,7 @@ unsigned short checksum_ipv4(struct s_ipv4_addr ip_src, * @param proto Protocol in the payload * @param payload Pointer to payload data * - * @return Checksum + * @return Checksum */ unsigned short checksum_ipv6(struct s_ipv6_addr ip_src, struct s_ipv6_addr ip_dest, @@ -170,7 +170,7 @@ unsigned short checksum_ipv6(struct s_ipv6_addr ip_src, unsigned short sum; if ((buffer = malloc(sizeof(struct s_ipv6_pseudo) + length)) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 0; } @@ -202,7 +202,7 @@ unsigned short checksum_ipv6(struct s_ipv6_addr ip_src, * @param ip4_dest New destination IPv4 address * @param new_port New transport layer address (port) * - * @return Checksum + * @return Checksum */ unsigned short checksum_ipv4_update(unsigned short old_sum, struct s_ipv6_addr ip6_src, @@ -241,7 +241,7 @@ unsigned short checksum_ipv4_update(unsigned short old_sum, * @param ip6_dest New destination IPv6 address * @param new_port New transport layer address (port) * - * @return Checksum + * @return Checksum */ unsigned short checksum_ipv6_update(unsigned short old_sum, struct s_ipv4_addr ip4_src, diff --git a/src/icmp.c b/src/icmp.c index fbaaefb..62ed5b8 100644 --- a/src/icmp.c +++ b/src/icmp.c @@ -18,13 +18,13 @@ #include /* ETHERTYPE_* */ #include /* htons */ -#include #include /* malloc */ #include /* memcpy, memset */ #include "checksum.h" #include "icmp.h" #include "ipv6.h" +#include "log.h" #include "nat.h" #include "transmitter.h" #include "wrapper.h" @@ -65,7 +65,7 @@ int icmp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, if (icmp->checksum != orig_checksum) { /* packet is corrupted and shouldn't be processed */ - printf("[Debug] Wrong checksum\n"); + log_debug("Wrong checksum"); return 1; } @@ -81,8 +81,8 @@ int icmp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, 0, echo->id); if (connection == NULL) { - printf("[Debug] Incoming connection wasn't " - "found in NAT\n"); + log_debug("Incoming connection wasn't found in " + "NAT"); return 1; } @@ -94,8 +94,8 @@ int icmp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, break; default: - printf("[Debug] ICMPv4 Type: unknown [%d/0x%x]\n", - icmp->type, icmp->type); + log_debug("ICMPv4 Type: unknown [%d/0x%x]", + icmp->type, icmp->type); return 1; } @@ -103,7 +103,7 @@ int icmp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, if ((packet = (unsigned char *) malloc(sizeof(struct s_ethernet) + sizeof(struct s_ipv6) + payload_size)) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 1; } eth6 = (struct s_ethernet *) packet; @@ -177,7 +177,7 @@ int icmp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload) if (icmp->checksum != orig_checksum) { /* packet is corrupted and shouldn't be processed */ - printf("[Debug] Wrong checksum\n"); + log_debug("Wrong checksum"); return 1; } @@ -192,8 +192,8 @@ int icmp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload) echo->id, 0); if (connection == NULL) { - printf("[Debug] Error! Outgoing connection " - "wasn't found/created in NAT!\n"); + log_warn("Outgoing connection wasn't " + "found/created in NAT!"); return 1; } @@ -213,15 +213,15 @@ int icmp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload) (struct s_icmp_ndp_ns *) icmp_data); default: - printf("[Debug] ICMPv6 Type: unknown [%d/0x%x]\n", - icmp->type, icmp->type); + log_debug("ICMPv6 Type: unknown [%d/0x%x]", + icmp->type, icmp->type); return 1; } /* allocate memory for translated packet */ if ((packet = (unsigned char *) malloc(sizeof(struct s_ipv4) + htons(ip6->len))) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 1; } ip4 = (struct s_ipv4 *) packet; @@ -280,7 +280,7 @@ int icmp_ndp(struct s_ethernet *ethq, struct s_ipv6 *ipq, /* first check whether the request belongs to us */ if (memcmp(&wrapsix_ipv6_prefix, &ndp_ns->target, 12) != 0) { - printf("[Debug] [NDP] This is unfamiliar packet\n"); + log_debug("This is unfamiliar NDP packet"); return 1; } @@ -290,7 +290,7 @@ int icmp_ndp(struct s_ethernet *ethq, struct s_ipv6 *ipq, sizeof(struct s_icmp) + \ sizeof(struct s_icmp_ndp_na) if ((packet = (unsigned char *) malloc(NDP_PACKET_SIZE)) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 1; } memset(packet, 0x0, NDP_PACKET_SIZE); diff --git a/src/ipv4.c b/src/ipv4.c index 897265d..9de5406 100644 --- a/src/ipv4.c +++ b/src/ipv4.c @@ -17,11 +17,11 @@ */ #include /* IPPROTO_* */ -#include #include /* memcmp */ #include "icmp.h" #include "ipv4.h" +#include "log.h" #include "tcp.h" #include "udp.h" #include "wrapper.h" @@ -47,7 +47,7 @@ int ipv4(struct s_ethernet *eth, char *packet) /* test if this packet belongs to us */ if (memcmp(&wrapsix_ipv4_addr, &ip->ip_dest, 4) != 0) { - printf("[Debug] [IPv4] This is unfamiliar packet\n"); + log_debug("This is unfamiliar IPv4 packet"); return 1; } @@ -58,17 +58,17 @@ int ipv4(struct s_ethernet *eth, char *packet) switch (ip->proto) { case IPPROTO_TCP: - printf("[Debug] IPv4 Protocol: TCP\n"); + log_debug("IPv4 Protocol: TCP"); return tcp_ipv4(eth, ip, payload, data_size); case IPPROTO_UDP: - printf("[Debug] IPv4 Protocol: UDP\n"); + log_debug("IPv4 Protocol: UDP"); return udp_ipv4(eth, ip, payload, data_size); case IPPROTO_ICMP: - printf("[Debug] IPv4 Protocol: ICMP\n"); + log_debug("IPv4 Protocol: ICMP"); return icmp_ipv4(eth, ip, payload, data_size); default: - printf("[Debug] IPv4 Protocol: unknown [%d/0x%x]\n", - ip->proto, ip->proto); + log_debug("IPv4 Protocol: unknown [%d/0x%x]", + ip->proto, ip->proto); return 1; } } diff --git a/src/ipv6.c b/src/ipv6.c index 31bad2a..f95b533 100644 --- a/src/ipv6.c +++ b/src/ipv6.c @@ -17,11 +17,11 @@ */ #include /* IPPROTO_* */ -#include #include /* memcmp */ #include "icmp.h" #include "ipv6.h" +#include "log.h" #include "tcp.h" #include "udp.h" #include "wrapper.h" @@ -47,23 +47,23 @@ int ipv6(struct s_ethernet *eth, char *packet) /* test if this packet belongs to us */ if (memcmp(&wrapsix_ipv6_prefix, &ip->ip_dest, 12) != 0 && memcmp(&ndp_multicast_addr, &ip->ip_dest, 13) != 0) { - printf("[Debug] [IPv6] This is unfamiliar packet\n"); + log_debug("This is unfamiliar IPv6 packet"); return 1; } switch (ip->next_header) { case IPPROTO_TCP: - printf("[Debug] IPv6 Protocol: TCP\n"); + log_debug("IPv6 Protocol: TCP"); return tcp_ipv6(eth, ip, payload); case IPPROTO_UDP: - printf("[Debug] IPv6 Protocol: UDP\n"); + log_debug("IPv6 Protocol: UDP"); return udp_ipv6(eth, ip, payload); case IPPROTO_ICMPV6: - printf("[Debug] IPv6 Protocol: ICMP\n"); + log_debug("IPv6 Protocol: ICMP"); return icmp_ipv6(eth, ip, payload); default: - printf("[Debug] IPv6 Protocol: unknown [%d/0x%x]\n", - ip->next_header, ip->next_header); + log_debug("IPv6 Protocol: unknown [%d/0x%x]", + ip->next_header, ip->next_header); return 1; } } diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..4ea4e59 --- /dev/null +++ b/src/log.c @@ -0,0 +1,100 @@ +/* + * WrapSix + * Copyright (C) 2008-2012 Michal Zima + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include "log.h" + +/** + * Logs debugging stuff to stdout, but only when compiled with debug enabled. + * + * @param msg Formatted message + * @param ... Parameters to be included in the message + */ +void log_debug(const char *msg, ...) +{ +#ifdef DEBUG + va_list args; + + fprintf(stdout, "[Debug] "); + + va_start(args, msg); + vfprintf(stdout, msg, args); + va_end(args); + + fprintf(stdout, "\n"); +#endif /* DEBUG */ +} + +/** + * Logs information to stdout. + * + * @param msg Formatted message + * @param ... Parameters to be included in the message + */ +void log_info(const char *msg, ...) +{ + va_list args; + + fprintf(stdout, "[Info] "); + + va_start(args, msg); + vfprintf(stdout, msg, args); + va_end(args); + + fprintf(stdout, "\n"); +} + +/** + * Logs warnings to stderr. + * + * @param msg Formatted message + * @param ... Parameters to be included in the message + */ +void log_warn(const char *msg, ...) +{ + va_list args; + + fprintf(stderr, "[Warning] "); + + va_start(args, msg); + vfprintf(stderr, msg, args); + va_end(args); + + fprintf(stderr, "\n"); +} + +/** + * Logs errors to stderr. + * + * @param msg Formatted message + * @param ... Parameters to be included in the message + */ +void log_error(const char *msg, ...) +{ + va_list args; + + fprintf(stderr, "[Error] "); + + va_start(args, msg); + vfprintf(stderr, msg, args); + va_end(args); + + fprintf(stderr, "\n"); +} diff --git a/src/log.h b/src/log.h new file mode 100644 index 0000000..d65a018 --- /dev/null +++ b/src/log.h @@ -0,0 +1,27 @@ +/* + * WrapSix + * Copyright (C) 2008-2012 Michal Zima + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef LOG_H +#define LOG_H + +void log_debug(const char *msg, ...); +void log_info(const char *msg, ...); +void log_warn(const char *msg, ...); +void log_error(const char *msg, ...); + +#endif /* LOG_H */ diff --git a/src/nat.c b/src/nat.c index aaa7982..e2b17e4 100644 --- a/src/nat.c +++ b/src/nat.c @@ -16,13 +16,13 @@ * along with this program. If not, see . */ -#include #include /* malloc */ #include /* time */ #include "ethernet.h" #include "ipv4.h" #include "ipv6.h" +#include "log.h" #include "nat.h" #include "radixtree.h" #include "wrapper.h" @@ -120,7 +120,7 @@ struct s_nat *nat_out(radixtree_t *nat_proto6, radixtree_t *nat_proto4, /* if no connection is found, let's create one */ if ((connection = (struct s_nat *) malloc(sizeof(struct s_nat))) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return NULL; } @@ -198,7 +198,7 @@ struct s_nat *nat_in(radixtree_t *nat_proto4, struct s_ipv4_addr ipv4_src, * @param id Fragment identification * @param nat Connection to save * - * @return Connection + * @return Connection */ struct s_nat *nat_in_fragments(radixtree_t *nat_proto4, struct s_ipv4_addr ipv4_src, diff --git a/src/radixtree.c b/src/radixtree.c index 600747c..56db36d 100644 --- a/src/radixtree.c +++ b/src/radixtree.c @@ -16,10 +16,10 @@ * along with this program. If not, see . */ -#include /* fprintf */ #include /* free, malloc */ #include /* memcpy */ +#include "log.h" #include "radixtree.h" /** @@ -32,7 +32,7 @@ radixtree_t *radixtree_create(void) radixtree_t *radixtree; if ((radixtree = (radixtree_t *) malloc(sizeof(radixtree_t))) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return NULL; } memset(radixtree, 0, sizeof(radixtree_t)); @@ -207,7 +207,7 @@ void *radixtree_lookup(radixtree_t *root, * @param count Variable into which is put information about number of * chunks produced * - * @return Array of chunks + * @return Array of chunks */ unsigned char *radixtree_chunker(void *data, unsigned char size, unsigned char *count) { @@ -220,7 +220,7 @@ unsigned char *radixtree_chunker(void *data, unsigned char size, unsigned char * memcpy(count, &counter, sizeof(unsigned char)); if ((chunks = (unsigned char *) malloc(counter * sizeof(unsigned char))) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return NULL; } diff --git a/src/tcp.c b/src/tcp.c index 1322ef1..0e402ec 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -18,7 +18,6 @@ #include /* ETHERTYPE_* */ #include /* htons */ -#include #include /* malloc */ #include /* memcpy */ @@ -26,6 +25,7 @@ #include "ethernet.h" #include "ipv4.h" #include "ipv6.h" +#include "log.h" #include "nat.h" #include "tcp.h" #include "transmitter.h" @@ -78,7 +78,7 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload, if (tcp->checksum != orig_checksum) { /* packet is corrupted and shouldn't be * processed */ - printf("[Debug] Wrong checksum\n"); + log_debug("Wrong checksum"); return 1; } } @@ -88,8 +88,7 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload, tcp->port_src, tcp->port_dest); if (connection == NULL) { - printf("[Debug] Incoming connection wasn't found in " - "NAT\n"); + log_debug("Incoming connection wasn't found in NAT"); return 1; } @@ -105,7 +104,7 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload, MTU + sizeof(struct s_ethernet) : sizeof(struct s_ethernet) + sizeof(struct s_ipv6) + payload_size)) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 1; } eth6 = (struct s_ethernet *) packet; @@ -201,8 +200,8 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload, ip4->id, NULL); if (connection == NULL) { - printf("[Debug] Incoming connection wasn't found in " - "fragments table\n"); + log_debug("Incoming connection wasn't found in " + "fragments table"); return 1; } @@ -213,7 +212,7 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload, MTU + sizeof(struct s_ethernet) : sizeof(struct s_ethernet) + sizeof(struct s_ipv6) + sizeof(struct s_ipv6_fragment) + payload_size)) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 1; } eth6 = (struct s_ethernet *) packet; @@ -311,7 +310,7 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload, /* if this is the last fragment, remove the entry from table */ if (!(ip4->flags_offset & htons(IPV4_FLAG_MORE_FRAGMENTS))) { - printf("[Debug] Removing fragment entry\n"); + log_debug("Removing fragment entry"); nat_in_fragments_cleanup(nat4_tcp_fragments, ip4->ip_src, ip4->id); } @@ -354,7 +353,7 @@ int tcp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload) if (tcp->checksum != orig_checksum) { /* packet is corrupted and shouldn't be processed */ - printf("[Debug] Wrong checksum\n"); + log_debug("Wrong checksum"); return 1; } @@ -364,15 +363,14 @@ int tcp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload) tcp->port_src, tcp->port_dest); if (connection == NULL) { - printf("[Debug] Error! Outgoing connection wasn't " - "found/created in NAT!\n"); + log_warn("Outgoing connection wasn't found/created in NAT"); return 1; } /* allocate memory for translated packet */ if ((packet = (unsigned char *) malloc(sizeof(struct s_ipv4) + htons(ip6->len))) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 1; } ip4 = (struct s_ipv4 *) packet; diff --git a/src/transmitter.c b/src/transmitter.c index 8196d6b..ff3f20d 100644 --- a/src/transmitter.c +++ b/src/transmitter.c @@ -22,11 +22,12 @@ * sendto */ #include /* htons */ #include /* sockaddr_ll, PACKET_OTHERHOST */ -#include /* fprintf, stderr, perror */ +#include /* perror */ #include /* memcpy */ #include /* close */ #include "ipv4.h" +#include "log.h" #include "transmitter.h" #include "wrapper.h" @@ -38,8 +39,8 @@ int sock, sock_ipv4; * Initialize sockets and all needed properties. Should be called only once on * program startup. * - * @return 0 for success - * @return 1 for failure + * @return 0 for success + * @return 1 for failure */ int transmission_init(void) { @@ -54,7 +55,7 @@ int transmission_init(void) /* initialize RAW socket */ if ((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) { - fprintf(stderr, "[Error] Couldn't open RAW socket.\n"); + log_error("Couldn't open RAW socket."); perror("socket()"); return 1; } @@ -62,8 +63,7 @@ int transmission_init(void) /* bind the socket to the interface */ if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(struct ifreq)) == -1) { - fprintf(stderr, "[Error] Couldn't bind the socket to the " - "interface.\n"); + log_error("Couldn't bind the socket to the interface."); perror("setsockopt()"); return 1; } @@ -76,7 +76,7 @@ int transmission_init(void) /* initialize RAW IPv4 socket */ if ((sock_ipv4 = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) { - fprintf(stderr, "[Error] Couldn't open RAW IPv4 socket.\n"); + log_error("Couldn't open RAW IPv4 socket."); perror("socket()"); return 1; } @@ -84,8 +84,7 @@ int transmission_init(void) /* we will provide our own IPv4 header */ if (setsockopt(sock_ipv4, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) == -1) { - fprintf(stderr, "[Error] Couldn't apply the socket " - "settings.\n"); + log_error("Couldn't apply the socket settings."); perror("setsockopt()"); return 1; } @@ -96,15 +95,14 @@ int transmission_init(void) /** * Close sockets. Should be called only once on program shutdown. * - * @return 0 for success - * @return 1 for failure + * @return 0 for success + * @return 1 for failure */ int transmission_quit(void) { /* close the socket */ if (close(sock) || close(sock_ipv4)) { - fprintf(stderr, "[Error] Couldn't close the transmission " - "sockets.\n"); + log_warn("Couldn't close the transmission sockets."); perror("close()"); return 1; } else { @@ -118,14 +116,14 @@ int transmission_quit(void) * @param data Raw packet data, including ethernet header * @param length Length of the whole packet in bytes * - * @return 0 for success - * @return 1 for failure + * @return 0 for success + * @return 1 for failure */ int transmit_raw(unsigned char *data, unsigned int length) { if (sendto(sock, data, length, 0, (struct sockaddr *) &socket_address, sizeof(struct sockaddr_ll)) != (int) length) { - fprintf(stderr, "[Error] Couldn't send a RAW packet.\n"); + log_error("Couldn't send a RAW packet."); perror("sendto()"); return 1; } @@ -141,8 +139,8 @@ int transmit_raw(unsigned char *data, unsigned int length) * including IPv4 header * @param length Length of the whole packet in bytes * - * @return 0 for success - * @return 1 for failure + * @return 0 for success + * @return 1 for failure */ int transmit_ipv4(struct s_ipv4_addr *ip, unsigned char *data, unsigned int length) @@ -154,7 +152,7 @@ int transmit_ipv4(struct s_ipv4_addr *ip, unsigned char *data, if (sendto(sock_ipv4, data, length, 0, (struct sockaddr *) &socket_address_ipv4, sizeof(struct sockaddr)) != (int) length) { - fprintf(stderr, "[Error] Couldn't send an IPv4 packet.\n"); + log_error("Couldn't send an IPv4 packet."); perror("sendto()"); return 1; } diff --git a/src/udp.c b/src/udp.c index d936a9c..1ca87fb 100644 --- a/src/udp.c +++ b/src/udp.c @@ -18,7 +18,6 @@ #include /* ETHERTYPE_* */ #include /* htons */ -#include #include /* malloc */ #include /* memcpy */ @@ -26,6 +25,7 @@ #include "ethernet.h" #include "ipv4.h" #include "ipv6.h" +#include "log.h" #include "nat.h" #include "transmitter.h" #include "udp.h" @@ -68,7 +68,7 @@ int udp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload, if (udp->checksum != orig_checksum) { /* packet is corrupted and shouldn't be processed */ - printf("[Debug] Wrong checksum\n"); + log_debug("Wrong checksum"); return 1; } } @@ -77,7 +77,7 @@ int udp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload, connection = nat_in(nat4_udp, ip4->ip_src, udp->port_src, udp->port_dest); if (connection == NULL) { - printf("[Debug] Incoming connection wasn't found in NAT\n"); + log_debug("Incoming connection wasn't found in NAT"); return 1; } @@ -85,7 +85,7 @@ int udp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload, if ((packet = (unsigned char *) malloc(sizeof(struct s_ethernet) + sizeof(struct s_ipv6) + payload_size)) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 1; } eth6 = (struct s_ethernet *) packet; @@ -168,7 +168,7 @@ int udp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload) if (udp->checksum != orig_checksum) { /* packet is corrupted and shouldn't be processed */ - printf("[Debug] Wrong checksum\n"); + log_debug("Wrong checksum"); return 1; } @@ -178,15 +178,14 @@ int udp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload) udp->port_src, udp->port_dest); if (connection == NULL) { - printf("[Debug] Error! Outgoing connection wasn't " - "found/created in NAT!\n"); + log_warn("Outgoing connection wasn't found/created in NAT!"); return 1; } /* allocate memory for translated packet */ packet_size = sizeof(struct s_ipv4) + htons(ip6->len); if ((packet = (unsigned char *) malloc(packet_size)) == NULL) { - fprintf(stderr, "[Error] Lack of free memory\n"); + log_error("Lack of free memory"); return 1; } ip4 = (struct s_ipv4 *) packet; diff --git a/src/wrapper.c b/src/wrapper.c index 28742c0..2ae2e5a 100644 --- a/src/wrapper.c +++ b/src/wrapper.c @@ -22,7 +22,6 @@ #include /* struct packet_mreq, struct sockaddr_ll */ #include /* htons */ #include /* ETHERTYPE_* */ -#include #include /* srand */ #include /* strncpy */ #include /* ioctl, SIOCGIFINDEX */ @@ -33,6 +32,7 @@ #include "ethernet.h" #include "ipv4.h" #include "ipv6.h" +#include "log.h" #include "nat.h" #include "transmitter.h" #include "wrapper.h" @@ -63,16 +63,18 @@ int main(int argc, char **argv) int length; char buffer[MTU]; + log_info(PACKAGE_STRING " is starting"); + /* initialize the socket for sniffing */ if ((sniff_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) { - fprintf(stderr, "[Error] Unable to create listening socket\n"); + log_error("Unable to create listening socket"); return 1; } /* get the interface */ strncpy(interface.ifr_name, INTERFACE, IFNAMSIZ); if (ioctl(sniff_sock, SIOCGIFINDEX, &interface) == -1) { - fprintf(stderr, "[Error] Unable to get the interface\n"); + log_error("Unable to get the interface"); return 1; } @@ -82,11 +84,11 @@ int main(int argc, char **argv) /* reinitialize the interface */ if (ioctl(sniff_sock, SIOCGIFINDEX, &interface) == -1) { - fprintf(stderr, "[Error] Unable to reinitialize the interface\n"); + log_error("Unable to reinitialize the interface"); return 1; } } else { - fprintf(stderr, "[Error] Unable to get the interface's HW address\n"); + log_error("Unable to get the interface's HW address"); return 1; } @@ -95,7 +97,7 @@ int main(int argc, char **argv) pmr.mr_ifindex = interface.ifr_ifindex; pmr.mr_type = PACKET_MR_PROMISC; if (setsockopt(sniff_sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, (char *) &pmr, sizeof(pmr)) == -1) { - fprintf(stderr, "[Error] Unable to set the promiscuous mode on the interface\n"); + log_error("Unable to set the promiscuous mode on the interface"); return 1; } @@ -111,7 +113,7 @@ int main(int argc, char **argv) /* initiate sending socket */ if (transmission_init()) { - fprintf(stderr, "[Error] Unable to initiate sending socket\n"); + log_error("Unable to initiate sending socket"); return 1; } @@ -125,7 +127,7 @@ int main(int argc, char **argv) for (;;) { addr_size = sizeof(addr); if ((length = recv(sniff_sock, buffer, MTU, 0)) == -1) { - fprintf(stderr, "[Error] Unable to retrieve data from socket\n"); + log_error("Unable to retrieve data from socket"); return 1; } @@ -141,7 +143,7 @@ int main(int argc, char **argv) /* unset the promiscuous mode */ if (setsockopt(sniff_sock, SOL_PACKET, PACKET_DROP_MEMBERSHIP, (char *) &pmr, sizeof(pmr)) == -1) { - fprintf(stderr, "[Error] Unable to unset the promiscuous mode on the interface\n"); + log_error("Unable to unset the promiscuous mode on the interface"); /* do not call `return` here as we want to close the socket too */ } @@ -162,16 +164,16 @@ int process(char *packet) switch (htons(eth->type)) { case ETHERTYPE_IP: - printf("[Debug] HW Protocol: IPv4\n"); + log_debug("HW Protocol: IPv4"); return ipv4(eth, payload); case ETHERTYPE_IPV6: - printf("[Debug] HW Protocol: IPv6\n"); + log_debug("HW Protocol: IPv6"); return ipv6(eth, payload); case ETHERTYPE_ARP: - printf("[Debug] HW Protocol: ARP\n"); + log_debug("HW Protocol: ARP"); return arp(eth, payload); default: - printf("[Debug] HW Protocol: unknown [%d/0x%04x]\n", + log_debug("HW Protocol: unknown [%d/0x%04x]", htons(eth->type), htons(eth->type)); return 1; }