Skip to content
Browse files

Specialized logging functions; can control debug

  • Loading branch information...
1 parent fbbf20b commit 34025797b15e19804ca66eebe172f22aa7a73e60 @xHire committed Jul 4, 2012
Showing with 254 additions and 104 deletions.
  1. +26 −1 configure.ac
  2. +1 −0 src/Makefile.am
  3. +5 −5 src/arp.c
  4. +9 −9 src/checksum.c
  5. +15 −15 src/icmp.c
  6. +7 −7 src/ipv4.c
  7. +7 −7 src/ipv6.c
  8. +100 −0 src/log.c
  9. +27 −0 src/log.h
  10. +3 −3 src/nat.c
  11. +4 −4 src/radixtree.c
  12. +11 −13 src/tcp.c
  13. +17 −19 src/transmitter.c
  14. +7 −8 src/udp.c
  15. +15 −13 src/wrapper.c
View
27 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
View
1 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 \
View
10 src/arp.c
@@ -18,11 +18,11 @@
#include <net/ethernet.h> /* ETHERTYPE_* */
#include <netinet/in.h> /* htons */
-#include <stdio.h>
#include <stdlib.h> /* malloc */
#include <string.h> /* 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);
View
18 src/checksum.c
@@ -17,21 +17,21 @@
*/
#include <netinet/in.h> /* htonl */
-#include <stdio.h>
#include <stdlib.h> /* malloc */
#include <string.h> /* memcpy */
#include "checksum.h"
#include "ipv4.h"
#include "ipv6.h"
+#include "log.h"
/**
* General checksum computation function
*
* @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,
View
30 src/icmp.c
@@ -18,13 +18,13 @@
#include <net/ethernet.h> /* ETHERTYPE_* */
#include <netinet/in.h> /* htons */
-#include <stdio.h>
#include <stdlib.h> /* malloc */
#include <string.h> /* 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,16 +94,16 @@ 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;
}
/* allocate memory for translated packet */
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);
View
14 src/ipv4.c
@@ -17,11 +17,11 @@
*/
#include <netinet/in.h> /* IPPROTO_* */
-#include <stdio.h>
#include <string.h> /* 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;
}
}
View
14 src/ipv6.c
@@ -17,11 +17,11 @@
*/
#include <netinet/in.h> /* IPPROTO_* */
-#include <stdio.h>
#include <string.h> /* 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;
}
}
View
100 src/log.c
@@ -0,0 +1,100 @@
+/*
+ * WrapSix
+ * Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#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");
+}
View
27 src/log.h
@@ -0,0 +1,27 @@
+/*
+ * WrapSix
+ * Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 */
View
6 src/nat.c
@@ -16,13 +16,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdio.h>
#include <stdlib.h> /* malloc */
#include <time.h> /* 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,
View
8 src/radixtree.c
@@ -16,10 +16,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdio.h> /* fprintf */
#include <stdlib.h> /* free, malloc */
#include <string.h> /* 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;
}
View
24 src/tcp.c
@@ -18,14 +18,14 @@
#include <net/ethernet.h> /* ETHERTYPE_* */
#include <netinet/in.h> /* htons */
-#include <stdio.h>
#include <stdlib.h> /* malloc */
#include <string.h> /* memcpy */
#include "checksum.h"
#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;
View
36 src/transmitter.c
@@ -22,11 +22,12 @@
* sendto */
#include <netinet/in.h> /* htons */
#include <netpacket/packet.h> /* sockaddr_ll, PACKET_OTHERHOST */
-#include <stdio.h> /* fprintf, stderr, perror */
+#include <stdio.h> /* perror */
#include <string.h> /* memcpy */
#include <unistd.h> /* 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,16 +55,15 @@ 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;
}
/* 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,16 +76,15 @@ 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;
}
/* 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;
}
View
15 src/udp.c
@@ -18,14 +18,14 @@
#include <net/ethernet.h> /* ETHERTYPE_* */
#include <netinet/in.h> /* htons */
-#include <stdio.h>
#include <stdlib.h> /* malloc */
#include <string.h> /* memcpy */
#include "checksum.h"
#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,15 +77,15 @@ 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;
}
/* allocate memory for translated packet */
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;
View
28 src/wrapper.c
@@ -22,7 +22,6 @@
#include <netpacket/packet.h> /* struct packet_mreq, struct sockaddr_ll */
#include <netinet/in.h> /* htons */
#include <net/ethernet.h> /* ETHERTYPE_* */
-#include <stdio.h>
#include <stdlib.h> /* srand */
#include <string.h> /* strncpy */
#include <sys/ioctl.h> /* 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;
}

0 comments on commit 3402579

Please sign in to comment.
Something went wrong with that request. Please try again.