mirror of
https://code.semirocket.science/wrapsix
synced 2024-11-21 13:31:02 +02:00
Specialized logging functions; can control debug
This commit is contained in:
parent
fbbf20ba0a
commit
34025797b1
27
configure.ac
27
configure.ac
@ -1,11 +1,36 @@
|
|||||||
AC_INIT([WrapSix], [0.1.99.0], [xhire@mujmalysvet.cz])
|
AC_INIT([WrapSix], [0.1.99.0], [xhire@mujmalysvet.cz])
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror])
|
AM_INIT_AUTOMAKE([-Wall -Werror])
|
||||||
|
|
||||||
|
# prevent automatic adding of "-g -O2" to CFLAGS
|
||||||
|
OLD_CFLAGS=$CFLAGS
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
|
CFLAGS=$OLD_CFLAGS
|
||||||
|
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
Makefile
|
Makefile
|
||||||
src/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
|
AC_OUTPUT
|
||||||
|
@ -7,6 +7,7 @@ wrapsix_wrapper_SOURCES = \
|
|||||||
icmp.c icmp.h \
|
icmp.c icmp.h \
|
||||||
ipv4.c ipv4.h \
|
ipv4.c ipv4.h \
|
||||||
ipv6.c ipv6.h \
|
ipv6.c ipv6.h \
|
||||||
|
log.c log.h \
|
||||||
nat.c nat.h \
|
nat.c nat.h \
|
||||||
radixtree.c radixtree.h \
|
radixtree.c radixtree.h \
|
||||||
tcp.c tcp.h \
|
tcp.c tcp.h \
|
||||||
|
10
src/arp.c
10
src/arp.c
@ -18,11 +18,11 @@
|
|||||||
|
|
||||||
#include <net/ethernet.h> /* ETHERTYPE_* */
|
#include <net/ethernet.h> /* ETHERTYPE_* */
|
||||||
#include <netinet/in.h> /* htons */
|
#include <netinet/in.h> /* htons */
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h> /* malloc */
|
#include <stdlib.h> /* malloc */
|
||||||
#include <string.h> /* memcmp, memset */
|
#include <string.h> /* memcmp, memset */
|
||||||
|
|
||||||
#include "arp.h"
|
#include "arp.h"
|
||||||
|
#include "log.h"
|
||||||
#include "transmitter.h"
|
#include "transmitter.h"
|
||||||
#include "wrapper.h"
|
#include "wrapper.h"
|
||||||
|
|
||||||
@ -32,8 +32,8 @@
|
|||||||
* @param ethq Ethernet header of the packet
|
* @param ethq Ethernet header of the packet
|
||||||
* @param payload Data of the packet
|
* @param payload Data of the packet
|
||||||
*
|
*
|
||||||
* @return 0 for success
|
* @return 0 for success
|
||||||
* @return 1 for failure
|
* @return 1 for failure
|
||||||
*/
|
*/
|
||||||
int arp(struct s_ethernet *ethq, char *payload)
|
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 */
|
/* test if this packet belongs to us */
|
||||||
if (memcmp(&wrapsix_ipv4_addr, &arpq->ip_dest, 4)) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ int arp(struct s_ethernet *ethq, char *payload)
|
|||||||
|
|
||||||
/* allocate enough memory */
|
/* allocate enough memory */
|
||||||
if ((packet = (unsigned char *) malloc(ARP_PACKET_SIZE)) == NULL) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
memset(packet, 0x0, ARP_PACKET_SIZE);
|
memset(packet, 0x0, ARP_PACKET_SIZE);
|
||||||
|
@ -17,13 +17,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <netinet/in.h> /* htonl */
|
#include <netinet/in.h> /* htonl */
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h> /* malloc */
|
#include <stdlib.h> /* malloc */
|
||||||
#include <string.h> /* memcpy */
|
#include <string.h> /* memcpy */
|
||||||
|
|
||||||
#include "checksum.h"
|
#include "checksum.h"
|
||||||
#include "ipv4.h"
|
#include "ipv4.h"
|
||||||
#include "ipv6.h"
|
#include "ipv6.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* General checksum computation function
|
* General checksum computation function
|
||||||
@ -31,7 +31,7 @@
|
|||||||
* @param data Pointer to data of which to compute the checksum
|
* @param data Pointer to data of which to compute the checksum
|
||||||
* @param length Length of the data (in bytes)
|
* @param length Length of the data (in bytes)
|
||||||
*
|
*
|
||||||
* @return Checksum
|
* @return Checksum
|
||||||
*/
|
*/
|
||||||
unsigned short checksum(const void *data, int length)
|
unsigned short checksum(const void *data, int length)
|
||||||
{
|
{
|
||||||
@ -76,7 +76,7 @@ unsigned short checksum(const void *data, int length)
|
|||||||
* number of octets
|
* number of octets
|
||||||
* @param new_len Length of new data
|
* @param new_len Length of new data
|
||||||
*
|
*
|
||||||
* @return Updated checksum
|
* @return Updated checksum
|
||||||
*/
|
*/
|
||||||
unsigned short checksum_update(unsigned short old_sum,
|
unsigned short checksum_update(unsigned short old_sum,
|
||||||
unsigned short *old_data, short old_len,
|
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 proto Protocol in the payload
|
||||||
* @param payload Pointer to payload data
|
* @param payload Pointer to payload data
|
||||||
*
|
*
|
||||||
* @return Checksum
|
* @return Checksum
|
||||||
*/
|
*/
|
||||||
unsigned short checksum_ipv4(struct s_ipv4_addr ip_src,
|
unsigned short checksum_ipv4(struct s_ipv4_addr ip_src,
|
||||||
struct s_ipv4_addr ip_dest,
|
struct s_ipv4_addr ip_dest,
|
||||||
@ -128,7 +128,7 @@ unsigned short checksum_ipv4(struct s_ipv4_addr ip_src,
|
|||||||
unsigned short sum;
|
unsigned short sum;
|
||||||
|
|
||||||
if ((buffer = malloc(sizeof(struct s_ipv4_pseudo) + length)) == NULL) {
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,7 +158,7 @@ unsigned short checksum_ipv4(struct s_ipv4_addr ip_src,
|
|||||||
* @param proto Protocol in the payload
|
* @param proto Protocol in the payload
|
||||||
* @param payload Pointer to payload data
|
* @param payload Pointer to payload data
|
||||||
*
|
*
|
||||||
* @return Checksum
|
* @return Checksum
|
||||||
*/
|
*/
|
||||||
unsigned short checksum_ipv6(struct s_ipv6_addr ip_src,
|
unsigned short checksum_ipv6(struct s_ipv6_addr ip_src,
|
||||||
struct s_ipv6_addr ip_dest,
|
struct s_ipv6_addr ip_dest,
|
||||||
@ -170,7 +170,7 @@ unsigned short checksum_ipv6(struct s_ipv6_addr ip_src,
|
|||||||
unsigned short sum;
|
unsigned short sum;
|
||||||
|
|
||||||
if ((buffer = malloc(sizeof(struct s_ipv6_pseudo) + length)) == NULL) {
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +202,7 @@ unsigned short checksum_ipv6(struct s_ipv6_addr ip_src,
|
|||||||
* @param ip4_dest New destination IPv4 address
|
* @param ip4_dest New destination IPv4 address
|
||||||
* @param new_port New transport layer address (port)
|
* @param new_port New transport layer address (port)
|
||||||
*
|
*
|
||||||
* @return Checksum
|
* @return Checksum
|
||||||
*/
|
*/
|
||||||
unsigned short checksum_ipv4_update(unsigned short old_sum,
|
unsigned short checksum_ipv4_update(unsigned short old_sum,
|
||||||
struct s_ipv6_addr ip6_src,
|
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 ip6_dest New destination IPv6 address
|
||||||
* @param new_port New transport layer address (port)
|
* @param new_port New transport layer address (port)
|
||||||
*
|
*
|
||||||
* @return Checksum
|
* @return Checksum
|
||||||
*/
|
*/
|
||||||
unsigned short checksum_ipv6_update(unsigned short old_sum,
|
unsigned short checksum_ipv6_update(unsigned short old_sum,
|
||||||
struct s_ipv4_addr ip4_src,
|
struct s_ipv4_addr ip4_src,
|
||||||
|
30
src/icmp.c
30
src/icmp.c
@ -18,13 +18,13 @@
|
|||||||
|
|
||||||
#include <net/ethernet.h> /* ETHERTYPE_* */
|
#include <net/ethernet.h> /* ETHERTYPE_* */
|
||||||
#include <netinet/in.h> /* htons */
|
#include <netinet/in.h> /* htons */
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h> /* malloc */
|
#include <stdlib.h> /* malloc */
|
||||||
#include <string.h> /* memcpy, memset */
|
#include <string.h> /* memcpy, memset */
|
||||||
|
|
||||||
#include "checksum.h"
|
#include "checksum.h"
|
||||||
#include "icmp.h"
|
#include "icmp.h"
|
||||||
#include "ipv6.h"
|
#include "ipv6.h"
|
||||||
|
#include "log.h"
|
||||||
#include "nat.h"
|
#include "nat.h"
|
||||||
#include "transmitter.h"
|
#include "transmitter.h"
|
||||||
#include "wrapper.h"
|
#include "wrapper.h"
|
||||||
@ -65,7 +65,7 @@ int icmp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4,
|
|||||||
|
|
||||||
if (icmp->checksum != orig_checksum) {
|
if (icmp->checksum != orig_checksum) {
|
||||||
/* packet is corrupted and shouldn't be processed */
|
/* packet is corrupted and shouldn't be processed */
|
||||||
printf("[Debug] Wrong checksum\n");
|
log_debug("Wrong checksum");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,8 +81,8 @@ int icmp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4,
|
|||||||
0, echo->id);
|
0, echo->id);
|
||||||
|
|
||||||
if (connection == NULL) {
|
if (connection == NULL) {
|
||||||
printf("[Debug] Incoming connection wasn't "
|
log_debug("Incoming connection wasn't found in "
|
||||||
"found in NAT\n");
|
"NAT");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,8 +94,8 @@ int icmp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("[Debug] ICMPv4 Type: unknown [%d/0x%x]\n",
|
log_debug("ICMPv4 Type: unknown [%d/0x%x]",
|
||||||
icmp->type, icmp->type);
|
icmp->type, icmp->type);
|
||||||
return 1;
|
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) +
|
if ((packet = (unsigned char *) malloc(sizeof(struct s_ethernet) +
|
||||||
sizeof(struct s_ipv6) +
|
sizeof(struct s_ipv6) +
|
||||||
payload_size)) == NULL) {
|
payload_size)) == NULL) {
|
||||||
fprintf(stderr, "[Error] Lack of free memory\n");
|
log_error("Lack of free memory");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
eth6 = (struct s_ethernet *) packet;
|
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) {
|
if (icmp->checksum != orig_checksum) {
|
||||||
/* packet is corrupted and shouldn't be processed */
|
/* packet is corrupted and shouldn't be processed */
|
||||||
printf("[Debug] Wrong checksum\n");
|
log_debug("Wrong checksum");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,8 +192,8 @@ int icmp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload)
|
|||||||
echo->id, 0);
|
echo->id, 0);
|
||||||
|
|
||||||
if (connection == NULL) {
|
if (connection == NULL) {
|
||||||
printf("[Debug] Error! Outgoing connection "
|
log_warn("Outgoing connection wasn't "
|
||||||
"wasn't found/created in NAT!\n");
|
"found/created in NAT!");
|
||||||
return 1;
|
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);
|
(struct s_icmp_ndp_ns *) icmp_data);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("[Debug] ICMPv6 Type: unknown [%d/0x%x]\n",
|
log_debug("ICMPv6 Type: unknown [%d/0x%x]",
|
||||||
icmp->type, icmp->type);
|
icmp->type, icmp->type);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate memory for translated packet */
|
/* allocate memory for translated packet */
|
||||||
if ((packet = (unsigned char *) malloc(sizeof(struct s_ipv4) +
|
if ((packet = (unsigned char *) malloc(sizeof(struct s_ipv4) +
|
||||||
htons(ip6->len))) == NULL) {
|
htons(ip6->len))) == NULL) {
|
||||||
fprintf(stderr, "[Error] Lack of free memory\n");
|
log_error("Lack of free memory");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
ip4 = (struct s_ipv4 *) packet;
|
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 */
|
/* first check whether the request belongs to us */
|
||||||
if (memcmp(&wrapsix_ipv6_prefix, &ndp_ns->target, 12) != 0) {
|
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;
|
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) + \
|
||||||
sizeof(struct s_icmp_ndp_na)
|
sizeof(struct s_icmp_ndp_na)
|
||||||
if ((packet = (unsigned char *) malloc(NDP_PACKET_SIZE)) == NULL) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
memset(packet, 0x0, NDP_PACKET_SIZE);
|
memset(packet, 0x0, NDP_PACKET_SIZE);
|
||||||
|
14
src/ipv4.c
14
src/ipv4.c
@ -17,11 +17,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <netinet/in.h> /* IPPROTO_* */
|
#include <netinet/in.h> /* IPPROTO_* */
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h> /* memcmp */
|
#include <string.h> /* memcmp */
|
||||||
|
|
||||||
#include "icmp.h"
|
#include "icmp.h"
|
||||||
#include "ipv4.h"
|
#include "ipv4.h"
|
||||||
|
#include "log.h"
|
||||||
#include "tcp.h"
|
#include "tcp.h"
|
||||||
#include "udp.h"
|
#include "udp.h"
|
||||||
#include "wrapper.h"
|
#include "wrapper.h"
|
||||||
@ -47,7 +47,7 @@ int ipv4(struct s_ethernet *eth, char *packet)
|
|||||||
|
|
||||||
/* test if this packet belongs to us */
|
/* test if this packet belongs to us */
|
||||||
if (memcmp(&wrapsix_ipv4_addr, &ip->ip_dest, 4) != 0) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,17 +58,17 @@ int ipv4(struct s_ethernet *eth, char *packet)
|
|||||||
|
|
||||||
switch (ip->proto) {
|
switch (ip->proto) {
|
||||||
case IPPROTO_TCP:
|
case IPPROTO_TCP:
|
||||||
printf("[Debug] IPv4 Protocol: TCP\n");
|
log_debug("IPv4 Protocol: TCP");
|
||||||
return tcp_ipv4(eth, ip, payload, data_size);
|
return tcp_ipv4(eth, ip, payload, data_size);
|
||||||
case IPPROTO_UDP:
|
case IPPROTO_UDP:
|
||||||
printf("[Debug] IPv4 Protocol: UDP\n");
|
log_debug("IPv4 Protocol: UDP");
|
||||||
return udp_ipv4(eth, ip, payload, data_size);
|
return udp_ipv4(eth, ip, payload, data_size);
|
||||||
case IPPROTO_ICMP:
|
case IPPROTO_ICMP:
|
||||||
printf("[Debug] IPv4 Protocol: ICMP\n");
|
log_debug("IPv4 Protocol: ICMP");
|
||||||
return icmp_ipv4(eth, ip, payload, data_size);
|
return icmp_ipv4(eth, ip, payload, data_size);
|
||||||
default:
|
default:
|
||||||
printf("[Debug] IPv4 Protocol: unknown [%d/0x%x]\n",
|
log_debug("IPv4 Protocol: unknown [%d/0x%x]",
|
||||||
ip->proto, ip->proto);
|
ip->proto, ip->proto);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
14
src/ipv6.c
14
src/ipv6.c
@ -17,11 +17,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <netinet/in.h> /* IPPROTO_* */
|
#include <netinet/in.h> /* IPPROTO_* */
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h> /* memcmp */
|
#include <string.h> /* memcmp */
|
||||||
|
|
||||||
#include "icmp.h"
|
#include "icmp.h"
|
||||||
#include "ipv6.h"
|
#include "ipv6.h"
|
||||||
|
#include "log.h"
|
||||||
#include "tcp.h"
|
#include "tcp.h"
|
||||||
#include "udp.h"
|
#include "udp.h"
|
||||||
#include "wrapper.h"
|
#include "wrapper.h"
|
||||||
@ -47,23 +47,23 @@ int ipv6(struct s_ethernet *eth, char *packet)
|
|||||||
/* test if this packet belongs to us */
|
/* test if this packet belongs to us */
|
||||||
if (memcmp(&wrapsix_ipv6_prefix, &ip->ip_dest, 12) != 0 &&
|
if (memcmp(&wrapsix_ipv6_prefix, &ip->ip_dest, 12) != 0 &&
|
||||||
memcmp(&ndp_multicast_addr, &ip->ip_dest, 13) != 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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (ip->next_header) {
|
switch (ip->next_header) {
|
||||||
case IPPROTO_TCP:
|
case IPPROTO_TCP:
|
||||||
printf("[Debug] IPv6 Protocol: TCP\n");
|
log_debug("IPv6 Protocol: TCP");
|
||||||
return tcp_ipv6(eth, ip, payload);
|
return tcp_ipv6(eth, ip, payload);
|
||||||
case IPPROTO_UDP:
|
case IPPROTO_UDP:
|
||||||
printf("[Debug] IPv6 Protocol: UDP\n");
|
log_debug("IPv6 Protocol: UDP");
|
||||||
return udp_ipv6(eth, ip, payload);
|
return udp_ipv6(eth, ip, payload);
|
||||||
case IPPROTO_ICMPV6:
|
case IPPROTO_ICMPV6:
|
||||||
printf("[Debug] IPv6 Protocol: ICMP\n");
|
log_debug("IPv6 Protocol: ICMP");
|
||||||
return icmp_ipv6(eth, ip, payload);
|
return icmp_ipv6(eth, ip, payload);
|
||||||
default:
|
default:
|
||||||
printf("[Debug] IPv6 Protocol: unknown [%d/0x%x]\n",
|
log_debug("IPv6 Protocol: unknown [%d/0x%x]",
|
||||||
ip->next_header, ip->next_header);
|
ip->next_header, ip->next_header);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
100
src/log.c
Normal file
100
src/log.c
Normal file
@ -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");
|
||||||
|
}
|
27
src/log.h
Normal file
27
src/log.h
Normal file
@ -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 */
|
@ -16,13 +16,13 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h> /* malloc */
|
#include <stdlib.h> /* malloc */
|
||||||
#include <time.h> /* time */
|
#include <time.h> /* time */
|
||||||
|
|
||||||
#include "ethernet.h"
|
#include "ethernet.h"
|
||||||
#include "ipv4.h"
|
#include "ipv4.h"
|
||||||
#include "ipv6.h"
|
#include "ipv6.h"
|
||||||
|
#include "log.h"
|
||||||
#include "nat.h"
|
#include "nat.h"
|
||||||
#include "radixtree.h"
|
#include "radixtree.h"
|
||||||
#include "wrapper.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 no connection is found, let's create one */
|
||||||
if ((connection =
|
if ((connection =
|
||||||
(struct s_nat *) malloc(sizeof(struct s_nat))) == NULL) {
|
(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;
|
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 id Fragment identification
|
||||||
* @param nat Connection to save
|
* @param nat Connection to save
|
||||||
*
|
*
|
||||||
* @return Connection
|
* @return Connection
|
||||||
*/
|
*/
|
||||||
struct s_nat *nat_in_fragments(radixtree_t *nat_proto4,
|
struct s_nat *nat_in_fragments(radixtree_t *nat_proto4,
|
||||||
struct s_ipv4_addr ipv4_src,
|
struct s_ipv4_addr ipv4_src,
|
||||||
|
@ -16,10 +16,10 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h> /* fprintf */
|
|
||||||
#include <stdlib.h> /* free, malloc */
|
#include <stdlib.h> /* free, malloc */
|
||||||
#include <string.h> /* memcpy */
|
#include <string.h> /* memcpy */
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
#include "radixtree.h"
|
#include "radixtree.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -32,7 +32,7 @@ radixtree_t *radixtree_create(void)
|
|||||||
radixtree_t *radixtree;
|
radixtree_t *radixtree;
|
||||||
|
|
||||||
if ((radixtree = (radixtree_t *) malloc(sizeof(radixtree_t))) == NULL) {
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
memset(radixtree, 0, sizeof(radixtree_t));
|
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
|
* @param count Variable into which is put information about number of
|
||||||
* chunks produced
|
* chunks produced
|
||||||
*
|
*
|
||||||
* @return Array of chunks
|
* @return Array of chunks
|
||||||
*/
|
*/
|
||||||
unsigned char *radixtree_chunker(void *data, unsigned char size, unsigned char *count)
|
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));
|
memcpy(count, &counter, sizeof(unsigned char));
|
||||||
|
|
||||||
if ((chunks = (unsigned char *) malloc(counter * sizeof(unsigned char))) == NULL) {
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
24
src/tcp.c
24
src/tcp.c
@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
#include <net/ethernet.h> /* ETHERTYPE_* */
|
#include <net/ethernet.h> /* ETHERTYPE_* */
|
||||||
#include <netinet/in.h> /* htons */
|
#include <netinet/in.h> /* htons */
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h> /* malloc */
|
#include <stdlib.h> /* malloc */
|
||||||
#include <string.h> /* memcpy */
|
#include <string.h> /* memcpy */
|
||||||
|
|
||||||
@ -26,6 +25,7 @@
|
|||||||
#include "ethernet.h"
|
#include "ethernet.h"
|
||||||
#include "ipv4.h"
|
#include "ipv4.h"
|
||||||
#include "ipv6.h"
|
#include "ipv6.h"
|
||||||
|
#include "log.h"
|
||||||
#include "nat.h"
|
#include "nat.h"
|
||||||
#include "tcp.h"
|
#include "tcp.h"
|
||||||
#include "transmitter.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) {
|
if (tcp->checksum != orig_checksum) {
|
||||||
/* packet is corrupted and shouldn't be
|
/* packet is corrupted and shouldn't be
|
||||||
* processed */
|
* processed */
|
||||||
printf("[Debug] Wrong checksum\n");
|
log_debug("Wrong checksum");
|
||||||
return 1;
|
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);
|
tcp->port_src, tcp->port_dest);
|
||||||
|
|
||||||
if (connection == NULL) {
|
if (connection == NULL) {
|
||||||
printf("[Debug] Incoming connection wasn't found in "
|
log_debug("Incoming connection wasn't found in NAT");
|
||||||
"NAT\n");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,7 +104,7 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload,
|
|||||||
MTU + sizeof(struct s_ethernet) :
|
MTU + sizeof(struct s_ethernet) :
|
||||||
sizeof(struct s_ethernet) + sizeof(struct s_ipv6) +
|
sizeof(struct s_ethernet) + sizeof(struct s_ipv6) +
|
||||||
payload_size)) == NULL) {
|
payload_size)) == NULL) {
|
||||||
fprintf(stderr, "[Error] Lack of free memory\n");
|
log_error("Lack of free memory");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
eth6 = (struct s_ethernet *) packet;
|
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);
|
ip4->id, NULL);
|
||||||
|
|
||||||
if (connection == NULL) {
|
if (connection == NULL) {
|
||||||
printf("[Debug] Incoming connection wasn't found in "
|
log_debug("Incoming connection wasn't found in "
|
||||||
"fragments table\n");
|
"fragments table");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +212,7 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload,
|
|||||||
MTU + sizeof(struct s_ethernet) :
|
MTU + sizeof(struct s_ethernet) :
|
||||||
sizeof(struct s_ethernet) + sizeof(struct s_ipv6) +
|
sizeof(struct s_ethernet) + sizeof(struct s_ipv6) +
|
||||||
sizeof(struct s_ipv6_fragment) + payload_size)) == NULL) {
|
sizeof(struct s_ipv6_fragment) + payload_size)) == NULL) {
|
||||||
fprintf(stderr, "[Error] Lack of free memory\n");
|
log_error("Lack of free memory");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
eth6 = (struct s_ethernet *) packet;
|
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 this is the last fragment, remove the entry from table */
|
||||||
if (!(ip4->flags_offset & htons(IPV4_FLAG_MORE_FRAGMENTS))) {
|
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,
|
nat_in_fragments_cleanup(nat4_tcp_fragments,
|
||||||
ip4->ip_src, ip4->id);
|
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) {
|
if (tcp->checksum != orig_checksum) {
|
||||||
/* packet is corrupted and shouldn't be processed */
|
/* packet is corrupted and shouldn't be processed */
|
||||||
printf("[Debug] Wrong checksum\n");
|
log_debug("Wrong checksum");
|
||||||
return 1;
|
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);
|
tcp->port_src, tcp->port_dest);
|
||||||
|
|
||||||
if (connection == NULL) {
|
if (connection == NULL) {
|
||||||
printf("[Debug] Error! Outgoing connection wasn't "
|
log_warn("Outgoing connection wasn't found/created in NAT");
|
||||||
"found/created in NAT!\n");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate memory for translated packet */
|
/* allocate memory for translated packet */
|
||||||
if ((packet = (unsigned char *) malloc(sizeof(struct s_ipv4) +
|
if ((packet = (unsigned char *) malloc(sizeof(struct s_ipv4) +
|
||||||
htons(ip6->len))) == NULL) {
|
htons(ip6->len))) == NULL) {
|
||||||
fprintf(stderr, "[Error] Lack of free memory\n");
|
log_error("Lack of free memory");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
ip4 = (struct s_ipv4 *) packet;
|
ip4 = (struct s_ipv4 *) packet;
|
||||||
|
@ -22,11 +22,12 @@
|
|||||||
* sendto */
|
* sendto */
|
||||||
#include <netinet/in.h> /* htons */
|
#include <netinet/in.h> /* htons */
|
||||||
#include <netpacket/packet.h> /* sockaddr_ll, PACKET_OTHERHOST */
|
#include <netpacket/packet.h> /* sockaddr_ll, PACKET_OTHERHOST */
|
||||||
#include <stdio.h> /* fprintf, stderr, perror */
|
#include <stdio.h> /* perror */
|
||||||
#include <string.h> /* memcpy */
|
#include <string.h> /* memcpy */
|
||||||
#include <unistd.h> /* close */
|
#include <unistd.h> /* close */
|
||||||
|
|
||||||
#include "ipv4.h"
|
#include "ipv4.h"
|
||||||
|
#include "log.h"
|
||||||
#include "transmitter.h"
|
#include "transmitter.h"
|
||||||
#include "wrapper.h"
|
#include "wrapper.h"
|
||||||
|
|
||||||
@ -38,8 +39,8 @@ int sock, sock_ipv4;
|
|||||||
* Initialize sockets and all needed properties. Should be called only once on
|
* Initialize sockets and all needed properties. Should be called only once on
|
||||||
* program startup.
|
* program startup.
|
||||||
*
|
*
|
||||||
* @return 0 for success
|
* @return 0 for success
|
||||||
* @return 1 for failure
|
* @return 1 for failure
|
||||||
*/
|
*/
|
||||||
int transmission_init(void)
|
int transmission_init(void)
|
||||||
{
|
{
|
||||||
@ -54,7 +55,7 @@ int transmission_init(void)
|
|||||||
|
|
||||||
/* initialize RAW socket */
|
/* initialize RAW socket */
|
||||||
if ((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
|
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()");
|
perror("socket()");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -62,8 +63,7 @@ int transmission_init(void)
|
|||||||
/* bind the socket to the interface */
|
/* bind the socket to the interface */
|
||||||
if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &interface,
|
if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &interface,
|
||||||
sizeof(struct ifreq)) == -1) {
|
sizeof(struct ifreq)) == -1) {
|
||||||
fprintf(stderr, "[Error] Couldn't bind the socket to the "
|
log_error("Couldn't bind the socket to the interface.");
|
||||||
"interface.\n");
|
|
||||||
perror("setsockopt()");
|
perror("setsockopt()");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -76,7 +76,7 @@ int transmission_init(void)
|
|||||||
|
|
||||||
/* initialize RAW IPv4 socket */
|
/* initialize RAW IPv4 socket */
|
||||||
if ((sock_ipv4 = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
|
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()");
|
perror("socket()");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -84,8 +84,7 @@ int transmission_init(void)
|
|||||||
/* we will provide our own IPv4 header */
|
/* we will provide our own IPv4 header */
|
||||||
if (setsockopt(sock_ipv4, IPPROTO_IP, IP_HDRINCL, &on,
|
if (setsockopt(sock_ipv4, IPPROTO_IP, IP_HDRINCL, &on,
|
||||||
sizeof(on)) == -1) {
|
sizeof(on)) == -1) {
|
||||||
fprintf(stderr, "[Error] Couldn't apply the socket "
|
log_error("Couldn't apply the socket settings.");
|
||||||
"settings.\n");
|
|
||||||
perror("setsockopt()");
|
perror("setsockopt()");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -96,15 +95,14 @@ int transmission_init(void)
|
|||||||
/**
|
/**
|
||||||
* Close sockets. Should be called only once on program shutdown.
|
* Close sockets. Should be called only once on program shutdown.
|
||||||
*
|
*
|
||||||
* @return 0 for success
|
* @return 0 for success
|
||||||
* @return 1 for failure
|
* @return 1 for failure
|
||||||
*/
|
*/
|
||||||
int transmission_quit(void)
|
int transmission_quit(void)
|
||||||
{
|
{
|
||||||
/* close the socket */
|
/* close the socket */
|
||||||
if (close(sock) || close(sock_ipv4)) {
|
if (close(sock) || close(sock_ipv4)) {
|
||||||
fprintf(stderr, "[Error] Couldn't close the transmission "
|
log_warn("Couldn't close the transmission sockets.");
|
||||||
"sockets.\n");
|
|
||||||
perror("close()");
|
perror("close()");
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
@ -118,14 +116,14 @@ int transmission_quit(void)
|
|||||||
* @param data Raw packet data, including ethernet header
|
* @param data Raw packet data, including ethernet header
|
||||||
* @param length Length of the whole packet in bytes
|
* @param length Length of the whole packet in bytes
|
||||||
*
|
*
|
||||||
* @return 0 for success
|
* @return 0 for success
|
||||||
* @return 1 for failure
|
* @return 1 for failure
|
||||||
*/
|
*/
|
||||||
int transmit_raw(unsigned char *data, unsigned int length)
|
int transmit_raw(unsigned char *data, unsigned int length)
|
||||||
{
|
{
|
||||||
if (sendto(sock, data, length, 0, (struct sockaddr *) &socket_address,
|
if (sendto(sock, data, length, 0, (struct sockaddr *) &socket_address,
|
||||||
sizeof(struct sockaddr_ll)) != (int) length) {
|
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()");
|
perror("sendto()");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -141,8 +139,8 @@ int transmit_raw(unsigned char *data, unsigned int length)
|
|||||||
* including IPv4 header
|
* including IPv4 header
|
||||||
* @param length Length of the whole packet in bytes
|
* @param length Length of the whole packet in bytes
|
||||||
*
|
*
|
||||||
* @return 0 for success
|
* @return 0 for success
|
||||||
* @return 1 for failure
|
* @return 1 for failure
|
||||||
*/
|
*/
|
||||||
int transmit_ipv4(struct s_ipv4_addr *ip, unsigned char *data,
|
int transmit_ipv4(struct s_ipv4_addr *ip, unsigned char *data,
|
||||||
unsigned int length)
|
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,
|
if (sendto(sock_ipv4, data, length, 0,
|
||||||
(struct sockaddr *) &socket_address_ipv4,
|
(struct sockaddr *) &socket_address_ipv4,
|
||||||
sizeof(struct sockaddr)) != (int) length) {
|
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()");
|
perror("sendto()");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
15
src/udp.c
15
src/udp.c
@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
#include <net/ethernet.h> /* ETHERTYPE_* */
|
#include <net/ethernet.h> /* ETHERTYPE_* */
|
||||||
#include <netinet/in.h> /* htons */
|
#include <netinet/in.h> /* htons */
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h> /* malloc */
|
#include <stdlib.h> /* malloc */
|
||||||
#include <string.h> /* memcpy */
|
#include <string.h> /* memcpy */
|
||||||
|
|
||||||
@ -26,6 +25,7 @@
|
|||||||
#include "ethernet.h"
|
#include "ethernet.h"
|
||||||
#include "ipv4.h"
|
#include "ipv4.h"
|
||||||
#include "ipv6.h"
|
#include "ipv6.h"
|
||||||
|
#include "log.h"
|
||||||
#include "nat.h"
|
#include "nat.h"
|
||||||
#include "transmitter.h"
|
#include "transmitter.h"
|
||||||
#include "udp.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) {
|
if (udp->checksum != orig_checksum) {
|
||||||
/* packet is corrupted and shouldn't be processed */
|
/* packet is corrupted and shouldn't be processed */
|
||||||
printf("[Debug] Wrong checksum\n");
|
log_debug("Wrong checksum");
|
||||||
return 1;
|
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);
|
connection = nat_in(nat4_udp, ip4->ip_src, udp->port_src, udp->port_dest);
|
||||||
|
|
||||||
if (connection == NULL) {
|
if (connection == NULL) {
|
||||||
printf("[Debug] Incoming connection wasn't found in NAT\n");
|
log_debug("Incoming connection wasn't found in NAT");
|
||||||
return 1;
|
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) +
|
if ((packet = (unsigned char *) malloc(sizeof(struct s_ethernet) +
|
||||||
sizeof(struct s_ipv6) +
|
sizeof(struct s_ipv6) +
|
||||||
payload_size)) == NULL) {
|
payload_size)) == NULL) {
|
||||||
fprintf(stderr, "[Error] Lack of free memory\n");
|
log_error("Lack of free memory");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
eth6 = (struct s_ethernet *) packet;
|
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) {
|
if (udp->checksum != orig_checksum) {
|
||||||
/* packet is corrupted and shouldn't be processed */
|
/* packet is corrupted and shouldn't be processed */
|
||||||
printf("[Debug] Wrong checksum\n");
|
log_debug("Wrong checksum");
|
||||||
return 1;
|
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);
|
udp->port_src, udp->port_dest);
|
||||||
|
|
||||||
if (connection == NULL) {
|
if (connection == NULL) {
|
||||||
printf("[Debug] Error! Outgoing connection wasn't "
|
log_warn("Outgoing connection wasn't found/created in NAT!");
|
||||||
"found/created in NAT!\n");
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate memory for translated packet */
|
/* allocate memory for translated packet */
|
||||||
packet_size = sizeof(struct s_ipv4) + htons(ip6->len);
|
packet_size = sizeof(struct s_ipv4) + htons(ip6->len);
|
||||||
if ((packet = (unsigned char *) malloc(packet_size)) == NULL) {
|
if ((packet = (unsigned char *) malloc(packet_size)) == NULL) {
|
||||||
fprintf(stderr, "[Error] Lack of free memory\n");
|
log_error("Lack of free memory");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
ip4 = (struct s_ipv4 *) packet;
|
ip4 = (struct s_ipv4 *) packet;
|
||||||
|
@ -22,7 +22,6 @@
|
|||||||
#include <netpacket/packet.h> /* struct packet_mreq, struct sockaddr_ll */
|
#include <netpacket/packet.h> /* struct packet_mreq, struct sockaddr_ll */
|
||||||
#include <netinet/in.h> /* htons */
|
#include <netinet/in.h> /* htons */
|
||||||
#include <net/ethernet.h> /* ETHERTYPE_* */
|
#include <net/ethernet.h> /* ETHERTYPE_* */
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h> /* srand */
|
#include <stdlib.h> /* srand */
|
||||||
#include <string.h> /* strncpy */
|
#include <string.h> /* strncpy */
|
||||||
#include <sys/ioctl.h> /* ioctl, SIOCGIFINDEX */
|
#include <sys/ioctl.h> /* ioctl, SIOCGIFINDEX */
|
||||||
@ -33,6 +32,7 @@
|
|||||||
#include "ethernet.h"
|
#include "ethernet.h"
|
||||||
#include "ipv4.h"
|
#include "ipv4.h"
|
||||||
#include "ipv6.h"
|
#include "ipv6.h"
|
||||||
|
#include "log.h"
|
||||||
#include "nat.h"
|
#include "nat.h"
|
||||||
#include "transmitter.h"
|
#include "transmitter.h"
|
||||||
#include "wrapper.h"
|
#include "wrapper.h"
|
||||||
@ -63,16 +63,18 @@ int main(int argc, char **argv)
|
|||||||
int length;
|
int length;
|
||||||
char buffer[MTU];
|
char buffer[MTU];
|
||||||
|
|
||||||
|
log_info(PACKAGE_STRING " is starting");
|
||||||
|
|
||||||
/* initialize the socket for sniffing */
|
/* initialize the socket for sniffing */
|
||||||
if ((sniff_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the interface */
|
/* get the interface */
|
||||||
strncpy(interface.ifr_name, INTERFACE, IFNAMSIZ);
|
strncpy(interface.ifr_name, INTERFACE, IFNAMSIZ);
|
||||||
if (ioctl(sniff_sock, SIOCGIFINDEX, &interface) == -1) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,11 +84,11 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
/* reinitialize the interface */
|
/* reinitialize the interface */
|
||||||
if (ioctl(sniff_sock, SIOCGIFINDEX, &interface) == -1) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
} 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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,7 +97,7 @@ int main(int argc, char **argv)
|
|||||||
pmr.mr_ifindex = interface.ifr_ifindex;
|
pmr.mr_ifindex = interface.ifr_ifindex;
|
||||||
pmr.mr_type = PACKET_MR_PROMISC;
|
pmr.mr_type = PACKET_MR_PROMISC;
|
||||||
if (setsockopt(sniff_sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, (char *) &pmr, sizeof(pmr)) == -1) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +113,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
/* initiate sending socket */
|
/* initiate sending socket */
|
||||||
if (transmission_init()) {
|
if (transmission_init()) {
|
||||||
fprintf(stderr, "[Error] Unable to initiate sending socket\n");
|
log_error("Unable to initiate sending socket");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +127,7 @@ int main(int argc, char **argv)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
addr_size = sizeof(addr);
|
addr_size = sizeof(addr);
|
||||||
if ((length = recv(sniff_sock, buffer, MTU, 0)) == -1) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,7 +143,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
/* unset the promiscuous mode */
|
/* unset the promiscuous mode */
|
||||||
if (setsockopt(sniff_sock, SOL_PACKET, PACKET_DROP_MEMBERSHIP, (char *) &pmr, sizeof(pmr)) == -1) {
|
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 */
|
/* 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)) {
|
switch (htons(eth->type)) {
|
||||||
case ETHERTYPE_IP:
|
case ETHERTYPE_IP:
|
||||||
printf("[Debug] HW Protocol: IPv4\n");
|
log_debug("HW Protocol: IPv4");
|
||||||
return ipv4(eth, payload);
|
return ipv4(eth, payload);
|
||||||
case ETHERTYPE_IPV6:
|
case ETHERTYPE_IPV6:
|
||||||
printf("[Debug] HW Protocol: IPv6\n");
|
log_debug("HW Protocol: IPv6");
|
||||||
return ipv6(eth, payload);
|
return ipv6(eth, payload);
|
||||||
case ETHERTYPE_ARP:
|
case ETHERTYPE_ARP:
|
||||||
printf("[Debug] HW Protocol: ARP\n");
|
log_debug("HW Protocol: ARP");
|
||||||
return arp(eth, payload);
|
return arp(eth, payload);
|
||||||
default:
|
default:
|
||||||
printf("[Debug] HW Protocol: unknown [%d/0x%04x]\n",
|
log_debug("HW Protocol: unknown [%d/0x%04x]",
|
||||||
htons(eth->type), htons(eth->type));
|
htons(eth->type), htons(eth->type));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user